From 03aef77bacc41f53b1d21b88e683302e7e1600c2 Mon Sep 17 00:00:00 2001 From: Daniel Gonzalez Date: Thu, 31 Jan 2013 16:45:37 +0100 Subject: [PATCH] Feature #1711 CreaDevManager application implementation - Changes for windows compatibility. project open had stopped working in fedora. - Graphical Application creation enabled. --- lib/creaDevManagerLib/modelCDMAppli.cpp | 148 +++++++++++++----- lib/creaDevManagerLib/modelCDMAppli.h | 2 + lib/creaDevManagerLib/modelCDMApplication.cpp | 2 +- lib/creaDevManagerLib/modelCDMProject.cpp | 3 +- lib/creaDevManagerLib/modelCDMProject.h | 1 + .../wxCDMAppliDescriptionPanel.cpp | 85 ++++++---- lib/creaDevManagerLib/wxCDMMainFrame.cpp | 9 +- .../wxCDMProjectActionsPanel.cpp | 8 +- lib/creaDevManagerLib/wxCDMTreeItemId.cpp | 4 +- 9 files changed, 182 insertions(+), 80 deletions(-) diff --git a/lib/creaDevManagerLib/modelCDMAppli.cpp b/lib/creaDevManagerLib/modelCDMAppli.cpp index be0852a..bcb0876 100644 --- a/lib/creaDevManagerLib/modelCDMAppli.cpp +++ b/lib/creaDevManagerLib/modelCDMAppli.cpp @@ -122,6 +122,7 @@ const std::vector& modelCDMAppli::GetApplications() const modelCDMApplication* modelCDMAppli::CreateApplication( const std::string& namein, + const int& type, std::string*& result ) { @@ -130,64 +131,131 @@ modelCDMApplication* modelCDMAppli::CreateApplication( std::string name; for (int i = 0; i < (int)(words.size()); i++) { - name += words[i]; + name += words[i]; } if (name == "") { result = new std::string("The given name is not valid: '/\\*\"% are forbidden."); - return NULL; + return NULL; } - //copy template application folder with new name + + if (type == 0) + { + //copy template application folder with new name #ifdef _WIN32 - std::string copyCommand = "xcopy \"" + this->path + CDMUtilities::SLASH + "template_appli\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "\" /Y"; + std::string copyCommand = "xcopy \"" + this->path + CDMUtilities::SLASH + "template_appli\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "\" /Y"; #else - std::string copyCommand = "cp -r \"" + this->path + CDMUtilities::SLASH + "template_appli\" \"" + this->path + CDMUtilities::SLASH + name + "\""; + std::string copyCommand = "cp -r \"" + this->path + CDMUtilities::SLASH + "template_appli\" \"" + this->path + CDMUtilities::SLASH + name + "\""; #endif - if(system(copyCommand.c_str())) - { - result = new std::string("An error occurred while running '" + copyCommand + "'."); - return NULL; - } - //set name of library in CMakeLists inside copied folder - std::string line; - std::ifstream in((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt").c_str()); - if( !in.is_open()) - { - result = new std::string("CMakeLists.txt file failed to open."); - return NULL; + if(system(copyCommand.c_str())) + { + result = new std::string("An error occurred while running '" + copyCommand + "'."); + return NULL; + } + //set name of library in CMakeLists inside copied folder + std::string line; + std::ifstream in((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt").c_str()); + if( !in.is_open()) + { + result = new std::string("CMakeLists.txt file failed to open."); + return NULL; + } + std::ofstream out((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp").c_str()); + while (getline(in, line)) + { + if(line == "SET ( EXE_NAME MyExe )") + line = "SET ( EXE_NAME " + name + " )"; + out << line << std::endl; + } + in.close(); + out.close(); + //delete old file and rename new file +#ifdef _WIN32 + std::string renameCommand = "move /Y \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; +#else + std::string renameCommand = "mv \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; +#endif + + if(system(renameCommand.c_str())) + { + result = new std::string("An error occurred while running '" + renameCommand + "'."); + return NULL; + } + + //add application to model + modelCDMApplication* application = new modelCDMApplication(this, this->path + CDMUtilities::SLASH + name, name, this->level + 1); + this->applications.push_back(application); + this->children.push_back(application); + + this->SortChildren(); + + result = new std::string(this->path + CDMUtilities::SLASH + name); + return application; } - std::ofstream out((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp").c_str()); - while (getline(in, line)) + else if(type == 1) { - if(line == "SET ( EXE_NAME MyExe )") - line = "SET ( EXE_NAME " + name + " )"; - out << line << std::endl; - } - in.close(); - out.close(); - //delete old file and rename new file + //copy template application folder with new name #ifdef _WIN32 - std::string renameCommand = "move /Y \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; + std::string copyCommand = "xcopy \"" + this->path + CDMUtilities::SLASH + "template_wx_appli\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "\" /Y"; #else - std::string renameCommand = "mv \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; + std::string copyCommand = "cp -r \"" + this->path + CDMUtilities::SLASH + "template_wx_appli\" \"" + this->path + CDMUtilities::SLASH + name + "\""; #endif - if(system(renameCommand.c_str())) - { - result = new std::string("An error occurred while running '" + renameCommand + "'."); - return NULL; - } + if(system(copyCommand.c_str())) + { + result = new std::string("An error occurred while running '" + copyCommand + "'."); + return NULL; + } + //set name of library in CMakeLists inside copied folder + std::string line; + std::ifstream in((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt").c_str()); + if( !in.is_open()) + { + result = new std::string("CMakeLists.txt file failed to open."); + return NULL; + } + std::ofstream out((this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp").c_str()); + while (getline(in, line)) + { + if(line == "SET ( EXE_NAME MyExeWx )") + line = "SET ( EXE_NAME " + name + " )"; + out << line << std::endl; + } + in.close(); + out.close(); + //delete old file and rename new file +#ifdef _WIN32 + std::string renameCommand = "move /Y \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; +#else + std::string renameCommand = "mv \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt.tmp\" \"" + this->path + CDMUtilities::SLASH + name + CDMUtilities::SLASH + "CMakeLists.txt\""; +#endif + + if(system(renameCommand.c_str())) + { + result = new std::string("An error occurred while running '" + renameCommand + "'."); + return NULL; + } - //add application to model - modelCDMApplication* application = new modelCDMApplication(this, this->path + CDMUtilities::SLASH + name, name, this->level + 1); - this->applications.push_back(application); - this->children.push_back(application); + //add application to model + modelCDMApplication* application = new modelCDMApplication(this, this->path + CDMUtilities::SLASH + name, name, this->level + 1); + this->applications.push_back(application); + this->children.push_back(application); - this->SortChildren(); + this->SortChildren(); - result = new std::string(this->path + CDMUtilities::SLASH + name); - return application; + result = new std::string(this->path + CDMUtilities::SLASH + name); + return application; + } + else + { + std::string res = "Invalid application type: "; + res += type; + res += std::string(".\n0:Console application.\n1:GUI Application (wxWidgets)."); + result = new std::string(res); + + return NULL; + } } const bool modelCDMAppli::Refresh(std::string*& result) diff --git a/lib/creaDevManagerLib/modelCDMAppli.h b/lib/creaDevManagerLib/modelCDMAppli.h index 5a85580..579f12a 100644 --- a/lib/creaDevManagerLib/modelCDMAppli.h +++ b/lib/creaDevManagerLib/modelCDMAppli.h @@ -74,11 +74,13 @@ public: /** * Creates a new application in the system and creates an application node. This node is stored in the applications attribute and returned. * @param name Name of the new application. + * @param type 0=console application, 1=GUI Application (wxWidgets). * @param result Result message of the operation. * @return Reference to the created application or NULL. */ modelCDMApplication* CreateApplication( const std::string& name, + const int& type, std::string*& result ); /** diff --git a/lib/creaDevManagerLib/modelCDMApplication.cpp b/lib/creaDevManagerLib/modelCDMApplication.cpp index c77f3be..dcfb21e 100644 --- a/lib/creaDevManagerLib/modelCDMApplication.cpp +++ b/lib/creaDevManagerLib/modelCDMApplication.cpp @@ -140,7 +140,7 @@ modelCDMApplication::modelCDMApplication(modelCDMIProjectTreeNode* parent, const std::getline(fileStream,word,'('); std::vector wordBits; CDMUtilities::splitter::split(wordBits,word," \n",CDMUtilities::splitter::no_empties); - if (wordBits[wordBits.size() - 1] == "main") + if (wordBits[wordBits.size() - 1] == "main" || wordBits[wordBits.size() - 1] == "IMPLEMENT_APP") { this->mainFile = file; } diff --git a/lib/creaDevManagerLib/modelCDMProject.cpp b/lib/creaDevManagerLib/modelCDMProject.cpp index 8b93e18..520fc0e 100644 --- a/lib/creaDevManagerLib/modelCDMProject.cpp +++ b/lib/creaDevManagerLib/modelCDMProject.cpp @@ -416,13 +416,14 @@ modelCDMIProjectTreeNode* modelCDMProject::CreateLibrary( modelCDMIProjectTreeNode* modelCDMProject::CreateApplication( const std::string& name, + const int& type, std::string*& result, const std::string& path ) { if(this->appli != NULL) { - return this->appli->CreateApplication(name, result); + return this->appli->CreateApplication(name, type, result); } result = new std::string("there is no appli folder in this project."); return NULL; diff --git a/lib/creaDevManagerLib/modelCDMProject.h b/lib/creaDevManagerLib/modelCDMProject.h index 60a5ad5..085d9e4 100644 --- a/lib/creaDevManagerLib/modelCDMProject.h +++ b/lib/creaDevManagerLib/modelCDMProject.h @@ -182,6 +182,7 @@ public: */ modelCDMIProjectTreeNode* CreateApplication( const std::string& name, + const int& type, std::string*& result, const std::string& path = "/appli" ); diff --git a/lib/creaDevManagerLib/wxCDMAppliDescriptionPanel.cpp b/lib/creaDevManagerLib/wxCDMAppliDescriptionPanel.cpp index 1378f60..94f0d00 100644 --- a/lib/creaDevManagerLib/wxCDMAppliDescriptionPanel.cpp +++ b/lib/creaDevManagerLib/wxCDMAppliDescriptionPanel.cpp @@ -126,7 +126,7 @@ void wxCDMAppliDescriptionPanel::CreateControls() std::vector applications = this->appli->GetApplications(); for (int i = 0; i < (int)(applications.size()); i++) { - wxHyperlinkCtrl* pApplicationlk = new wxHyperlinkCtrl(propertiesPanel,ID_LINK_SELECT_APPLICATION, crea::std2wx(applications[i]->GetName().c_str()), crea::std2wx(applications[i]->GetName().c_str()), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); + wxHyperlinkCtrl* pApplicationlk = new wxHyperlinkCtrl(propertiesPanel,ID_LINK_SELECT_APPLICATION, crea::std2wx(applications[i]->GetName().c_str()), crea::std2wx(applications[i]->GetName().c_str()), wxDefaultPosition, wxDefaultSize, wxHL_DEFAULT_STYLE); pApplicationlk->SetWindowStyle(wxALIGN_LEFT | wxNO_BORDER); std::string tt = "Name: " + applications[i]->GetName() + "\n"; tt += "Location: " + applications[i]->GetPath(); @@ -184,36 +184,59 @@ void wxCDMAppliDescriptionPanel::CreateControls() void wxCDMAppliDescriptionPanel::OnBtnCreateApplication(wxCommandEvent& event) { //get name - wxString applicationName = wxGetTextFromUser( - _T("Enter the new application name"), - _T("New Application - creaDevManager"), - _T("") - ); - //check name - if(applicationName.Len() > 0) - { - std::string* result; - //create library - modelCDMIProjectTreeNode* application = this->appli->CreateApplication(crea::wx2std(applicationName),result); - //check library created - if(application == NULL) - { - wxMessageBox(crea::std2wx(*result),_T("New Application - Error!"),wxOK | wxICON_ERROR); - event.Skip(); - return; - } - wxMessageBox(crea::std2wx("Application successfully created."),_T("New Application - Success!"),wxOK | wxICON_INFORMATION); - - //refreshing tree and description - //send event instead of calling parent to avoid crashing - - ((wxCDMMainFrame*)this->GetParent())->RefreshProject(); - - wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_DISPLAY_CHANGED); - newEvent->SetClientData(application); - wxPostEvent(this->GetParent(), *newEvent); - event.Skip(); - } + wxTextEntryDialog* appDlg = new wxTextEntryDialog( + this, + wxT("Enter the new application name (NO white spaces)"), + wxT("New Application - creaDevManager"), + wxT(""), + wxOK | wxCANCEL + ); + + if (appDlg->ShowModal() == wxID_OK) + { + std::string applicationName = crea::wx2std(appDlg->GetValue()); + //check name + if(applicationName.size() > 0) + { + wxArrayString types; + types.Add(wxT("Console Application")); + types.Add(wxT("GUI Application (wxWidgets)")); + int applicationType = wxGetSingleChoiceIndex( + wxT("Select the application type"), + wxT("New Application - creaDevManager"), + types + ); + + if (applicationType != -1) + { + std::string* result; + //create library + modelCDMIProjectTreeNode* application = this->appli->CreateApplication(applicationName, applicationType ,result); + //check library created + if(application == NULL) + { + wxMessageBox(crea::std2wx(*result),_T("New Application - Error!"),wxOK | wxICON_ERROR); + event.Skip(); + return; + } + wxMessageBox(crea::std2wx("Application successfully created."),_T("New Application - Success!"),wxOK | wxICON_INFORMATION); + + //refreshing tree and description + //send event instead of calling parent to avoid crashing + + ((wxCDMMainFrame*)this->GetParent())->RefreshProject(); + + wxCommandEvent* newEvent = new wxCommandEvent(wxEVT_DISPLAY_CHANGED); + newEvent->SetClientData(application); + wxPostEvent(this->GetParent(), *newEvent); + event.Skip(); + } + } + else + { + wxMessageBox(crea::std2wx("Invalid application name, please try again with a valid name."),_T("New Application - Error!"),wxOK | wxICON_INFORMATION); + } + } } void wxCDMAppliDescriptionPanel::OnBtnEditCMakeLists(wxCommandEvent& event) diff --git a/lib/creaDevManagerLib/wxCDMMainFrame.cpp b/lib/creaDevManagerLib/wxCDMMainFrame.cpp index e5e1eaa..1b80f28 100755 --- a/lib/creaDevManagerLib/wxCDMMainFrame.cpp +++ b/lib/creaDevManagerLib/wxCDMMainFrame.cpp @@ -346,9 +346,9 @@ void wxCDMMainFrame::OnMenuOpenProject(wxCommandEvent& event) std::cout << "building ui" << std::endl; //populate tree control - tree_Projects->Unselect(); - this->actualTreeItem.Unset(); - tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); + tree_Projects->BuildTree(this->model->GetModelElements(), this->model->GetProject()); + tree_Projects->Unselect(); + this->actualTreeItem.Unset(); tree_Projects->SelectItem(this->model->GetProject()->GetId().GetWxId(), true); @@ -587,11 +587,12 @@ void wxCDMMainFrame::OnTreeSelectionChanged(wxTreeEvent& event) //get selected element wxTreeItemId elementId = event.GetItem(); + std::cout << "Tree Selection id: " << elementId.m_pItem << this->actualTreeItem.m_pItem << std::endl; //elementId.IsOk() && this->tree_Projects->IsSelected(elementId) if(elementId.IsOk() && this->actualTreeItem != elementId) { - std::cout << "Tree Selection id: " << elementId.m_pItem << std::endl; + std::cout << "Valid tree selection id: " << elementId.m_pItem << std::endl; //get element from model modelCDMIProjectTreeNode* element = this->model->GetModelElements()[elementId]; diff --git a/lib/creaDevManagerLib/wxCDMProjectActionsPanel.cpp b/lib/creaDevManagerLib/wxCDMProjectActionsPanel.cpp index ddfe262..676e1b2 100755 --- a/lib/creaDevManagerLib/wxCDMProjectActionsPanel.cpp +++ b/lib/creaDevManagerLib/wxCDMProjectActionsPanel.cpp @@ -170,10 +170,14 @@ void wxCDMProjectActionsPanel::OnBtnConnectProject(wxCommandEvent& event) wxT("Please select the folder containing the bbtkPackage file you want to use. Usually it is where you built your project."), crea::std2wx(this->project->GetBuildPath()) ); + std::cout << crea::wx2std(file) << std::endl; + std::cout.flush(); - if(file.IsEmpty() || !this->project->Connect(result, crea::wx2std(file))) + if(crea::wx2std(file) == "" || !this->project->Connect(result, crea::wx2std(file))) { - wxMessageBox(crea::std2wx(result->c_str()), wxT("Plug Packages - Error!")); + if (crea::wx2std(file) == "") + result = new std::string("Folder not specified."); + wxMessageBox(crea::std2wx(result->c_str()), wxT("Plug BBTK Packages - Error!"), wxICON_ERROR); return; } #ifdef _WIN32 diff --git a/lib/creaDevManagerLib/wxCDMTreeItemId.cpp b/lib/creaDevManagerLib/wxCDMTreeItemId.cpp index 635ec07..0818c01 100644 --- a/lib/creaDevManagerLib/wxCDMTreeItemId.cpp +++ b/lib/creaDevManagerLib/wxCDMTreeItemId.cpp @@ -35,7 +35,9 @@ #include "wxCDMTreeItemId.h" -wxCDMTreeItemId::wxCDMTreeItemId(){} +wxCDMTreeItemId::wxCDMTreeItemId(){ + this->_id = this->_idWx.m_pItem; +} wxCDMTreeItemId::wxCDMTreeItemId(const wxTreeItemId& id) { -- 2.47.1