void CMakePlugin::OnWorkspaceContextMenu(clContextMenuEvent& event) { event.Skip(); CHECK_COND_RET(clCxxWorkspaceST::Get()->IsOpen()); ProjectPtr p = clCxxWorkspaceST::Get()->GetActiveProject(); CHECK_COND_RET(p); BuildConfigPtr buildConf = p->GetBuildConfiguration(); CHECK_COND_RET(buildConf); CHECK_COND_RET(buildConf->GetBuilder()->GetName() == "CMake"); // The active project is using CMake builder // Add our context menu wxMenu* menu = event.GetMenu(); CHECK_PTR_RET(menu); wxFileName workspaceFile = clCxxWorkspaceST::Get()->GetFileName(); workspaceFile.SetFullName(CMAKELISTS_FILE); menu->InsertSeparator(0); if(workspaceFile.FileExists()) { wxMenuItem* item = new wxMenuItem(NULL, XRCID("cmake_open_active_project_cmake"), _("Open CMakeLists.txt")); item->SetBitmap(m_mgr->GetStdIcons()->LoadBitmap("cmake")); menu->Insert(0, item); } menu->Insert(0, XRCID("cmake_export_active_project"), _("Export CMakeLists.txt")); menu->Bind(wxEVT_MENU, &CMakePlugin::OnOpenCMakeLists, this, XRCID("cmake_open_active_project_cmake")); menu->Bind(wxEVT_MENU, &CMakePlugin::OnExportCMakeLists, this, XRCID("cmake_export_active_project")); }
void CMakePlugin::OnProjectContextMenu(clContextMenuEvent& event) { event.Skip(); CHECK_COND_RET(clCxxWorkspaceST::Get()->IsOpen()); ProjectPtr p = GetSelectedProject(); CHECK_COND_RET(p); BuildConfigPtr buildConf = p->GetBuildConfiguration(); CHECK_COND_RET(buildConf); CHECK_COND_RET(buildConf->GetBuilder()->GetName() == "CMake"); // The selected project is using CMake builder // Add our context menu wxMenu* menu = event.GetMenu()->GetParent(); // We want to attach this action to the main menu, not the subclass CHECK_PTR_RET(menu); const wxMenuItemList& items = menu->GetMenuItems(); size_t buildPos = 0; size_t settingsPos = 0; size_t curpos = 0; wxMenuItemList::const_iterator iter = items.begin(); for(; iter != items.end(); ++iter) { if((*iter)->GetId() == XRCID("build_project")) { buildPos = curpos; } if((*iter)->GetId() == XRCID("project_properties")) { settingsPos = curpos; } ++curpos; } wxFileName projectFile = p->GetFileName(); projectFile.SetFullName(CMAKELISTS_FILE); if(projectFile.FileExists()) { wxMenuItem* item = new wxMenuItem(NULL, XRCID("cmake_open_cmake"), _("Open CMakeLists.txt")); item->SetBitmap(m_mgr->GetStdIcons()->LoadBitmap("cmake")); menu->Insert(settingsPos, item); } menu->Insert(buildPos, XRCID("cmake_run_cmake"), _("Run CMake")); menu->InsertSeparator(buildPos); menu->Insert(buildPos, XRCID("cmake_export_cmakelists"), _("Export CMakeLists.txt")); menu->Bind(wxEVT_MENU, &CMakePlugin::OnRunCMake, this, XRCID("cmake_run_cmake")); menu->Bind(wxEVT_MENU, &CMakePlugin::OnOpenCMakeLists, this, XRCID("cmake_open_cmake")); menu->Bind(wxEVT_MENU, &CMakePlugin::OnExportCMakeLists, this, XRCID("cmake_export_cmakelists")); }
void NodeJSDebugger::OnDebugStart(clDebugEvent& event) { event.Skip(); CHECK_COND_RET(NodeJSWorkspace::Get()->IsOpen()); // Our to handle event.Skip(false); if(m_socket && m_socket->IsConnected()) { Continue(); return; }; NodeJSDebuggerDlg dlg(EventNotifier::Get()->TopFrame(), NodeJSDebuggerDlg::kDebug); if(dlg.ShowModal() != wxID_OK) { return; } wxString command = dlg.GetCommand(); if(!m_node.ExecuteConsole(command, "", false, command)) { ::wxMessageBox(_("Failed to start NodeJS application"), "CodeLite", wxOK | wxICON_ERROR | wxCENTER); m_socket.Reset(NULL); } // already connected? m_socket.Reset(new NodeJSSocket(this)); NodeJSWorkspaceUser userConf(NodeJSWorkspace::Get()->GetFilename().GetFullPath()); userConf.Load(); m_socket->Connect("127.0.0.1", userConf.GetDebuggerPort()); }
void CMakePlugin::OnFileRemoved(clCommandEvent& event) { event.Skip(); CHECK_COND_RET(clCxxWorkspaceST::Get()->IsOpen()); // The affected project is passed in the string member of the event ProjectPtr p = clCxxWorkspaceST::Get()->GetProject(event.GetString()); CHECK_PTR_RET(p); BuildConfigPtr buildConf = p->GetBuildConfiguration(); CHECK_COND_RET(buildConf); // Ensure we are a CMake project CHECK_COND_RET(buildConf->GetBuilder()->GetName() == "CMake"); DoRunCMake(p); }
void CMakePlugin::DoRunCMake(ProjectPtr p) { CHECK_PTR_RET(p); BuildConfigPtr buildConf = p->GetBuildConfiguration(); CHECK_COND_RET(buildConf); // Apply the environment variables before we do anything here #ifdef __WXMSW__ // On Windows, we need to set the bin folder of the selected compiler wxFileName fnCxx(buildConf->GetCompiler()->GetTool("CXX")); wxStringMap_t om; wxString pathvar; pathvar << fnCxx.GetPath() << clPATH_SEPARATOR << "$PATH"; om["PATH"] = pathvar; EnvSetter es(NULL, &om, p->GetName(), buildConf->GetName()); #else EnvSetter es(p); #endif CMakeGenerator generator; if(generator.CanGenerate(p)) { generator.Generate(p); } const wxString& args = buildConf->GetBuildSystemArguments(); wxString cmakeExe = GetCMake()->GetPath().GetFullPath(); // Did the user provide a generator to use? bool hasGeneratorInArgs = (args.Find(" -G") != wxNOT_FOUND); // Build the working directory wxFileName fnWorkingDirectory(CMakeBuilder::GetWorkspaceBuildFolder(false), ""); wxString workingDirectory = fnWorkingDirectory.GetPath(); // Ensure that the build directory exists fnWorkingDirectory.Mkdir(wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL); ::WrapWithQuotes(cmakeExe); wxString command; command << cmakeExe << " .. " << args; if(!hasGeneratorInArgs) { #ifdef __WXMSW__ // On Windows, generate MinGW makefiles command << " -G\"MinGW Makefiles\""; #endif } // Execute it IProcess* proc = ::CreateAsyncProcess(this, command, IProcessCreateDefault, fnWorkingDirectory.GetPath()); if(!proc) { ::wxMessageBox(_("Failed to execute:\n") + command, "CodeLite", wxICON_ERROR | wxOK | wxCENTER, EventNotifier::Get()->TopFrame()); return; } m_mgr->ShowOutputPane(_("Build")); m_mgr->ClearOutputTab(kOutputTab_Build); m_mgr->AppendOutputTabText(kOutputTab_Build, command + "\n"); }
void wxCodeCompletionBoxManager::ShowCompletionBox(wxStyledTextCtrl* ctrl, const TagEntryPtrVector_t& tags, size_t flags, int startPos, wxEvtHandler* eventObject) { DestroyCurrent(); CHECK_PTR_RET(ctrl); CHECK_COND_RET(!tags.empty()); m_box = new wxCodeCompletionBox(wxTheApp->GetTopWindow(), eventObject); m_box->SetFlags(flags); m_box->SetStartPos(startPos); m_stc = ctrl; CallAfter(&wxCodeCompletionBoxManager::DoShowCCBoxTags, tags); }
void wxCodeCompletionBoxManager::ShowCompletionBox(wxStyledTextCtrl* ctrl, const wxCodeCompletionBoxEntry::Vec_t& entries, size_t flags, wxEvtHandler* eventObject) { DestroyCurrent(); CHECK_PTR_RET(ctrl); CHECK_COND_RET(!entries.empty()); m_box = new wxCodeCompletionBox(wxTheApp->GetTopWindow(), eventObject); m_box->SetFlags(flags); m_stc = ctrl; CallAfter(&wxCodeCompletionBoxManager::DoShowCCBoxEntries, entries); }
void PHPCodeCompletion::OnInsertDoxyBlock(clCodeCompletionEvent& e) { e.Skip(); // Do we have a workspace open? CHECK_COND_RET(PHPWorkspace::Get()->IsOpen()); // Sanity IEditor* editor = dynamic_cast<IEditor*>(e.GetEditor()); CHECK_PTR_RET(editor); // Is this a PHP editor? CHECK_COND_RET(IsPHPFile(editor)); // Get the text from the caret current position // until the end of file wxString unsavedBuffer = editor->GetTextRange(editor->GetCurrentPosition(), editor->GetLength()); unsavedBuffer.Trim().Trim(false); PHPSourceFile source("<?php " + unsavedBuffer); source.SetParseFunctionBody(false); source.Parse(); PHPEntityBase::Ptr_t ns = source.Namespace(); if(ns) { const PHPEntityBase::List_t& children = ns->GetChildren(); for(PHPEntityBase::List_t::const_iterator iter = children.begin(); iter != children.end(); ++iter) { PHPEntityBase::Ptr_t match = *iter; if(match->GetLine() == 0 && match->Is(kEntityTypeFunction)) { e.Skip(false); // notify codelite to stop processing this event wxString phpdoc = match->FormatPhpDoc(); phpdoc.Trim(); e.SetTooltip(phpdoc); } } } }
void NodeJSDebugger::OnDebugStart(clDebugEvent& event) { event.Skip(); CHECK_COND_RET(NodeJSWorkspace::Get()->IsOpen()); event.SetFeatures(0); // No special features by the NodeJS debugger // Our to handle event.Skip(false); if(m_socket && m_socket->IsConnected()) { Continue(); return; }; NodeJSDebuggerDlg dlg(EventNotifier::Get()->TopFrame(), NodeJSDebuggerDlg::kDebug); if(dlg.ShowModal() != wxID_OK) { return; } StartDebugger(dlg.GetCommand(), dlg.GetWorkingDirectory()); }
void clTreeCtrlPanel::OnNewFile(wxCommandEvent& event) { wxTreeItemId item = GetTreeCtrl()->GetFocusedItem(); clTreeCtrlData* cd = GetItemData(item); CHECK_PTR_RET(cd); CHECK_COND_RET(cd->IsFolder()); wxString filename = ::clGetTextFromUser(_("New File"), _("Set the file name:"), "Untitled.txt", wxStrlen("Untitled")); if(filename.IsEmpty()) return; // user cancelled wxFileName file(cd->GetPath(), filename); // Write the file content if(!FileUtils::WriteFileContent(file, "")) return; wxTreeItemId newFile = DoAddFile(item, file.GetFullPath()); GetTreeCtrl()->SortChildren(item); CallAfter(&clTreeCtrlPanel::SelectItem, newFile); }
void clTreeCtrlPanel::OnNewFolder(wxCommandEvent& event) { wxTreeItemId item = GetTreeCtrl()->GetFocusedItem(); clTreeCtrlData* cd = GetItemData(item); CHECK_PTR_RET(cd); CHECK_COND_RET(cd->IsFolder()); wxString foldername = ::clGetTextFromUser(_("New Folder"), _("Set the folder name:"), "New Folder"); if(foldername.IsEmpty()) return; // user cancelled wxFileName file(cd->GetPath(), ""); file.AppendDir(foldername); // Create the folder wxFileName::Mkdir(file.GetPath(), wxS_DIR_DEFAULT, wxPATH_MKDIR_FULL); // Add it to the tree view wxTreeItemId newFile = DoAddFolder(item, file.GetPath()); GetTreeCtrl()->SortChildren(item); CallAfter(&clTreeCtrlPanel::SelectItem, newFile); }
void NodeJSDebugger::OnTooltip(clDebugEvent& event) { event.Skip(); CHECK_RUNNING(); event.Skip(false); CHECK_PTR_RET(clGetManager()->GetActiveEditor()); wxString selection = event.GetString(); CHECK_COND_RET(!selection.IsEmpty()); // Build the request JSONElement request = JSONElement::createObject(); request.addProperty("type", "request"); request.addProperty("command", "evaluate"); JSONElement args = JSONElement::createObject("arguments"); request.append(args); args.addProperty("expression", selection); // Write the command m_socket->WriteRequest(request, new NodeJSEvaluateExprHandler(selection)); }
void clTreeCtrlPanel::OnDeleteFolder(wxCommandEvent& event) { wxTreeItemId item = GetTreeCtrl()->GetFocusedItem(); clTreeCtrlData* cd = GetItemData(item); CHECK_PTR_RET(cd); CHECK_COND_RET(cd->IsFolder()); wxString message; message << _("Are you sure you want to delete folder:\n'") << cd->GetPath() << _("'"); wxRichMessageDialog dialog(EventNotifier::Get()->TopFrame(), message, _("Confirm"), wxYES_NO | wxCANCEL | wxNO_DEFAULT | wxCENTER | wxICON_WARNING); dialog.SetYesNoLabels(_("Delete Folder"), _("Don't Delete")); if(dialog.ShowModal() == wxID_YES) { if(wxFileName::Rmdir(cd->GetPath(), wxPATH_RMDIR_RECURSIVE)) { // Remove this item from its parent cache UpdateItemDeleted(item); // Remove the item from the UI GetTreeCtrl()->Delete(item); } } }