bool MainBook::DoSelectPage(wxWindow* win) { LEditor *editor = dynamic_cast<LEditor*>(win); if ( editor ) { editor->SetActive(); m_quickFindBar->SetEditor( editor ); } else { m_quickFindBar->ShowForPlugins(); } // Remove context menu if needed DoHandleFrameMenu(editor); if (!editor) { clMainFrame::Get()->SetFrameTitle(NULL); clMainFrame::Get()->SetStatusMessage(wxEmptyString, 1); // clear line & column indicator UpdateNavBar(NULL); SendCmdEvent(wxEVT_CMD_PAGE_CHANGED, win); } else { if (editor->GetContext()->GetName() == wxT("C++")) { if (clMainFrame::Get()->GetMenuBar()->FindMenu(wxT("C++")) == wxNOT_FOUND) { clMainFrame::Get()->GetMenuBar()->Append(wxXmlResource::Get()->LoadMenu(wxT("editor_right_click")), wxT("C++")); } } SendCmdEvent(wxEVT_ACTIVE_EDITOR_CHANGED, (IEditor*)editor); } return true; }
bool PHPWorkspace::Close(bool saveBeforeClose, bool saveSession) { SendCmdEvent(wxEVT_WORKSPACE_CLOSING); if(IsOpen()) { if(m_manager && saveSession) { m_manager->StoreWorkspaceSession(m_workspaceFile); } if(saveBeforeClose) { // Save it Save(); } } m_projects.clear(); m_workspaceFile.Clear(); // Close the code completion lookup table PHPCodeCompletion::Instance()->Close(); PHPParserThread::Clear(); PHPEvent phpEvent(wxEVT_PHP_WORKSPACE_CLOSED); EventNotifier::Get()->AddPendingEvent(phpEvent); // Notify that workspace has been opened to the plugins SendCmdEvent(wxEVT_WORKSPACE_CLOSED); return true; }
void MainBook::ReloadExternallyModified(bool prompt) { if ( m_isWorkspaceReloading ) return; LEditor::Vec_t editors; GetAllEditors(editors, MainBook::kGetAll_IncludeDetached); time_t workspaceModifiedTimeBefore = WorkspaceST::Get()->GetFileLastModifiedTime(); // filter list of editors for any whose files have been modified std::vector<std::pair<wxFileName, bool> > files; size_t n = 0; for (size_t i = 0; i < editors.size(); i++) { time_t diskTime = editors[i]->GetFileLastModifiedTime(); time_t editTime = editors[i]->GetEditorLastModifiedTime(); if (diskTime != editTime) { // update editor last mod time so that we don't keep bugging the user over the same file, // unless it gets changed again editors[i]->SetEditorLastModifiedTime(diskTime); // A last check: see if the content of the file has actually changed. This avoids unnecessary reload offers after e.g. git stash if (!CompareFileWithString(editors[i]->GetFileName().GetFullPath(), editors[i]->GetText())) { files.push_back(std::make_pair(editors[i]->GetFileName(), !editors[i]->GetModify())); editors[n++] = editors[i]; } } } editors.resize(n); if(prompt) { UserSelectFiles(files, _("Reload Modified Files"), _("Files have been modified outside the editor.\nChoose which files you would like to reload."), false); } time_t workspaceModifiedTimeAfter = WorkspaceST::Get()->GetFileLastModifiedTime(); if ( workspaceModifiedTimeBefore != workspaceModifiedTimeAfter ) { // a workspace reload occured between the "Reload Modified Files" and // the "Reload WOrkspace" dialog, cancel this it's not needed anymore return; } std::vector<wxFileName> filesToRetag; for (size_t i = 0; i < files.size(); i++) { if (files[i].second) { editors[i]->ReloadFile(); filesToRetag.push_back(files[i].first); } } if (filesToRetag.size() > 1) { TagsManagerST::Get()->RetagFiles(filesToRetag, TagsManager::Retag_Quick); SendCmdEvent(wxEVT_FILE_RETAGGED, (void*)&filesToRetag); } else if (filesToRetag.size() == 1) { ManagerST::Get()->RetagFile(filesToRetag.at(0).GetFullPath()); SendCmdEvent(wxEVT_FILE_RETAGGED, (void*)&filesToRetag); } }
bool MainBook::DoSelectPage(wxWindow* win) { LEditor* editor = dynamic_cast<LEditor*>(win); if(editor) { editor->SetActive(); m_quickFindBar->SetEditor(editor); } else { m_quickFindBar->ShowForPlugins(); } // Remove context menu if needed DoHandleFrameMenu(editor); if(!editor) { clMainFrame::Get()->SetFrameTitle(NULL); clMainFrame::Get()->GetStatusBar()->SetLinePosColumn(wxEmptyString); UpdateNavBar(NULL); SendCmdEvent(wxEVT_CMD_PAGE_CHANGED, win); } else { // if(editor->GetContext()->GetName() == wxT("C++")) { // if(clMainFrame::Get()->GetMenuBar()->FindMenu(wxT("C++")) == wxNOT_FOUND) { // clMainFrame::Get()->GetMenuBar()->Append(wxXmlResource::Get()->LoadMenu(wxT("editor_right_click")), // wxT("C++")); // } // } wxCommandEvent event(wxEVT_ACTIVE_EDITOR_CHANGED); EventNotifier::Get()->AddPendingEvent(event); } return true; }
void WorkspaceTab::OnProjectRemoved(clCommandEvent& e) { e.Skip(); m_fileView->BuildTree(); CallAfter(&WorkspaceTab::DoGoHome); DoUpdateChoiceWithProjects(); SendCmdEvent(wxEVT_FILE_VIEW_REFRESHED); }
void WorkspaceTab::OnWorkspaceClosed(wxCommandEvent& e) { e.Skip(); m_workspaceConfig->Clear(); m_choiceActiveProject->Clear(); m_workspaceConfig->Enable(false); m_fileView->DeleteAllItems(); SendCmdEvent(wxEVT_FILE_VIEW_INIT_DONE); }
void WorkspaceTab::OnProjectRemoved(wxCommandEvent& e) { e.Skip(); Freeze(); m_fileView->BuildTree(); OnGoHome(e); Thaw(); DoUpdateChoiceWithProjects(); SendCmdEvent(wxEVT_FILE_VIEW_REFRESHED); }
void WorkspaceTab::OnProjectAdded(clCommandEvent& e) { e.Skip(); const wxString& projName = e.GetString(); m_fileView->BuildTree(); if(!projName.IsEmpty()) { m_fileView->ExpandToPath(projName, wxFileName()); } DoUpdateChoiceWithProjects(); SendCmdEvent(wxEVT_FILE_VIEW_REFRESHED); }
void WorkspaceTab::OnProjectAdded(wxCommandEvent& e) { e.Skip(); const wxString *projName = (const wxString *) e.GetClientData(); m_fileView->BuildTree(); if (projName && !projName->IsEmpty()) { m_fileView->ExpandToPath(*projName, wxFileName()); } DoUpdateChoiceWithProjects(); SendCmdEvent(wxEVT_FILE_VIEW_REFRESHED); }
void WorkspaceTab::OnWorkspaceLoaded(wxCommandEvent& e) { e.Skip(); if(ManagerST::Get()->IsWorkspaceOpen()) { DoWorkspaceConfig(); DoUpdateChoiceWithProjects(); // Tree construction m_fileView->BuildTree(); CallAfter(&WorkspaceTab::DoGoHome); SendCmdEvent(wxEVT_FILE_VIEW_INIT_DONE); } }
void MainBook::OnPageClosed(NotebookEvent &e) { SelectPage(m_book->GetCurrentPage()); m_quickFindBar->SetEditor(GetActiveEditor()); // any editors left open? LEditor *editor = NULL; for (size_t i = 0; i < m_book->GetPageCount() && editor == NULL; i++) { editor = dynamic_cast<LEditor*>(m_book->GetPage(i)); } if (m_book->GetPageCount() == 0) { SendCmdEvent(wxEVT_ALL_EDITORS_CLOSED); ShowQuickBar(false); } }
void MainBook::OnPageClosing(wxBookCtrlEvent& e) { e.Skip(); LEditor* editor = dynamic_cast<LEditor*>(m_book->GetPage(e.GetSelection())); if(editor) { if(AskUserToSave(editor)) { SendCmdEvent(wxEVT_EDITOR_CLOSING, (IEditor*)editor); } else { e.Veto(); } } else { // Unknown type, ask the plugins - maybe they know about this type wxNotifyEvent closeEvent(wxEVT_NOTIFY_PAGE_CLOSING); closeEvent.SetClientData(m_book->GetPage(e.GetSelection())); EventNotifier::Get()->ProcessEvent(closeEvent); if(!closeEvent.IsAllowed()) { e.Veto(); } } }
bool MainBook::CloseAll(bool cancellable) { LEditor::Vec_t editors; GetAllEditors(editors, kGetAll_IncludeDetached); // filter list of editors for any that need to be saved std::vector<std::pair<wxFileName, bool> > files; size_t n = 0; for(size_t i = 0; i < editors.size(); i++) { if(editors[i]->GetModify()) { files.push_back(std::make_pair(editors[i]->GetFileName(), true)); editors[n++] = editors[i]; } } editors.resize(n); if(!UserSelectFiles(files, _("Save Modified Files"), _("Some files are modified.\nChoose the files you would like to save."), cancellable)) return false; for(size_t i = 0; i < files.size(); i++) { if(files[i].second) { editors[i]->SaveFile(); } else { editors[i]->SetSavePoint(); } } // Delete the files without notifications (it will be faster) clWindowUpdateLocker locker(this); #if HAS_LIBCLANG ClangCodeCompletion::Instance()->CancelCodeComplete(); #endif SendCmdEvent(wxEVT_ALL_EDITORS_CLOSING); m_reloadingDoRaise = false; m_book->DeleteAllPages(); m_reloadingDoRaise = true; // Delete all detached editors EditorFrame::List_t::iterator iter = m_detachedEditors.begin(); for(; iter != m_detachedEditors.end(); ++iter) { (*iter)->Destroy(); // Destroying the frame will release the editor } // Since we got no more editors opened, // send a wxEVT_ALL_EDITORS_CLOSED event SendCmdEvent(wxEVT_ALL_EDITORS_CLOSED); // Update the quick-find-bar m_quickFindBar->SetEditor(NULL); ShowQuickBar(false); // Clear the Navigation Bar if it is not empty TagEntryPtr tag = NULL; m_navBar->UpdateScope(tag); // Update the frame's title clMainFrame::Get()->SetFrameTitle(NULL); DoHandleFrameMenu(NULL); // OutputTabWindow::OnEditUI will crash on >=wxGTK-2.9.3 if we don't set the focus somewhere that still exists // This workaround doesn't seem to work if applied earlier in the function :/ m_book->SetFocus(); return true; }
void MainBook::ReloadExternallyModified(bool prompt) { if(m_isWorkspaceReloading) return; static int depth = wxNOT_FOUND; ++depth; // Protect against recursion if(depth == 2) { depth = wxNOT_FOUND; return; } LEditor::Vec_t editors; GetAllEditors(editors, MainBook::kGetAll_IncludeDetached); time_t workspaceModifiedTimeBefore = clCxxWorkspaceST::Get()->GetFileLastModifiedTime(); // filter list of editors for any whose files have been modified std::vector<std::pair<wxFileName, bool> > files; size_t n = 0; for(size_t i = 0; i < editors.size(); i++) { time_t diskTime = editors[i]->GetFileLastModifiedTime(); time_t editTime = editors[i]->GetEditorLastModifiedTime(); if(diskTime != editTime) { // update editor last mod time so that we don't keep bugging the user over the same file, // unless it gets changed again editors[i]->SetEditorLastModifiedTime(diskTime); // A last check: see if the content of the file has actually changed. This avoids unnecessary reload offers // after e.g. git stash if(!CompareFileWithString(editors[i]->GetFileName().GetFullPath(), editors[i]->GetText())) { files.push_back(std::make_pair(editors[i]->GetFileName(), !editors[i]->GetModify())); editors[n++] = editors[i]; } } } editors.resize(n); if(n == 0) return; if(prompt) { int res = clConfig::Get().GetAnnoyingDlgAnswer("FilesModifiedDlg", wxNOT_FOUND); if(res == wxID_CANCEL) { return; // User had previous ticked the 'Remember my answer' checkbox after he'd just chosen Ignore } if(res == wxNOT_FOUND) { // User hasn't previously ticked the 'Remember my answer' checkbox // Show the dialog res = GetFilesModifiedDlg()->ShowModal(); if(GetFilesModifiedDlg()->GetRememberMyAnswer()) { clConfig::Get().SetAnnoyingDlgAnswer("FilesModifiedDlg", res); } if(res == FilesModifiedDlg::kID_BUTTON_IGNORE) { return; } } if(res == FilesModifiedDlg::kID_BUTTON_CHOOSE) { UserSelectFiles(files, _("Reload Modified Files"), _("Files have been modified outside the editor.\nChoose which files you would like to reload."), false); } } time_t workspaceModifiedTimeAfter = clCxxWorkspaceST::Get()->GetFileLastModifiedTime(); if(workspaceModifiedTimeBefore != workspaceModifiedTimeAfter) { // a workspace reload occured between the "Reload Modified Files" and // the "Reload WOrkspace" dialog, cancel this it's not needed anymore return; } // See issue: https://github.com/eranif/codelite/issues/663 LEditor::Vec_t editorsAgain; GetAllEditors(editorsAgain, MainBook::kGetAll_IncludeDetached); // Make sure that the tabs that we have opened // are still available in the main book LEditor::Vec_t realEditorsList; std::sort(editors.begin(), editors.end()); std::sort(editorsAgain.begin(), editorsAgain.end()); std::set_intersection( editorsAgain.begin(), editorsAgain.end(), editors.begin(), editors.end(), std::back_inserter(realEditorsList)); // Update the "files" list if(editors.size() != realEditorsList.size()) { // something went wrong here... CallAfter(&MainBook::ReloadExternallyModified, prompt); return; } // reset the recursive protector depth = wxNOT_FOUND; std::vector<wxFileName> filesToRetag; for(size_t i = 0; i < files.size(); i++) { if(files[i].second) { editors[i]->ReloadFile(); filesToRetag.push_back(files[i].first); } } if(filesToRetag.size() > 1) { TagsManagerST::Get()->RetagFiles(filesToRetag, TagsManager::Retag_Quick); SendCmdEvent(wxEVT_FILE_RETAGGED, (void*)&filesToRetag); } else if(filesToRetag.size() == 1) { ManagerST::Get()->RetagFile(filesToRetag.at(0).GetFullPath()); SendCmdEvent(wxEVT_FILE_RETAGGED, (void*)&filesToRetag); } }