0026936: Drawbacks of inlining in new type system in OCCT 7.0 -- 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
92efcf78 28IMPLEMENT_STANDARD_RTTIEXT(IFSelect_EditForm,MMgt_TShared)
29
b311480e 30IFSelect_EditForm::IFSelect_EditForm
7fd59977 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
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
65 Standard_Boolean& IFSelect_EditForm::EditKeepStatus ()
66 { return thekeepst; }
67
68 Standard_CString IFSelect_EditForm::Label () const
69 { return thelabel.ToCString(); }
70
71 Standard_Boolean IFSelect_EditForm::IsLoaded () const
72 { return theloaded; }
73
74 void IFSelect_EditForm::ClearData ()
75 { theent.Nullify(); themodel.Nullify(); theloaded = Standard_False; }
76
77 void IFSelect_EditForm::SetData
78 (const Handle(Standard_Transient)& ent,
79 const Handle(Interface_InterfaceModel)& model)
80 { theent = ent; themodel = model; }
81
82 void IFSelect_EditForm::SetEntity
83 (const Handle(Standard_Transient)& ent)
84 { theent = ent; }
85
86 void IFSelect_EditForm::SetModel
87 (const Handle(Interface_InterfaceModel)& model)
88 { themodel = model; }
89
90 Handle(Standard_Transient) IFSelect_EditForm::Entity () const
91 { return theent; }
92
93 Handle(Interface_InterfaceModel) IFSelect_EditForm::Model () const
94 { return themodel; }
95
96 Handle(IFSelect_Editor) IFSelect_EditForm::Editor () const
97 { return theeditor; }
98
99 Standard_Boolean IFSelect_EditForm::IsComplete () const
100 { return thecomplete; }
101
102 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
109 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
117 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
128 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
141 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
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
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
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
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
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
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
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
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
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
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
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
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
284 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
292 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
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
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
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
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
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
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
408 void IFSelect_EditForm::PrintDefs (const Handle(Message_Messenger)& S) const
409{
410 Standard_Integer iv, nbv = NbValues(Standard_True);
411 S<<"***** EditForm, Label : "<<Label()<<endl;
412 if (IsComplete()) S<<"Complete, "<<nbv<<" Values"<<endl;
413 else {
414 S<<"Extraction on "<<nbv<<" Values : (extracted<-editor)"<<endl;
415 for (iv = 1; iv <= nbv; iv ++) S<<" "<<iv<<"<-"<<NumberFromRank(iv);
416 S<<endl;
417 }
418 S<<"*****"<<endl;
419}
420
421
422static void PrintList
423 (const Handle(TColStd_HSequenceOfHAsciiString)& list,
424 const Handle(Message_Messenger)& S, const Standard_Boolean alsolist)
425{
426 if (list.IsNull()) { S<<"(NULL LIST)"<<endl; return; }
427
428 Standard_Integer i,nb = list->Length();
429 S<<"(List : "<<nb<<" Items)"<<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())<<endl;
435 }
436}
437
438 void IFSelect_EditForm::PrintValues
439 (const Handle(Message_Messenger)& 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<< "****************************************************"<<endl;
444 S<<"***** "<<Label()<<Interface_MSG::Blanks(Label(),40)<<"*****"<<endl;
445 S<<"***** *****"<<endl;
446 if (!theloaded)
447 S<<"***** Values are NOT loaded *****"<<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<<endl<<"****************************************************"<<endl<<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"<<endl;
467 else S<<" N0 Name Value"<<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()) <<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()) <<endl;
515 str = EditedValue (jv);
516 S<<Interface_MSG::Blanks("",maxnam+4)<<" MOD :"<< (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
517 }
518 }
519 if (what == 0) S<<"On "<<nbv<<" Values, "<<nbmod<<" Modified"<<endl;
520}
521
522
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
531 Standard_Boolean IFSelect_EditForm::Recognize () const
532 { return theeditor->Recognize(this); }
533
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
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}