|
NCBI C++ ToolKit
|
00001 /* $Id: workspace.cpp 25238 2012-02-14 16:11:43Z ucko $ 00002 00003 * =========================================================================== 00004 * 00005 * PUBLIC DOMAIN NOTICE 00006 * National Center for Biotechnology Information 00007 * 00008 * This software/database is a "United States Government Work" under the 00009 * terms of the United States Copyright Act. It was written as part of 00010 * the author's official duties as a United States Government employee and 00011 * thus cannot be copyrighted. This software/database is freely available 00012 * to the public for use. The National Library of Medicine and the U.S. 00013 * Government have not placed any restriction on its use or reproduction. 00014 * 00015 * Although all reasonable efforts have been taken to ensure the accuracy 00016 * and reliability of the software and data, the NLM and the U.S. 00017 * Government do not and cannot warrant the performance or results that 00018 * may be obtained by using this software or data. The NLM and the U.S. 00019 * Government disclaim all warranties, express or implied, including 00020 * warranties of performance, merchantability or fitness for any particular 00021 * purpose. 00022 * 00023 * Please cite the author in any work or product based on this material. 00024 * 00025 * =========================================================================== 00026 * 00027 * Authors: Andrey Yazhuk 00028 * 00029 * File Description: 00030 * 00031 */ 00032 00033 #include <ncbi_pch.hpp> 00034 00035 #include <gui/core/workspace.hpp> 00036 00037 #include <gui/core/project_service.hpp> 00038 #include <gui/core/project_service_types.hpp> 00039 00040 #include <gui/core/document.hpp> 00041 00042 #include <gui/objects/GBWorkspace.hpp> 00043 #include <gui/objects/WorkspaceFolder.hpp> 00044 #include <gui/objects/GBProjectHandle.hpp> 00045 #include <gui/objects/ProjectDescr.hpp> 00046 #include <gui/objects/ProjectItem.hpp> 00047 #include <gui/objects/ProjectFolder.hpp> 00048 #include <gui/objects/FolderInfo.hpp> 00049 #include <gui/objects/GBProject_ver2.hpp> 00050 00051 #include <objects/general/Date.hpp> 00052 00053 #include <serial/iterator.hpp> 00054 00055 #include <corelib/ncbifile.hpp> 00056 #include <corelib/ncbitime.hpp> 00057 00058 #include <gui/widgets/wx/wx_utils.hpp> 00059 00060 #include <wx/filename.h> 00061 00062 BEGIN_NCBI_SCOPE 00063 00064 USING_SCOPE(objects); 00065 00066 /////////////////////////////////////////////////////////////////////////////// 00067 /// CWorkspaceConstPrx 00068 00069 CWorkspaceConstPrx::CWorkspaceConstPrx(objects::CGBWorkspace& workspace, 00070 CProjectService& service, 00071 bool get_lock) 00072 : m_Workspace(&workspace), 00073 m_Service(&service) 00074 { 00075 m_Sw.Start(); 00076 m_OrigThreadID = CThread::GetSelf(); 00077 00078 if(get_lock) { 00079 m_Service->x_GetWorkspaceLock().ReadLock(); 00080 //LOG_POST(Info << "CWorkspaceConstPrx constructor " << this << " got READ lock"); 00081 } 00082 } 00083 00084 00085 CWorkspaceConstPrx::~CWorkspaceConstPrx() 00086 { 00087 //LOG_POST(Info << "CWorkspaceConstPrx destructor " << this); 00088 00089 m_Service->x_GetWorkspaceLock().Unlock(); 00090 m_Sw.Stop(); 00091 00092 //int t = 1000 * m_Sw.Elapsed(); 00093 //LOG_POST(Info << "CWorkspaceConstPrx destructor " << t << " ms"); 00094 } 00095 00096 00097 CWorkspaceConstPrx::TId CWorkspaceConstPrx::GetId() 00098 { 00099 x_ValidateCall(); 00100 00101 return m_Workspace->GetId(); 00102 } 00103 00104 00105 string CWorkspaceConstPrx::GetName() 00106 { 00107 x_ValidateCall(); 00108 00109 return m_Workspace->SetDescr().SetTitle(); 00110 } 00111 00112 00113 string CWorkspaceConstPrx::GetDescr() 00114 { 00115 x_ValidateCall(); 00116 00117 CProjectDescr& descr = m_Workspace->SetDescr(); 00118 if( ! descr.IsSetComment()) { 00119 descr.SetComment(kEmptyStr); 00120 } 00121 return descr.GetComment(); 00122 } 00123 00124 00125 CTime CWorkspaceConstPrx::GetCreateTime() 00126 { 00127 x_ValidateCall(); 00128 00129 CProjectDescr& descr = m_Workspace->SetDescr(); 00130 return descr.GetCreate_date().AsCTime(); 00131 } 00132 00133 00134 CTime CWorkspaceConstPrx::GetModifiedTime() 00135 { 00136 x_ValidateCall(); 00137 00138 CProjectDescr& descr = m_Workspace->SetDescr(); 00139 return descr.GetModified_date().AsCTime(); 00140 } 00141 00142 00143 bool CWorkspaceConstPrx::IsDirty() const 00144 { 00145 x_ValidateCall(); 00146 00147 return m_Workspace->IsDirty(); 00148 } 00149 00150 00151 wxString CWorkspaceConstPrx::GetFilename() const 00152 { 00153 x_ValidateCall(); 00154 00155 return FnToWxString(m_Workspace->GetFilename()); 00156 } 00157 00158 00159 CRef<CWorkspaceFolderConstPrx> 00160 CWorkspaceConstPrx::FindWorkspaceFolderById_C(CWorkspaceFolderConstPrx::TId folder_id) 00161 { 00162 x_ValidateCall(); 00163 00164 CRef<CWorkspaceFolderConstPrx> root = GetRootFolder_C(); 00165 return root->FindChildFolderById_C(folder_id, true); 00166 } 00167 00168 00169 CRef<CProjectFolderConstPrx> 00170 CWorkspaceConstPrx::FindProjectFolderById_C(CWorkspaceFolderConstPrx::TId /*folder_id*/) 00171 { 00172 x_ValidateCall(); 00173 00174 CRef<CProjectFolderConstPrx> folder_prx; 00175 _ASSERT(false); //TODO 00176 return folder_prx; 00177 } 00178 00179 00180 CRef<CWorkspaceFolderConstPrx> CWorkspaceConstPrx::GetRootFolder_C() 00181 { 00182 x_ValidateCall(); 00183 00184 CWorkspaceFolder& folder = m_Workspace->SetWorkspace(); 00185 return CRef<CWorkspaceFolderConstPrx>(new CWorkspaceFolderConstPrx(folder, *this)); 00186 } 00187 00188 00189 // converts given absolute path to a relative path using Workspace path as the base. 00190 // If Workspace has not been saved - return absolute path 00191 wxString CWorkspaceConstPrx::ToRelativePath(const wxString& abs_path) 00192 { 00193 x_ValidateCall(); 00194 00195 if (abs_path.StartsWith(wxT("http://")) || abs_path.StartsWith(wxT("ftp://"))) 00196 return abs_path; 00197 00198 wxFileName absolute(abs_path); 00199 if (absolute.IsRelative()) 00200 return abs_path; 00201 00202 wxString ws_path = GetFilename(); 00203 if (ws_path.size() != 0) { 00204 wxString ws_dir = wxFileName(ws_path).GetPath(); 00205 wxFileName relative(abs_path); 00206 relative.MakeRelativeTo(ws_dir); 00207 return relative.GetFullPath(); 00208 } 00209 return abs_path; 00210 } 00211 00212 // converts given relative path to an absolute path using Workspace path as the base. 00213 wxString CWorkspaceConstPrx::ToAbsolutePath(const wxString& rel_path) 00214 { 00215 x_ValidateCall(); 00216 00217 if (rel_path.StartsWith(wxT("http://")) || rel_path.StartsWith(wxT("ftp://"))) 00218 return rel_path; 00219 00220 wxFileName absolute(rel_path); 00221 if (absolute.IsAbsolute()) 00222 return rel_path; 00223 00224 wxString ws_path = GetFilename(); 00225 if (ws_path.size() != 0) { 00226 wxString ws_dir = wxFileName(ws_path).GetPath(); 00227 absolute.MakeAbsolute(ws_dir); 00228 return absolute.GetFullPath(); 00229 } 00230 00231 return rel_path; 00232 } 00233 00234 /// Visitor that accumulates Project Handles in a container 00235 class CDocumentAccumulator : public CWorkspaceFolder::IProjectVisitor 00236 { 00237 public: 00238 typedef CWorkspaceConstPrx::EProjectState TState; 00239 00240 CDocumentAccumulator(TState state) 00241 : m_State(state) {} 00242 00243 virtual bool Visit(objects::CGBProjectHandle& project) 00244 { 00245 CGBDocument* doc = dynamic_cast<CGBDocument*>(&project); 00246 00247 _ASSERT(doc); 00248 00249 if(doc) { 00250 bool loaded = doc->IsLoaded(); 00251 bool exclude = 00252 (m_State == CWorkspaceConstPrx::eLoaded && ! loaded) || 00253 (m_State == CWorkspaceConstPrx::eUnloaded && loaded); 00254 if( ! exclude) { 00255 m_Docs.push_back(CRef<CGBDocument>(doc)); 00256 } 00257 } 00258 return true; // continue 00259 } 00260 00261 public: 00262 TState m_State; 00263 vector< CRef<CGBDocument> > m_Docs; 00264 }; 00265 00266 00267 void CWorkspaceConstPrx::GetProjects_C(TProjectConstPrxVector& projects, 00268 EProjectState state) 00269 { 00270 x_ValidateCall(); 00271 00272 CDocumentAccumulator acc(state); 00273 CRef<CWorkspaceFolderConstPrx> rfolder(GetRootFolder_C()); 00274 rfolder->x_ForEachProject(acc, true); 00275 00276 for( size_t i = 0; i < acc.m_Docs.size(); i++ ) { 00277 CGBDocument& doc = *acc.m_Docs[i]; 00278 CRef<CProjectConstPrx> prx(new CProjectConstPrx(doc, this)); 00279 projects.push_back(prx); 00280 } 00281 } 00282 00283 00284 void CWorkspaceConstPrx::GetProjects(TProjectPrxVector& projects, 00285 EProjectState state) 00286 { 00287 x_ValidateCall(); 00288 00289 CDocumentAccumulator acc(state); 00290 CRef<CWorkspaceFolderConstPrx> rfolder(GetRootFolder_C()); 00291 rfolder->x_ForEachProject(acc, true); 00292 00293 for( size_t i = 0; i < acc.m_Docs.size(); i++ ) { 00294 CGBDocument& doc = *acc.m_Docs[i]; 00295 CRef<CProjectPrx> prx(new CProjectPrx(doc, this)); 00296 projects.push_back(prx); 00297 } 00298 } 00299 00300 00301 void CWorkspaceConstPrx::GetProjectIds(vector<TProjectId>& ids, 00302 EProjectState state) 00303 { 00304 x_ValidateCall(); 00305 00306 CDocumentAccumulator acc(state); 00307 CRef<CWorkspaceFolderConstPrx> rfolder(GetRootFolder_C()); 00308 rfolder->x_ForEachProject(acc, true); 00309 00310 for( size_t i = 0; i < acc.m_Docs.size(); i++ ) { 00311 CGBDocument& doc = *acc.m_Docs[i]; 00312 TProjectId id = doc.GetId(); 00313 ids.push_back(id); 00314 } 00315 } 00316 00317 00318 CRef<CProjectConstPrx> CWorkspaceConstPrx::FindProjectById_C(TProjectId prj_id) 00319 { 00320 x_ValidateCall(); 00321 00322 CRef<CProjectConstPrx> res; 00323 if(m_Workspace->CanGetWorkspace()) { 00324 CRef<CWorkspaceFolderConstPrx> folder = GetRootFolder_C(); 00325 res = folder->FindProjectById_C(prj_id, true); 00326 } 00327 return res; 00328 } 00329 00330 00331 CRef<CProjectPrx> CWorkspaceConstPrx::FindProjectById(TProjectId prj_id) 00332 { 00333 x_ValidateCall(); 00334 00335 CRef<CProjectPrx> res; 00336 if(m_Workspace->CanGetWorkspace()) { 00337 CRef<CWorkspaceFolderConstPrx> folder = GetRootFolder_C(); 00338 res = folder->FindProjectById(prj_id, true); 00339 } 00340 return res; 00341 } 00342 00343 00344 CRef<CProjectPrx> CWorkspaceConstPrx::FindProjectByFilename(const wxString& filename) 00345 { 00346 x_ValidateCall(); 00347 00348 CRef<CWorkspaceFolderConstPrx> root = GetRootFolder_C(); 00349 CRef<CProjectPrx> project = root->FindProjectByFilename(filename, true); 00350 return project; 00351 } 00352 00353 00354 CRef<CProjectConstPrx> CWorkspaceConstPrx::FindProjectByScope_C(CScope* scope) 00355 { 00356 x_ValidateCall(); 00357 00358 CRef<CProjectConstPrx> prx; 00359 if(scope) { 00360 CGBProjectHandle* project = m_Workspace->GetProjectFromScope(*scope); 00361 CGBDocument* doc = dynamic_cast<CGBDocument*>(project); 00362 if(doc) { 00363 prx.Reset(new CProjectConstPrx(*doc, this)); 00364 } 00365 } 00366 return prx; 00367 } 00368 00369 00370 CRef<CProjectPrx> CWorkspaceConstPrx::FindProjectByScope(CScope* scope) 00371 { 00372 x_ValidateCall(); 00373 00374 CRef<CProjectPrx> prx; 00375 if(scope) { 00376 CGBProjectHandle* project = m_Workspace->GetProjectFromScope(*scope); 00377 CGBDocument* doc = dynamic_cast<CGBDocument*>(project); 00378 if(doc) { 00379 prx.Reset(new CProjectPrx(*doc, this)); 00380 } 00381 } 00382 return prx; 00383 } 00384 00385 00386 void CWorkspaceConstPrx::x_OnProjectChanged(CProjectPrx& project) 00387 { 00388 x_ValidateCall(); 00389 00390 CProjectPrx::TId prj_id = project.GetId(); 00391 m_Service->x_OnProjectChanged(prj_id); 00392 } 00393 00394 00395 CProjectService* CWorkspaceConstPrx::x_GetProjectService() 00396 { 00397 return m_Service; 00398 } 00399 00400 00401 CRWLock& CWorkspaceConstPrx::x_GetProjectsLock() 00402 { 00403 return m_Service->x_GetProjectsLock(); 00404 } 00405 00406 00407 void CWorkspaceConstPrx::x_ValidateCall() const 00408 { 00409 CThread::TID id = CThread::GetSelf(); 00410 00411 if(id != m_OrigThreadID) { 00412 _ASSERT(false); 00413 NCBI_THROW(CProjectServiceException, eThreadAffinityError, 00414 "Workspace Proxy can only be used on the thread on which\ 00415 it was created."); 00416 } 00417 } 00418 00419 00420 /////////////////////////////////////////////////////////////////////////////// 00421 /// CWorkspacePrx 00422 static const char* kNotSerialMsg = "Cannot create a project - input objects is not a CSerialObject"; 00423 static const char* kProjectExistsMsg = "Cannot create a project - a project with the given id already exists"; 00424 00425 CWorkspacePrx::CWorkspacePrx(CGBWorkspace& workspace, CProjectService& service) 00426 : CWorkspaceConstPrx(workspace, service, false) // do not get read lock 00427 { 00428 m_Service->x_GetWorkspaceLock().WriteLock(); 00429 // LOG_POST(Info << "CWorkspacePrx constructor " << this << " got WRITE lock"); 00430 } 00431 00432 00433 CWorkspacePrx::~CWorkspacePrx() 00434 { 00435 //LOG_POST(Info << "CWorkspacePrx destructor " << this); 00436 // do not unlock here, ~CWorkspaceConstPrx will do it for us 00437 } 00438 00439 00440 void CWorkspacePrx::SetName(const string& title) 00441 { 00442 x_ValidateCall(); 00443 00444 m_Workspace->SetDescr().SetTitle(title); 00445 x_OnWorkspaceChanged(); 00446 } 00447 00448 00449 void CWorkspacePrx::SetDescr(const string& descr) 00450 { 00451 x_ValidateCall(); 00452 00453 m_Workspace->SetDescr().SetComment(descr); 00454 x_OnWorkspaceChanged(); 00455 } 00456 00457 00458 void CWorkspacePrx::SetCreateTime(const CTime& time) 00459 { 00460 x_ValidateCall(); 00461 00462 CDate date(time); 00463 m_Workspace->SetDescr().SetCreate_date(date); 00464 00465 x_OnWorkspaceChanged(); 00466 } 00467 00468 00469 void CWorkspacePrx::SetModifiedTime(const CTime& time) 00470 { 00471 x_ValidateCall(); 00472 00473 CDate date(time); 00474 m_Workspace->SetDescr().SetModified_date().Assign(date); 00475 00476 x_OnWorkspaceChanged(); 00477 } 00478 00479 00480 void CWorkspacePrx::SetFilename(const wxString& filename) 00481 { 00482 x_ValidateCall(); 00483 00484 // update all project paths so that they remain correct 00485 for (CTypeIterator<CGBProjectHandle> it(*m_Workspace); it; ++it) { 00486 CGBProjectHandle& handle = *it; 00487 CGBDocument* doc = dynamic_cast<CGBDocument*>(&handle); 00488 doc->SetFileName(ToAbsolutePath(doc->GetFileName())); 00489 } 00490 00491 m_Workspace->SetFilename(FnToStdString(filename)); 00492 00493 for (CTypeIterator<CGBProjectHandle> it(*m_Workspace); it; ++it) { 00494 CGBProjectHandle& handle = *it; 00495 CGBDocument* doc = dynamic_cast<CGBDocument*>(&handle); 00496 doc->SetFileName(ToRelativePath(doc->GetFileName())); 00497 } 00498 00499 x_OnWorkspaceChanged(); 00500 } 00501 00502 00503 CRef<CWorkspaceFolderPrx> CWorkspacePrx::GetRootFolder() 00504 { 00505 x_ValidateCall(); 00506 00507 CWorkspaceFolder& folder = m_Workspace->SetWorkspace(); 00508 return CRef<CWorkspaceFolderPrx>(new CWorkspaceFolderPrx(folder, *this)); 00509 } 00510 00511 00512 CRef<CWorkspaceFolderPrx> 00513 CWorkspacePrx::FindWorkspaceFolderById(CWorkspaceFolderPrx::TId folder_id) 00514 { 00515 x_ValidateCall(); 00516 00517 CRef<CWorkspaceFolderPrx> root = GetRootFolder(); 00518 return root->FindChildFolderById(folder_id, true); 00519 } 00520 00521 00522 CRef<CProjectFolderPrx> 00523 CWorkspacePrx::FindProjectFolderById(CProjectFolderPrx::TId /*folder_id*/) 00524 { 00525 x_ValidateCall(); 00526 00527 CRef<CProjectFolderPrx> folder_prx; 00528 _ASSERT(false); //TODO 00529 return folder_prx; 00530 } 00531 00532 00533 CRef<CProjectPrx> CWorkspacePrx::CreateNewProject() 00534 { 00535 x_ValidateCall(); 00536 00537 TProjectId id = CGBDocument::GetNextId(); 00538 TObjectsSet objs; 00539 return CreateNewProject(id, objs); 00540 } 00541 00542 00543 CRef<CProjectPrx> CWorkspacePrx::CreateNewProject(TProjectId id) 00544 { 00545 x_ValidateCall(); 00546 00547 TObjectsSet objs; 00548 return CreateNewProject(id, objs); 00549 } 00550 00551 00552 CRef<CProjectPrx> CWorkspacePrx::CreateNewProject(TProjectId id, TObjectsSet& objs) 00553 { 00554 x_ValidateCall(); 00555 00556 //LOG_POST(Info << "CWorkspacePrx::CreateNewProject() project id " << id); 00557 // make sure all objects are Serial Objects 00558 00559 vector<CSerialObject*> ser_objects; 00560 NON_CONST_ITERATE(TObjectsSet, obj, objs) { 00561 CSerialObject* ser_obj = const_cast<CSerialObject*>(obj->GetPointer()); 00562 00563 if(ser_obj) { 00564 ser_objects.push_back(ser_obj); 00565 } else { 00566 NCBI_THROW(CException, eUnknown, kNotSerialMsg); // TODO throw special exception here 00567 } 00568 } 00569 00570 /// make sure Project with the given id does not exist 00571 CRef<CProjectPrx> project = FindProjectById(id); 00572 00573 if(project) { // TODO throw special exception here 00574 NCBI_THROW(CException, eUnknown, kProjectExistsMsg); 00575 } 00576 00577 CGBProject_ver2* prj_obj = new CGBProject_ver2(); 00578 CRef<CGBDocument> doc(new CGBDocument(m_Service, id, *prj_obj)); 00579 doc->CreateProjectScope(); 00580 00581 // initialize project data 00582 doc->SetDescr().SetTitle("New Project"); 00583 CTime now(CTime::eCurrent); 00584 00585 CDate date(now); 00586 doc->SetCreateDate(date); 00587 doc->SetModifiedDate(date); 00588 00589 project.Reset(new CProjectPrx(*doc, NULL)); 00590 00591 NON_CONST_ITERATE(vector<CSerialObject*>, it, ser_objects) { 00592 CSerialObject& ser_obj = **it; 00593 CRef<CProjectFolderPrx> data = project->GetDataFolder(); 00594 data->AddProjectItem("", ser_obj); 00595 } 00596 00597 //LOG_POST(Info << "Create CGBDocument " << doc.GetPointer()); 00598 return project; 00599 } 00600 00601 00602 CRef<CProjectPrx> CWorkspacePrx::CreateNewProject(const wxString& abs_path) 00603 { 00604 x_ValidateCall(); 00605 00606 //LOG_POST(Info << "CWorkspacePrx::CreateNewProject(" << abs_path << ")"); 00607 CRef<CGBDocument> doc(new CGBDocument(m_Service)); 00608 00609 wxString rel_path = ToRelativePath(abs_path); 00610 doc->SetFileName(rel_path); 00611 00612 // do not initialize data - we will read it from the file 00613 //LOG_POST(Info << "Create CGBDocument " << doc.GetPointer()); 00614 00615 CRef<CProjectPrx> project(new CProjectPrx(*doc, NULL)); 00616 return project; 00617 } 00618 00619 00620 void CWorkspacePrx::AddProject(CGBDocument& doc) 00621 { 00622 x_ValidateCall(); 00623 00624 CRef<CProjectPrx> project(new CProjectPrx(doc, this)); 00625 AddProject(*project); 00626 } 00627 00628 00629 /// this attached a new fully created project to the workspace 00630 void CWorkspacePrx::AddProject(CProjectPrx& project) 00631 00632 { 00633 x_ValidateCall(); 00634 00635 CGBDocument* doc = project.x_GetDocument(); 00636 00637 if(project.IsLoaded()) { 00638 // make sure the project name is set and unique 00639 project.x_FixProjectTitle(); 00640 } 00641 00642 x_InsertProjectHandle(*doc); 00643 00644 if(project.IsLoaded()) { 00645 m_Workspace->AddScopeToIndex(*doc); 00646 m_Service->x_ConnectDocument(*doc); 00647 } 00648 00649 x_OnProjectChanged(project); //TODO incremental 00650 00651 // we only send update if this a new project 00652 if(m_Workspace->IsDirty()) { 00653 x_OnWorkspaceChanged(); 00654 } 00655 } 00656 00657 00658 void CWorkspacePrx::RemoveProject(TProjectId id, bool reset_hist_async) 00659 { 00660 x_ValidateCall(); 00661 00662 CRef<CProjectPrx> project = FindProjectById(id); 00663 00664 if(project->IsLoaded()) { 00665 UnloadProject(*project, reset_hist_async); 00666 } 00667 x_RemoveFromFolder(m_Workspace->SetWorkspace(), id); 00668 00669 x_OnProjectChanged(*project); 00670 00671 x_OnWorkspaceChanged(); 00672 } 00673 00674 00675 void CWorkspacePrx::UnloadAllProjects() 00676 { 00677 x_ValidateCall(); 00678 00679 CDocumentAccumulator acc(eLoaded); 00680 CRef<CWorkspaceFolderConstPrx> rfolder(GetRootFolder_C()); 00681 rfolder->x_ForEachProject(acc, true); 00682 00683 for( size_t i = 0; i < acc.m_Docs.size(); i++ ) { 00684 CGBDocument& doc = *acc.m_Docs[i]; 00685 CRef<CProjectPrx> prx(new CProjectPrx(doc, this)); 00686 UnloadProject(*prx); 00687 } 00688 } 00689 00690 00691 void CWorkspacePrx::x_InsertProjectHandle(CGBProjectHandle& project) 00692 { 00693 x_ValidateCall(); 00694 00695 CRef<CWorkspaceFolderPrx> root = GetRootFolder(); 00696 00697 TProjectId id = project.GetId(); 00698 CRef<CProjectPrx> project_prx = root->FindProjectById(id, true); 00699 00700 if( ! project_prx) { 00701 // this project handle is not attached yet 00702 wxString fname = FnToWxString(project.GetFilename()); 00703 00704 // find the project by its filename 00705 if ( ! fname.empty() ) { 00706 project_prx = root->FindProjectByFilename(fname, true); 00707 } 00708 00709 if ( ! project_prx) { 00710 // this a new project - insert 00711 if(project.IsLoaded()) { 00712 // make sure the name is unique 00713 CProjectDescr& descr = project.SetDescr(); 00714 string name = descr.GetTitle(); 00715 string new_name = m_Workspace->MakeUniqueProjectTitle(name); 00716 descr.SetTitle(new_name); 00717 } 00718 root->x_AddProject(project); 00719 00720 m_Workspace->SetDirty(true); 00721 } 00722 } 00723 } 00724 00725 00726 bool CWorkspacePrx::LoadProject(CProjectPrx& project) 00727 { 00728 x_ValidateCall(); 00729 00730 if(project.IsLoaded()) { 00731 NCBI_THROW(CProjectServiceException, eInvalidOperation, 00732 "Cannot load project - it is already loaded."); 00733 } 00734 if(project.x_LoadData()) { 00735 m_Workspace->AddScopeToIndex(*project.x_GetDocument()); 00736 00737 CGBDocument* doc = project.x_GetDocument(); 00738 m_Service->x_ConnectDocument(*doc); 00739 00740 x_OnProjectChanged(project); 00741 return true; 00742 } 00743 return false; 00744 } 00745 00746 00747 void CWorkspacePrx::UnloadProject(CProjectPrx& project, bool reset_hist_async) 00748 { 00749 x_ValidateCall(); 00750 00751 if( ! project.IsLoaded()) { 00752 NCBI_THROW(CProjectServiceException, eInvalidOperation, 00753 "Cannot unload project - it is not loaded."); 00754 } 00755 00756 CGBDocument* doc = project.x_GetDocument(); 00757 m_Service->x_DisconnectDocument(project, reset_hist_async); 00758 00759 m_Workspace->RemoveScopeFromIndex(*doc); 00760 00761 project.x_UnloadData(); 00762 00763 x_OnProjectChanged(project); 00764 } 00765 00766 00767 // TODO 00768 bool CWorkspacePrx::x_RemoveFromFolder(CWorkspaceFolder& folder, TProjectId prj_id) 00769 { 00770 x_ValidateCall(); 00771 00772 if (folder.IsSetFolders()) { 00773 NON_CONST_ITERATE(CWorkspaceFolder::TFolders, iter, folder.SetFolders()) { 00774 if (x_RemoveFromFolder(**iter, prj_id)) { 00775 return true; 00776 } 00777 } 00778 } 00779 00780 if (folder.IsSetProjects()) { 00781 NON_CONST_ITERATE(CWorkspaceFolder::TProjects, it, folder.SetProjects()) { 00782 if ((*it)->GetId() == prj_id) { 00783 folder.SetProjects().erase(it); 00784 return true; 00785 } 00786 } 00787 } 00788 return false; 00789 } 00790 00791 00792 void CWorkspacePrx::x_OnWorkspaceChanged() 00793 { 00794 x_ValidateCall(); 00795 00796 m_Workspace->SetDirty(true); 00797 TId id = m_Workspace->GetId(); 00798 m_Service->x_OnWorkspaceChanged(id); 00799 } 00800 00801 00802 void CWorkspacePrx::x_OnWorkspaceFolderChanged(CWorkspaceFolderPrx& /*folder*/) 00803 { 00804 x_ValidateCall(); 00805 00806 m_Workspace->SetDirty(true); 00807 00808 // TODO - on folder changed 00809 TId id = m_Workspace->GetId(); 00810 m_Service->x_OnWorkspaceChanged(id); 00811 } 00812 00813 00814 END_NCBI_SCOPE 00815
1.7.5.1
Modified on Wed May 23 13:13:08 2012 by modify_doxy.py rev. 337098