NCBI C++ ToolKit
workspace.cpp
Go to the documentation of this file.
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 
Modified on Wed May 23 13:13:08 2012 by modify_doxy.py rev. 337098