bool ProjectManager::BeginLoadingWorkspace() { if (m_IsLoadingWorkspace) return false; m_IsLoadingWorkspace = true; if (!CloseWorkspace()) { m_IsLoadingWorkspace = false; return false; // didn't close } m_ui->BeginLoadingWorkspace(); return true; }
void ProjectManager::EndLoadingWorkspace() { if (!m_IsLoadingWorkspace) return; m_IsLoadingWorkspace = false; if (!m_pWorkspace) return; if (m_pWorkspace->IsOK()) { if (m_pProjectToActivate) { SetProject(m_pProjectToActivate, true); m_pProjectToActivate = nullptr; } m_ui->FinishLoadingWorkspace(m_pActiveProject, m_pWorkspace->GetTitle()); // sort out any global user vars that need to be defined now (in a batch) :) Manager::Get()->GetUserVariableManager()->Arrogate(); int numNotes = 0; // and now send the project loaded events // since we were loading a workspace, these events were not sent before for (size_t i = 0; i < m_pProjects->GetCount(); ++i) { cbProject* project = m_pProjects->Item(i); // notify plugins that the project is loaded // moved here from cbProject::Open() because code-completion // kicks in too early and the perceived loading time is long... CodeBlocksEvent event(cbEVT_PROJECT_OPEN); event.SetProject(project); Manager::Get()->GetPluginManager()->NotifyPlugins(event); // since we 're iterating anyway, let's count the project notes that should be displayed if (project->GetShowNotesOnLoad() && !project->GetNotes().IsEmpty()) ++numNotes; } // finally, display projects notes (if appropriate) if (numNotes) { if (numNotes == 1 || // if only one project has notes, don't bother asking cbMessageBox(wxString::Format(_("%d projects contain notes that should be displayed on-load.\n" "Do you want to display them now, one after the other?"), numNotes), _("Display project notes?"), wxICON_QUESTION | wxYES_NO) == wxID_YES) { for (size_t i = 0; i < m_pProjects->GetCount(); ++i) { cbProject* project = m_pProjects->Item(i); if (project->GetShowNotesOnLoad()) project->ShowNotes(true); } } } WorkspaceChanged(); } else CloseWorkspace(); }
bool clCxxWorkspace::OpenWorkspace(const wxString& fileName, wxString& errMsg) { CloseWorkspace(); m_buildMatrix.Reset(NULL); wxFileName workSpaceFile(fileName); if(workSpaceFile.FileExists() == false) { errMsg = wxString::Format(wxT("Could not open workspace file: '%s'"), fileName.c_str()); return false; } m_fileName = workSpaceFile; m_doc.Load(m_fileName.GetFullPath()); if(!m_doc.IsOk()) { errMsg = wxT("Corrupted workspace file"); return false; } // Make sure we have the WORKSPACE/.codelite folder exists { wxLogNull nolog; wxMkdir(GetPrivateFolder()); } SetWorkspaceLastModifiedTime(GetFileLastModifiedTime()); // This function sets the working directory to the workspace directory! ::wxSetWorkingDirectory(m_fileName.GetPath()); // Load all projects wxXmlNode* child = m_doc.GetRoot()->GetChildren(); std::vector<wxXmlNode*> removedChildren; wxString tmperr; while(child) { if(child->GetName() == wxT("Project")) { wxString projectPath = child->GetPropVal(wxT("Path"), wxEmptyString); if(!DoAddProject(projectPath, errMsg)) { tmperr << wxString::Format(wxT("Error occured while loading project: \"%s\"\nCodeLite has removed the " "faulty project from the workspace\n"), projectPath.c_str()); removedChildren.push_back(child); } } else if((child->GetName() == wxT("WorkspaceParserPaths")) || (child->GetName() == wxT("WorkspaceParserMacros"))) { wxString swtlw = wxEmptyString; swtlw = XmlUtils::ReadString(m_doc.GetRoot(), "SWTLW"); if(swtlw.CmpNoCase("yes") == 0) { LocalWorkspaceST::Get()->SetParserFlags(LocalWorkspaceST::Get()->GetParserFlags() | LocalWorkspace::EnableSWTLW); SyncToLocalWorkspaceSTParserPaths(); SyncToLocalWorkspaceSTParserMacros(); } } child = child->GetNext(); } // Delete the faulty projects for(size_t i = 0; i < removedChildren.size(); i++) { wxXmlNode* ch = removedChildren.at(i); ch->GetParent()->RemoveChild(ch); delete ch; } errMsg.Clear(); TagsManager* mgr = TagsManagerST::Get(); mgr->CloseDatabase(); mgr->OpenDatabase(GetTagsFileName().GetFullPath()); // Update the build matrix DoUpdateBuildMatrix(); // Notify about active project changed ProjectPtr activeProject = GetActiveProject(); if(activeProject) { clProjectSettingsEvent evt(wxEVT_ACTIVE_PROJECT_CHANGED); evt.SetProjectName(activeProject->GetName()); evt.SetFileName(activeProject->GetFileName().GetFullPath()); EventNotifier::Get()->AddPendingEvent(evt); } return true; }