1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-26 10:19:45 +03:00
occt/src/IFSelect/IFSelect_EditForm.cxx
2012-03-05 19:23:40 +04:00

526 lines
16 KiB
C++
Executable File

#include <IFSelect_EditForm.ixx>
#include <Interface_TypedValue.hxx>
#include <Interface_MSG.hxx>
#include <Message_Messenger.hxx>
#include <Message.hxx>
IFSelect_EditForm::IFSelect_EditForm
(const Handle(IFSelect_Editor)& editor,
const Standard_Boolean readonly, const Standard_Boolean undoable,
const Standard_CString label)
: thecomplete (Standard_True) ,
theloaded (Standard_False) ,
thekeepst (Standard_False) ,
thelabel (label) ,
thenums (0,1) ,
theorigs (0, (undoable ? editor->NbValues() : 0) ) ,
themodifs (0, (readonly ? 0 : editor->NbValues()) ) ,
thestatus (0, (readonly ? 0 : editor->NbValues()) ) ,
theeditor (editor) ,
thetouched (0) { }
IFSelect_EditForm::IFSelect_EditForm
(const Handle(IFSelect_Editor)& editor,
const TColStd_SequenceOfInteger& nums,
const Standard_Boolean readonly, const Standard_Boolean undoable,
const Standard_CString label)
: thecomplete (Standard_False) ,
theloaded (Standard_False) ,
thekeepst (Standard_False) ,
thelabel (label) ,
thenums (0,nums.Length()) ,
theorigs (0, (undoable ? nums.Length() : 0) ) ,
themodifs (0, (readonly ? 0 : nums.Length()) ) ,
thestatus (0, (readonly ? 0 : nums.Length()) ) ,
theeditor (editor) ,
thetouched (0)
{
Standard_Integer i,nb = nums.Length();
for (i = 1; i <= nb; i ++) thenums.SetValue (i,nums.Value(i));
}
Standard_Boolean& IFSelect_EditForm::EditKeepStatus ()
{ return thekeepst; }
Standard_CString IFSelect_EditForm::Label () const
{ return thelabel.ToCString(); }
Standard_Boolean IFSelect_EditForm::IsLoaded () const
{ return theloaded; }
void IFSelect_EditForm::ClearData ()
{ theent.Nullify(); themodel.Nullify(); theloaded = Standard_False; }
void IFSelect_EditForm::SetData
(const Handle(Standard_Transient)& ent,
const Handle(Interface_InterfaceModel)& model)
{ theent = ent; themodel = model; }
void IFSelect_EditForm::SetEntity
(const Handle(Standard_Transient)& ent)
{ theent = ent; }
void IFSelect_EditForm::SetModel
(const Handle(Interface_InterfaceModel)& model)
{ themodel = model; }
Handle(Standard_Transient) IFSelect_EditForm::Entity () const
{ return theent; }
Handle(Interface_InterfaceModel) IFSelect_EditForm::Model () const
{ return themodel; }
Handle(IFSelect_Editor) IFSelect_EditForm::Editor () const
{ return theeditor; }
Standard_Boolean IFSelect_EditForm::IsComplete () const
{ return thecomplete; }
Standard_Integer IFSelect_EditForm::NbValues
(const Standard_Boolean editable) const
{
if (!editable || thecomplete) return theeditor->NbValues();
return thenums.Upper();
}
Standard_Integer IFSelect_EditForm::NumberFromRank
(const Standard_Integer rank) const
{
if (thecomplete) return rank;
if (rank < 1 || rank > thenums.Upper()) return 0;
return thenums.Value(rank);
}
Standard_Integer IFSelect_EditForm::RankFromNumber
(const Standard_Integer num) const
{
if (thecomplete) return num;
Standard_Integer i, n = thenums.Upper();
for (i = 1; i <= n; i ++) {
if (thenums.Value(i) == num) return i;
}
return 0;
}
Standard_Integer IFSelect_EditForm::NameNumber
(const Standard_CString name) const
{
Standard_Integer res = theeditor->NameNumber(name);
if (thecomplete || res == 0) return res;
// Sinon, chercher res dans thenums
Standard_Integer i, nb = thenums.Length();
for (i = 1; i <= nb; i ++) {
if (res == thenums.Value(i)) return res;
}
return -res;
}
Standard_Integer IFSelect_EditForm::NameRank
(const Standard_CString name) const
{
Standard_Integer res = theeditor->NameNumber(name);
if (thecomplete || res == 0) return res;
// Sinon, chercher res dans thenums
Standard_Integer i, nb = thenums.Length();
for (i = 1; i <= nb; i ++) {
if (res == thenums.Value(i)) return i;
}
return 0;
}
void IFSelect_EditForm::LoadDefault ()
{
theloaded = Standard_True;
thetouched = 0;
Standard_Integer i,nb = theorigs.Upper();
if (nb == 0) return;
for (i = 1; i <= nb; i ++) {
Standard_Integer num = NumberFromRank(i);
if (num == 0) continue;
Handle(TCollection_HAsciiString) str = theeditor->StringValue (this,num);
theorigs.SetValue (i,str);
}
}
Standard_Boolean IFSelect_EditForm::LoadData
(const Handle(Standard_Transient)& ent,
const Handle(Interface_InterfaceModel)& model)
{
thetouched = 0;
if (!theeditor->Load (this,ent,model)) return Standard_False;
SetData (ent,model);
theloaded = Standard_True;
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::LoadEntity
(const Handle(Standard_Transient)& ent)
{
thetouched = 0;
Handle(Interface_InterfaceModel) model;
if (!theeditor->Load (this,ent,model)) return Standard_False;
SetEntity (ent);
theloaded = Standard_True;
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::LoadModel
(const Handle(Interface_InterfaceModel)& model)
{
thetouched = 0;
Handle(Standard_Transient) ent;
if (!theeditor->Load (this,ent,model)) return Standard_False;
SetData (ent,model);
theloaded = Standard_True;
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::LoadData ()
{
thetouched = 0;
Handle(Interface_InterfaceModel) model;
Handle(Standard_Transient) ent;
if (!theeditor->Load (this,ent,model)) return Standard_False;
theloaded = Standard_True;
return Standard_True;
}
// ######## VALUES ########
Handle(IFSelect_ListEditor) IFSelect_EditForm::ListEditor
(const Standard_Integer num) const
{
Standard_Integer n = RankFromNumber(num);
Handle(IFSelect_ListEditor) led;
if (n <= 0 || n > theorigs.Upper()) return led;
if (!theeditor->IsList(n)) return led;
led = theeditor->ListEditor (num);
Handle(TColStd_HSequenceOfHAsciiString) lis = theeditor->ListValue(this,num);
led->LoadModel (themodel);
led->LoadValues (lis);
return led;
}
void IFSelect_EditForm::LoadValue
(const Standard_Integer num, const Handle(TCollection_HAsciiString)& val)
{
Standard_Integer n = RankFromNumber(num);
if (n <= 0 || n > theorigs.Upper()) return;
theorigs.SetValue (n,val);
}
void IFSelect_EditForm::LoadList
(const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& list)
{
Standard_Integer n = RankFromNumber(num);
if (n <= 0 || n > theorigs.Upper()) return;
theorigs.SetValue (n,list);
}
Handle(TCollection_HAsciiString) IFSelect_EditForm::OriginalValue
(const Standard_Integer num) const
{
Standard_Integer n = RankFromNumber(num);
Handle(TCollection_HAsciiString) val;
if (theorigs.Upper() == 0) return theeditor->StringValue (this,num);
else return Handle(TCollection_HAsciiString)::DownCast(theorigs.Value(n));
}
Handle(TColStd_HSequenceOfHAsciiString) IFSelect_EditForm::OriginalList
(const Standard_Integer num) const
{
Standard_Integer n = RankFromNumber(num);
Handle(TColStd_HSequenceOfHAsciiString) list;
if (theorigs.Upper() == 0) return theeditor->ListValue (this,num);
else return Handle(TColStd_HSequenceOfHAsciiString)::DownCast(theorigs.Value(n));
}
Handle(TCollection_HAsciiString) IFSelect_EditForm::EditedValue
(const Standard_Integer num) const
{
if (themodifs.Upper() == 0) return OriginalValue(num);
if (!IsModified(num)) return OriginalValue(num);
Standard_Integer n = RankFromNumber(num);
return Handle(TCollection_HAsciiString)::DownCast(themodifs.Value(n));
}
Handle(TColStd_HSequenceOfHAsciiString) IFSelect_EditForm::EditedList
(const Standard_Integer num) const
{
if (themodifs.Upper() == 0) return OriginalList(num);
if (!IsModified(num)) return OriginalList(num);
Standard_Integer n = RankFromNumber(num);
return Handle(TColStd_HSequenceOfHAsciiString)::DownCast(themodifs.Value(n));
}
Standard_Boolean IFSelect_EditForm::IsModified
(const Standard_Integer num) const
{
if (thestatus.Upper() == 0) return Standard_False;
Standard_Integer n = RankFromNumber(num);
return (thestatus.Value(n) != 0);
}
Standard_Boolean IFSelect_EditForm::IsTouched
(const Standard_Integer num) const
{
if (thestatus.Upper() == 0) return Standard_False;
Standard_Integer n = RankFromNumber(num);
return (thestatus.Value(n) == 2);
}
Standard_Boolean IFSelect_EditForm::Modify
(const Standard_Integer num, const Handle(TCollection_HAsciiString)& newval,
const Standard_Boolean enforce)
{
// Peut-on editer
thetouched = 0;
if (themodifs.Upper() == 0) return Standard_False;
Standard_Integer tnum = RankFromNumber(num);
if (tnum == 0) return Standard_False;
IFSelect_EditValue acc = theeditor->EditMode (num);
if (newval.IsNull() && acc != IFSelect_Optional) return Standard_False;
if (!enforce && (acc == IFSelect_EditProtected || acc == IFSelect_EditComputed)) return Standard_False;
// Satisfies ?
Handle(Interface_TypedValue) typval = theeditor->TypedValue(num);
if (!typval->Satisfies(newval)) return Standard_False;
Interface_ParamType pty = typval->Type();
if (pty == Interface_ParamIdent && !newval.IsNull()) {
if (themodel.IsNull()) return Standard_False;
if (themodel->NextNumberForLabel(newval->ToCString(),0,Standard_False) <= 0)
return Standard_False;
}
// Update ?
if (!theeditor->Update(this,num,newval,enforce)) return Standard_False;
thestatus.SetValue (tnum,1);
themodifs.SetValue (tnum,newval);
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::ModifyList
(const Standard_Integer num, const Handle(IFSelect_ListEditor)& edited,
const Standard_Boolean enforce)
{
// Faut-il prendre
if (edited.IsNull()) return Standard_False;
if (!edited->IsTouched()) return Standard_False;
Handle(TColStd_HSequenceOfHAsciiString) newlist = edited->EditedValues();
// Peut-on editer
thetouched = 0;
if (themodifs.Upper() == 0) return Standard_False;
Standard_Integer tnum = RankFromNumber(num);
if (tnum == 0) return Standard_False;
IFSelect_EditValue acc = theeditor->EditMode (num);
if (acc == IFSelect_EditRead || acc == IFSelect_EditDynamic) return Standard_False;
if (newlist.IsNull() && acc != IFSelect_Optional) return Standard_False;
if (!enforce && (acc == IFSelect_EditProtected || acc == IFSelect_EditComputed)) return Standard_False;
// Update ?
if (!theeditor->UpdateList(this,num,newlist,enforce)) return Standard_False;
thestatus.SetValue (tnum,1);
themodifs.SetValue (tnum,newlist);
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::ModifyListValue
(const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& list,
const Standard_Boolean enforce)
{
Handle(IFSelect_ListEditor) led = ListEditor (num);
if (led.IsNull()) return Standard_False;
if (!led->LoadEdited(list)) return Standard_False;
return ModifyList (num,led,enforce);
}
Standard_Boolean IFSelect_EditForm::Touch
(const Standard_Integer num, const Handle(TCollection_HAsciiString)& newval)
{
if (themodifs.Upper() == 0) return Standard_False;
Standard_Integer tnum = RankFromNumber(num);
if (tnum == 0) return Standard_False;
thestatus.SetValue (tnum,2);
themodifs.SetValue (tnum,newval);
thetouched ++;
return Standard_True;
}
Standard_Boolean IFSelect_EditForm::TouchList
(const Standard_Integer num, const Handle(TColStd_HSequenceOfHAsciiString)& newlist)
{
if (themodifs.Upper() == 0) return Standard_False;
Standard_Integer tnum = RankFromNumber(num);
if (tnum == 0) return Standard_False;
thestatus.SetValue (tnum,2);
themodifs.SetValue (tnum,newlist);
thetouched ++;
return Standard_True;
}
void IFSelect_EditForm::ClearEdit (const Standard_Integer num)
{
Standard_Integer i, nb = thestatus.Upper();
if (num == 0) {
for (i = 1; i <= nb; i ++) thestatus.SetValue (i,0);
} else {
Standard_Integer tnum = RankFromNumber(num);
if (tnum > 0 && num <= nb) thestatus.SetValue (tnum,0);
}
}
void IFSelect_EditForm::PrintDefs (const Handle(Message_Messenger)& S) const
{
Standard_Integer iv, nbv = NbValues(Standard_True);
S<<"***** EditForm, Label : "<<Label()<<endl;
if (IsComplete()) S<<"Complete, "<<nbv<<" Values"<<endl;
else {
S<<"Extraction on "<<nbv<<" Values : (extracted<-editor)"<<endl;
for (iv = 1; iv <= nbv; iv ++) S<<" "<<iv<<"<-"<<NumberFromRank(iv);
S<<endl;
}
S<<"*****"<<endl;
}
static void PrintList
(const Handle(TColStd_HSequenceOfHAsciiString)& list,
const Handle(Message_Messenger)& S, const Standard_Boolean alsolist)
{
if (list.IsNull()) { S<<"(NULL LIST)"<<endl; return; }
Standard_Integer i,nb = list->Length();
S<<"(List : "<<nb<<" Items)"<<endl;
if (!alsolist) return;
for (i = 1; i <= nb; i ++) {
Handle(TCollection_HAsciiString) str = list->Value(i);
S<<" ["<<i<<"] "<< (str.IsNull() ? "(NULL)" : str->ToCString())<<endl;
}
}
void IFSelect_EditForm::PrintValues
(const Handle(Message_Messenger)& S, const Standard_Integer what,
const Standard_Boolean names, const Standard_Boolean alsolist) const
{
Standard_Integer iv, nbv = NbValues(Standard_True);
S<< "****************************************************"<<endl;
S<<"***** "<<Label()<<Interface_MSG::Blanks(Label(),40)<<"*****"<<endl;
S<<"***** *****"<<endl;
if (!theloaded)
S<<"***** Values are NOT loaded *****"<<endl;
else {
// Donnees sur lesquelles on a travaille
if (themodel.IsNull()) {
if (theent.IsNull()) S<<"***** No loaded data";
else S<<"***** No loaded Model. Loaded object : type "<<theent->DynamicType()->Name();
} else {
if (theent.IsNull()) S<<"***** No loaded entity";
else { S<<"***** Loaded entity : "; themodel->PrintLabel (theent,S); }
}
}
S<<endl<<"****************************************************"<<endl<<endl;
// Affichage des valeurs
Standard_Boolean nams = names;
Standard_Integer maxnam = theeditor->MaxNameLength (names ? 0 : -1);
if (maxnam == 0) { maxnam = theeditor->MaxNameLength (0); nams = Standard_True; }
Standard_Integer nbmod = 0;
if (what != 0) S<<"Mod N0 Name Value"<<endl;
else S<<" N0 Name Value"<<endl;
for (iv = 1; iv <= nbv; iv ++) {
Standard_Integer jv = NumberFromRank(iv);
Standard_CString name = theeditor->Name(jv,!nams);
// Original ou Final
if (what != 0) {
Handle(TCollection_HAsciiString) str;
if (IsModified(jv)) S<<"* ";
else S<<" ";
S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
<<name<<Interface_MSG::Blanks(name,maxnam)<<" ";
if (theeditor->IsList(jv)) {
Handle(TColStd_HSequenceOfHAsciiString) list;
if (what < 0) list = OriginalList (jv);
if (what > 0) list = EditedList (jv);
PrintList (list,S,alsolist);
continue;
}
if (what < 0) str = OriginalValue (jv);
if (what > 0) str = EditedValue (jv);
S << (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
// Modified only
} else {
if (!IsModified(jv)) continue;
nbmod ++;
if (theeditor->IsList(jv)) {
Handle(TColStd_HSequenceOfHAsciiString) list= OriginalList (jv);
S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
<<name<<Interface_MSG::Blanks(name,maxnam)<<" ORIG:";
PrintList (list,S,alsolist);
list = EditedList (jv);
S<<Interface_MSG::Blanks("",maxnam+5)<<"MOD :";
PrintList (list,S,alsolist);
continue;
}
Handle(TCollection_HAsciiString) str = OriginalValue (jv);
S <<Interface_MSG::Blanks(iv,3)<<iv<<" "
<<name<<Interface_MSG::Blanks(name,maxnam)<<" ORIG:"
<< (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
str = EditedValue (jv);
S<<Interface_MSG::Blanks("",maxnam+4)<<" MOD :"<< (str.IsNull() ? "(NULL)" : str->ToCString()) <<endl;
}
}
if (what == 0) S<<"On "<<nbv<<" Values, "<<nbmod<<" Modified"<<endl;
}
Standard_Boolean IFSelect_EditForm::Apply ()
{
Standard_Boolean stat = ApplyData(theent,themodel);
if (stat && !thekeepst) ClearEdit();
return stat;
}
Standard_Boolean IFSelect_EditForm::Recognize () const
{ return theeditor->Recognize(this); }
Standard_Boolean IFSelect_EditForm::ApplyData
(const Handle(Standard_Transient)& ent,
const Handle(Interface_InterfaceModel)& model)
{ return theeditor->Apply (this,ent,model); }
Standard_Boolean IFSelect_EditForm::Undo ()
{
if (thestatus.Upper() == 0 || theorigs.Upper() == 0) return Standard_False;
Standard_Integer i, nb = thestatus.Upper();
for (i = 1; i <= nb; i ++) {
if (thestatus.Value (i) != 0) themodifs.SetValue (i,theorigs.Value(i));
}
return Apply ();
}