From f0d6beb7af51921d5245cd04e307e69993044dfc Mon Sep 17 00:00:00 2001 From: Daniel Gonzalez Date: Fri, 30 Nov 2012 17:39:49 +0100 Subject: [PATCH] Feature #1711 CreaDevManager application implementation Creation of files and folders in constructors Showing files and folders in the tree and catching changing event in tree. --- lib/creaDevManagerLib/modelCDMApplication.cpp | 8 +- .../modelCDMCMakeListsFile.cpp | 8 ++ lib/creaDevManagerLib/modelCDMFile.cpp | 17 ++++ lib/creaDevManagerLib/modelCDMFolder.cpp | 67 +++++++++++++ lib/creaDevManagerLib/modelCDMFolder.h | 2 + lib/creaDevManagerLib/modelCDMLibrary.cpp | 8 +- lib/creaDevManagerLib/modelCDMMain.cpp | 5 + lib/creaDevManagerLib/modelCDMMain.h | 9 ++ lib/creaDevManagerLib/modelCDMPackage.cpp | 10 +- lib/creaDevManagerLib/modelCDMProject.cpp | 99 ++++++++++--------- lib/creaDevManagerLib/modelCDMProject.h | 6 +- lib/creaDevManagerLib/wxCDMMainFrame.cpp | 80 ++++++++++++++- .../wxCDMProjectsTreeCtrl.cxx | 11 ++- lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.h | 5 +- 14 files changed, 274 insertions(+), 61 deletions(-) diff --git a/lib/creaDevManagerLib/modelCDMApplication.cpp b/lib/creaDevManagerLib/modelCDMApplication.cpp index 5035feb..a816a96 100644 --- a/lib/creaDevManagerLib/modelCDMApplication.cpp +++ b/lib/creaDevManagerLib/modelCDMApplication.cpp @@ -44,7 +44,13 @@ modelCDMApplication::modelCDMApplication() modelCDMApplication::modelCDMApplication(const std::string& path, const int& level) { - this->name = "application"; + 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->path = path; this->type = wxDIR_DIRS; this->level = level; diff --git a/lib/creaDevManagerLib/modelCDMCMakeListsFile.cpp b/lib/creaDevManagerLib/modelCDMCMakeListsFile.cpp index 7cdcc63..768ce80 100644 --- a/lib/creaDevManagerLib/modelCDMCMakeListsFile.cpp +++ b/lib/creaDevManagerLib/modelCDMCMakeListsFile.cpp @@ -34,6 +34,9 @@ #include "modelCDMCMakeListsFile.h" +#include +#include + modelCDMCMakeListsFile::modelCDMCMakeListsFile() { } @@ -41,6 +44,11 @@ modelCDMCMakeListsFile::modelCDMCMakeListsFile() modelCDMCMakeListsFile::modelCDMCMakeListsFile(const std::string& path, const int& level) { + this->children.clear(); + this->level = level; + this->type = wxDIR_FILES; + this->name = "CMakeFileLists.txt"; + this->path = path; } modelCDMCMakeListsFile::~modelCDMCMakeListsFile() diff --git a/lib/creaDevManagerLib/modelCDMFile.cpp b/lib/creaDevManagerLib/modelCDMFile.cpp index 0049e41..6fcfab6 100644 --- a/lib/creaDevManagerLib/modelCDMFile.cpp +++ b/lib/creaDevManagerLib/modelCDMFile.cpp @@ -34,12 +34,29 @@ #include "modelCDMFile.h" +#include +#include + +#include "CDMUtilities.h" + modelCDMFile::modelCDMFile() { } modelCDMFile::modelCDMFile(const std::string& path, const int& level) { + this->children.clear(); + this->level = level; + + 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->path = path; + this->type = wxDIR_FILES; } modelCDMFile::~modelCDMFile() diff --git a/lib/creaDevManagerLib/modelCDMFolder.cpp b/lib/creaDevManagerLib/modelCDMFolder.cpp index a1965a6..537e636 100644 --- a/lib/creaDevManagerLib/modelCDMFolder.cpp +++ b/lib/creaDevManagerLib/modelCDMFolder.cpp @@ -34,16 +34,83 @@ #include "modelCDMFolder.h" +#include +#include + +#include "CDMUtilities.h" + modelCDMFolder::modelCDMFolder() { + this->CMakeLists = NULL; } modelCDMFolder::modelCDMFolder(const std::string& path, const int& level) { + //set attributes + this->children.clear(); + this->level = level; + this->CMakeLists = NULL; + + 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->path = path; + this->type = wxDIR_DIRS; + + std::string pathFixed(CDMUtilities::fixPath(path)); + //check all folders + wxDir dir(crea::std2wx((pathFixed).c_str())); + if (dir.IsOpened()) + { + wxString fileName; + bool cont = dir.GetFirst(&fileName, wxEmptyString, wxDIR_DIRS); + while (cont) + { + std::string stdfileName = crea::wx2std(fileName); + + //if is an unknown folder, create folder + this->children.push_back(new modelCDMFolder(pathFixed + "/" + stdfileName, this->level + 1)); + + 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") + { + this->CMakeLists = new modelCDMCMakeListsFile(pathFixed + "/" + stdfileName, this->level + 1); + this->children.push_back(this->CMakeLists); + } + else + { + this->children.push_back(new modelCDMFile(pathFixed + "/" + stdfileName, this->level + 1)); + } + //if is an unknown file, create file + cont = dir.GetNext(&fileName); + } + } + + this->SortChildren(); } modelCDMFolder::~modelCDMFolder() { + for (int i = 0; i < this->children.size(); i++) + { + if(this->children[i] != NULL) + { + delete this->children[i]; + this->children[i] = NULL; + } + } } bool modelCDMFolder::CreateFolder(const std::string& name, std::string*& result, diff --git a/lib/creaDevManagerLib/modelCDMFolder.h b/lib/creaDevManagerLib/modelCDMFolder.h index f1ead30..fe88055 100644 --- a/lib/creaDevManagerLib/modelCDMFolder.h +++ b/lib/creaDevManagerLib/modelCDMFolder.h @@ -39,6 +39,7 @@ #include #include "modelCDMIProjectTreeNode.h" +#include "modelCDMCMakeListsFile.h" class modelCDMFolder : public modelCDMIProjectTreeNode { @@ -57,6 +58,7 @@ public: private: std::vector folders; + modelCDMCMakeListsFile* CMakeLists; }; #endif /* MODELCDMFOLDER_H_ */ diff --git a/lib/creaDevManagerLib/modelCDMLibrary.cpp b/lib/creaDevManagerLib/modelCDMLibrary.cpp index c9aeb1f..cfd0411 100644 --- a/lib/creaDevManagerLib/modelCDMLibrary.cpp +++ b/lib/creaDevManagerLib/modelCDMLibrary.cpp @@ -44,7 +44,13 @@ modelCDMLibrary::modelCDMLibrary() modelCDMLibrary::modelCDMLibrary(const std::string& path, const int& level) { - this->name = "library"; + 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->path = path; this->type = wxDIR_DIRS; this->level = level; diff --git a/lib/creaDevManagerLib/modelCDMMain.cpp b/lib/creaDevManagerLib/modelCDMMain.cpp index b3c381f..5c49116 100644 --- a/lib/creaDevManagerLib/modelCDMMain.cpp +++ b/lib/creaDevManagerLib/modelCDMMain.cpp @@ -263,6 +263,11 @@ bool modelCDMMain::RefreshProject( } } +std::map& modelCDMMain::GetModelElements() +{ + return this->modelElements; +} + bool modelCDMMain::CloseProject( std::string*& result ) diff --git a/lib/creaDevManagerLib/modelCDMMain.h b/lib/creaDevManagerLib/modelCDMMain.h index 83d86ac..d75355c 100644 --- a/lib/creaDevManagerLib/modelCDMMain.h +++ b/lib/creaDevManagerLib/modelCDMMain.h @@ -36,7 +36,12 @@ #define MODELCDMMAIN_H_ #include +#include +#include +#include + +#include "modelCDMIProjectTreeNode.h" #include "modelCDMProject.h" class modelCDMMain @@ -46,6 +51,8 @@ public: ~modelCDMMain(); modelCDMProject* GetProject() const; + std::map< wxTreeItemId, modelCDMIProjectTreeNode* >& GetModelElements(); + bool CreateProject( const std::string& name, @@ -65,8 +72,10 @@ public: std::string*& result ); + private: modelCDMProject* project; + std::map< wxTreeItemId, modelCDMIProjectTreeNode* > modelElements; }; diff --git a/lib/creaDevManagerLib/modelCDMPackage.cpp b/lib/creaDevManagerLib/modelCDMPackage.cpp index 487beef..b7280b1 100644 --- a/lib/creaDevManagerLib/modelCDMPackage.cpp +++ b/lib/creaDevManagerLib/modelCDMPackage.cpp @@ -36,6 +36,7 @@ #include "creaWx.h" #include "wx/dir.h" +#include "CDMUtilities.h" modelCDMPackage::modelCDMPackage() { @@ -44,8 +45,13 @@ modelCDMPackage::modelCDMPackage() modelCDMPackage::modelCDMPackage(const std::string& path, const int& level) { this->type = wxDIR_DIRS; - //TODO: Get Package Name - this->name = "Package"; + //Get Package Name + 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].substr(5, words[words.size()-1].size()-9); this->namePackage = this->name; this->level = level; this->path = path; diff --git a/lib/creaDevManagerLib/modelCDMProject.cpp b/lib/creaDevManagerLib/modelCDMProject.cpp index 11ed495..dc9ac63 100644 --- a/lib/creaDevManagerLib/modelCDMProject.cpp +++ b/lib/creaDevManagerLib/modelCDMProject.cpp @@ -47,6 +47,7 @@ modelCDMProject::modelCDMProject() std::cout << "in constructor1" << std::endl; this->appli = NULL; this->lib = NULL; + this->CMakeLists = NULL; } modelCDMProject::modelCDMProject( @@ -79,13 +80,14 @@ modelCDMProject::modelCDMProject( std::vector nameBits; CDMUtilities::splitter::split(nameBits, word, " ", CDMUtilities::splitter::no_empties); - this->name = ""; + this->name = this->nameProject = ""; for (int i = 0; i < nameBits.size(); i++) { if(i != 0) this->name += " "; this->name += nameBits[i]; } + this->nameProject = this->name; } @@ -132,28 +134,14 @@ modelCDMProject::modelCDMProject( this->type = wxDIR_DIRS; this->level = 0; - //TODO: implement method - //if appli exist create Appli + this->children.clear(); this->appli = NULL; - wxDir dir(crea::std2wx((pathFixed + "/appli").c_str())); - if (dir.IsOpened()) - { - this->appli = new modelCDMAppli(pathFixed + "/appli", this->level + 1); - this->children.push_back(this->appli); - } - - //if lib exist create Lib this->lib = NULL; - dir.Open(crea::std2wx((pathFixed + "/lib").c_str())); - if (dir.IsOpened()) - { - this->lib = new modelCDMLib(pathFixed + "/lib", this->level + 1); - this->children.push_back(this->lib); - } - - //if bbtk_* exist create Packages this->packages.clear(); - dir.Open(crea::std2wx((pathFixed).c_str())); + + + //check all folders + wxDir dir(crea::std2wx((pathFixed).c_str())); if (dir.IsOpened()) { wxString fileName; @@ -162,63 +150,86 @@ modelCDMProject::modelCDMProject( { std::string stdfileName = crea::wx2std(fileName); - if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG") + //if appli, create appli + if(stdfileName == "appli") + { + this->appli = new modelCDMAppli(pathFixed + "/appli", this->level + 1); + this->children.push_back(this->appli); + } + //if lib, create lib + else if(stdfileName == "lib") + { + this->lib = new modelCDMLib(pathFixed + "/lib", this->level + 1); + this->children.push_back(this->lib); + } + //if package , create package + else if(stdfileName.size() > 9 && stdfileName.substr(0,5) == "bbtk_" && stdfileName.substr(stdfileName.size()-4,4) == "_PKG") { modelCDMPackage* package = new modelCDMPackage(pathFixed + "/" + stdfileName, this->level + 1); this->packages.push_back(package); this->children.push_back(package); } + //if is an unknown folder, create folder + else + { + this->children.push_back(new modelCDMFolder(pathFixed + "/" + stdfileName, this->level + 1)); + } 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") + { + this->CMakeLists = new modelCDMCMakeListsFile(pathFixed + "/" + stdfileName, this->level + 1); + this->children.push_back(this->CMakeLists); + } + else + { + this->children.push_back(new modelCDMFile(pathFixed + "/" + stdfileName, this->level + 1)); + } + //if is an unknown file, create file + cont = dir.GetNext(&fileName); + } } + this->SortChildren(); } modelCDMProject::~modelCDMProject() { - if(this->appli != NULL) - { - delete this->appli; - this->appli = NULL; - } - if(this->lib != NULL) - { - delete this->lib; - this->lib = NULL; - } - for (int i = 0; i < this->packages.size(); i++) + for (int i = 0; i < this->children.size(); i++) { - if(this->packages[i] != NULL) + if(this->children[i] != NULL) { - delete this->packages[i]; - this->packages[i] = NULL; + delete this->children[i]; + this->children[i] = NULL; } } } -const std::string& -modelCDMProject::GetName() const +const std::string& modelCDMProject::GetNameProject() const { - return this->name; + return this->nameProject; } -const std::string& -modelCDMProject::GetVersion() const +const std::string& modelCDMProject::GetVersion() const { return this->version; } -const std::string& -modelCDMProject::GetVersionDate() const +const std::string& modelCDMProject::GetVersionDate() const { return this->versionDate; } -const std::string& -modelCDMProject::GetBuildPath() const +const std::string& modelCDMProject::GetBuildPath() const { return this->buildPath; } diff --git a/lib/creaDevManagerLib/modelCDMProject.h b/lib/creaDevManagerLib/modelCDMProject.h index bafe635..00fff7c 100644 --- a/lib/creaDevManagerLib/modelCDMProject.h +++ b/lib/creaDevManagerLib/modelCDMProject.h @@ -42,6 +42,7 @@ #include "modelCDMLib.h" #include "modelCDMAppli.h" #include "modelCDMPackage.h" +#include "modelCDMCMakeListsFile.h" class modelCDMProject : public modelCDMFolder { @@ -52,7 +53,7 @@ public: void PopulateProject(); - const std::string& GetName() const; + const std::string& GetNameProject() const; const std::string& GetVersion() const; const std::string& GetVersionDate() const; const std::string& GetBuildPath() const; @@ -94,7 +95,7 @@ public: private: - std::string name; + std::string nameProject; std::string version; std::string versionDate; std::string buildPath; @@ -102,6 +103,7 @@ private: modelCDMLib* lib; modelCDMAppli* appli; std::vector packages; + modelCDMCMakeListsFile* CMakeLists; }; diff --git a/lib/creaDevManagerLib/wxCDMMainFrame.cpp b/lib/creaDevManagerLib/wxCDMMainFrame.cpp index 28d9a5d..d8ffea1 100755 --- a/lib/creaDevManagerLib/wxCDMMainFrame.cpp +++ b/lib/creaDevManagerLib/wxCDMMainFrame.cpp @@ -238,7 +238,7 @@ void wxCDMMainFrame::OnMenuNewProject(wxCommandEvent& event) } //populate tree control - tree_Projects->BuildTree(this->model->GetProject()); + tree_Projects->BuildTree(this->model->GetModelElements(),this->model->GetProject()); tree_Projects->SelectItem(this->model->GetProject()->GetId()); //change description panel @@ -325,7 +325,7 @@ void wxCDMMainFrame::OnMenuOpenProject(wxCommandEvent& event) //populate tree control - tree_Projects->BuildTree(this->model->GetProject()); + tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); tree_Projects->SelectItem(this->model->GetProject()->GetId()); //change description panel @@ -383,7 +383,7 @@ void wxCDMMainFrame::OnMenuCloseProject(wxCommandEvent& event) std::cout << "error closing project: " << *result << std::endl; wxMessageBox( crea::std2wx(result->c_str()), wxT("Close Project - Error"), wxICON_ERROR); } - tree_Projects->BuildTree(this->model->GetProject()); + tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); if(this->panel_Properties != NULL) { @@ -412,7 +412,38 @@ void wxCDMMainFrame::OnMenuCloseProject(wxCommandEvent& event) } void wxCDMMainFrame::OnMenuCloseAllProjects(wxCommandEvent& event) { - std::cerr << "Event OnMenuCloseAllProjects not implemented" << std::endl; + std::cerr << "Event OnMenuCloseAllProjects closing only one project" << std::endl; + std::string* result; + if(!this->model->CloseProject(result)) + { + std::cout << "error closing project: " << *result << std::endl; + wxMessageBox( crea::std2wx(result->c_str()), wxT("Close Project - Error"), wxICON_ERROR); + } + tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); + + if(this->panel_Properties != NULL) + { + auiManager.DetachPane(this->panel_Properties); + this->panel_Properties->Destroy(); + } + if(this->panel_ProjectActions != NULL) + { + auiManager.DetachPane(this->panel_ProjectActions); + this->panel_ProjectActions->Destroy(); + } + + this->panel_Properties = new wxCDMMainDescriptionPanel( + this, + ID_WINDOW_PROPERTIES, + wxT("Description Panel"), + wxDefaultPosition, + wxSize(300, 400), + 0 + ); + + auiManager.AddPane(panel_Properties, wxCENTER, wxT("Properties")); + + auiManager.Update(); event.Skip(); } void wxCDMMainFrame::OnMenuExportHierarchy(wxCommandEvent& event) @@ -423,6 +454,33 @@ void wxCDMMainFrame::OnMenuExportHierarchy(wxCommandEvent& event) void wxCDMMainFrame::OnMenuExit(wxCommandEvent& event) { std::cout << "Closing CreaDevManager..." << std::endl; + std::string* result; + if(!this->model->CloseProject(result)) + { + std::cout << "error closing project: " << *result << std::endl; + wxMessageBox( crea::std2wx(result->c_str()), wxT("Close Project - Error"), wxICON_ERROR); + } + tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); + + if(this->panel_Properties != NULL) + { + auiManager.DetachPane(this->panel_Properties); + this->panel_Properties->Destroy(); + } + if(this->panel_ProjectActions != NULL) + { + auiManager.DetachPane(this->panel_ProjectActions); + this->panel_ProjectActions->Destroy(); + } + + this->panel_Properties = new wxCDMMainDescriptionPanel( + this, + ID_WINDOW_PROPERTIES, + wxT("Description Panel"), + wxDefaultPosition, + wxSize(300, 400), + 0 + ); Close(); event.Skip(); } @@ -520,6 +578,18 @@ void wxCDMMainFrame::OnMenuAboutCreatis(wxCommandEvent& event) void wxCDMMainFrame::OnTreeSelectionChanged(wxTreeEvent& event) { - std::cerr << "Event OnTreeSelectionChange not implemented" << std::endl; + std::cout << "New Tree Selection" << std::endl; + //get selected element + wxTreeItemId elementId = event.GetItem(); + + //get element from model + modelCDMIProjectTreeNode* element = this->model->GetModelElements()[elementId]; + std::cout << "Tree Selection: " << element->GetName() << std::endl; + + //TODO get element type + //TODO create element description + //TODO delete old view + //TODO set new view event.Skip(); + } diff --git a/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.cxx b/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.cxx index 61bd7e7..671574d 100755 --- a/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.cxx +++ b/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.cxx @@ -70,17 +70,19 @@ bool wxCDMProjectsTreeCtrl::Create( return TRUE; } -void wxCDMProjectsTreeCtrl::BuildTree(modelCDMProject* projectTree) +void wxCDMProjectsTreeCtrl::BuildTree(std::map< wxTreeItemId, modelCDMIProjectTreeNode* >& modelElements, modelCDMProject* projectTree) { this->DeleteAllItems(); + modelElements.clear(); if(projectTree != NULL) { wxTreeItemId rootIndex; rootIndex= this-> AddRoot(crea::std2wx(projectTree->GetName())); projectTree->SetId(rootIndex); + modelElements[rootIndex] = projectTree; std::cout << "Building TreeCtrl for " << projectTree->GetName() << std::endl; - this->BuildTree(projectTree->GetChildren(), rootIndex); + this->BuildTree(projectTree->GetChildren(), modelElements, rootIndex); this->Expand(rootIndex); @@ -92,7 +94,7 @@ void wxCDMProjectsTreeCtrl::BuildTree(modelCDMProject* projectTree) } } -void wxCDMProjectsTreeCtrl::BuildTree(const std::vector& treeNodes, wxTreeItemId parent) +void wxCDMProjectsTreeCtrl::BuildTree(const std::vector& treeNodes, std::map< wxTreeItemId, modelCDMIProjectTreeNode* >& modelElements, wxTreeItemId parent) { for (int i = 0; i < treeNodes.size(); i++) { @@ -103,11 +105,12 @@ void wxCDMProjectsTreeCtrl::BuildTree(const std::vectorGetName()).c_str(), wxConvUTF8); parentNodeIndex = this->AppendItem(parent, nodeName); treeNodes[i]->SetId(parentNodeIndex); + modelElements[parentNodeIndex] = treeNodes[i]; std::vector innerChildren = treeNodes[i]->GetChildren(); if(innerChildren.size() > 0) { - this->BuildTree(innerChildren, parentNodeIndex); + this->BuildTree(innerChildren, modelElements, parentNodeIndex); } } diff --git a/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.h b/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.h index 7cf0887..18649e0 100755 --- a/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.h +++ b/lib/creaDevManagerLib/wxCDMProjectsTreeCtrl.h @@ -42,6 +42,7 @@ #include "modelCDMIProjectTreeNode.h" #include +#include class wxCDMProjectsTreeCtrl: public wxTreeCtrl { @@ -66,9 +67,9 @@ public: const wxString &name=_("Projects tree") ); - void BuildTree(modelCDMProject* tree = NULL); + void BuildTree(std::map< wxTreeItemId, modelCDMIProjectTreeNode* >& modelElements, modelCDMProject* tree = NULL); private: - void BuildTree(const std::vector& tree, wxTreeItemId parent); + void BuildTree(const std::vector& tree, std::map< wxTreeItemId, modelCDMIProjectTreeNode* >& modelElements, wxTreeItemId parent); }; #endif /* WXCDMPROJECTSTREECTRL_H_ */ -- 2.47.1