]> Creatis software - crea.git/blob - lib/creaDevManagerLib/ModelCreaDevManagerTree.cpp
Feature #1711
[crea.git] / lib / creaDevManagerLib / ModelCreaDevManagerTree.cpp
1 /*
2  * ModelCreaDevManagerTree.cpp
3  *
4  *  Created on: 22/10/2012
5  *      Author: daniel
6  */
7
8 #include "ModelCreaDevManagerTree.h"
9
10 #include <iostream>
11 #include <sstream>
12 #include <algorithm>
13 #include <string>
14 #include <cstring>
15 #include <creaWx.h>
16 #include <wx/dir.h>
17
18
19 ModelCreaDevManagerTree::ModelCreaDevManagerTree()
20 {
21 }
22
23 ModelCreaDevManagerTree::~ModelCreaDevManagerTree()
24 {
25 }
26
27 bool ModelCreaDevManagerTree::CompareNodeItem(ModelCreaDevManagerTreeNode x, ModelCreaDevManagerTreeNode y)
28 {
29   bool returnValue;
30   bool noWinner = true;
31   unsigned int i = 0;
32   std::string xName = x.GetName();
33   std::string yName = y.GetName();
34   unsigned char xType = x.GetType();
35   unsigned char yType = y.GetType();
36
37   while ((i < xName.length()) && (i < yName.length()))
38   {
39     if (tolower (xName[i]) < tolower (yName[i]))
40     {
41       noWinner = false;
42       returnValue = true;
43       break;
44     }
45     else if (tolower (xName[i]) > tolower (yName[i]))
46     {
47       noWinner = false;
48       returnValue = false;
49       break;
50     }
51     i++;
52   }
53
54   if(noWinner)
55   {
56     if (xName.length() < yName.length())
57       returnValue = true;
58     else
59       returnValue = false;
60   }
61
62   if(xType != yType)
63   {
64     if(xType == DT_DIR)
65       returnValue = true;
66     else
67       returnValue = false;
68   }
69
70   return returnValue;
71 }
72
73 void ModelCreaDevManagerTree::addRoot(std::string path)
74 {
75   std::stringstream p(path);
76   std::vector<std::string> breadcrumbs;
77   std::string name;
78
79   while(!p.eof())
80   {
81     getline(p,name,'/');
82     if(name != "")
83       breadcrumbs.push_back(name);
84   }
85
86   path = "/";
87   for (int i = 0; i < breadcrumbs.size()-1; i++)
88   {
89     path += breadcrumbs[i] + "/";
90   }
91   name = breadcrumbs[breadcrumbs.size()-1];
92
93   bool projectFound = false;
94   for (int i = 0; i < this->projectRoots.size(); i++)
95   {
96     if(this->projectRoots[i].GetName() == name)
97       projectFound = true;
98   }
99
100   if(!projectFound)
101   {
102     this->projectRoots.push_back(ModelCreaDevManagerTreeNode(path,name,DT_DIR,0));
103   }else{
104     std::cout << "already existing ";
105   }
106
107   std::cout << "project root added: " << name << " in " << path << std::endl;
108 }
109
110 void ModelCreaDevManagerTree::populateNode(ModelCreaDevManagerTreeNode& node)
111 {
112   //std::cout << "populating " << node.GetName() << " path " << node.GetPath() << "..." << std::endl;
113   std::vector <ModelCreaDevManagerTreeNode>*  nodes = new std::vector <ModelCreaDevManagerTreeNode>;
114
115   std::string path = node.GetPath()+node.GetName()+"/";
116
117   wxDir dir(wxString(path.c_str()));
118   if (!dir.IsOpened())
119   {
120     std::cerr << "Couldn't open the directory" << std::endl;
121     return;
122   }
123
124   wxString fileName;
125   bool cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_DIRS);
126   while (cont)
127   {
128     ModelCreaDevManagerTreeNode innerNode = ModelCreaDevManagerTreeNode(path, crea::wx2std(fileName), wxDIR_DIRS, node.GetLevel()+1);
129     this->populateNode(innerNode);
130     nodes->push_back(innerNode);
131     cont = dir.GetNext(&fileName);
132   }
133
134   cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_FILES);
135   while (cont)
136   {
137     ModelCreaDevManagerTreeNode innerNode = ModelCreaDevManagerTreeNode(path, crea::wx2std(fileName), wxDIR_FILES, node.GetLevel()+1);
138     nodes->push_back(innerNode);
139     cont = dir.GetNext(&fileName);
140   }
141
142   sort (nodes->begin(), nodes->end(), CompareNodeItem);
143   node.SetChildren(*nodes);
144
145   /*
146
147   DIR *dp;
148   struct dirent *ep;
149
150   std::string path = node.GetPath()+node.GetName()+"/";
151
152   dp = opendir(path.c_str());
153   if (dp != NULL)
154   {
155     while ((ep = readdir (dp)) != NULL)
156     {
157       //std::cout << ep->d_name << std::endl;
158       if(strcmp(ep->d_name, ".") != 0 && strcmp(ep->d_name, "..") != 0 )
159       {
160         ModelCreaDevManagerTreeNode innerNode = ModelCreaDevManagerTreeNode(path, ep->d_name, ep->d_type, node.GetLevel()+1);
161         if (ep->d_type == DT_DIR)
162         {
163           this->populateNode(innerNode);
164         }
165
166         nodes->push_back(innerNode);
167       }
168
169     }
170
171     (void) closedir (dp);
172
173     sort (nodes->begin(), nodes->end(), CompareNodeItem);
174
175     node.SetChildren(*nodes);
176   }
177   else
178   {
179     std::cerr << "Couldn't open the directory" << std::endl;
180   }*/
181 }
182
183 void ModelCreaDevManagerTree::populateNode(std::string path)
184 {
185   if(path[path.size()-1] != '/')
186     path+="/";
187   std::cout << "searching " << path << std::endl;
188   for (int i = 0; i < this->projectRoots.size(); i++)
189   {
190     //std::cout << (this->projectRoots[i].GetPath() + this->projectRoots[i].GetName() + "/") << "..." << std::endl;
191     if(this->projectRoots[i].GetPath()+this->projectRoots[i].GetName()+"/" == path)
192     {
193         std::cout << "Populating Project: " << path << "..." << std::endl;
194       this->populateNode(this->projectRoots[i]);
195       break;
196     }
197   }
198 }