0024002: Overall code and build procedure refactoring -- automatic
[occt.git] / src / IFSelect / IFSelect_EditForm.cxx
CommitLineData
973c2be1 1// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 2//
973c2be1 3// This file is part of Open CASCADE Technology software library.
b311480e 4//
d5f74e42 5// This library is free software; you can redistribute it and/or modify it under
6// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 7// by the Free Software Foundation, with special exception defined in the file
8// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9// distribution for complete text of the license and disclaimer of any warranty.
b311480e 10//
973c2be1 11// Alternatively, this file may be used under the terms of Open CASCADE
12// commercial license or contractual agreement.
b311480e 13
42cf5bc1 14
15#include <IFSelect_EditForm.hxx>
16#include <IFSelect_Editor.hxx>
17#include <IFSelect_ListEditor.hxx>
18#include <Interface_InterfaceModel.hxx>
7fd59977 19#include <Interface_MSG.hxx>
42cf5bc1 20#include <Interface_TypedValue.hxx>
7fd59977 21#include <Message.hxx>
42cf5bc1 22#include <Message_Messenger.hxx>
23#include <Standard_Transient.hxx>
24#include <Standard_Type.hxx>
ec357c5c 25#include <TCollection_HAsciiString.hxx>
26#include <TColStd_HSequenceOfHAsciiString.hxx>
7fd59977 27
b311480e 28IFSelect_EditForm::IFSelect_EditForm
7fd59977 29 (const Handle(IFSelect_Editor)& editor,
30 const Standard_Boolean readonly, const Standard_Boolean undoable,
31 const Standard_CString label)
32 : thecomplete (Standard_True) ,
33 theloaded (Standard_False) ,
34 thekeepst (Standard_False) ,
35 thelabel (label) ,
36 thenums (0,1) ,
37 theorigs (0, (undoable ? editor->NbValues() : 0) ) ,
38 themodifs (0, (readonly ? 0 : editor->NbValues()) ) ,
39 thestatus (0, (readonly ? 0 : editor->NbValues()) ) ,
40 theeditor (editor) ,
41 thetouched (0) { }
42
43 IFSelect_EditForm::IFSelect_EditForm
44 (const Handle(IFSelect_Editor)& editor,
45 const TColStd_SequenceOfInteger& nums,
46 const Standard_Boolean readonly, const Standard_Boolean undoable,
47 const Standard_CString label)
48 : thecomplete (Standard_False) ,
49 theloaded (Standard_False) ,
50 thekeepst (Standard_False) ,
51 thelabel (label) ,
52 thenums (0,nums.Length()) ,
53 theorigs (0, (undoable ? nums.Length() : 0) ) ,
54 themodifs (0, (readonly ? 0 : nums.Length()) ) ,
55 thestatus (0, (readonly ? 0 : nums.Length()) ) ,
56 theeditor (editor) ,
57 thetouched (0)
58{
59 Standard_Integer i,nb = nums.Length();
60 for (i = 1; i <= nb; i ++) thenums.SetValue (i,nums.Value(i));
61}
62
63 Standard_Boolean& IFSelect_EditForm::EditKeepStatus ()
64 { return thekeepst; }
65
66 Standard_CString IFSelect_EditForm::Label () const
67 { return thelabel.ToCString(); }
68
69 Standard_Boolean IFSelect_EditForm::IsLoaded () const
70 { return theloaded; }
71
72 void IFSelect_EditForm::ClearData ()
73 { theent.Nullify(); themodel.Nullify(); theloaded = Standard_False; }
74
75 void IFSelect_EditForm::SetData
76 (const Handle(Standard_Transient)& ent,
77 const Handle(Interface_InterfaceModel)& model)
78 { theent = ent; themodel = model; }
79
80 void IFSelect_EditForm::SetEntity
81 (const Handle(Standard_Transient)& ent)
82 { theent = ent; }
83
84 void IFSelect_EditForm::SetModel
85 (const Handle(Interface_InterfaceModel)& model)
86 { themodel = model; }
87
88 Handle(Standard_Transient) IFSelect_EditForm::Entity () const
89 { return theent; }
90
91 Handle(Interface_InterfaceModel) IFSelect_EditForm::Model () const
92 { return themodel; }
93
94 Handle(IFSelect_Editor) IFSelect_EditForm::Editor () const
95 { return theeditor; }
96
97 Standard_Boolean IFSelect_EditForm::IsComplete () const
98 { return thecomplete; }
99
100 Standard_Integer IFSelect_EditForm::NbValues
101 (const Standard_Boolean editable) const
102{
103 if (!editable || thecomplete) return theeditor->NbValues();
104 return thenums.Upper();
105}
106
107 Standard_Integer IFSelect_EditForm::NumberFromRank
108 (const Standard_Integer rank) const
109{
110 if (thecomplete) return rank;
111 if (rank < 1 || rank > thenums.Upper()) return 0;
112 return thenums.Value(rank);
113}
114
115 Standard_Integer IFSelect_EditForm::RankFromNumber
116 (const Standard_Integer num) const
117{
118 if (thecomplete) return num;
119 Standard_Integer i, n = thenums.Upper();
120 for (i = 1; i <= n; i ++) {
121 if (thenums.Value(i) == num) return i;
122 }
123 return 0;
124}
125
126 Standard_Integer IFSelect_EditForm::NameNumber
127 (const Standard_CString name) const
128{
129 Standard_Integer res = theeditor->NameNumber(name);
130 if (thecomplete || res == 0) return res;
131// Sinon, chercher res dans thenums
132 Standard_Integer i, nb = thenums.Length();
133 for (i = 1; i <= nb; i ++) {
134 if (res == thenums.Value(i)) return res;
135 }
136 return -res;
137}
138
139 Standard_Integer IFSelect_EditForm::NameRank
140 (const Standard_CString name) const
141{
142 Standard_Integer res = theeditor->NameNumber(name);
143 if (thecomplete || res == 0) return res;
144// Sinon, chercher res dans thenums
145 Standard_Integer i, nb = thenums.Length();
146 for (i = 1; i <= nb; i ++) {
147 if (res == thenums.Value(i)) return i;
148 }
149 return 0;
150}
151
152
153 void IFSelect_EditForm::LoadDefault ()
154{
155 theloaded = Standard_True;
156 thetouched = 0;
157 Standard_Integer i,nb = theorigs.Upper();
158 if (nb == 0) return;
159 for (i = 1; i <= nb; i ++) {
160 Standard_Integer num = NumberFromRank(i);
161 if (num == 0) continue;
162 Handle(TCollection_HAsciiString) str = theeditor->StringValue (this,num);
163 theorigs.SetValue (i,str);
164 }
165}
166
167
168 Standard_Boolean IFSelect_EditForm::LoadData
169 (const Handle(Standard_Transient)& ent,
170 const Handle(Interface_InterfaceModel)& model)
171{
172 thetouched = 0;
173 if (!theeditor->Load (this,ent,model)) return Standard_False;
174 SetData (ent,model);
175 theloaded = Standard_True;
176 return Standard_True;
177}
178
179 Standard_Boolean IFSelect_EditForm::LoadEntity
180 (const Handle(Standard_Transient)& ent)
181{
182 thetouched = 0;
183 Handle(Interface_InterfaceModel) model;
184 if (!theeditor->Load (this,ent,model)) return Standard_False;
185 SetEntity (ent);
186 theloaded = Standard_True;
187 return Standard_True;
188}
189
190 Standard_Boolean IFSelect_EditForm::LoadModel
191 (const Handle(Interface_InterfaceModel)& model)
192{
193 thetouched = 0;
194 Handle(Standard_Transient) ent;
195 if (!theeditor->Load (this,ent,model)) return Standard_False;
196 SetData (ent,model);
197 theloaded = Standard_True;
198 return Standard_True;
199}
200
201 Standard_Boolean IFSelect_EditForm::LoadData ()
202{
203 thetouched = 0;
204 Handle(Interface_InterfaceModel) model;
205 Handle(Standard_Transient) ent;
206 if (!theeditor->Load (this,ent,model)) return Standard_False;
207 theloaded = Standard_True;
208 return Standard_True;
209}
210
211
212// ######## VALUES ########
213
214 Handle(IFSelect_ListEditor) IFSelect_EditForm::ListEditor
215 (const Standard_Integer num) const
216{
217 Standard_Integer n = RankFromNumber(num);
218 Handle(IFSelect_ListEditor) led;
219 if (n <= 0 || n > theorigs.Upper()) return led;
220 if (!theeditor->IsList(n)) return led;
221 led = theeditor->ListEditor (num);
222 Handle(TColStd_HSequenceOfHAsciiString) lis = theeditor->ListValue(this,num);
223 led->LoadModel (themodel);
224 led->LoadValues (lis);
225 return led;
226}
227
228 void IFSelect_EditForm::LoadValue
229 (const Standard_Integer num, const Handle(TCollection_HAsciiString)& val)
230{
231 Standard_Integer n = RankFromNumber(num);
232 if (n <= 0 || n > theorigs.Upper()) return;
233 theorigs.SetValue (n,val);
234}
235
236 void IFSelect_EditForm::LoadList
237 (const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& list)
238{
239 Standard_Integer n = RankFromNumber(num);
240 if (n <= 0 || n > theorigs.Upper()) return;
241 theorigs.SetValue (n,list);
242}
243
244
245 Handle(TCollection_HAsciiString) IFSelect_EditForm::OriginalValue
246 (const Standard_Integer num) const
247{
248 Standard_Integer n = RankFromNumber(num);
249 Handle(TCollection_HAsciiString) val;
250 if (theorigs.Upper() == 0) return theeditor->StringValue (this,num);
251 else return Handle(TCollection_HAsciiString)::DownCast(theorigs.Value(n));
252}
253
254 Handle(TColStd_HSequenceOfHAsciiString) IFSelect_EditForm::OriginalList
255 (const Standard_Integer num) const
256{
257 Standard_Integer n = RankFromNumber(num);
258 Handle(TColStd_HSequenceOfHAsciiString) list;
259 if (theorigs.Upper() == 0) return theeditor->ListValue (this,num);
260 else return Handle(TColStd_HSequenceOfHAsciiString)::DownCast(theorigs.Value(n));
261}
262
263 Handle(TCollection_HAsciiString) IFSelect_EditForm::EditedValue
264 (const Standard_Integer num) const
265{
266 if (themodifs.Upper() == 0) return OriginalValue(num);
267 if (!IsModified(num)) return OriginalValue(num);
268 Standard_Integer n = RankFromNumber(num);
269 return Handle(TCollection_HAsciiString)::DownCast(themodifs.Value(n));
270}
271
272 Handle(TColStd_HSequenceOfHAsciiString) IFSelect_EditForm::EditedList
273 (const Standard_Integer num) const
274{
275 if (themodifs.Upper() == 0) return OriginalList(num);
276 if (!IsModified(num)) return OriginalList(num);
277 Standard_Integer n = RankFromNumber(num);
278 return Handle(TColStd_HSequenceOfHAsciiString)::DownCast(themodifs.Value(n));
279}
280
281
282 Standard_Boolean IFSelect_EditForm::IsModified
283 (const Standard_Integer num) const
284{
285 if (thestatus.Upper() == 0) return Standard_False;
286 Standard_Integer n = RankFromNumber(num);
287 return (thestatus.Value(n) != 0);
288}
289
290 Standard_Boolean IFSelect_EditForm::IsTouched
291 (const Standard_Integer num) const
292{
293 if (thestatus.Upper() == 0) return Standard_False;
294 Standard_Integer n = RankFromNumber(num);
295 return (thestatus.Value(n) == 2);
296}
297
298 Standard_Boolean IFSelect_EditForm::Modify
299 (const Standard_Integer num, const Handle(TCollection_HAsciiString)& newval,
300 const Standard_Boolean enforce)
301{
302// Peut-on editer
303 thetouched = 0;
304 if (themodifs.Upper() == 0) return Standard_False;
305 Standard_Integer tnum = RankFromNumber(num);
306 if (tnum == 0) return Standard_False;
307 IFSelect_EditValue acc = theeditor->EditMode (num);
308 if (newval.IsNull() && acc != IFSelect_Optional) return Standard_False;
309 if (!enforce && (acc == IFSelect_EditProtected || acc == IFSelect_EditComputed)) return Standard_False;
310
311// Satisfies ?
312 Handle(Interface_TypedValue) typval = theeditor->TypedValue(num);
313 if (!typval->Satisfies(newval)) return Standard_False;
314 Interface_ParamType pty = typval->Type();
315 if (pty == Interface_ParamIdent && !newval.IsNull()) {
316 if (themodel.IsNull()) return Standard_False;
317 if (themodel->NextNumberForLabel(newval->ToCString(),0,Standard_False) <= 0)
318 return Standard_False;
319 }
320
321// Update ?
322 if (!theeditor->Update(this,num,newval,enforce)) return Standard_False;
323
324 thestatus.SetValue (tnum,1);
325 themodifs.SetValue (tnum,newval);
326 return Standard_True;
327}
328
329 Standard_Boolean IFSelect_EditForm::ModifyList
330 (const Standard_Integer num, const Handle(IFSelect_ListEditor)& edited,
331 const Standard_Boolean enforce)
332{
333// Faut-il prendre
334 if (edited.IsNull()) return Standard_False;
335 if (!edited->IsTouched()) return Standard_False;
336 Handle(TColStd_HSequenceOfHAsciiString) newlist = edited->EditedValues();
337
338// Peut-on editer
339 thetouched = 0;
340 if (themodifs.Upper() == 0) return Standard_False;
341 Standard_Integer tnum = RankFromNumber(num);
342 if (tnum == 0) return Standard_False;
343 IFSelect_EditValue acc = theeditor->EditMode (num);
344 if (acc == IFSelect_EditRead || acc == IFSelect_EditDynamic) return Standard_False;
345 if (newlist.IsNull() && acc != IFSelect_Optional) return Standard_False;
346 if (!enforce && (acc == IFSelect_EditProtected || acc == IFSelect_EditComputed)) return Standard_False;
347
348// Update ?
349 if (!theeditor->UpdateList(this,num,newlist,enforce)) return Standard_False;
350
351 thestatus.SetValue (tnum,1);
352 themodifs.SetValue (tnum,newlist);
353 return Standard_True;
354}
355
356 Standard_Boolean IFSelect_EditForm::ModifyListValue
357 (const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& list,
358 const Standard_Boolean enforce)
359{
360 Handle(IFSelect_ListEditor) led = ListEditor (num);
361 if (led.IsNull()) return Standard_False;
362 if (!led->LoadEdited(list)) return Standard_False;
363 return ModifyList (num,led,enforce);
364}
365
366
367 Standard_Boolean IFSelect_EditForm::Touch
368 (const Standard_Integer num, const Handle(TCollection_HAsciiString)& newval)
369{
370 if (themodifs.Upper() == 0) return Standard_False;
371 Standard_Integer tnum = RankFromNumber(num);
372 if (tnum == 0) return Standard_False;
373
374 thestatus.SetValue (tnum,2);
375 themodifs.SetValue (tnum,newval);
376 thetouched ++;
377 return Standard_True;
378}
379
380 Standard_Boolean IFSelect_EditForm::TouchList
381 (const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& newlist)
382{
383 if (themodifs.Upper() == 0) return Standard_False;
384 Standard_Integer tnum = RankFromNumber(num);
385 if (tnum == 0) return Standard_False;
386
387 thestatus.SetValue (tnum,2);
388 themodifs.SetValue (tnum,newlist);
389 thetouched ++;
390 return Standard_True;
391}
392
393
394 void IFSelect_EditForm::ClearEdit (const Standard_Integer num)
395{
396 Standard_Integer i, nb = thestatus.Upper();
397 if (num == 0) {
398 for (i = 1; i <= nb; i ++) thestatus.SetValue (i,0);
399 } else {
400 Standard_Integer tnum = RankFromNumber(num);
401 if (tnum > 0 && num <= nb) thestatus.SetValue (tnum,0);
402 }
403}
404
405
406 void IFSelect_EditForm::PrintDefs (const Handle(Message_Messenger)& S) const
407{
408 Standard_Integer iv, nbv = NbValues(Standard_True);
409 S<<"***** EditForm, Label : "<<Label()<<endl;
410 if (IsComplete()) S<<"Complete, "<<nbv<<" Values"<<endl;
411 else {
412 S<<"Extraction on "<<nbv<<" Values : (extracted<-editor)"<<endl;
413 for (iv = 1; iv <= nbv; iv ++) S<<" "<<iv<<"<-"<<NumberFromRank(iv);
414 S<<endl;
415 }
416 S<<"*****"<<endl;
417}
418
419
420static void PrintList
421 (const Handle(TColStd_HSequenceOfHAsciiString)& list,
422 const Handle(Message_Messenger)& S, const Standard_Boolean alsolist)
423{
424 if (list.IsNull()) { S<<"(NULL LIST)"<<endl; return; }
425
426 Standard_Integer i,nb = list->Length();
427 S<<"(List : "<<nb<<" Items)"<<endl;
428 if (!alsolist) return;
429
430 for (i = 1; i <= nb; i ++) {
431 Handle(TCollection_HAsciiString) str = list->Value(i);
432 S<<" ["<<i<<"] "<< (str.IsNull() ? "(NULL)" : str->ToCString())<<endl;
433 }
434}
435
436 void IFSelect_EditForm::PrintValues
437 (const Handle(Message_Messenger)& S, const Standard_Integer what,
438 const Standard_Boolean names, const Standard_Boolean alsolist) const
439{
440 Standard_Integer iv, nbv = NbValues(Standard_True);
441 S<< "****************************************************"<<endl;
442 S<<"***** "<<Label()<<Interface_MSG::Blanks(Label(),40)<<"*****"<<endl;
443 S<<"***** *****"<<endl;
444 if (!theloaded)
445 S<<"***** Values are NOT loaded *****"<<endl;
446
447 else {
448// Donnees sur lesquelles on a travaille
449 if (themodel.IsNull()) {
450 if (theent.IsNull()) S<<"***** No loaded data";
451 else S<<"***** No loaded Model. Loaded object : type "<<theent->DynamicType()->Name();
452 } else {
453 if (theent.IsNull()) S<<"***** No loaded entity";
454 else { S<<"***** Loaded entity : "; themodel->PrintLabel (theent,S); }
455 }
456 }
457 S<<endl<<"****************************************************"<<endl<<endl;
458
459// Affichage des valeurs
460 Standard_Boolean nams = names;
461 Standard_Integer maxnam = theeditor->MaxNameLength (names ? 0 : -1);
462 if (maxnam == 0) { maxnam = theeditor->MaxNameLength (0); nams = Standard_True; }
463 Standard_Integer nbmod = 0;
464 if (what != 0) S<<"Mod N0 Name Value"<<endl;
465 else S<<" N0 Name Value"<<endl;
466
467 for (iv = 1; iv <= nbv; iv ++) {
468 Standard_Integer jv = NumberFromRank(iv);
469 Standard_CString name = theeditor->Name(jv,!nams);
470
471// Original ou Final
472 if (what != 0) {
473 Handle(TCollection_HAsciiString) str;
474 if (IsModified(jv)) S<<"* ";
475 else S<<" ";
476 S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
477 <<name<<Interface_MSG::Blanks(name,maxnam)<<" ";
478
479 if (theeditor->IsList(jv)) {
480 Handle(TColStd_HSequenceOfHAsciiString) list;
481 if (what < 0) list = OriginalList (jv);
482 if (what > 0) list = EditedList (jv);
483 PrintList (list,S,alsolist);
484 continue;
485 }
486
487 if (what < 0) str = OriginalValue (jv);
488 if (what > 0) str = EditedValue (jv);
489
490 S << (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
491
492// Modified only
493 } else {
494 if (!IsModified(jv)) continue;
495 nbmod ++;
496 if (theeditor->IsList(jv)) {
497 Handle(TColStd_HSequenceOfHAsciiString) list= OriginalList (jv);
498 S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
499 <<name<<Interface_MSG::Blanks(name,maxnam)<<" ORIG:";
500 PrintList (list,S,alsolist);
501
502 list = EditedList (jv);
503 S<<Interface_MSG::Blanks("",maxnam+5)<<"MOD :";
504 PrintList (list,S,alsolist);
505
506 continue;
507 }
508
509 Handle(TCollection_HAsciiString) str = OriginalValue (jv);
510 S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
511 <<name<<Interface_MSG::Blanks(name,maxnam)<<" ORIG:"
512 << (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
513 str = EditedValue (jv);
514 S<<Interface_MSG::Blanks("",maxnam+4)<<" MOD :"<< (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
515 }
516 }
517 if (what == 0) S<<"On "<<nbv<<" Values, "<<nbmod<<" Modified"<<endl;
518}
519
520
521 Standard_Boolean IFSelect_EditForm::Apply ()
522{
523 Standard_Boolean stat = ApplyData(theent,themodel);
524 if (stat && !thekeepst) ClearEdit();
525 return stat;
526}
527
528
529 Standard_Boolean IFSelect_EditForm::Recognize () const
530 { return theeditor->Recognize(this); }
531
532 Standard_Boolean IFSelect_EditForm::ApplyData
533 (const Handle(Standard_Transient)& ent,
534 const Handle(Interface_InterfaceModel)& model)
535 { return theeditor->Apply (this,ent,model); }
536
537
538 Standard_Boolean IFSelect_EditForm::Undo ()
539{
540 if (thestatus.Upper() == 0 || theorigs.Upper() == 0) return Standard_False;
541 Standard_Integer i, nb = thestatus.Upper();
542 for (i = 1; i <= nb; i ++) {
543 if (thestatus.Value (i) != 0) themodifs.SetValue (i,theorigs.Value(i));
544 }
545 return Apply ();
546}