1 // Created on: 2002-01-16
2 // Created by: Michael PONIKAROV
3 // Copyright (c) 2002-2014 OPEN CASCADE SAS
5 // This file is part of Open CASCADE Technology software library.
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.
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
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>
28 IMPLEMENT_STANDARD_RTTIEXT(TDataStd_ExtStringArray,TDF_Attribute)
30 //=======================================================================
33 //=======================================================================
34 const Standard_GUID& TDataStd_ExtStringArray::GetID()
36 static Standard_GUID anExtStringArrayID ("2a96b624-ec8b-11d0-bee7-080009dc3333");
37 return anExtStringArrayID;
40 //=======================================================================
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)
50 Handle(TDataStd_ExtStringArray) A;
51 if (!label.FindAttribute (theGuid, A))
53 A = new TDataStd_ExtStringArray;
55 A->Init (lower, upper);
57 label.AddAttribute(A);
59 else if (lower != A->Lower() || upper != A->Upper())
61 A->Init(lower, upper);
65 //=======================================================================
66 //function : TDataStd_ExtStringArray::TDataStd_ExtStringArray
68 //=======================================================================
70 TDataStd_ExtStringArray::TDataStd_ExtStringArray()
71 : myIsDelta(Standard_False), myID(GetID())
74 //=======================================================================
77 //=======================================================================
79 void TDataStd_ExtStringArray::Init(const Standard_Integer lower,
80 const Standard_Integer upper)
82 Standard_RangeError_Raise_if(upper < lower,"TDataStd_ExtStringArray::Init");
84 myValue = new TColStd_HArray1OfExtendedString(lower, upper, "");
87 //=======================================================================
90 //=======================================================================
92 Handle(TDataStd_ExtStringArray) TDataStd_ExtStringArray::Set (
93 const TDF_Label& label,
94 const Standard_Integer lower,
95 const Standard_Integer upper,
96 const Standard_Boolean isDelta)
99 return SetAttr(label, lower, upper, isDelta, GetID());
102 //=======================================================================
104 //purpose : Set user defined attribute with specific ID
105 //=======================================================================
107 Handle(TDataStd_ExtStringArray) TDataStd_ExtStringArray::Set (
108 const TDF_Label& label,
109 const Standard_GUID& theGuid,
110 const Standard_Integer lower,
111 const Standard_Integer upper,
112 const Standard_Boolean isDelta)
115 return SetAttr(label, lower, upper, isDelta, theGuid);
117 //=======================================================================
118 //function : SetValue
120 //=======================================================================
122 void TDataStd_ExtStringArray::SetValue(const Standard_Integer index, const TCollection_ExtendedString& value)
124 if(myValue.IsNull()) return;
125 if( myValue->Value(index) == value)
129 myValue->SetValue(index, value);
133 //=======================================================================
136 //=======================================================================
138 const TCollection_ExtendedString& TDataStd_ExtStringArray::Value (const Standard_Integer index) const
140 if (myValue.IsNull())
142 static TCollection_ExtendedString staticEmptyValue;
143 return staticEmptyValue;
145 return myValue->Value(index);
148 //=======================================================================
151 //=======================================================================
152 Standard_Integer TDataStd_ExtStringArray::Lower (void) const
154 if(myValue.IsNull()) return 0;
155 return myValue->Lower();
159 //=======================================================================
162 //=======================================================================
163 Standard_Integer TDataStd_ExtStringArray::Upper (void) const
165 if(myValue.IsNull()) return 0;
166 return myValue->Upper();
170 //=======================================================================
173 //=======================================================================
174 Standard_Integer TDataStd_ExtStringArray::Length (void) const
176 if(myValue.IsNull()) return 0;
177 return myValue->Length();
182 //=======================================================================
183 //function : ChangeArray
184 //purpose : If value of <newArray> differs from <myValue>, Backup
185 // : performed and myValue refers to new instance of HArray1OfExtendedString
186 // : that holds <newArray>
187 //=======================================================================
189 void TDataStd_ExtStringArray::ChangeArray(const Handle(TColStd_HArray1OfExtendedString)& newArray,
190 const Standard_Boolean isCheckItems)
192 Standard_Integer aLower = newArray->Lower();
193 Standard_Integer anUpper = newArray->Upper();
194 Standard_Boolean aDimEqual = Standard_False;
197 if (Lower() == aLower && Upper() == anUpper ) {
198 aDimEqual = Standard_True;
199 Standard_Boolean isEqual = Standard_True;
201 for(i = aLower; i <= anUpper; i++) {
202 if(myValue->Value(i) != newArray->Value(i)) {
203 isEqual = Standard_False;
214 // Handles of myValue of current and backuped attributes will be different!!!
215 if(myValue.IsNull() || !aDimEqual)
216 myValue = new TColStd_HArray1OfExtendedString(aLower, anUpper);
218 for(i = aLower; i <= anUpper; i++)
219 myValue->SetValue(i, newArray->Value(i));
222 //=======================================================================
225 //=======================================================================
227 const Standard_GUID& TDataStd_ExtStringArray::ID () const { return myID; }
229 //=======================================================================
232 //=======================================================================
234 void TDataStd_ExtStringArray::SetID( const Standard_GUID& theGuid)
236 if(myID == theGuid) return;
241 //=======================================================================
243 //purpose : sets default ID
244 //=======================================================================
246 void TDataStd_ExtStringArray::SetID()
252 //=======================================================================
253 //function : NewEmpty
255 //=======================================================================
257 Handle(TDF_Attribute) TDataStd_ExtStringArray::NewEmpty () const
259 return new TDataStd_ExtStringArray();
262 //=======================================================================
265 //=======================================================================
267 void TDataStd_ExtStringArray::Restore(const Handle(TDF_Attribute)& With)
269 Standard_Integer i, lower, upper;
270 Handle(TDataStd_ExtStringArray) anArray = Handle(TDataStd_ExtStringArray)::DownCast(With);
271 if(!anArray->myValue.IsNull()) {
272 lower = anArray->Lower();
273 upper = anArray->Upper();
274 myValue = new TColStd_HArray1OfExtendedString(lower, upper);
275 for(i = lower; i<=upper; i++)
276 myValue->SetValue(i, anArray->Value(i));
277 myIsDelta = anArray->myIsDelta;
278 myID = anArray->ID();
284 //=======================================================================
287 //=======================================================================
289 void TDataStd_ExtStringArray::Paste (const Handle(TDF_Attribute)& Into,
290 const Handle(TDF_RelocationTable)& ) const
292 if(!myValue.IsNull()) {
293 Handle(TDataStd_ExtStringArray) anAtt = Handle(TDataStd_ExtStringArray)::DownCast(Into);
294 if(!anAtt.IsNull()) {
295 anAtt->ChangeArray( myValue, Standard_False );
296 anAtt->SetDelta(myIsDelta);
302 //=======================================================================
305 //=======================================================================
307 Standard_OStream& TDataStd_ExtStringArray::Dump (Standard_OStream& anOS) const
309 anOS << "\nExtStringArray :";
310 if(!myValue.IsNull()) {
311 Standard_Integer i, lower, upper;
312 lower = myValue->Lower();
313 upper = myValue->Upper();
314 for(i = lower; i<=upper; i++)
315 anOS << "\t" <<myValue->Value(i)<<endl;
317 anOS << " Delta is " << (myIsDelta ? "ON":"OFF");
318 Standard_Character sguid[Standard_GUID_SIZE_ALLOC];
319 myID.ToCString(sguid);
325 //=======================================================================
326 //function : DeltaOnModification
328 //=======================================================================
330 Handle(TDF_DeltaOnModification) TDataStd_ExtStringArray::DeltaOnModification
331 (const Handle(TDF_Attribute)& OldAttribute) const
334 return new TDataStd_DeltaOnModificationOfExtStringArray(Handle(TDataStd_ExtStringArray)::DownCast (OldAttribute));
335 else return new TDF_DefaultDeltaOnModification(OldAttribute);