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