0027970: Improvement of standard attributes usability - containers.
[occt.git] / src / TDataStd / TDataStd_ExtStringArray.cxx
1 // Created on: 2002-01-16
2 // Created by: Michael PONIKAROV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16
17 #include <Standard_GUID.hxx>
18 #include <Standard_Type.hxx>
19 #include <TCollection_ExtendedString.hxx>
20 #include <TDataStd_DeltaOnModificationOfExtStringArray.hxx>
21 #include <TDataStd_ExtStringArray.hxx>
22 #include <TDF_Attribute.hxx>
23 #include <TDF_DefaultDeltaOnModification.hxx>
24 #include <TDF_DeltaOnModification.hxx>
25 #include <TDF_Label.hxx>
26 #include <TDF_RelocationTable.hxx>
27
28 IMPLEMENT_STANDARD_RTTIEXT(TDataStd_ExtStringArray,TDF_Attribute)
29
30 //=======================================================================
31 //function : GetID
32 //purpose  : 
33 //=======================================================================
34 const Standard_GUID& TDataStd_ExtStringArray::GetID() 
35
36   static Standard_GUID anExtStringArrayID ("2a96b624-ec8b-11d0-bee7-080009dc3333");
37   return anExtStringArrayID; 
38 }
39
40 //=======================================================================
41 //function : SetAttr
42 //purpose  : Implements Set functionality
43 //=======================================================================
44 Handle(TDataStd_ExtStringArray) SetAttr(const TDF_Label&       label,
45                                         const Standard_Integer lower,
46                                         const Standard_Integer upper,
47                                         const Standard_Boolean isDelta,
48                                         const Standard_GUID&   theGuid) 
49 {
50   Handle(TDataStd_ExtStringArray) A;
51   if (!label.FindAttribute (theGuid, A)) 
52   {
53     A = new TDataStd_ExtStringArray;
54     A->SetID(theGuid);
55     A->Init (lower, upper); 
56     A->SetDelta(isDelta); 
57     label.AddAttribute(A);
58   }
59   else if (lower != A->Lower() || upper != A->Upper())
60   {
61     A->Init(lower, upper);
62   }
63   return A;
64 }
65 //=======================================================================
66 //function : TDataStd_ExtStringArray::TDataStd_ExtStringArray
67 //purpose  : 
68 //=======================================================================
69
70 TDataStd_ExtStringArray::TDataStd_ExtStringArray() 
71     : myIsDelta(Standard_False){}
72      
73 //=======================================================================
74 //function : Init
75 //purpose  : 
76 //=======================================================================
77
78 void TDataStd_ExtStringArray::Init(const Standard_Integer lower,
79                                    const Standard_Integer upper)
80 {
81   Standard_RangeError_Raise_if(upper < lower,"TDataStd_ExtStringArray::Init");
82   Backup();
83   myValue = new TColStd_HArray1OfExtendedString(lower, upper, "");
84 }
85
86 //=======================================================================
87 //function : Set
88 //purpose  : 
89 //=======================================================================
90
91 Handle(TDataStd_ExtStringArray) TDataStd_ExtStringArray::Set (
92                                           const TDF_Label& label,
93                                           const Standard_Integer lower,
94                                           const Standard_Integer upper,
95                                           const Standard_Boolean isDelta) 
96
97 {
98   return SetAttr(label, lower, upper, isDelta, GetID());
99 }
100
101 //=======================================================================
102 //function : Set
103 //purpose  : Set user defined attribute with specific ID
104 //=======================================================================
105
106 Handle(TDataStd_ExtStringArray) TDataStd_ExtStringArray::Set (
107                                           const TDF_Label& label,
108                                           const Standard_GUID& theGuid,
109                                           const Standard_Integer lower,
110                                           const Standard_Integer upper,
111                                           const Standard_Boolean isDelta) 
112
113 {
114   return SetAttr(label, lower, upper, isDelta, theGuid);
115 }
116 //=======================================================================
117 //function : SetValue
118 //purpose  : 
119 //=======================================================================
120
121 void TDataStd_ExtStringArray::SetValue(const Standard_Integer index, const TCollection_ExtendedString& value) 
122 {
123   if(myValue.IsNull()) return;
124   if( myValue->Value(index) == value)
125     return; 
126
127   Backup();
128   myValue->SetValue(index, value);
129 }
130
131
132 //=======================================================================
133 //function : Value
134 //purpose  : 
135 //=======================================================================
136
137 const TCollection_ExtendedString& TDataStd_ExtStringArray::Value (const Standard_Integer index) const 
138 {
139   if (myValue.IsNull()) 
140   {
141     static TCollection_ExtendedString staticEmptyValue;
142     return staticEmptyValue;
143   }
144   return myValue->Value(index); 
145 }
146
147 //=======================================================================
148 //function : Lower
149 //purpose  : 
150 //=======================================================================
151 Standard_Integer TDataStd_ExtStringArray::Lower (void) const 
152
153   if(myValue.IsNull()) return 0;
154   return myValue->Lower(); 
155 }
156
157
158 //=======================================================================
159 //function : Upper
160 //purpose  : 
161 //=======================================================================
162 Standard_Integer TDataStd_ExtStringArray::Upper (void) const 
163
164   if(myValue.IsNull()) return 0;
165   return myValue->Upper(); 
166 }
167
168
169 //=======================================================================
170 //function : Length
171 //purpose  : 
172 //=======================================================================
173 Standard_Integer TDataStd_ExtStringArray::Length (void) const 
174 {
175   if(myValue.IsNull()) return 0;
176   return myValue->Length(); 
177 }
178
179
180
181 //=======================================================================
182 //function : ChangeArray
183 //purpose  : If value of <newArray> differs from <myValue>, Backup 
184 //         : performed and myValue refers to new instance of HArray1OfExtendedString
185 //         : that holds <newArray>
186 //=======================================================================
187
188 void TDataStd_ExtStringArray::ChangeArray(const Handle(TColStd_HArray1OfExtendedString)& newArray,
189                                           const Standard_Boolean isCheckItems) 
190 {
191   Standard_Integer aLower    = newArray->Lower();
192   Standard_Integer anUpper   = newArray->Upper();
193   Standard_Boolean aDimEqual = Standard_False;
194   Standard_Integer i;
195
196   if (Lower() == aLower && Upper() == anUpper ) {
197     aDimEqual = Standard_True;
198     Standard_Boolean isEqual = Standard_True;
199     if(isCheckItems) {
200       for(i = aLower; i <= anUpper; i++) {
201         if(myValue->Value(i) != newArray->Value(i)) {
202           isEqual = Standard_False;
203           break;
204         }
205       }
206       if(isEqual)
207         return;
208     }
209   }
210
211   Backup();
212
213 // Handles of myValue of current and backuped attributes will be different!!!
214   if(myValue.IsNull() || !aDimEqual) 
215     myValue = new TColStd_HArray1OfExtendedString(aLower, anUpper);
216
217   for(i = aLower; i <= anUpper; i++) 
218     myValue->SetValue(i, newArray->Value(i));
219 }
220
221 //=======================================================================
222 //function : ID
223 //purpose  : 
224 //=======================================================================
225
226 const Standard_GUID& TDataStd_ExtStringArray::ID () const { return myID; }
227
228 //=======================================================================
229 //function : SetID
230 //purpose  :
231 //=======================================================================
232
233 void TDataStd_ExtStringArray::SetID( const Standard_GUID&  theGuid)
234 {  
235   if(myID == theGuid) return;
236   Backup();
237   myID = theGuid;
238 }
239
240 //=======================================================================
241 //function : SetID
242 //purpose  : sets default ID
243 //=======================================================================
244
245 void TDataStd_ExtStringArray::SetID()
246 {  
247   Backup();
248   myID = GetID();
249 }
250
251 //=======================================================================
252 //function : NewEmpty
253 //purpose  : 
254 //=======================================================================
255
256 Handle(TDF_Attribute) TDataStd_ExtStringArray::NewEmpty () const
257 {  
258   return new TDataStd_ExtStringArray(); 
259 }
260
261 //=======================================================================
262 //function : Restore
263 //purpose  : 
264 //=======================================================================
265
266 void TDataStd_ExtStringArray::Restore(const Handle(TDF_Attribute)& With) 
267 {
268   Standard_Integer i, lower, upper;
269   Handle(TDataStd_ExtStringArray) anArray = Handle(TDataStd_ExtStringArray)::DownCast(With);
270   if(!anArray->myValue.IsNull()) {
271     lower = anArray->Lower();
272     upper = anArray->Upper(); 
273     myValue = new TColStd_HArray1OfExtendedString(lower, upper);
274     for(i = lower; i<=upper; i++)
275       myValue->SetValue(i, anArray->Value(i));
276     myIsDelta = anArray->myIsDelta;
277     myID = anArray->ID();
278   }
279   else
280     myValue.Nullify();
281 }
282
283 //=======================================================================
284 //function : Paste
285 //purpose  : 
286 //=======================================================================
287
288 void TDataStd_ExtStringArray::Paste (const Handle(TDF_Attribute)& Into,
289                                      const Handle(TDF_RelocationTable)& ) const
290 {
291   if(!myValue.IsNull()) {
292     Handle(TDataStd_ExtStringArray) anAtt = Handle(TDataStd_ExtStringArray)::DownCast(Into);
293     if(!anAtt.IsNull()) {
294       anAtt->ChangeArray( myValue, Standard_False );
295       anAtt->SetDelta(myIsDelta);
296       anAtt->SetID(myID);
297     }
298   }
299 }
300
301 //=======================================================================
302 //function : Dump
303 //purpose  : 
304 //=======================================================================
305
306 Standard_OStream& TDataStd_ExtStringArray::Dump (Standard_OStream& anOS) const
307 {  
308   anOS << "\nExtStringArray :";
309   if(!myValue.IsNull()) {
310     Standard_Integer i, lower, upper;
311     lower = myValue->Lower();
312     upper = myValue->Upper();
313     for(i = lower; i<=upper; i++)
314       anOS << "\t" <<myValue->Value(i)<<endl;
315   }
316   anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
317   Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
318   myID.ToCString(sguid);
319   anOS << sguid;
320   anOS << endl;
321   return anOS;
322 }
323
324 //=======================================================================
325 //function : DeltaOnModification
326 //purpose  : 
327 //=======================================================================
328
329 Handle(TDF_DeltaOnModification) TDataStd_ExtStringArray::DeltaOnModification
330 (const Handle(TDF_Attribute)& OldAttribute) const
331 {
332   if(myIsDelta)
333     return new TDataStd_DeltaOnModificationOfExtStringArray(Handle(TDataStd_ExtStringArray)::DownCast (OldAttribute));
334   else return new TDF_DefaultDeltaOnModification(OldAttribute);
335 }
336