X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FcreaDevManagerLib%2FmodelCDMFolder.cpp;h=3365c099b9adfd64c246ff7b7f04a92636a6df02;hb=311bdcc514f85386f3bbbef9ff6a88bf69fd930f;hp=73312b64fbae52a4c1c1fac588a8fcce733cb6c9;hpb=d8222afd6508f39bd37426842667de2e431cca4a;p=crea.git diff --git a/lib/creaDevManagerLib/modelCDMFolder.cpp b/lib/creaDevManagerLib/modelCDMFolder.cpp index 73312b6..3365c09 100644 --- a/lib/creaDevManagerLib/modelCDMFolder.cpp +++ b/lib/creaDevManagerLib/modelCDMFolder.cpp @@ -34,6 +34,9 @@ #include "modelCDMFolder.h" +#include +#include + #include #include @@ -44,21 +47,15 @@ modelCDMFolder::modelCDMFolder() this->CMakeLists = NULL; } -modelCDMFolder::modelCDMFolder(const std::string& path, const int& level) +modelCDMFolder::modelCDMFolder(const std::string& path, const std::string& name, const int& level) { + std::cout << "creating folder: " + path + "\n"; //set attributes this->children.clear(); this->level = level; this->CMakeLists = NULL; this->length = 0; - - std::vector words; - std::string delimiters; - //TODO::fix for windows - delimiters = "/"; - CDMUtilities::splitter::split(words, path, delimiters, CDMUtilities::splitter::no_empties); - this->name = words[words.size()-1]; - + this->name = name; this->path = path; this->type = wxDIR_DIRS; @@ -74,7 +71,9 @@ modelCDMFolder::modelCDMFolder(const std::string& path, const int& level) std::string stdfileName = crea::wx2std(fileName); //if is an unknown folder, create folder - this->children.push_back(new modelCDMFolder(pathFixed + "/" + stdfileName, this->level + 1)); + modelCDMFolder* folder = new modelCDMFolder(pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->children.push_back(folder); + this->folders.push_back(folder); cont = dir.GetNext(&fileName); } @@ -87,12 +86,12 @@ modelCDMFolder::modelCDMFolder(const std::string& path, const int& level) //if CMakeLists, create CMakeLists if(stdfileName == "CMakeLists.txt") { - this->CMakeLists = new modelCDMCMakeListsFile(pathFixed + "/" + stdfileName, this->level + 1); + this->CMakeLists = new modelCDMCMakeListsFile(pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); this->children.push_back(this->CMakeLists); } else { - this->children.push_back(new modelCDMFile(pathFixed + "/" + stdfileName, this->level + 1)); + this->children.push_back(new modelCDMFile(pathFixed + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1)); } //if is an unknown file, create file cont = dir.GetNext(&fileName); @@ -100,6 +99,7 @@ modelCDMFolder::modelCDMFolder(const std::string& path, const int& level) } this->SortChildren(); + std::sort(this->folders.begin(), this->folders.end(), CompareNodeItem); } modelCDMFolder::~modelCDMFolder() @@ -117,22 +117,149 @@ modelCDMFolder::~modelCDMFolder() this->children.clear(); } -bool modelCDMFolder::CreateFolder(const std::string& name, std::string*& result, - const std::string& path) +modelCDMFolder* modelCDMFolder::CreateFolder(const std::string& name, std::string*& result) { - //TODO: implement method - return true; + //TODO:: mkdir depending on OS + std::string command = "mkdir \"" + path + CDMUtilities::SLASH + name + "\""; + if(system(command.c_str())) + { + result = new std::string("Error executing: " + command + "."); + return NULL; + } + modelCDMFolder* folder = new modelCDMFolder(path + CDMUtilities::SLASH + name, name, level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + return folder; } bool modelCDMFolder::OpenCMakeListsFile(std::string*& result) { - //TODO: implement method - return true; + if (this->CMakeLists == NULL) + { + result = new std::string("There's no CMakeLists file to open."); + return false; + } + if (!CDMUtilities::openTextEditor(this->CMakeLists->GetPath())) + return true; + else + { + result = new std::string("Couldn't open CMakeLists file."); + return false; + } } const bool modelCDMFolder::Refresh(std::string*& result) { - //TODO: implement method + //std::cout << "refreshing folder " << this->name << std::endl; + //set attributes + this->type = wxDIR_DIRS; + + //check children + std::vector checked(this->children.size(), false); + std::vector checkedFolders(this->folders.size(), false); + + //check all folders + wxDir dir(crea::std2wx((this->path).c_str())); + if (dir.IsOpened()) + { + wxString fileName; + bool cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_DIRS); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + //check if they already exist + bool found = false; + for (int i = 0; !found && i < this->folders.size(); i++) + { + if (this->folders[i]->GetName() == stdfileName) + { + found = true; + int pos = std::find(this->children.begin(), this->children.end(), this->folders[i]) - this->children.begin(); + checked[pos] = true; + checkedFolders[i] = true; + if(!this->folders[i]->Refresh(result)) + return false; + } + } + if(!found) + { + modelCDMFolder* folder = new modelCDMFolder(this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + } + cont = dir.GetNext(&fileName); + } + + cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_FILES); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + //if CMakeLists, create CMakeLists + if(stdfileName == "CMakeLists.txt") + { + if (this->CMakeLists == NULL) + { + this->CMakeLists = new modelCDMCMakeListsFile(this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->children.push_back(this->CMakeLists); + } + else + { + int pos = std::find(this->children.begin(), this->children.end(), this->CMakeLists) - this->children.begin(); + checked[pos] = true; + if(!this->CMakeLists->Refresh(result)) + return false; + } + } + + //if is an unknown file, create file + else + { + bool found = false; + for (int i = 0;!found && i < this->children.size(); i++) + { + if (this->children[i]->GetName() == stdfileName) + { + found = true; + checked[i] = true; + if(!this->children[i]->Refresh(result)) + return false; + } + } + + if(!found) + { + modelCDMFile* file = new modelCDMFile(this->path + CDMUtilities::SLASH + stdfileName, stdfileName, this->level + 1); + this->children.push_back(file); + } + } + + cont = dir.GetNext(&fileName); + } + } + + for (int i = 0; i < checkedFolders.size(); i++) + { + if(!checkedFolders[i]) + { + this->folders.erase(this->folders.begin()+i); + checkedFolders.erase(checkedFolders.begin()+i); + i--; + } + } + for (int i = 0; i < checked.size(); i++) + { + if(!checked[i]) + { + delete this->children[i]; + this->children.erase(this->children.begin()+i); + checked.erase(checked.begin()+i); + i--; + } + } + this->SortChildren(); + std::sort(this->folders.begin(), this->folders.end(), CompareNodeItem); return true; }