0023016: Elimination of dependency of Tcl OCAF Browser from Tix product
[occt.git] / src / DDF / DDF_TransactionCommands.cxx
1 // File:        DDF_TransactionCommands.cxx
2 //              ---------------------------
3 // Author:      DAUTRY Philippe
4 //              <fid@fox.paris1.matra-dtv.fr>
5 // Copyright:   Matra Datavision 1997
6 // Version:     0.0
7 // History:     Version Date            Purpose
8 //              0.0     Sep 30 1997     Creation
9
10
11
12 #include <DDF.hxx>
13 #include <DDF_Data.hxx>
14 #include <DDF_Transaction.hxx>
15 #include <DDF_TransactionStack.hxx>
16
17 #include <Draw.hxx>
18 #include <Draw_Appli.hxx>
19 #include <Draw_Drawable3D.hxx>
20 #include <Draw_Interpretor.hxx>
21
22 #include <TDF_Data.hxx>
23 #include <TDF_Delta.hxx>
24 #include <TDF_Transaction.hxx>
25
26 static DDF_TransactionStack DDF_TStack;
27 static Handle(TDF_Delta)    DDF_LastDelta;
28
29 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
30 // Transaction commands
31 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
32
33
34
35 //=======================================================================
36 //function : OpenTran
37 //purpose  : Opens a transaction
38 //=======================================================================
39
40 static Standard_Integer OpenTran (Draw_Interpretor& di, 
41                                   Standard_Integer  n, 
42                                   const char**            a)
43 {
44   if (n < 2) return 1;
45
46   Handle(TDF_Data) DF;
47   if (DDF::GetDF (a[1], DF)) {
48     Handle(DDF_Transaction) tr = new DDF_Transaction(DF);
49     di<<"Open transaction # "<<tr->Open()<<" # "<<DF->Transaction()<<"\n";
50     DDF_TStack.Push(tr);
51   }
52   return 0;
53 }
54
55
56 //=======================================================================
57 //function : AbortTran
58 //purpose  : Aborts a transaction
59 //=======================================================================
60
61 static Standard_Integer AbortTran (Draw_Interpretor& di, 
62                                    Standard_Integer  n, 
63                                    const char**            a)
64
65   if (n < 2) return 1;
66
67   Handle(TDF_Data) DF;
68   if (DDF::GetDF (a[1], DF)) {
69     if (DF->Transaction () > 0) {
70       Handle(DDF_Transaction) tr = DDF_TStack.Top();
71       di<<"Abort transaction # "<<tr->Transaction()<<" # "<<DF->Transaction()<<"\n";
72       tr->Abort();
73       DDF_TStack.Pop();
74     }
75     else {
76       di<<"DDF_BasicCommands::AbortTran - No more transaction to abort"<<"\n";
77     }
78   }
79   return 0;
80 }
81
82
83 //=======================================================================
84 //function : CommitTran
85 //purpose  : Commits a transaction
86 //=======================================================================
87
88 static Standard_Integer CommitTran (Draw_Interpretor& di, 
89                                     Standard_Integer  n, 
90                                     const char**            a)
91 {
92   if (n < 2) return 1;
93
94   Handle(TDF_Data) DF;
95   if (DDF::GetDF (a[1], DF)) {
96     if (DF->Transaction () > 0) {
97       Handle(DDF_Transaction) tr = DDF_TStack.Top();
98       di<<"Commit transaction # "<<tr->Transaction()<<" # "<<DF->Transaction()<<"\n";
99       Standard_Boolean withDelta = Standard_False;
100       if (n > 2) withDelta = (atoi(a[2]) != 0);
101       DDF_LastDelta = tr->Commit(withDelta);
102       DDF_TStack.Pop();
103     }
104     else {
105       di<<"DDF_BasicCommands::CommitTran - No more transaction to commit"<<"\n";
106     }
107   }
108   return 0;
109 }
110
111
112 //=======================================================================
113 //function : CurrentTran
114 //purpose  : Current transaction number.
115 //=======================================================================
116
117 static Standard_Integer CurrentTran (Draw_Interpretor& di, 
118                                      Standard_Integer  n, 
119                                      const char**            a)
120 {
121   if (n < 2) return 1;
122
123   Handle(TDF_Data) DF;
124   if (DDF::GetDF (a[1], DF)) {
125     di<<"# "<<DF->Transaction()<<"\n";
126     if (!DDF_TStack.IsEmpty())
127       if (DF->Transaction() != DDF_TStack.Top()->Transaction())
128         di<<"Transaction object said # "<<DDF_TStack.Top()->Transaction()<<"\n";
129   }
130   return 0;
131
132 }
133
134
135
136
137 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
138 // Delta commands
139 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
140
141
142
143 //=======================================================================
144 //function : Undo
145 //purpose  : Undo
146 //=======================================================================
147
148 static Standard_Integer Undo (Draw_Interpretor& di, 
149                               Standard_Integer  n, 
150                               const char**            a)
151
152   if (n < 2) return 1;
153
154   Handle(TDF_Data) DF;
155   if (DDF::GetDF (a[1], DF)) {
156     Standard_Boolean withDelta = Standard_False;
157     if (n > 2) withDelta = (atoi(a[2]) != 0);
158     if (!DDF_LastDelta.IsNull()) {
159       if (DF->IsApplicable(DDF_LastDelta)) {
160         Handle(TDF_Delta) tmp = DF->Undo(DDF_LastDelta,withDelta);
161         DDF_LastDelta = tmp;
162       }
163       else {
164         di<<"Undo not applicable HERE and NOW."<<"\n";
165         return 1;
166       }
167     }
168     else {
169       di<<"No undo to apply."<<"\n";
170       return 1;
171     }
172   }
173   else {
174     di<<"Unknown DF."<<"\n";
175     return 1;
176   }
177   return 0;
178 }
179
180
181 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
182
183
184
185
186 //=======================================================================
187 //function : TransactionCommands
188 //purpose  : 
189 //=======================================================================
190
191 void DDF::TransactionCommands (Draw_Interpretor& theCommands) 
192 {
193   static Standard_Boolean done = Standard_False;
194   if (done) return;
195   done = Standard_True;
196
197   const char* g = "DF transaction and undo commands";
198
199   // Transaction :
200   // +++++++++++++
201   theCommands.Add
202     ("OpenTran",
203      "Opens a transaction on a DF: OpenTran dfname",
204      __FILE__, OpenTran, g);
205
206   theCommands.Add
207     ("AbortTran",
208      "Aborts a transaction on a DF: AbortTran dfname",
209      __FILE__, AbortTran, g);
210
211   theCommands.Add
212     ("CommitTran",
213      "Commits a transaction on a DF with/without delta generation : CommitTran dfname [withDelta]",
214      __FILE__, CommitTran, g);
215
216   theCommands.Add
217     ("CurrentTran",
218      "Returns the current transaction number on a DF : CurrentTran dfname",
219      __FILE__, CurrentTran, g);
220
221   // Undo :
222   // ++++++
223   theCommands.Add
224     ("DFUndo",
225      " Undos last DF commit modifications: Undo dfname [withDelta]",
226      __FILE__, Undo, g);
227
228
229 }