0031313: Foundation Classes - Dump improvement for classes
[occt.git] / src / TDocStd / TDocStd_XLink.cxx
1 // Created by: DAUTRY Philippe
2 // Copyright (c) 1997-1999 Matra Datavision
3 // Copyright (c) 1999-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 // Version:     0.0
18 //Version       Date            Purpose
19 //              0.0     Sep 15 1997     Creation
20
21 #include <TDocStd_XLink.hxx>
22
23 #include <Standard_GUID.hxx>
24 #include <Standard_NotImplemented.hxx>
25 #include <Standard_Type.hxx>
26 #include <TCollection_AsciiString.hxx>
27 #include <TDF_Attribute.hxx>
28 #include <TDF_AttributeDelta.hxx>
29 #include <TDF_DeltaOnAddition.hxx>
30 #include <TDF_DeltaOnRemoval.hxx>
31 #include <TDF_Label.hxx>
32 #include <TDF_Reference.hxx>
33 #include <TDF_RelocationTable.hxx>
34 #include <TDF_Tool.hxx>
35 #include <TDocStd.hxx>
36 #include <TDocStd_Document.hxx>
37 #include <TDocStd_XLinkIterator.hxx>
38 #include <TDocStd_XLinkRoot.hxx>
39
40 IMPLEMENT_STANDARD_RTTIEXT(TDocStd_XLink,TDF_Attribute)
41
42 //=======================================================================
43 //function : TDocStd_XLink
44 //purpose  : 
45 //=======================================================================
46 TDocStd_XLink::TDocStd_XLink()
47 : myNext(NULL)
48 {}
49
50
51 //=======================================================================
52 //function : Set
53 //purpose  : Class method.
54 //=======================================================================
55
56 Handle(TDocStd_XLink) TDocStd_XLink::Set (const TDF_Label& atLabel) 
57 {
58   Handle(TDocStd_XLink) xRef;
59   if (!atLabel.FindAttribute(TDocStd_XLink::GetID(),xRef)) {
60     xRef = new TDocStd_XLink;  
61     atLabel.AddAttribute(xRef);
62   }
63   return xRef;
64 }
65
66 //=======================================================================
67 //function : Update
68 //purpose  : 
69 //=======================================================================
70
71 Handle(TDF_Reference) TDocStd_XLink::Update ()
72 {
73   TDF_Label reflabel;  
74   Handle(TDocStd_Document) refdoc;
75   Standard_Integer IEntry = myDocEntry.IntegerValue();
76   Handle(TDocStd_Document) mydoc = TDocStd_Document::Get(Label()); //mon document
77   refdoc = Handle(TDocStd_Document)::DownCast(mydoc->Document(IEntry));
78   TDF_Tool::Label(refdoc->GetData(),myLabelEntry,reflabel);
79   // return TXLink::Import(reflabel,Label());
80   return TDF_Reference::Set(Label(),reflabel);
81 }
82
83
84 //=======================================================================
85 //function : ID
86 //purpose  : 
87 //=======================================================================
88
89 const Standard_GUID& TDocStd_XLink::ID() const
90 { return GetID(); }
91
92
93 //=======================================================================
94 //function : GetID
95 //purpose  : 
96 //======================================================================
97
98 const Standard_GUID& TDocStd_XLink::GetID() 
99 {
100   static Standard_GUID myID("5d587400-5690-11d1-8940-080009dc3333");
101   return myID;
102 }
103
104
105 //=======================================================================
106 //function : DocumentEntry
107 //purpose  : 
108 //=======================================================================
109
110 void TDocStd_XLink::DocumentEntry
111 (const TCollection_AsciiString& aDocEntry) 
112 { Backup(); myDocEntry = aDocEntry; }
113
114
115 //=======================================================================
116 //function : DocumentEntry
117 //purpose  : 
118 //=======================================================================
119
120 const TCollection_AsciiString& TDocStd_XLink::DocumentEntry() const
121 { return myDocEntry; }
122
123
124 //=======================================================================
125 //function : LabelEntry
126 //purpose  : 
127 //=======================================================================
128
129 void TDocStd_XLink::LabelEntry
130 (const TDF_Label& aLabel) 
131 {
132   Backup();
133   TDF_Tool::Entry(aLabel,myLabelEntry);
134 }
135
136
137 //=======================================================================
138 //function : LabelEntry
139 //purpose  : 
140 //=======================================================================
141
142 void TDocStd_XLink::LabelEntry
143 (const TCollection_AsciiString& aLabEntry) 
144 { Backup(); myLabelEntry = aLabEntry; }
145
146
147 //=======================================================================
148 //function : LabelEntry
149 //purpose  : 
150 //=======================================================================
151
152 const TCollection_AsciiString& TDocStd_XLink::LabelEntry() const
153 { return myLabelEntry; }
154
155
156 //=======================================================================
157 //function : AfterAddition
158 //purpose  : 
159 //=======================================================================
160
161 void TDocStd_XLink::AfterAddition() 
162 {
163   TDocStd_XLinkRoot::Insert(this);
164   Label().Imported(Standard_True);
165 }
166
167
168 //=======================================================================
169 //function : BeforeRemoval
170 //purpose  : 
171 //=======================================================================
172
173 void TDocStd_XLink::BeforeRemoval() 
174 {
175   if (!IsBackuped()) {
176     TDocStd_XLinkRoot::Remove(this);
177     Label().Imported(Standard_False);
178   }
179 }
180
181
182 //=======================================================================
183 //function : BeforeUndo
184 //purpose  : Before application of a TDF_Delta.
185 //=======================================================================
186
187 Standard_Boolean TDocStd_XLink::BeforeUndo
188 (const Handle(TDF_AttributeDelta)& anAttDelta,
189  const Standard_Boolean /*forceIt*/)
190 {
191   if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnAddition))) {
192     anAttDelta->Attribute()->BeforeRemoval();
193   }
194   return Standard_True;
195 }
196
197
198 //=======================================================================
199 //function : AfterUndo
200 //purpose  : After application of a TDF_Delta.
201 //=======================================================================
202
203 Standard_Boolean TDocStd_XLink::AfterUndo
204 (const Handle(TDF_AttributeDelta)& anAttDelta,
205  const Standard_Boolean /*forceIt*/)
206 {
207   if (anAttDelta->IsKind(STANDARD_TYPE(TDF_DeltaOnRemoval))) {
208     anAttDelta->Attribute()->AfterAddition();
209   }
210   return Standard_True;
211 }
212
213
214 //=======================================================================
215 //function : BackupCopy
216 //purpose  : 
217 //=======================================================================
218
219 Handle(TDF_Attribute) TDocStd_XLink::BackupCopy() const
220 {
221   Handle(TDocStd_XLink) xRef = new TDocStd_XLink();
222   xRef->DocumentEntry(myDocEntry);
223   xRef->LabelEntry(myLabelEntry);
224   return xRef;
225 }
226
227
228 //=======================================================================
229 //function : Restore
230 //purpose  : 
231 //=======================================================================
232
233 void TDocStd_XLink::Restore(const Handle(TDF_Attribute)& anAttribute) 
234 {
235   Handle(TDocStd_XLink) xRef (Handle(TDocStd_XLink)::DownCast(anAttribute));
236   if (!xRef.IsNull()) {
237     myDocEntry = xRef->DocumentEntry();
238     myLabelEntry = xRef->LabelEntry();
239   }
240 }
241
242
243 //=======================================================================
244 //function : NewEmpty
245 //purpose  : 
246 //=======================================================================
247
248 Handle(TDF_Attribute) TDocStd_XLink::NewEmpty() const
249 { return new TDocStd_XLink(); }
250
251
252 //=======================================================================
253 //function : Paste
254 //purpose  : 
255 //=======================================================================
256
257 void TDocStd_XLink::Paste
258 (const Handle(TDF_Attribute)& intoAttribute,
259  const Handle(TDF_RelocationTable)& /*aRelocationTable*/) const
260 {
261   Handle(TDocStd_XLink) xRef (Handle(TDocStd_XLink)::DownCast(intoAttribute));
262   if (!xRef.IsNull()) {
263     xRef->DocumentEntry(myDocEntry);
264     xRef->LabelEntry(myLabelEntry);
265   }
266 }
267
268
269 //=======================================================================
270 //function : Dump
271 //purpose  : 
272 //=======================================================================
273
274 Standard_OStream& TDocStd_XLink::Dump(Standard_OStream& anOS) const
275 {
276   return anOS;
277 }
278