3bdbabdeb0b19671a9c9ea1e71d5ac39b973a9fd
[occt.git] / src / MoniTool / MoniTool_Option.cxx
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 <Dico_DictionaryOfTransient.hxx>
16 #include <Dico_IteratorOfDictionaryOfTransient.hxx>
17 #include <MoniTool_Option.hxx>
18 #include <MoniTool_TypedValue.hxx>
19 #include <Standard_Transient.hxx>
20 #include <Standard_Type.hxx>
21 #include <TCollection_AsciiString.hxx>
22 #include <TCollection_HAsciiString.hxx>
23
24 IMPLEMENT_STANDARD_RTTIEXT(MoniTool_Option,MMgt_TShared)
25
26 MoniTool_Option::MoniTool_Option
27   (const Handle(Standard_Type)& atype, const Standard_CString aname)
28     : thename (aname) , thetype (atype) 
29       {  theitems = new Dico_DictionaryOfTransient();  }
30
31     MoniTool_Option::MoniTool_Option
32   (const Handle(MoniTool_TypedValue)& aval, const Standard_CString aname)
33     : thename (aname) , 
34       thetype (STANDARD_TYPE(TCollection_HAsciiString)) ,
35       thevalue (aval)  
36       {  theitems = new Dico_DictionaryOfTransient();
37          if (thename.Length() == 0) thename.AssignCat (aval->Name());  }
38
39     MoniTool_Option::MoniTool_Option
40   (const Handle(MoniTool_Option)& other, const Standard_CString aname)
41     : thename (aname) ,
42       thetype (other->Type()) , 
43       thevalue (other->TypedValue()) ,
44       theitems (other->Items())
45 {
46   if (thename.Length() == 0) thename.AssignCat (other->Name());
47   thecase.Clear();  thecase.AssignCat (other->CaseName());
48   other->Value(theval);
49 }
50
51     Standard_Boolean  MoniTool_Option::Add
52   (const Standard_CString name, const Handle(Standard_Transient)& val)
53 {
54   if (val.IsNull()) return Standard_False;
55   if (!val->IsKind (thetype)) return Standard_False;
56   if (!thevalue.IsNull()) {
57     Handle(TCollection_HAsciiString) str = Handle(TCollection_HAsciiString)::DownCast(val);
58     if (str.IsNull()) return Standard_False;
59     if (!thevalue->Satisfies(str)) return Standard_False;
60   }
61   theitems->SetItem (name,val);
62   thecase.Clear();  thecase.AssignCat (name);  // switch mis a jour par defaut
63   theval = val;
64   return Standard_True;
65 }
66
67     Standard_Boolean  MoniTool_Option::AddBasic
68   (const Standard_CString name, const Standard_CString val)
69 {
70   if (thevalue.IsNull()) return Standard_False;
71   Handle(TCollection_HAsciiString) str;
72   if (val && val[0] != '\0') str = new TCollection_HAsciiString (val);
73   else str = new TCollection_HAsciiString (name);
74   return Add (name,str);
75 }
76
77
78     void  MoniTool_Option::Duplicate ()
79 {
80   Handle(Dico_DictionaryOfTransient) items = new Dico_DictionaryOfTransient();
81   Dico_IteratorOfDictionaryOfTransient iter(theitems);
82   for (; iter.More(); iter.Next())
83     items->SetItem (iter.Name().ToCString(),iter.Value());
84   theitems = items;
85 }
86
87     const TCollection_AsciiString&  MoniTool_Option::Name () const
88       {  return thename;  }
89
90     Handle(Standard_Type)  MoniTool_Option::Type () const
91       {  return thetype;  }
92
93     Handle(MoniTool_TypedValue)  MoniTool_Option::TypedValue () const
94       {  return thevalue;  }
95
96     Handle(Dico_DictionaryOfTransient)  MoniTool_Option::Items () const
97       {  return theitems;  }
98
99     Standard_Boolean  MoniTool_Option::Item
100   (const Standard_CString name, Handle(Standard_Transient)& val) const
101 {
102   Handle(Standard_Transient) v;
103   if (!theitems->GetItem (name,v)) return Standard_False;
104   val = v;
105   return Standard_True;
106 }
107
108
109     Handle(TColStd_HSequenceOfAsciiString)  MoniTool_Option::ItemList () const
110 {
111   Handle(TColStd_HSequenceOfAsciiString) list = new TColStd_HSequenceOfAsciiString();
112   Dico_IteratorOfDictionaryOfTransient iter(theitems);
113   for (; iter.More(); iter.Next())  list->Append (iter.Name());
114   return list;
115 }
116
117     Handle(TColStd_HSequenceOfAsciiString)  MoniTool_Option::Aliases
118   (const Standard_CString name, const Standard_Boolean exact) const
119 {
120   Handle(TColStd_HSequenceOfAsciiString) list = new TColStd_HSequenceOfAsciiString();
121   Handle(Standard_Transient) v;
122   if (!theitems->GetItem (name,v, exact)) return list;
123
124   Dico_IteratorOfDictionaryOfTransient iter(theitems);
125   for (; iter.More(); iter.Next()) {
126     if (iter.Value() != v) continue;
127     TCollection_AsciiString itname = iter.Name();
128     if (!itname.IsEqual(name)) list->Append (itname);
129   }
130   return list;
131 }
132
133 //    ####    SWITCH ACTIONS    ####
134
135     Standard_Boolean  MoniTool_Option::Switch (const Standard_CString name)
136 {
137   Handle(Standard_Transient) val;
138   if (!theitems->GetItem (name,val)) return Standard_False;
139   thecase.Clear();  thecase.AssignCat (name);
140   theval = val;
141   return Standard_True;
142 }
143
144     const TCollection_AsciiString&  MoniTool_Option::CaseName () const
145       {  return thecase;  }
146
147     Handle(Standard_Transient)  MoniTool_Option::CaseValue () const
148       {  return theval;  }
149
150     void  MoniTool_Option::Value (Handle(Standard_Transient)& val) const
151       {  if (!theval.IsNull()) val = theval;  }