]> AND Private Git Repository - blast.git/blob - BlockLibraryTree.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
correct relative positionning of source/group
[blast.git] / BlockLibraryTree.cpp
1 #include "BlockLibraryTree.h"
2
3 BlockLibraryTree::BlockLibraryTree() {
4   tabCategories = NULL;
5   tabIdParent = NULL;
6   nbCategories = 0;
7 }
8
9 BlockLibraryTree::~BlockLibraryTree() {
10   clear();
11 }
12
13 void BlockLibraryTree::clear() {
14
15   for(int i=0;i<nbCategories;i++) {
16     delete tabCategories[i];
17   }
18   delete [] tabCategories;
19   nbCategories = 0;
20 }
21
22 void BlockLibraryTree::clearBlocks() {
23
24   for(int i=0;i<nbCategories;i++) {
25     tabCategories[i]->blocks.clear();
26   }
27 }
28
29 void BlockLibraryTree::addItem(QXmlAttributes &attributes)
30 {
31   nbCategories++;
32   if(tabCategories == NULL){
33     tabCategories = new BlockCategory* [1];
34     tabIdParent = new int[1];
35   }
36   else{
37     BlockCategory** tmpTabCat = new BlockCategory* [nbCategories];
38     int* tmpTabParent = new int[nbCategories];
39     for(int i=0; i< nbCategories; i++){
40       tmpTabCat[i] = tabCategories[i];
41       tmpTabParent[i] = tabIdParent[i];
42     }
43     tabCategories = tmpTabCat;
44     tabIdParent = tmpTabParent;
45   }
46
47   QString name = attributes.value(0);
48   int id = attributes.value(1).toInt();
49   int idParent = attributes.value(2).toInt();
50   BlockCategory* cat = new BlockCategory(name,id);
51   tabCategories[id] = cat;
52   tabIdParent[id] = idParent;
53 }
54
55 bool BlockLibraryTree::initChildParent()
56 {
57   // initializing parent/childs
58   for(int i=0;i<nbCategories;i++) {
59     if (tabIdParent[i] != -1) {
60       if (tabIdParent[i] >= nbCategories) return false;
61       tabCategories[i]->setParent(tabCategories[tabIdParent[i]]);
62       tabCategories[tabIdParent[i]]->addChild(tabCategories[i]);
63     }
64   }
65   return true;
66 }
67
68
69 QDomElement BlockLibraryTree::save(QDomDocument &doc) {
70
71 }
72
73 /* NOTE : load() is the only way to initialize the tree.
74    It is done at the begining of the application, while reading
75    the configuration file.
76    elt MUST be the DOM element that corresponds to the tag <categories>
77  */
78 void BlockLibraryTree::load(QDomElement &elt) throw(Exception) {
79
80   if (elt.tagName() != "categories") throw(Exception(CONFIGFILE_CORRUPTED));
81
82   QString nbStr = elt.attribute("nb","none");
83   bool ok;
84   int nb = nbStr.toInt(&ok);
85   QDomNodeList list = elt.elementsByTagName("category");
86   nbCategories = list.size();
87   if (nb != nbCategories) throw(Exception(CONFIGFILE_CORRUPTED));
88   QString name;
89   int id;
90   QString idStr;
91   int idParent;
92   QString idParentStr;
93
94   tabCategories = new BlockCategory* [nbCategories];
95   tabIdParent = new int[nbCategories];
96   BlockCategory* cat = NULL;
97
98   // creating all BlockCategory objects
99   for(int i=0;i<nbCategories;i++) {
100     QDomNode node = list.item(i);
101     QDomElement e = node.toElement();
102     name = e.attribute("name","none");
103     idStr = e.attribute("id","none");
104     idParentStr = e.attribute("parent","none");
105     id = idStr.toInt(&ok);
106     if ((!ok) || (id < 0) || (id >= nbCategories)) throw(Exception(CONFIGFILE_CORRUPTED));
107     idParent = idParentStr.toInt(&ok);
108     if ((!ok)|| (idParent < -1) || (idParent >= nbCategories)) throw(Exception(CONFIGFILE_CORRUPTED));
109     cat = new BlockCategory(name,id);
110     tabCategories[id] = cat;
111     tabIdParent[id] = idParent;
112   }
113
114   ok = initChildParent();
115   delete [] tabIdParent;
116   if (!ok) throw(Exception(CONFIGFILE_CORRUPTED));
117 }
118
119 BlockCategory* BlockLibraryTree::searchCategory(int id) {
120
121   if (tabCategories != NULL) {
122     if ((id>=0) && (id < nbCategories)) {
123       return tabCategories[id];
124     }
125   }
126
127   return NULL;
128 }
129
130 BlockCategory *BlockLibraryTree::getRoot() {
131   if (tabCategories != NULL) {
132     if (nbCategories > 0) {
133       return tabCategories[0];
134     }
135   }
136   return NULL;
137 }