Salome HOME
This commit was generated by cvs2git to create tag 'V1_4_0b1'.
[modules/kernel.git] / src / SALOMEDS / SALOMEDS_TableOfIntegerAttribute.cxx
1 //  SALOME SALOMEDS : data structure of SALOME and sources of Salome data server 
2 //
3 //  Copyright (C) 2003  CEA/DEN, EDF R&D
4 //
5 //
6 //
7 //  File   : SALOMEDS_TableOfIntegerAttribute.cxx
8 //  Author : Michael Ponikarov
9 //  Module : SALOME
10 //  $Header$
11
12 using namespace std;
13 #include <SALOMEDS_TableOfIntegerAttribute.ixx>
14 #include <Standard_Failure.hxx>
15 #include <TColStd_DataMapIteratorOfDataMapOfIntegerInteger.hxx>
16
17 #include <string>
18
19 const Standard_GUID& SALOMEDS_TableOfIntegerAttribute::GetID() 
20 {
21   static Standard_GUID SALOMEDS_TableOfIntegerAttributeID ("128371A0-8F52-11d6-A8A3-0001021E8C7F");
22   return SALOMEDS_TableOfIntegerAttributeID;
23 }
24
25 Handle(SALOMEDS_TableOfIntegerAttribute) SALOMEDS_TableOfIntegerAttribute::Set(const TDF_Label& label) 
26 {
27   Handle(SALOMEDS_TableOfIntegerAttribute) anAttr;
28   if (!label.FindAttribute(SALOMEDS_TableOfIntegerAttribute::GetID(),anAttr)) {
29     anAttr = new SALOMEDS_TableOfIntegerAttribute();
30     label.AddAttribute(anAttr);
31   }
32   return anAttr;
33 }
34
35 SALOMEDS_TableOfIntegerAttribute::SALOMEDS_TableOfIntegerAttribute() {
36   myRows = new TColStd_HSequenceOfExtendedString();
37   myCols = new TColStd_HSequenceOfExtendedString();
38   myNbRows = 0;
39   myNbColumns = 0;
40 }
41
42 void SALOMEDS_TableOfIntegerAttribute::SetNbColumns(const Standard_Integer theNbColumns)
43 {
44   Backup();
45   
46   TColStd_DataMapOfIntegerInteger aMap;
47   aMap = myTable;
48   myTable.Clear();
49
50   TColStd_DataMapIteratorOfDataMapOfIntegerInteger 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());
58   }
59
60   myNbColumns = theNbColumns;
61
62   while (myCols->Length() < myNbColumns) { // append empty columns titles
63     myCols->Append(TCollection_ExtendedString(""));
64   }
65 }
66
67 void SALOMEDS_TableOfIntegerAttribute::SetTitle(const TCollection_ExtendedString& theTitle) {
68   Backup();
69   myTitle = theTitle;
70 }
71
72 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetTitle() const {
73   return myTitle;
74 }
75
76 void SALOMEDS_TableOfIntegerAttribute::SetRowData(const Standard_Integer theRow,
77                                                   const Handle(TColStd_HSequenceOfInteger)& theData) 
78 {
79   if(theData->Length() > myNbColumns) SetNbColumns(theData->Length());
80
81   Backup();
82
83   while (myRows->Length() < theRow) { // append new row titles
84     myRows->Append(TCollection_ExtendedString(""));
85   }
86
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));
90   }
91
92   if(theRow > myNbRows) myNbRows = theRow;
93 }
94
95 Handle(TColStd_HSequenceOfInteger) SALOMEDS_TableOfIntegerAttribute::GetRowData(const Standard_Integer theRow)
96 {
97   Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger();
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));
102      else
103        aSeq->Append(0);
104   }
105   
106   return aSeq;
107 }
108
109 void SALOMEDS_TableOfIntegerAttribute::SetRowTitle(const Standard_Integer theRow,
110                                                    const TCollection_ExtendedString& theTitle) {
111   Backup();
112   myRows->SetValue(theRow,theTitle);
113 }
114
115 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetRowTitle(const Standard_Integer theRow) const {
116   return myRows->Value(theRow);
117 }
118
119
120 void SALOMEDS_TableOfIntegerAttribute::SetColumnData(const Standard_Integer theColumn,
121                                                      const Handle(TColStd_HSequenceOfInteger)& theData) 
122 {
123   if(theColumn > myNbColumns) SetNbColumns(theColumn);
124
125   Backup();
126
127   Standard_Integer i, aLength = theData->Length();
128   for(i = 1; i <= aLength; i++) {
129     myTable.Bind(myNbColumns*(i-1)+theColumn, theData->Value(i));
130   }
131
132   if(aLength > myNbRows) {
133     myNbRows = aLength;
134     while (myRows->Length() < myNbRows) { // append empty row titles
135       myRows->Append(TCollection_ExtendedString(""));
136     }
137   }
138 }
139
140
141 Handle(TColStd_HSequenceOfInteger) SALOMEDS_TableOfIntegerAttribute::GetColumnData(const Standard_Integer theColumn)
142 {
143   Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
144   
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));
150     else
151       aSeq->Append(0);
152   }
153   
154   return aSeq;
155 }
156
157 void SALOMEDS_TableOfIntegerAttribute::SetColumnTitle(const Standard_Integer theColumn,
158                                                       const TCollection_ExtendedString& theTitle) {
159   Backup();
160   while(myCols->Length() < theColumn) myCols->Append(TCollection_ExtendedString(""));
161   myCols->SetValue(theColumn,theTitle);
162 }
163
164 TCollection_ExtendedString SALOMEDS_TableOfIntegerAttribute::GetColumnTitle(const Standard_Integer theColumn) const {
165   if(myCols.IsNull()) return "";
166   if(myCols->Length() < theColumn) return "";
167   return myCols->Value(theColumn);
168 }
169
170
171 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetNbRows() const
172 {
173   return myNbRows;
174 }
175
176 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetNbColumns() const
177 {
178   return myNbColumns;
179 }
180
181 void SALOMEDS_TableOfIntegerAttribute::PutValue(const Standard_Integer theValue,
182                                                 const Standard_Integer theRow,
183                                                 const Standard_Integer theColumn) 
184 {
185   if(theColumn > myNbColumns) SetNbColumns(theColumn);
186
187   Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
188   myTable.Bind(anIndex, theValue);
189
190   if(theRow > myNbRows) {
191     while (myRows->Length() < theRow) { // append empty row titles
192       myRows->Append(TCollection_ExtendedString(""));
193     }
194     myNbRows = theRow;
195   }
196 }
197
198 Standard_Boolean SALOMEDS_TableOfIntegerAttribute::HasValue(const Standard_Integer theRow,
199                                                             const Standard_Integer theColumn) 
200 {
201   Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
202   return myTable.IsBound(anIndex); 
203 }
204
205 Standard_Integer SALOMEDS_TableOfIntegerAttribute::GetValue(const Standard_Integer theRow,
206                                                             const Standard_Integer theColumn) 
207 {
208   Standard_Integer anIndex = (theRow-1)*myNbColumns + theColumn;
209   if(myTable.IsBound(anIndex)) return myTable.Find(anIndex);
210   
211   Standard_Failure::Raise("Invalid cell index");
212   return 0;
213 }
214
215 const Standard_GUID& SALOMEDS_TableOfIntegerAttribute::ID() const
216 {
217   return GetID();
218 }
219
220 void SALOMEDS_TableOfIntegerAttribute::Restore(const Handle(TDF_Attribute)& with) 
221 {
222   Standard_Integer anIndex;
223   Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(with);
224
225   myTable.Clear();
226   myCols->Clear();
227   myRows->Clear();
228
229   myTable = aTable->myTable;
230   myNbRows = aTable->myNbRows;
231   myNbColumns = aTable->myNbColumns;
232   myTitle = aTable->myTitle;
233   
234   for(anIndex = 1; anIndex <= aTable->GetNbRows();anIndex++)
235     myRows->Append(aTable->GetRowTitle(anIndex));
236
237   for(anIndex = 1; anIndex <= aTable->GetNbColumns(); anIndex++) 
238     myCols->Append(aTable->GetColumnTitle(anIndex));
239 }
240
241 Handle(TDF_Attribute) SALOMEDS_TableOfIntegerAttribute::NewEmpty() const
242 {
243   return new SALOMEDS_TableOfIntegerAttribute();
244 }
245
246 void SALOMEDS_TableOfIntegerAttribute::Paste(const Handle(TDF_Attribute)& into,
247                                              const Handle(TDF_RelocationTable)&) const
248 {
249   Standard_Integer anIndex;
250   Handle(SALOMEDS_TableOfIntegerAttribute) aTable = Handle(SALOMEDS_TableOfIntegerAttribute)::DownCast(into);
251
252   aTable->myTable.Clear();
253   aTable->myCols->Clear();
254   aTable->myRows->Clear();
255
256   aTable->myTable = myTable;
257   aTable->myTitle = myTitle;
258   aTable->myNbRows = myNbRows;
259   aTable->myNbColumns = myNbColumns;
260
261   for(anIndex = 1; anIndex <= GetNbRows();anIndex++)
262     aTable->myRows->Append(GetRowTitle(anIndex));
263   for(anIndex = 1; anIndex <= GetNbColumns(); anIndex++) 
264     aTable->myCols->Append(GetColumnTitle(anIndex));
265 }
266
267
268 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfIntegerAttribute::GetSetRowIndices(const Standard_Integer theRow)
269 {
270   Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
271
272   Standard_Integer i, aShift = myNbColumns*(theRow-1);
273   for(i = 1; i <= myNbColumns; i++) {
274     if(myTable.IsBound(aShift + i)) aSeq->Append(i);
275   }
276   
277   return aSeq;
278 }
279
280 Handle_TColStd_HSequenceOfInteger SALOMEDS_TableOfIntegerAttribute::GetSetColumnIndices(const Standard_Integer theColumn)
281 {
282   Handle(TColStd_HSequenceOfInteger) aSeq = new TColStd_HSequenceOfInteger;
283
284   Standard_Integer i, anIndex;
285   for(i = 1; i <= myNbRows; i++) {
286     anIndex = myNbColumns*(i-1)+theColumn;
287     if(myTable.IsBound(anIndex)) aSeq->Append(i);
288   }
289   
290   return aSeq;
291 }
292
293
294 void SALOMEDS_TableOfIntegerAttribute::ConvertToString(ostrstream& theStream)
295 {
296   int i, j, l;
297
298   theStream.precision(64);
299   
300   //Title
301   l = myTitle.Length();
302   theStream << l << "\n";
303   for(i=1; i<=l; i++)
304     theStream << myTitle.Value(i) << "\n";
305
306   //Nb rows
307   theStream << myNbRows << "\n";
308
309   //Rows titles
310   for(i=1; i<=myNbRows; i++) {
311     l = myRows->Value(i).Length();
312     theStream << l << "\n";
313     for(j=1; j<=l; j++)
314       theStream << myRows->Value(i).Value(j) << "\n";
315   }
316
317   //Nb columns
318   theStream << myNbColumns << "\n";
319
320   //Columns titles
321   for(i=1; i<=myNbColumns; i++) {
322     l = myCols->Value(i).Length();
323     theStream << l << "\n";
324     for(j=1; j<=l; j++)
325       theStream << myCols->Value(i).Value(j) << "\n";
326   }
327
328   //Store the table values
329   l = myTable.Extent();
330   theStream << l << "\n";
331   TColStd_DataMapIteratorOfDataMapOfIntegerInteger anIterator(myTable);
332   for(; anIterator.More(); anIterator.Next()) {
333     theStream << anIterator.Key() << "\n";
334     theStream << anIterator.Value() << "\n";
335   }
336
337   return;
338 }
339
340 bool SALOMEDS_TableOfIntegerAttribute::RestoreFromString(istrstream& theStream)
341 {
342   Backup();
343
344   int i, j, l;
345
346   Standard_ExtCharacter anExtChar;
347   TCollection_ExtendedString aStr;
348
349   //Title
350   theStream >> l;
351
352   myTitle = TCollection_ExtendedString(l, 0);
353   for(i=1; i<=l; i++) {
354     theStream >> anExtChar;
355     myTitle.SetValue(i, anExtChar);
356   }
357
358   //Nb rows
359   theStream >> myNbRows;
360
361   //Rows titles
362   myRows->Clear();  
363   for(i=1; i<=myNbRows; i++) { 
364     theStream >> l;
365     aStr = TCollection_ExtendedString(l,0);
366     for(j=1; j<=l; j++) {
367       theStream >> anExtChar;
368       aStr.SetValue(j, anExtChar);
369     }
370     myRows->Append(aStr);
371   }
372
373   //Nb columns
374   theStream >> myNbColumns;
375
376   //Columns titles
377   myCols->Clear();
378   for(i=1; i<=myNbColumns; i++) {
379     theStream >> l;
380     aStr = TCollection_ExtendedString(l,0);
381     for(j=1; j<=l; j++) {
382       theStream >> anExtChar;
383       aStr.SetValue(j, anExtChar);
384     }
385     myCols->Append(aStr);
386   }
387
388   //Restore the table values
389   theStream >> l;
390   myTable.Clear();
391   for(i=1; i<=l; i++) {
392     int aKey, aValue;
393     theStream >> aKey;
394     theStream >> aValue;
395     myTable.Bind(aKey, aValue);
396   }
397
398   return true;
399 }