From: Daniel Gonzalez Date: Wed, 19 Dec 2012 14:47:52 +0000 (+0100) Subject: Feature #1711 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=2b6788596bc21c7942df4b0d6917eaf5b5d72277;p=crea.git Feature #1711 CreaDevManager application implementation -Library, Application and Package creation completely implemented. -Folder creation in Folder, Library and Application implemented. -On Folder hierarchy refresh, the view is set back to the project's root. --- diff --git a/lib/creaDevManagerLib/creaDevManagerIds.h b/lib/creaDevManagerLib/creaDevManagerIds.h index 49193d9..ab662fa 100644 --- a/lib/creaDevManagerLib/creaDevManagerIds.h +++ b/lib/creaDevManagerLib/creaDevManagerIds.h @@ -93,19 +93,20 @@ #define ID_BUTTON_SET_BUILD_PATH 10319 #define ID_BUTTON_SET_AUTHOR 10320 #define ID_BUTTON_SET_DESCRIPTION 10321 +#define ID_BUTTON_SET_NAME 10322 -#define ID_BUTTON_BUILD_PROJECT 10322 -#define ID_BUTTON_CONFIGURE_BUILD 10323 -#define ID_BUTTON_CONNECT_PROJECT 10324 +#define ID_BUTTON_BUILD_PROJECT 10323 +#define ID_BUTTON_CONFIGURE_BUILD 10324 +#define ID_BUTTON_CONNECT_PROJECT 10325 -#define ID_BUTTON_GOTO_PACKAGE_MANAGER 10325 -#define ID_BUTTON_GOTO_APPLI_MANAGER 10326 -#define ID_BUTTON_GOTO_LIB_MANAGER 10327 +#define ID_BUTTON_GOTO_PACKAGE_MANAGER 10326 +#define ID_BUTTON_GOTO_APPLI_MANAGER 10327 +#define ID_BUTTON_GOTO_LIB_MANAGER 10328 -#define ID_LINK_SELECT_PACKAGE 10328 -#define ID_LINK_SELECT_LIBRARY 10329 -#define ID_LINK_SELECT_APPLICATION 10330 -#define ID_LINK_SELECT_BLACKBOX 10331 +#define ID_LINK_SELECT_PACKAGE 10329 +#define ID_LINK_SELECT_LIBRARY 10330 +#define ID_LINK_SELECT_APPLICATION 10331 +#define ID_LINK_SELECT_BLACKBOX 10332 #endif /* CREADEVMANAGERIDS_H_ */ diff --git a/lib/creaDevManagerLib/modelCDMAppli.cpp b/lib/creaDevManagerLib/modelCDMAppli.cpp index ce3388e..ebd4de0 100644 --- a/lib/creaDevManagerLib/modelCDMAppli.cpp +++ b/lib/creaDevManagerLib/modelCDMAppli.cpp @@ -36,6 +36,7 @@ #include #include +#include #include "CDMUtilities.h" #include "creaWx.h" @@ -140,6 +141,116 @@ modelCDMApplication* modelCDMAppli::CreateApplication( const bool modelCDMAppli::Refresh(std::string*& result) { - //TODO: implement method + std::cout << "refreshing appli" << std::endl; + this->type = wxDIR_DIRS; + this->name = "appli"; + this->level = level; + this->path = path; + + + + std::vector checked(this->children.size(), false); + std::vector checkedApplications(this->applications.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); + std::string applicationName = stdfileName; + //check if they already exist + bool found = false; + for (int i = 0;!found && i < this->applications.size(); i++) + { + if (this->applications[i]->GetName() == applicationName) + { + found = true; + int pos = std::find(this->children.begin(), this->children.end(), this->applications[i]) - this->children.begin(); + checked[pos] = true; + checkedApplications[i] = true; + if(!this->applications[i]->Refresh(result)) + return false; + } + } + if(!found) + { + modelCDMApplication* application= new modelCDMApplication(this->path + "/" + stdfileName, this->level + 1); + this->applications.push_back(application); + this->children.push_back(application); + } + 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 + "/" + 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; i 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 + "/" + stdfileName, this->level + 1); + this->children.push_back(file); + } + } + + cont = dir.GetNext(&fileName); + } + } + + for (int i = 0; i < checkedApplications.size(); i++) + { + if(!checkedApplications[i]) + { + this->applications.erase(this->applications.begin()+i); + checkedApplications.erase(checkedApplications.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(); return true; } diff --git a/lib/creaDevManagerLib/modelCDMApplication.cpp b/lib/creaDevManagerLib/modelCDMApplication.cpp index 35a731c..c39b48d 100644 --- a/lib/creaDevManagerLib/modelCDMApplication.cpp +++ b/lib/creaDevManagerLib/modelCDMApplication.cpp @@ -34,6 +34,9 @@ #include "modelCDMApplication.h" +#include +#include + #include "CDMUtilities.h" #include "creaWx.h" #include "wx/dir.h" @@ -44,19 +47,95 @@ modelCDMApplication::modelCDMApplication() modelCDMApplication::modelCDMApplication(const std::string& path, const int& level) { + //folder name std::vector words; std::string delimiters; //TODO::fix for windows delimiters = "/"; CDMUtilities::splitter::split(words, path, delimiters, CDMUtilities::splitter::no_empties); - this->name = this->nameApplication = words[words.size()-1]; + this->name = words[words.size()-1]; - this->path = path; + //path + this->path = CDMUtilities::fixPath(path); + //type this->type = wxDIR_DIRS; + //level this->level = level; - //TODO: open CMakeList - //TODO: get ApplicationName + //open CMakeList + std::string pathMakeLists = path + "/CMakeLists.txt"; + + std::ifstream confFile; + confFile.open((pathMakeLists).c_str()); + + std::string word; + while(confFile.is_open() && !confFile.eof()) + { + //get sets + std::getline(confFile,word,'('); + std::vector wordBits; + CDMUtilities::splitter::split(wordBits,word," (\n",CDMUtilities::splitter::no_empties); + + if(wordBits[wordBits.size()-1] == "SET") + { + //get library name + std::getline(confFile,word,')'); + CDMUtilities::splitter::split(wordBits, word, " ", CDMUtilities::splitter::no_empties); + if(wordBits[0] == "EXE_NAME") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + + this->nameApplication = this->executableName = word; + } + } + } + confFile.close(); + + //add library contents + + this->children.clear(); + wxDir dir(crea::std2wx((this->path).c_str())); + if (dir.IsOpened()) + { + wxString fileName; + //folders + bool cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_DIRS); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + modelCDMFolder* folder = new modelCDMFolder(this->path + "/" + stdfileName, this->level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + cont = dir.GetNext(&fileName); + } + //files + cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_FILES); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + //if CMakeLists, create CMakeLists + if(stdfileName == "CMakeLists.txt") + { + this->CMakeLists = new modelCDMCMakeListsFile(this->path + "/" + stdfileName, this->level + 1); + this->children.push_back(this->CMakeLists); + } + //if is an unknown file, create file + else + { + this->children.push_back(new modelCDMFile(this->path + "/" + stdfileName, this->level + 1)); + } + + cont = dir.GetNext(&fileName); + } + } + this->SortChildren(); } modelCDMApplication::~modelCDMApplication() @@ -73,22 +152,210 @@ const std::string& modelCDMApplication::GetExecutableName() const return this->executableName; } -void modelCDMApplication::SetMainFile(const std::string& fileName) +bool modelCDMApplication::SetExecutableName(const std::string& fileName, std::string*& result) { + std::vector words; + CDMUtilities::splitter::split(words, fileName, ", /\\\"", CDMUtilities::splitter::no_empties); + std::string fileNameReal = words[0]; + for (int i = 1; i < words.size(); i++) + { + fileNameReal += "-" + words[i]; + } + + std::string line; + //opening original cmakelists + std::ifstream in((this->path + "/CMakeLists.txt").c_str()); + if( !in.is_open()) + { + result = new std::string("CMakeLists.txt file failed to open."); + return false; + } + //opening temporal cmakelists + std::ofstream out((this->path + "/CMakeLists.txt.tmp").c_str()); + if( !out.is_open()) + { + result = new std::string("CMakeLists.txt.tmp file failed to open."); + return false; + } + //copying contents from original to temporal and making changes + while (getline(in, line)) + { + if(line.find("SET ( EXE_NAME") != std::string::npos) + line = "SET ( EXE_NAME " + fileNameReal + " )"; + out << line << std::endl; + } + in.close(); + out.close(); + //delete old file and rename new file + std::string renameCommand = "mv " + this->path + "/CMakeLists.txt.tmp " + this->path + "/CMakeLists.txt"; + if(system(renameCommand.c_str())) + { + result = new std::string("An error occurred while running '" + renameCommand + "'."); + return false; + } + + this->executableName = this->nameApplication = fileNameReal; + return true; } -bool modelCDMApplication::CreateFolder( - const std::string& name, - std::string*& result, - const std::string& path -) +modelCDMFolder* modelCDMApplication::CreateFolder(const std::string& name, std::string*& result) { - //TODO: implement method - return true; + //TODO:: mkdir depending on OS + std::string command = "mkdir " + path + "/" + name; + if(system(command.c_str())) + { + result = new std::string("Error executing: " + command + "."); + return NULL; + } + modelCDMFolder* folder = new modelCDMFolder(path + "/" + name, level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + return folder; } const bool modelCDMApplication::Refresh(std::string*& result) { - //TODO: implement method + //set attributes + this->type = wxDIR_DIRS; + + //open CMakeList + std::string pathMakeLists = path + "/CMakeLists.txt"; + + std::ifstream confFile; + confFile.open((pathMakeLists).c_str()); + + std::string word; + while(confFile.is_open() && !confFile.eof()) + { + //get sets + std::getline(confFile,word,'('); + std::vector wordBits; + CDMUtilities::splitter::split(wordBits,word," (\n",CDMUtilities::splitter::no_empties); + + if(wordBits[wordBits.size()-1] == "SET") + { + //get library name + std::getline(confFile,word,')'); + CDMUtilities::splitter::split(wordBits, word, " ", CDMUtilities::splitter::no_empties); + if(wordBits[0] == "LIBRARY_NAME") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + + this->nameApplication = this->executableName = word; + } + } + } + + confFile.close(); + + //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); + std::string applicationName = stdfileName; + //check if they already exist + bool found = false; + for (int i = 0;!found && i < this->folders.size(); i++) + { + if (this->folders[i]->GetName() == applicationName) + { + 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 + "/" + 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 + "/" + 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; i 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 + "/" + 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(); return true; } diff --git a/lib/creaDevManagerLib/modelCDMApplication.h b/lib/creaDevManagerLib/modelCDMApplication.h index 97d3a79..af3cbad 100644 --- a/lib/creaDevManagerLib/modelCDMApplication.h +++ b/lib/creaDevManagerLib/modelCDMApplication.h @@ -50,19 +50,16 @@ public: const std::string& GetNameApplication() const; const std::string& GetExecutableName() const; - void SetMainFile(const std::string& fileName); + bool SetExecutableName(const std::string& fileName, std::string*& result); + + modelCDMFolder* CreateFolder(const std::string& name, std::string*& result); - bool CreateFolder( - const std::string& name, - std::string*& result, - const std::string& path = "/" - ); virtual const bool Refresh(std::string*& result); private: std::string nameApplication; std::string executableName; - std::vector applications; + std::vector folders; }; #endif /* MODELCDMAPPLICATION_H_ */ diff --git a/lib/creaDevManagerLib/modelCDMFolder.cpp b/lib/creaDevManagerLib/modelCDMFolder.cpp index 8122ebb..28d7a95 100644 --- a/lib/creaDevManagerLib/modelCDMFolder.cpp +++ b/lib/creaDevManagerLib/modelCDMFolder.cpp @@ -34,6 +34,9 @@ #include "modelCDMFolder.h" +#include +#include + #include #include @@ -117,11 +120,20 @@ 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 + "/" + name; + if(system(command.c_str())) + { + result = new std::string("Error executing: " + command + "."); + return NULL; + } + modelCDMFolder* folder = new modelCDMFolder(path + "/" + name, level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + return folder; } bool modelCDMFolder::OpenCMakeListsFile(std::string*& result) @@ -142,7 +154,113 @@ bool modelCDMFolder::OpenCMakeListsFile(std::string*& result) const bool modelCDMFolder::Refresh(std::string*& result) { - //TODO: implement method + //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); + std::string folderName = stdfileName; + //check if they already exist + bool found = false; + for (int i = 0;!found && i < this->folders.size(); i++) + { + if (this->folders[i]->GetName() == folderName) + { + 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 + "/" + 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 + "/" + 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; i 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 + "/" + 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(); return true; } diff --git a/lib/creaDevManagerLib/modelCDMFolder.h b/lib/creaDevManagerLib/modelCDMFolder.h index 383f89d..2bda707 100644 --- a/lib/creaDevManagerLib/modelCDMFolder.h +++ b/lib/creaDevManagerLib/modelCDMFolder.h @@ -51,10 +51,9 @@ public: modelCDMCMakeListsFile* GetCMakeLists() const; std::vector GetFolders() const; - bool CreateFolder( + modelCDMFolder* CreateFolder( const std::string& name, - std::string*& result, - const std::string& path = "/" + std::string*& result ); bool OpenCMakeListsFile(std::string* & result); virtual const bool Refresh(std::string*& result); diff --git a/lib/creaDevManagerLib/modelCDMLib.cpp b/lib/creaDevManagerLib/modelCDMLib.cpp index 11b5f37..a0ece82 100644 --- a/lib/creaDevManagerLib/modelCDMLib.cpp +++ b/lib/creaDevManagerLib/modelCDMLib.cpp @@ -161,6 +161,7 @@ modelCDMLibrary* modelCDMLib::CreateLibrary( const bool modelCDMLib::Refresh(std::string*& result) { + std::cout << "refreshing lib" << std::endl; this->type = wxDIR_DIRS; this->name = "lib"; this->level = level; diff --git a/lib/creaDevManagerLib/modelCDMLibrary.cpp b/lib/creaDevManagerLib/modelCDMLibrary.cpp index d5b4efb..560759e 100644 --- a/lib/creaDevManagerLib/modelCDMLibrary.cpp +++ b/lib/creaDevManagerLib/modelCDMLibrary.cpp @@ -34,6 +34,9 @@ #include "modelCDMLibrary.h" +#include +#include + #include "CDMUtilities.h" #include "creaWx.h" #include "wx/dir.h" @@ -44,19 +47,96 @@ modelCDMLibrary::modelCDMLibrary() modelCDMLibrary::modelCDMLibrary(const std::string& path, const int& level) { + //folder name std::vector words; std::string delimiters; //TODO::fix for windows delimiters = "/"; CDMUtilities::splitter::split(words, path, delimiters, CDMUtilities::splitter::no_empties); - this->name = this->nameLibrary = words[words.size()-1]; + this->name = words[words.size()-1]; - this->path = path; + //path + this->path = CDMUtilities::fixPath(path); + //type this->type = wxDIR_DIRS; + //level this->level = level; - //TODO: open CMakeList - //TODO: get libraryName + //open CMakeList + std::string pathMakeLists = path + "/CMakeLists.txt"; + + std::ifstream confFile; + confFile.open((pathMakeLists).c_str()); + + std::string word; + while(confFile.is_open() && !confFile.eof()) + { + //get sets + std::getline(confFile,word,'('); + std::vector wordBits; + CDMUtilities::splitter::split(wordBits,word," (\n",CDMUtilities::splitter::no_empties); + + if(wordBits[wordBits.size()-1] == "SET") + { + //get library name + std::getline(confFile,word,')'); + CDMUtilities::splitter::split(wordBits, word, " ", CDMUtilities::splitter::no_empties); + if(wordBits[0] == "LIBRARY_NAME") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + + this->nameLibrary = word; + } + } + } + + confFile.close(); + + //add library contents + + this->children.clear(); + wxDir dir(crea::std2wx((this->path).c_str())); + if (dir.IsOpened()) + { + wxString fileName; + //folders + bool cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_DIRS); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + modelCDMFolder* folder = new modelCDMFolder(this->path + "/" + stdfileName, this->level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + cont = dir.GetNext(&fileName); + } + //files + cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_FILES); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + //if CMakeLists, create CMakeLists + if(stdfileName == "CMakeLists.txt") + { + this->CMakeLists = new modelCDMCMakeListsFile(this->path + "/" + stdfileName, this->level + 1); + this->children.push_back(this->CMakeLists); + } + //if is an unknown file, create file + else + { + this->children.push_back(new modelCDMFile(this->path + "/" + stdfileName, this->level + 1)); + } + + cont = dir.GetNext(&fileName); + } + } + this->SortChildren(); } modelCDMLibrary::~modelCDMLibrary() @@ -68,17 +148,210 @@ const std::string& modelCDMLibrary::GetNameLibrary() const return this->nameLibrary; } -bool modelCDMLibrary::CreateFolder( - const std::string& name, - std::string*& result, - const std::string& path) +bool modelCDMLibrary::SetNameLibrary(const std::string& fileName, std::string*& result) { - //TODO: implement method + std::vector words; + CDMUtilities::splitter::split(words, fileName, ", /\\\"", CDMUtilities::splitter::no_empties); + std::string fileNameReal = words[0]; + for (int i = 1; i < words.size(); i++) + { + fileNameReal += "-" + words[i]; + } + + std::string line; + //opening original cmakelists + std::ifstream in((this->path + "/CMakeLists.txt").c_str()); + if( !in.is_open()) + { + result = new std::string("CMakeLists.txt file failed to open."); + return false; + } + //opening temporal cmakelists + std::ofstream out((this->path + "/CMakeLists.txt.tmp").c_str()); + if( !out.is_open()) + { + result = new std::string("CMakeLists.txt.tmp file failed to open."); + return false; + } + //copying contents from original to temporal and making changes + while (getline(in, line)) + { + if(line.find("SET ( LIBRARY_NAME") != std::string::npos) + line = "SET ( LIBRARY_NAME " + fileNameReal + " )"; + out << line << std::endl; + } + in.close(); + out.close(); + //delete old file and rename new file + std::string renameCommand = "mv " + this->path + "/CMakeLists.txt.tmp " + this->path + "/CMakeLists.txt"; + if(system(renameCommand.c_str())) + { + result = new std::string("An error occurred while running '" + renameCommand + "'."); + return false; + } + + this->nameLibrary = fileNameReal; return true; } +modelCDMFolder* modelCDMLibrary::CreateFolder(const std::string& name, std::string*& result) +{ + //TODO:: mkdir depending on OS + std::string command = "mkdir " + path + "/" + name; + if(system(command.c_str())) + { + result = new std::string("Error executing: " + command + "."); + return NULL; + } + modelCDMFolder* folder = new modelCDMFolder(path + "/" + name, level + 1); + this->folders.push_back(folder); + this->children.push_back(folder); + + return folder; +} + const bool modelCDMLibrary::Refresh(std::string*& result) { - //TODO: implement method + //set attributes + this->type = wxDIR_DIRS; + + //open CMakeList + std::string pathMakeLists = path + "/CMakeLists.txt"; + + std::ifstream confFile; + confFile.open((pathMakeLists).c_str()); + + std::string word; + while(confFile.is_open() && !confFile.eof()) + { + //get sets + std::getline(confFile,word,'('); + std::vector wordBits; + CDMUtilities::splitter::split(wordBits,word," (\n",CDMUtilities::splitter::no_empties); + + if(wordBits[wordBits.size()-1] == "SET") + { + //get library name + std::getline(confFile,word,')'); + CDMUtilities::splitter::split(wordBits, word, " ", CDMUtilities::splitter::no_empties); + if(wordBits[0] == "LIBRARY_NAME") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + + this->nameLibrary = word; + } + } + } + + confFile.close(); + + //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); + std::string folderName = stdfileName; + //check if they already exist + bool found = false; + for (int i = 0;!found && i < this->folders.size(); i++) + { + if (this->folders[i]->GetName() == folderName) + { + 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 + "/" + 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 + "/" + 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; i 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 + "/" + 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(); return true; } diff --git a/lib/creaDevManagerLib/modelCDMLibrary.h b/lib/creaDevManagerLib/modelCDMLibrary.h index 9f19def..6bcee75 100644 --- a/lib/creaDevManagerLib/modelCDMLibrary.h +++ b/lib/creaDevManagerLib/modelCDMLibrary.h @@ -48,17 +48,15 @@ public: ~modelCDMLibrary(); const std::string& GetNameLibrary() const; + bool SetNameLibrary(const std::string& fileName, std::string*& result); + + modelCDMFolder* CreateFolder(const std::string& name, std::string*& result); - bool CreateFolder( - const std::string& name, - std::string*& result, - const std::string& path = "/" - ); virtual const bool Refresh(std::string*& result); private: std::string nameLibrary; - std::vector libraries; + std::vector folders; }; #endif /* MODELCDMLIBRARY_H_ */ diff --git a/lib/creaDevManagerLib/modelCDMPackage.cpp b/lib/creaDevManagerLib/modelCDMPackage.cpp index 9ec218a..82a514c 100644 --- a/lib/creaDevManagerLib/modelCDMPackage.cpp +++ b/lib/creaDevManagerLib/modelCDMPackage.cpp @@ -35,6 +35,7 @@ #include "modelCDMPackage.h" #include +#include #include "creaWx.h" #include "wx/dir.h" @@ -382,6 +383,229 @@ bool modelCDMPackage::CreateBlackBox( const bool modelCDMPackage::Refresh(std::string*& result) { - //TODO: implement method + std::cout << "refreshing package" << std::endl; + this->type = wxDIR_DIRS; + this->name = name; + this->level = level; + this->path = path; + + //Get Package Name + + //TODO: set pathMakeLists for windows + std::string pathMakeLists = path + "/CMakeLists.txt"; + + std::ifstream confFile; + confFile.open((pathMakeLists).c_str()); + + std::string word; + while(confFile.is_open() && !confFile.eof()) + { + //get sets + std::getline(confFile,word,'('); + std::vector wordBits; + CDMUtilities::splitter::split(wordBits,word," (\n",CDMUtilities::splitter::no_empties); + + if(wordBits[wordBits.size()-1] == "SET") + { + //get package name + std::getline(confFile,word,')'); + CDMUtilities::splitter::split(wordBits, word, " ", CDMUtilities::splitter::no_empties); + if(wordBits[0] == "BBTK_PACKAGE_NAME") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + wordBits.clear(); + CDMUtilities::splitter::split(wordBits, word, "\"", CDMUtilities::splitter::no_empties); + + this->namePackage = wordBits[0]; + } + else if(wordBits[0] == "${BBTK_PACKAGE_NAME}_AUTHOR") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + wordBits.clear(); + CDMUtilities::splitter::split(wordBits, word, "\"", CDMUtilities::splitter::no_empties); + + this->authors = wordBits[0]; + } + else if(wordBits[0] == "${BBTK_PACKAGE_NAME}_DESCRIPTION") + { + word = wordBits[1]; + for (int i = 2; i < wordBits.size(); i++) + { + word += " " + wordBits[i]; + } + wordBits.clear(); + CDMUtilities::splitter::split(wordBits, word, "\"", CDMUtilities::splitter::no_empties); + + this->description = wordBits[0]; + } + else if(wordBits[0] == "${BBTK_PACKAGE_NAME}_MAJOR_VERSION") + { + this->version = wordBits[1]; + } + else if(wordBits[0] == "${BBTK_PACKAGE_NAME}_MINOR_VERSION") + { + this->version += "." + wordBits[1]; + } + else if(wordBits[0] == "${BBTK_PACKAGE_NAME}_BUILD_VERSION") + { + this->version += "." + wordBits[1]; + } + } + } + + + + std::vector checked(this->children.size(), false); + std::vector checkedBlackBoxes(this->blackBoxes.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); + + + if(stdfileName == "src") + { + wxDir srcF(crea::std2wx((path + "/" + "src").c_str())); + if (srcF.IsOpened()) + { + wxString srcName; + bool innerCont = srcF.GetFirst(&srcName, wxT("*.h"), wxDIR_FILES); + while (innerCont) + { + std::string blackBoxName = crea::wx2std(srcName); + if(crea::wx2std(srcName.substr(0,2)) == "bb") + { + //check if box already exist + bool found = false; + for (int i = 0;!found && i < this->blackBoxes.size(); i++) + { + if (this->blackBoxes[i]->GetName() == blackBoxName) + { + found = true; + int pos = std::find(this->children.begin(), this->children.end(), this->blackBoxes[i]) - this->children.begin(); + checked[pos] = true; + checkedBlackBoxes[i] = true; + if(!this->blackBoxes[i]->Refresh(result)) + return false; + } + } + if(!found) + { + modelCDMBlackBox* blackBox = new modelCDMBlackBox(blackBoxName, path + "/" + "src", this->level +1); + this->blackBoxes.push_back(blackBox); + this->children.push_back(blackBox); + } + } + innerCont = srcF.GetNext(&srcName); + } + } + + } + //if not src + else + { + //check if they already exist + 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) + { + modelCDMFolder* folder = new modelCDMFolder(this->path + "/" + stdfileName, this->level + 1); + 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 + "/" + 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; i 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 + "/" + stdfileName, this->level + 1); + this->children.push_back(file); + } + } + + cont = dir.GetNext(&fileName); + } + } + + for (int i = 0; i < checkedBlackBoxes.size(); i++) + { + if(!checkedBlackBoxes[i]) + { + this->blackBoxes.erase(this->blackBoxes.begin()+i); + checkedBlackBoxes.erase(checkedBlackBoxes.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(); return true; } diff --git a/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.cpp b/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.cpp index 44ee9b1..ddb0da9 100644 --- a/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.cpp +++ b/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.cpp @@ -34,6 +34,7 @@ #include "wxCDMApplicationDescriptionPanel.h" +#include "CDMUtilities.h" #include "wxCDMMainFrame.h" #include "creaDevManagerIds.h" @@ -41,6 +42,7 @@ BEGIN_EVENT_TABLE(wxCDMApplicationDescriptionPanel, wxPanel) EVT_BUTTON(ID_BUTTON_PREV, wxCDMApplicationDescriptionPanel::OnBtnReturn) +EVT_BUTTON(ID_BUTTON_SET_NAME, wxCDMApplicationDescriptionPanel::OnBtnSetExeName) EVT_BUTTON(ID_BUTTON_CREATE_CLASS, wxCDMApplicationDescriptionPanel::OnBtnCreateClass) EVT_BUTTON(ID_BUTTON_CREATE_FOLDER, wxCDMApplicationDescriptionPanel::OnBtnCreateFolder) EVT_BUTTON(ID_BUTTON_EDIT_CMAKELISTSFILE, wxCDMApplicationDescriptionPanel::OnBtnEditCMakeLists) @@ -89,16 +91,16 @@ void wxCDMApplicationDescriptionPanel::CreateControls() returnbt->SetToolTip(wxT("Return to the active project description.")); sizer->Add(returnbt, 0, wxALIGN_CENTER | wxALL, 5); - //Welcome + //Title sizer->Add(new wxStaticText(this, -1, _("Application")),0, wxALIGN_CENTER, 0); //Image sizer->Add(new wxStaticBitmap(this, -1, wxBitmap(AIcon64)),0, wxALIGN_CENTER, 0); - //Project Name - sizer->Add(new wxStaticText(this, -1, crea::std2wx(this->application->GetNameApplication())),0, wxALIGN_CENTER, 0); + //Application Name + sizer->Add(new wxStaticText(this, -1, crea::std2wx(this->application->GetName())),0, wxALIGN_CENTER, 0); - //Project Properties + //Properties wxStaticBoxSizer* propertiesBox = new wxStaticBoxSizer(wxVERTICAL, this, wxT("&Properties")); wxPanel* propertiesPanel = new wxPanel(this); wxBoxSizer* propertiesPanelSizer = new wxBoxSizer(wxVERTICAL); @@ -107,10 +109,10 @@ void wxCDMApplicationDescriptionPanel::CreateControls() wxStaticText *pMainFile = new wxStaticText(propertiesPanel, -1, wxT("Executable Name")); wxBoxSizer* pMainFilesz = new wxBoxSizer(wxHORIZONTAL); - wxStaticText* pMainFiletc = new wxStaticText(propertiesPanel, wxID_ANY, crea::std2wx(this->application->GetExecutableName())); - wxButton* pMainFilebt = new wxButton(propertiesPanel, ID_BUTTON_SET_VERSION, wxT("Set")); + this->executableNametc = new wxStaticText(propertiesPanel, wxID_ANY, crea::std2wx(this->application->GetExecutableName())); + wxButton* pMainFilebt = new wxButton(propertiesPanel, ID_BUTTON_SET_NAME, wxT("Set")); pMainFilebt->SetToolTip(wxT("Set the name of the executable file for the application.")); - pMainFilesz->Add(pMainFiletc, 0, wxALIGN_CENTER_VERTICAL, 0); + pMainFilesz->Add(this->executableNametc, 0, wxALIGN_CENTER_VERTICAL, 0); pMainFilesz->Add(pMainFilebt, 0, wxALIGN_CENTER | wxLEFT, 10); propertiesGridSizer->Add(pMainFile, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); @@ -169,6 +171,30 @@ void wxCDMApplicationDescriptionPanel::OnBtnReturn(wxCommandEvent& event) wxPostEvent(this->GetParent(), *newEvent); } +void wxCDMApplicationDescriptionPanel::OnBtnSetExeName(wxCommandEvent& event) +{ + //get name + wxString versionWx = wxGetTextFromUser( + wxT("Enter the new executable name"), + wxT("Change Application Executable Name - creaDevManager"), + crea::std2wx(this->application->GetExecutableName()) + ); + //check name + std::vector parts; + CDMUtilities::splitter::split(parts, crea::wx2std(versionWx), " .", CDMUtilities::splitter::no_empties); + if(parts.size() > 0) + { + std::string* result; + if(!this->application->SetExecutableName(crea::wx2std(versionWx), result)) + wxMessageBox(crea::std2wx(*result),_T("Change Application Executable Name - Error!"),wxOK | wxICON_ERROR); + } + else + { + wxMessageBox(crea::std2wx("No name specified"),_T("Set Application Executable Name - Error!"),wxOK | wxICON_ERROR); + } + this->executableNametc->SetLabel(crea::std2wx(this->application->GetExecutableName())); +} + void wxCDMApplicationDescriptionPanel::OnBtnCreateClass(wxCommandEvent& event) { //TODO: implement method @@ -178,9 +204,33 @@ void wxCDMApplicationDescriptionPanel::OnBtnCreateClass(wxCommandEvent& event) void wxCDMApplicationDescriptionPanel::OnBtnCreateFolder(wxCommandEvent& event) { - //TODO: implement method - std::cerr << "Event OnBtnCreateFolder not implemented" << std::endl; - event.Skip(); + //get name + wxString folderName = wxGetTextFromUser( + wxT("Enter the name of the new folder:"), + wxT("Create Folder - creaDevManager") + ); + //check name + std::vector parts; + CDMUtilities::splitter::split(parts, crea::wx2std(folderName), " /\\\"", CDMUtilities::splitter::no_empties); + if(parts.size() > 0) + { + std::string* result; + modelCDMFolder* folderC = this->application->CreateFolder(crea::wx2std(folderName), result); + if(folderC == NULL) + { + wxMessageBox(crea::std2wx(*result),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + return; + } + ((wxCDMMainFrame*)this->GetParent())->RefreshProject(); + wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_DISPLAY_CHANGED); + newEvent->SetInt(folderC->GetId()); + wxPostEvent(this->GetParent(), *newEvent); + wxMessageBox(crea::std2wx("The folder was successfully created"),_T("Create Folder - Success"),wxOK | wxICON_INFORMATION); + } + else + { + wxMessageBox(crea::std2wx("No name specified"),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + } } void wxCDMApplicationDescriptionPanel::OnBtnEditCMakeLists(wxCommandEvent& event) diff --git a/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.h b/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.h index fbb0a24..0aa79fa 100644 --- a/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.h +++ b/lib/creaDevManagerLib/wxCDMApplicationDescriptionPanel.h @@ -70,10 +70,12 @@ public: private: modelCDMApplication* application; + wxStaticText* executableNametc; //handlers protected: void OnBtnReturn(wxCommandEvent& event); + void OnBtnSetExeName(wxCommandEvent& event); void OnBtnCreateClass(wxCommandEvent& event); void OnBtnCreateFolder(wxCommandEvent& event); void OnBtnEditCMakeLists(wxCommandEvent& event); diff --git a/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.cpp b/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.cpp index 7ac3841..9db89c4 100644 --- a/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.cpp +++ b/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.cpp @@ -35,6 +35,7 @@ #include "wxCDMFolderDescriptionPanel.h" #include "wxCDMMainFrame.h" +#include "CDMUtilities.h" #include "creaDevManagerIds.h" #include "images/FdIcon64.xpm" @@ -43,6 +44,7 @@ BEGIN_EVENT_TABLE(wxCDMFolderDescriptionPanel, wxPanel) EVT_BUTTON(ID_BUTTON_PREV, wxCDMFolderDescriptionPanel::OnBtnReturn) EVT_BUTTON(ID_BUTTON_OPEN_FOLDER, wxCDMFolderDescriptionPanel::OnBtnOpenInExplorer) EVT_BUTTON(ID_BUTTON_EDIT_CMAKELISTSFILE, wxCDMFolderDescriptionPanel::OnBtnEditCMakeLists) +EVT_BUTTON(ID_BUTTON_CREATE_FOLDER, wxCDMFolderDescriptionPanel::OnBtnCreateFolder) END_EVENT_TABLE() wxCDMFolderDescriptionPanel::wxCDMFolderDescriptionPanel( @@ -114,6 +116,10 @@ void wxCDMFolderDescriptionPanel::CreateControls() actionsPanelSizer->Add(editCMakebt, 0, wxALL, 5); } + wxButton* createFolderbt = new wxButton(actionsPanel, ID_BUTTON_CREATE_FOLDER, _T("Create Folder")); + createFolderbt->SetToolTip(wxT("Create a new folder inside this folder.")); + actionsPanelSizer->Add(createFolderbt, 0, wxALL, 5); + actionsPanel->SetSizer(actionsPanelSizer); actionsPanelSizer->Fit(actionsPanel); actionsBox->Add(actionsPanel, 0, wxEXPAND); @@ -135,8 +141,8 @@ void wxCDMFolderDescriptionPanel::OnBtnReturn(wxCommandEvent& event) void wxCDMFolderDescriptionPanel::OnBtnOpenInExplorer(wxCommandEvent& event) { std::string* result; - if(!this->folder->OpenInFileExplorer(result)) - wxMessageBox(crea::std2wx(*result),_T("Open Folder - Error!"),wxOK | wxICON_ERROR); + if(!this->folder->OpenInFileExplorer(result)) + wxMessageBox(crea::std2wx(*result),_T("Open Folder - Error!"),wxOK | wxICON_ERROR); } void wxCDMFolderDescriptionPanel::OnBtnEditCMakeLists(wxCommandEvent& event) @@ -156,6 +162,37 @@ void wxCDMFolderDescriptionPanel::OnBtnEditCMakeLists(wxCommandEvent& event) } } +void wxCDMFolderDescriptionPanel::OnBtnCreateFolder(wxCommandEvent& event) +{ + //get name + wxString folderName = wxGetTextFromUser( + wxT("Enter the name of the new folder:"), + wxT("Create Folder - creaDevManager") + ); + //check name + std::vector parts; + CDMUtilities::splitter::split(parts, crea::wx2std(folderName), " /\\\"", CDMUtilities::splitter::no_empties); + if(parts.size() > 0) + { + std::string* result; + modelCDMFolder* folderC = this->folder->CreateFolder(crea::wx2std(folderName), result); + if(folderC == NULL) + { + wxMessageBox(crea::std2wx(*result),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + return; + } + ((wxCDMMainFrame*)this->GetParent())->RefreshProject(); + wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_DISPLAY_CHANGED); + newEvent->SetInt(folderC->GetId()); + wxPostEvent(this->GetParent(), *newEvent); + wxMessageBox(crea::std2wx("The folder was successfully created"),_T("Create Folder - Success"),wxOK | wxICON_INFORMATION); + } + else + { + wxMessageBox(crea::std2wx("No name specified"),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + } +} + void wxCDMFolderDescriptionPanel::OnCMakeMouseEnter(wxMouseEvent& event) { wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_COMMAND_LIST_ITEM_SELECTED); diff --git a/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.h b/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.h index 514984e..ecf47ff 100644 --- a/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.h +++ b/lib/creaDevManagerLib/wxCDMFolderDescriptionPanel.h @@ -75,6 +75,7 @@ private: protected: void OnBtnReturn(wxCommandEvent& event); void OnBtnEditCMakeLists(wxCommandEvent& event); + void OnBtnCreateFolder(wxCommandEvent& event); void OnBtnOpenInExplorer(wxCommandEvent& event); void OnCMakeMouseEnter(wxMouseEvent& event); diff --git a/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.cpp b/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.cpp index 61cec4d..1c14b74 100644 --- a/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.cpp +++ b/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.cpp @@ -34,6 +34,7 @@ #include "wxCDMLibraryDescriptionPanel.h" +#include "CDMUtilities.h" #include "wxCDMMainFrame.h" #include "creaDevManagerIds.h" @@ -41,6 +42,7 @@ BEGIN_EVENT_TABLE(wxCDMLibraryDescriptionPanel, wxPanel) EVT_BUTTON(ID_BUTTON_PREV, wxCDMLibraryDescriptionPanel::OnBtnReturn) +EVT_BUTTON(ID_BUTTON_SET_NAME, wxCDMLibraryDescriptionPanel::OnBtnSetExeName) EVT_BUTTON(ID_BUTTON_CREATE_CLASS, wxCDMLibraryDescriptionPanel::OnBtnCreateClass) EVT_BUTTON(ID_BUTTON_CREATE_FOLDER, wxCDMLibraryDescriptionPanel::OnBtnCreateFolder) EVT_BUTTON(ID_BUTTON_EDIT_CMAKELISTSFILE, wxCDMLibraryDescriptionPanel::OnBtnEditCMakeLists) @@ -95,8 +97,34 @@ void wxCDMLibraryDescriptionPanel::CreateControls() //Image sizer->Add(new wxStaticBitmap(this, -1, wxBitmap(LIcon64)),0, wxALIGN_CENTER, 0); - //Project Name - sizer->Add(new wxStaticText(this, -1, crea::std2wx(this->library->GetNameLibrary())),0, wxALIGN_CENTER, 0); + //Application Name + sizer->Add(new wxStaticText(this, -1, crea::std2wx(this->library->GetName())),0, wxALIGN_CENTER, 0); + + //Properties + wxStaticBoxSizer* propertiesBox = new wxStaticBoxSizer(wxVERTICAL, this, wxT("&Properties")); + wxPanel* propertiesPanel = new wxPanel(this); + wxBoxSizer* propertiesPanelSizer = new wxBoxSizer(wxVERTICAL); + + wxFlexGridSizer* propertiesGridSizer = new wxFlexGridSizer(4, 2, 9, 15); + + wxStaticText *pMainFile = new wxStaticText(propertiesPanel, -1, wxT("Library Name")); + wxBoxSizer* pMainFilesz = new wxBoxSizer(wxHORIZONTAL); + this->libraryNametc = new wxStaticText(propertiesPanel, wxID_ANY, crea::std2wx(this->library->GetNameLibrary())); + wxButton* pMainFilebt = new wxButton(propertiesPanel, ID_BUTTON_SET_NAME, wxT("Set")); + pMainFilebt->SetToolTip(wxT("Set the name of the library for the project.")); + pMainFilesz->Add(this->libraryNametc, 0, wxALIGN_CENTER_VERTICAL, 0); + pMainFilesz->Add(pMainFilebt, 0, wxALIGN_CENTER | wxLEFT, 10); + + propertiesGridSizer->Add(pMainFile, 0, wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL); + propertiesGridSizer->Add(pMainFilesz, 1, wxEXPAND); + + propertiesGridSizer->AddGrowableCol(1,1); + + propertiesPanelSizer->Add(propertiesGridSizer, 0, wxEXPAND); + propertiesPanel->SetSizer(propertiesPanelSizer); + propertiesPanelSizer->Fit(propertiesPanel); + propertiesBox->Add(propertiesPanel, 0, wxEXPAND); + sizer->Add(propertiesBox, 0, wxEXPAND | wxALL, 10); //Actions wxStaticBoxSizer* actionsBox = new wxStaticBoxSizer(wxHORIZONTAL, this, wxT("&Actions")); @@ -136,6 +164,30 @@ void wxCDMLibraryDescriptionPanel::OnBtnReturn(wxCommandEvent& event) wxPostEvent(this->GetParent(), *newEvent); } +void wxCDMLibraryDescriptionPanel::OnBtnSetExeName(wxCommandEvent& event) +{ + //get name + wxString versionWx = wxGetTextFromUser( + wxT("Enter the new executable name"), + wxT("Change Library Name - creaDevManager"), + crea::std2wx(this->library->GetNameLibrary()) + ); + //check name + std::vector parts; + CDMUtilities::splitter::split(parts, crea::wx2std(versionWx), " .", CDMUtilities::splitter::no_empties); + if(parts.size() > 0) + { + std::string* result; + if(!this->library->SetNameLibrary(crea::wx2std(versionWx), result)) + wxMessageBox(crea::std2wx(*result),_T("Change Library Name - Error!"),wxOK | wxICON_ERROR); + } + else + { + wxMessageBox(crea::std2wx("No name specified"),_T("Set Library Name - Error!"),wxOK | wxICON_ERROR); + } + this->libraryNametc->SetLabel(crea::std2wx(this->library->GetNameLibrary())); +} + void wxCDMLibraryDescriptionPanel::OnBtnCreateClass(wxCommandEvent& event) { //TODO: implement method @@ -145,28 +197,52 @@ void wxCDMLibraryDescriptionPanel::OnBtnCreateClass(wxCommandEvent& event) void wxCDMLibraryDescriptionPanel::OnBtnCreateFolder(wxCommandEvent& event) { - //TODO: implement method - std::cerr << "Event OnBtnCreateFolder not implemented" << std::endl; - event.Skip(); + //get name + wxString folderName = wxGetTextFromUser( + wxT("Enter the name of the new folder:"), + wxT("Create Folder - creaDevManager") + ); + //check name + std::vector parts; + CDMUtilities::splitter::split(parts, crea::wx2std(folderName), " /\\\"", CDMUtilities::splitter::no_empties); + if(parts.size() > 0) + { + std::string* result; + modelCDMFolder* folderC = this->library->CreateFolder(crea::wx2std(folderName), result); + if(folderC == NULL) + { + wxMessageBox(crea::std2wx(*result),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + return; + } + ((wxCDMMainFrame*)this->GetParent())->RefreshProject(); + wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_DISPLAY_CHANGED); + newEvent->SetInt(folderC->GetId()); + wxPostEvent(this->GetParent(), *newEvent); + wxMessageBox(crea::std2wx("The folder was successfully created"),_T("Create Folder - Success"),wxOK | wxICON_INFORMATION); + } + else + { + wxMessageBox(crea::std2wx("No name specified"),_T("Create Folder - Error!"),wxOK | wxICON_ERROR); + } } void wxCDMLibraryDescriptionPanel::OnBtnEditCMakeLists(wxCommandEvent& event) { std::string* result; - if(!this->library->OpenCMakeListsFile(result)) - wxMessageBox(crea::std2wx(*result),_T("Open CMakeLists File - Error!"),wxOK | wxICON_ERROR); + if(!this->library->OpenCMakeListsFile(result)) + wxMessageBox(crea::std2wx(*result),_T("Open CMakeLists File - Error!"),wxOK | wxICON_ERROR); - wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_COMMAND_LIST_ITEM_DESELECTED); + wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_COMMAND_LIST_ITEM_DESELECTED); - if(this->library->GetCMakeLists() != NULL) - { - int CMId = this->library->GetCMakeLists()->GetId(); - newEvent->SetInt(CMId); - newEvent->SetId(0); - wxPostEvent(this->GetParent(), *newEvent); - } + if(this->library->GetCMakeLists() != NULL) + { + int CMId = this->library->GetCMakeLists()->GetId(); + newEvent->SetInt(CMId); + newEvent->SetId(0); + wxPostEvent(this->GetParent(), *newEvent); + } - event.Skip(); + event.Skip(); } void wxCDMLibraryDescriptionPanel::OnBtnOpenFolder(wxCommandEvent& event) diff --git a/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.h b/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.h index 37c0ff2..c6c60e3 100644 --- a/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.h +++ b/lib/creaDevManagerLib/wxCDMLibraryDescriptionPanel.h @@ -70,10 +70,12 @@ public: private: modelCDMLibrary* library; + wxStaticText* libraryNametc; //handlers protected: void OnBtnReturn(wxCommandEvent& event); + void OnBtnSetExeName(wxCommandEvent& event); void OnBtnCreateClass(wxCommandEvent& event); void OnBtnCreateFolder(wxCommandEvent& event); void OnBtnEditCMakeLists(wxCommandEvent& event); diff --git a/lib/creaDevManagerLib/wxCDMMainFrame.cpp b/lib/creaDevManagerLib/wxCDMMainFrame.cpp index dc2843e..414d88b 100755 --- a/lib/creaDevManagerLib/wxCDMMainFrame.cpp +++ b/lib/creaDevManagerLib/wxCDMMainFrame.cpp @@ -534,7 +534,12 @@ void wxCDMMainFrame::OnMenuRefreshProject(wxCommandEvent& event) wxMessageBox( crea::std2wx(result->c_str()), wxT("Refresh Project - Error"), wxICON_ERROR); } this->tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); + this->auiManager.Update(); + + this->tree_Projects->SelectItem(this->model->GetProject()->GetId(), false); + this->tree_Projects->SelectItem(this->model->GetProject()->GetId(), true); + //TODO: Show possible problems in CMakeLists files event.Skip(); }