]> Creatis software - creaImageIO.git/blob - src2/creaImageIOTreeNode.cpp
Order by columns is done. For the moment it only compares as if everything were a...
[creaImageIO.git] / src2 / creaImageIOTreeNode.cpp
1 #include <creaImageIOTreeNode.h>
2 #include <creaImageIOTree.h>
3 #include <creaImageIOSystem.h>
4 #include <algorithm>
5
6 namespace creaImageIO
7 {
8   namespace tree
9   {
10
11     //=============================================================
12     /// Ctor with parent
13     Node::Node(Node* parent)
14       : mParent(parent),
15         mData(0),
16         mChildrenLoaded(false)
17     {
18       if (parent) 
19         {
20           GimmickMessage(5,"Default Node constructor (level "<<GetLevel()<<")"
21                          << std::endl);
22           // Insert into parent's children list
23           parent->GetChildrenList().push_back(this);
24           InitializeAttributeMap();
25         }
26       else
27         {
28           GimmickMessage(5,"Default Node constructor without parent"    
29                          << std::endl);
30         }
31     }
32     //=============================================================
33
34     //=============================================================
35     /// Ctor with parent and attributes map 
36     Node::Node(Node* parent, const AttributeMapType& attr)
37      : mParent(parent),
38         mData(0),
39         mChildrenLoaded(false)
40     {
41       GimmickMessage(5,"Node constructor (level "<<GetLevel()<<")"
42                      << std::endl);
43      if (parent) 
44         {
45           // Insert into parent's children list
46           parent->GetChildrenList().push_back(this);
47           // Initialize attributes
48           LevelDescriptor::AttributeDescriptorListType::const_iterator a;
49           for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
50                a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
51                ++a)
52             {
53               std::string v;
54               AttributeMapType::const_iterator i = attr.find(a->GetKey());
55               if ( i != attr.end() )  
56                 {
57                   v = i->second;
58                 }
59               GimmickMessage(5,"Setting attribute '"<<a->GetName()<<"' = '"
60                              <<v<<"'"<<std::endl);
61               UnsafeSetAttribute( a->GetKey(), v );
62             }
63         }
64       
65     }
66     //=============================================================
67
68
69     //=============================================================
70     Node::~Node()
71     {
72       GimmickMessage(5,"Node destructor"
73                      << std::endl);
74       ChildrenListType::iterator i;
75       for (i=GetChildrenList().begin(); i!=GetChildrenList().end(); i++)
76         {
77           delete *i;
78         }
79       if (mData) 
80         {
81           delete mData;
82           mData = 0;
83         }
84     }
85     //=============================================================
86
87
88     //=============================================================
89     /// Initializes the attribute map i.e. creates the entries
90     void Node::InitializeAttributeMap()
91     {
92       // Initialize attributes
93       LevelDescriptor::AttributeDescriptorListType::const_iterator a;
94       for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
95            a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
96            ++a)
97         {
98           UnsafeSetAttribute( a->GetKey(), "" );
99         }
100     }
101     //=============================================================
102
103     //=============================================================
104     /// Returns the level descriptor of the node
105     const LevelDescriptor& Node::GetLevelDescriptor() const
106     { 
107       return GetTree()->GetLevelDescriptor(GetLevel()); 
108     }
109
110         //=============================================================
111
112     //=============================================================
113     /// Returns the attribute descriptor of the passed parameter
114         const AttributeDescriptor& Node::GetAttributeDescriptor(const std::string& k)const
115         {
116                 LevelDescriptor::AttributeDescriptorListType::const_iterator a;
117       for (a = GetTree()->GetAttributeDescriptorList(GetLevel()).begin();
118            a!= GetTree()->GetAttributeDescriptorList(GetLevel()).end();
119            ++a)
120                 {
121                         GimmickMessage(1,"Hello my type is"<<a->GetType()<<std::endl);
122                         GimmickMessage(1,"Hello my group is"<<a->GetGroup()<<std::endl);
123                         GimmickMessage(1,"Hello my element is"<<a->GetElement()<<std::endl);
124                         
125                         if(a->GetKey()==k)
126                         {
127                                 return *a;
128                         }
129                 
130                 }
131                 return *a;
132         }
133     //=============================================================
134
135     //=============================================================
136     void Node::RemoveChildrenFromList(Node* node)
137     {
138       ChildrenListType::iterator i = find(GetChildrenList().begin(),
139                                           GetChildrenList().end(),
140                                           node);
141       if (i != GetChildrenList().end())
142         {
143           GetChildrenList().erase(i);
144         }
145     }
146     //=============================================================
147
148     //=============================================================
149     const std::string& Node::GetAttribute(const std::string& k) const
150     {
151       //    std::cout << "this = "<<(void*)this<<std::endl;
152       //    std::cout << "mFieldValueMap="<<(void*)(&mFieldValueMap)<<std::endl;
153       AttributeMapType::const_iterator i = mAttributeMap.find(k);
154       if (i == mAttributeMap.end())
155         {
156           static std::string def("");
157           return def;
158           //    CREAIMAGEIO_ERROR("DicomNode::GetFieldValue : no field with key '"<<k<<"'");
159         }
160       return i->second;
161   }
162   //=============================================================
163
164   //=============================================================
165     void Node::SetAttribute(const std::string& k, 
166                                  const std::string& v)
167   {
168     AttributeMapType::iterator i = mAttributeMap.find(k);
169     if (i==mAttributeMap.end())
170       {
171         std::cout<<"[Gimmick!] Node::SetAttribute : no attribute with key '"
172                  <<k<<"'"<<std::endl;
173         creaError( "[Gimmick!] Node::SetAttribute : no attribute with key '"
174                    <<k<<"'");
175       }
176     i->second = v;
177   }
178     //=============================================================
179
180     //=============================================================
181     bool Node::Matches(  const AttributeMapType& m ) const
182     {
183       GimmickMessage(2,"'"<<GetLabel()<<"' matching..."<<std::endl);
184       const std::vector<std::string>& id 
185         = GetLevelDescriptor().GetIdentifierList();
186       std::vector<std::string>::const_iterator i;
187       for (i = id.begin(); i != id.end(); ++i)
188         {
189           if (mAttributeMap.find(*i)->second != m.find(*i)->second ) 
190             {
191               GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values do not match"<<std::endl);
192               return false;
193             }
194           GimmickMessage(2,"IDENTIFIER '"<<*i<<"' values match"<<std::endl);
195         }
196       return true;
197     }
198     //=============================================================
199     
200     //=============================================================
201     void Node::Print() const
202     {
203       std::string mess;
204       for (int i = 0; i<GetLevel(); ++i) mess += "  ";
205       mess += "|_ " + GetLabel();
206       GimmickMessage(1,mess<<std::endl);
207       ChildrenListType::const_iterator j;
208       for (j=GetChildrenList().begin(); j!=GetChildrenList().end(); j++)
209         {
210           (*j)->Print();
211         } 
212     }
213     //=============================================================
214
215     //=============================================================
216     std::string Node::GetLabel() const
217     {
218       std::string l;
219       const std::vector<std::string>& label 
220         = GetLevelDescriptor().GetLabelList();
221       
222       std::vector<std::string>::const_iterator i;
223       for (i = label.begin(); i != label.end(); )
224         {
225           GimmickMessage(3,"LABEL '"<<*i<<"'"<<std::endl);
226           AttributeMapType::const_iterator j = mAttributeMap.find(*i);
227           if (j != mAttributeMap.end())
228             {
229               l += j->second;
230               ++i;
231               if (i != label.end()) l += "|";
232             }
233           else 
234             {
235               GimmickError("Node::GetLabel() : LABEL attribute '"
236                            <<*i
237                            <<"' is not in node attribute map (should be!)" );
238             }
239         }
240       if (l.size()==0) l="?";
241       return l;
242     }
243     //=============================================================
244
245   }
246
247 }
248