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