1 // SALOME SALOMEDS : data structure of SALOME and sources of Salome data server
3 // Copyright (C) 2003 CEA/DEN, EDF R&D
7 // File : SALOMEDS_TableOfStringAttribute.cxx
8 // Author : Sergey Ruin
12 #include <SALOMEDS_TableOfStringAttribute.ixx>
13 #include <Standard_Failure.hxx>
14 #include <SALOMEDS_DataMapIteratorOfDataMapOfIntegerString.hxx>
19 const Standard_GUID& SALOMEDS_TableOfStringAttribute::GetID()
21 static Standard_GUID SALOMEDS_TableOfStringAttributeID ("128371A2-8F52-11d6-A8A3-0001021E8C7F");
22 return SALOMEDS_TableOfStringAttributeID;
25 Handle(SALOMEDS_TableOfStringAttribute) SALOMEDS_TableOfStringAttribute::Set(const TDF_Label& label)
27 Handle(SALOMEDS_TableOfStringAttribute) anAttr;
28 if (!label.FindAttribute(SALOMEDS_TableOfStringAttribute::GetID(),anAttr)) {
29 anAttr = new SALOMEDS_TableOfStringAttribute();
30 label.AddAttribute(anAttr);
35 SALOMEDS_TableOfStringAttribute::SALOMEDS_TableOfStringAttribute() {
36 myRows = new TColStd_HSequenceOfExtendedString();
37 myCols = new TColStd_HSequenceOfExtendedString();
42 void SALOMEDS_TableOfStringAttribute::SetNbColumns(const Standard_Integer theNbColumns)
46 SALOMEDS_DataMapOfIntegerString aMap;
50 SALOMEDS_DataMapIteratorOfDataMapOfIntegerString anIterator(aMap);
51 for(; anIterator.More(); anIterator.Next()) {
52 int aRow = (int)(anIterator.Key()/myNbColumns) + 1;
53 int aCol = (int)(anIterator.Key() - myNbColumns*(aRow-1));
54 if(aCol == 0) { aCol = myNbColumns; aRow--; }
55 if(aCol > theNbColumns) continue;
56 int aKey = (aRow-1)*theNbColumns+aCol;
57 myTable.Bind(aKey, anIterator.Value());
60 myNbColumns = theNbColumns;
62 while (myCols->Length() < myNbColumns) { // append empty columns titles
63 myCols->Append(TCollection_ExtendedString(""));
67 void SALOMEDS_TableOfStringAttribute::SetTitle(const TCollection_ExtendedString& theTitle) {
72 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetTitle() const {
76 void SALOMEDS_TableOfStringAttribute::SetRowData(const Standard_Integer theRow,
77 const Handle(TColStd_HSequenceOfExtendedString)& theData)
79 if(theData->Length() > myNbColumns) SetNbColumns(theData->Length());
83 while (myRows->Length() < theRow) { // append new row titles
84 myRows->Append(TCollection_ExtendedString(""));
87 Standard_Integer i, aShift = (theRow-1)*myNbColumns, aLength = theData->Length();
88 for(i = 1; i <= aLength; i++) {
89 myTable.Bind(aShift + i, theData->Value(i));
92 if(theRow > myNbRows) myNbRows = theRow;
95 Handle(TColStd_HSequenceOfExtendedString) SALOMEDS_TableOfStringAttribute::GetRowData(const Standard_Integer theRow)
97 Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString();
98 Standard_Integer i, aShift = (theRow-1)*myNbColumns;
99 for(i = 1; i <= myNbColumns; i++) {
100 if(myTable.IsBound(aShift+i))
101 aSeq->Append(myTable.Find(aShift+i));
109 void SALOMEDS_TableOfStringAttribute::SetRowTitle(const Standard_Integer theRow,
110 const TCollection_ExtendedString& theTitle) {
112 myRows->SetValue(theRow,theTitle);
115 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetRowTitle(const Standard_Integer theRow) const {
116 return myRows->Value(theRow);
120 void SALOMEDS_TableOfStringAttribute::SetColumnData(const Standard_Integer theColumn,
121 const Handle(TColStd_HSequenceOfExtendedString)& theData)
123 if(theColumn > myNbColumns) SetNbColumns(theColumn);
127 Standard_Integer i, aLength = theData->Length();
128 for(i = 1; i <= aLength; i++) {
129 myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i));
132 if(aLength > myNbRows) {
134 while (myRows->Length() < myNbRows) { // append empty row titles
135 myRows->Append(TCollection_ExtendedString(""));
141 Handle(TColStd_HSequenceOfExtendedString) SALOMEDS_TableOfStringAttribute::GetColumnData(const Standard_Integer theColumn)
143 Handle(TColStd_HSequenceOfExtendedString) aSeq = new TColStd_HSequenceOfExtendedString;
145 Standard_Integer i, anIndex;
146 for(i = 1; i <= myNbRows; i++) {
147 anIndex = myNbColumns*(i-1) + theColumn;
148 if(myTable.IsBound(anIndex))
149 aSeq->Append(myTable.Find(anIndex));
157 void SALOMEDS_TableOfStringAttribute::SetColumnTitle(const Standard_Integer theColumn,
158 const TCollection_ExtendedString& theTitle) {
160 while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString(""));
161 myCols->SetValue(theColumn,theTitle);
164 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetColumnTitle(const Standard_Integer theColumn) const {
165 if(myCols.IsNull()) return "";
166 if(myCols->Length() < theColumn) return "";
167 return myCols->Value(theColumn);
171 Standard_Integer SALOMEDS_TableOfStringAttribute::GetNbRows() const
176 Standard_Integer SALOMEDS_TableOfStringAttribute::GetNbColumns() const
181 void SALOMEDS_TableOfStringAttribute::PutValue(const TCollection_ExtendedString& theValue,
182 const Standard_Integer theRow,
183 const Standard_Integer theColumn)
185 if(theColumn > myNbColumns) SetNbColumns(theColumn);
187 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
188 myTable.Bind(anIndex, theValue);
190 if(theRow > myNbRows) {
191 while (myRows->Length() < theRow) { // append empty row titles
192 myRows->Append(TCollection_ExtendedString(""));
198 Standard_Boolean SALOMEDS_TableOfStringAttribute::HasValue(const Standard_Integer theRow,
199 const Standard_Integer theColumn)
201 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
202 return myTable.IsBound(anIndex);
205 TCollection_ExtendedString SALOMEDS_TableOfStringAttribute::GetValue(const Standard_Integer theRow,
206 const Standard_Integer theColumn)
208 Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
209 if(myTable.IsBound(anIndex)) return myTable.Find(anIndex);
211 Standard_Failure::Raise("Invalid cell index");
215 const Standard_GUID& SALOMEDS_TableOfStringAttribute::ID() const
220 void SALOMEDS_TableOfStringAttribute::Restore(const Handle(TDF_Attribute)& with)
222 Standard_Integer anIndex;
223 Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(with);
229 myTable = aTable->myTable;
230 myNbRows = aTable->myNbRows;
231 myNbColumns = aTable->myNbColumns;
232 myTitle = aTable->myTitle;
234 for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++) {
235 SetRowTitle(anIndex,aTable->GetRowTitle(anIndex));
237 for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++)
238 SetColumnTitle(anIndex, aTable->GetColumnTitle(anIndex));
241 Handle(TDF_Attribute) SALOMEDS_TableOfStringAttribute::NewEmpty() const
243 return new SALOMEDS_TableOfStringAttribute();
246 void SALOMEDS_TableOfStringAttribute::Paste(const Handle(TDF_Attribute)& into,
247 const Handle(TDF_RelocationTable)&) const
249 Standard_Integer anIndex;
250 Handle(SALOMEDS_TableOfStringAttribute) aTable = Handle(SALOMEDS_TableOfStringAttribute)::DownCast(into);
252 aTable->myTable.Clear();
253 aTable->myCols->Clear();
254 aTable->myRows->Clear();
256 aTable->myTable = myTable;
257 aTable->myTitle = myTitle;
258 aTable->myNbRows = myNbRows;
259 aTable->myNbColumns = myNbColumns;
261 for(anIndex = 1; anIndex <= GetNbRows();anIndex++) {
262 aTable->SetRowTitle(anIndex,GetRowTitle(anIndex));
264 for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++)
265 aTable->SetColumnTitle(anIndex, GetColumnTitle(anIndex));
269 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfStringAttribute::GetSetRowIndices(const Standard_Integer theRow)
271 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
273 Standard_Integer i, aShift = myNbColumns*(theRow-1);
274 for(i = 1; i <= myNbColumns; i++) {
275 if(myTable.IsBound(aShift + i)) aSeq->Append(i);
281 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfStringAttribute::GetSetColumnIndices(const Standard_Integer theColumn)
283 Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
285 Standard_Integer i, anIndex;
286 for(i = 1; i <= myNbRows; i++) {
287 anIndex = myNbColumns*(i-1)+theColumn;
288 if(myTable.IsBound(anIndex)) aSeq->Append(i);
296 void SALOMEDS_TableOfStringAttribute::ConvertToString(ostrstream& theStream)
301 l = myTitle.Length();
302 theStream << l << "\n";
304 theStream << myTitle.Value(i) << "\n";
307 theStream << myNbRows << "\n";
310 for(i=1; i<=myNbRows; i++) {
311 l = myRows->Value(i).Length();
312 theStream << l << "\n";
314 theStream << myRows->Value(i).Value(j) << "\n";
318 theStream << myNbColumns << "\n";
321 for(i=1; i<=myNbColumns; i++) {
322 l = myCols->Value(i).Length();
323 theStream << l << "\n";
325 theStream << myCols->Value(i).Value(j) << "\n";
328 //Store the table values
329 l = myTable.Extent();
330 theStream << l << "\n";
331 SALOMEDS_DataMapIteratorOfDataMapOfIntegerString anIterator(myTable);
332 for(; anIterator.More(); anIterator.Next()) {
333 if (anIterator.Value().Length()) { // check empty string in the value table
334 theStream << anIterator.Key() << "\n";
335 unsigned long aValueSize = anIterator.Value().Length();
336 theStream.write((char*)&aValueSize, sizeof(unsigned long));
337 theStream.write((TCollection_AsciiString(anIterator.Value()).ToCString()),aValueSize);
338 } else { // write index only of kind: "0key"; "05", for an example
339 theStream << "0" << anIterator.Key() << "\n";
345 bool SALOMEDS_TableOfStringAttribute::RestoreFromString(istrstream& theStream)
349 theStream.seekg(0, ios::end);
350 long aSize = theStream.tellg();
351 theStream.seekg(0, ios::beg);
354 char *aValueString = new char[aSize];
356 Standard_ExtCharacter anExtChar;
357 TCollection_ExtendedString aStr;
362 myTitle = TCollection_ExtendedString(l, 0);
363 for(i=1; i<=l; i++) {
364 theStream >> anExtChar;
365 myTitle.SetValue(i, anExtChar);
369 theStream >> myNbRows;
373 for(i=1; i<=myNbRows; i++) {
375 aStr = TCollection_ExtendedString(l,0);
376 for(j=1; j<=l; j++) {
377 theStream >> anExtChar;
378 aStr.SetValue(j, anExtChar);
380 myRows->Append(aStr);
384 theStream >> myNbColumns;
388 for(i=1; i<=myNbColumns; i++) {
390 aStr = TCollection_ExtendedString(l,0);
391 for(j=1; j<=l; j++) {
392 theStream >> anExtChar;
393 aStr.SetValue(j, anExtChar);
395 myCols->Append(aStr);
398 //Restore the table values
399 TCollection_AsciiString aValue;
402 theStream.getline(aValueString,aSize,'\n');
403 for(i=1; i<=l; i++) {
404 Standard_Integer aKey;
406 theStream.getline(aValueString,aSize,'\n');
407 aValue = aValueString;
408 aKey = aValue.IntegerValue();
409 if (aValue.Value(1) == '0')
412 unsigned long aValueSize;
413 theStream.read((char*)&aValueSize, sizeof(unsigned long));
414 theStream.read(aValueString, aValueSize);
415 aValue = aValueString;
417 myTable.Bind(aKey, aValue);
419 delete(aValueString);