doc_manager.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:16k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: doc_manager.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:43:48  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.50
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: doc_manager.cpp,v 1000.5 2004/06/01 20:43:48 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    Central document arbiter for GBENCH
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbimtx.hpp>
  41. #include <gui/core/data_store.hpp>
  42. #include <gui/core/doc_exception.hpp>
  43. #include <gui/core/doc_manager.hpp>
  44. #include <gui/core/docmgr_view.hpp>
  45. #include <gui/core/idocument.hpp>
  46. #include <gui/core/plugin_registry.hpp>
  47. #include <gui/core/plugin_utils.hpp>
  48. #include <gui/core/message_queue.hpp>
  49. #include <gui/core/iview.hpp>
  50. #include <gui/config/settings.hpp>
  51. #include <gui/core/selection_buffer.hpp>
  52. #include <gui/utils/message_box.hpp>
  53. #include <gui/utils/clipboard.hpp>
  54. #include <gui/plugin/PluginMessage.hpp>
  55. #include <gui/plugin/PluginMRUList.hpp>
  56. #include <objects/seqloc/Seq_id.hpp>
  57. #include <objects/seqalign/Seq_align.hpp>
  58. #include <objects/seq/Seq_annot.hpp>
  59. #include <objmgr/object_manager.hpp>
  60. #include <serial/typeinfo.hpp>
  61. #include <algorithm>
  62. #include "seqid_doc.hpp"
  63. #include "serialobj_doc.hpp"
  64. BEGIN_NCBI_SCOPE
  65. //
  66. // statics
  67. //
  68. DEFINE_STATIC_MUTEX(s_DocMgrMutex);
  69. CRef<CObjectManager>     CDocManager::sm_ObjMgr;
  70. CDocManager::TDocList    CDocManager::sm_Documents;
  71. CDocManager::TViewList   CDocManager::sm_Views;
  72. CRef<CSelectionBuffer>   CDocManager::sm_SelBuffer;
  73. CRef<CSettings>          CDocManager::sm_Settings;
  74. CDocManager::TScopeIndex CDocManager::sm_ScopeIdx;
  75. CRef<CPluginMRUList>     CDocManager::sm_PluginMessageCache;
  76. //
  77. // destructor
  78. // this is defined so that we can specify the order of destruction of our
  79. // member objects.  scopes must be deleted before the object manager itself!
  80. //
  81. void CDocManager::ShutDown()
  82. {
  83.     CMutexGuard LOCK(s_DocMgrMutex);
  84.     // shut down our settings
  85.     GetSettings().ShutDown();
  86.     // clear the data store
  87.     CDataStore::Clear();
  88.     // clear the clipboard
  89.     CClipboard::Clear();
  90.     // clear the plugin registry
  91.     CPluginRegistry::Clear();
  92.     // clear our views
  93.     sm_Views.clear();
  94.     // clear the plugin message queue
  95.     CPluginMessageQueue::Clear();
  96.     // clear our documents - there are hidden scopes here
  97.     // because of a circular CRef<>, we need to clear the views first
  98.     NON_CONST_ITERATE (TDocList, iter, sm_Documents) {
  99.         (*iter)->Clear();
  100.     }
  101.     sm_Documents.clear();
  102.     sm_ScopeIdx.clear();
  103.     // now, free to object manager
  104.     // (hopefully we've rooted out all lingering scopes by this point)
  105.     sm_ObjMgr.Reset(NULL);
  106. }
  107. CDocManager::TDocList& CDocManager::GetDocuments()
  108. {
  109.     CMutexGuard LOCK(s_DocMgrMutex);
  110.     return sm_Documents;
  111. }
  112. //
  113. // attach a view to the document manager
  114. //
  115. void CDocManager::AttachView(CDocMgrView* view)
  116. {
  117.     CMutexGuard LOCK(s_DocMgrMutex);
  118.     CRef<CDocMgrView> ref(view);
  119.     sm_Views.push_back(ref);
  120. }
  121. //
  122. // force update() to be called on all views
  123. //
  124. void CDocManager::UpdateAllViews(TUpdateFlags flags)
  125. {
  126.     CMutexGuard LOCK(s_DocMgrMutex);
  127.     NON_CONST_ITERATE (TViewList, iter, sm_Views) {
  128.         if (flags & (*iter)->GetEventMask()) {
  129.             (*iter)->Update(flags & (*iter)->GetEventMask());
  130.         }
  131.     }
  132. }
  133. //
  134. // event will be broadcasted to all documents and then views
  135. //
  136. void CDocManager::NotifyAllViews(const CEvent * event)
  137. {
  138.     CMutexGuard LOCK(s_DocMgrMutex);
  139.     NON_CONST_ITERATE (TDocList, iter, sm_Documents) {
  140.         IEventReceiver * vr = (*iter)->QueryInterfaceReceiver();
  141.         if (vr) vr->OnEvent(event);
  142.     }
  143. }
  144. //
  145. // x_CreateObjectManager()
  146. // function to wrap object manager and scope creation
  147. //
  148. void CDocManager::x_CreateObjectManager(void)
  149. {
  150.     // Check to see if we have an object manager(if not, we need to create one)
  151.     if (sm_ObjMgr) {
  152.         return;
  153.     }
  154.     // Create object manager
  155.     sm_ObjMgr = new CObjectManager();
  156.     if ( !sm_ObjMgr  ) {
  157.         NCBI_THROW(CDocException, eObjectManagerError,
  158.                    "CDocManager::CDocManager(): can't create object manager");
  159.     }
  160. }
  161. //
  162. // access the object manager
  163. //
  164. CObjectManager& CDocManager::GetObjectManager()
  165. {
  166.     if ( !sm_ObjMgr ) {
  167.         CMutexGuard LOCK(s_DocMgrMutex);
  168.         x_CreateObjectManager();
  169.     }
  170.     return *sm_ObjMgr;
  171. }
  172. //
  173. // access the selection buffer
  174. //
  175. CSelectionBuffer& CDocManager::GetSelBuffer()
  176. {
  177.     if (sm_SelBuffer) {
  178.         return *sm_SelBuffer;
  179.     }
  180.     CMutexGuard LOCK(s_DocMgrMutex);
  181.     // check again after locking to make sure we didn't block on a thread that
  182.     // was creating our selection buffer
  183.     if (sm_SelBuffer) {
  184.         return *sm_SelBuffer;
  185.     }
  186.     sm_SelBuffer = new CSelectionBuffer();
  187.     return *sm_SelBuffer;
  188. }
  189. //
  190. // GetSettings()
  191. // access the global settings repository
  192. //
  193. CSettings& CDocManager::GetSettings(void)
  194. {
  195.     if ( !sm_Settings ) {
  196.         CMutexGuard LOCK(s_DocMgrMutex);
  197.         if ( !sm_Settings ) {
  198.             sm_Settings.Reset(new CSettings());
  199.         }
  200.     }
  201.     return *sm_Settings;
  202. }
  203. IDocument* CDocManager::GetDocumentFromScope(CScope& scope)
  204. {
  205.     CMutexGuard LOCK(s_DocMgrMutex);
  206.     TScopeIndex::iterator iter = sm_ScopeIdx.find(CRef<CScope>(&scope));
  207.     if (iter == sm_ScopeIdx.end()) {
  208.         return NULL;
  209.     }
  210.     return iter->second;
  211. }
  212. const IDocument* CDocManager::GetDocumentFromScope(const CScope& scope)
  213. {
  214.     CRef<CScope> nc_ref(&const_cast<CScope&>(scope));
  215.     CMutexGuard LOCK(s_DocMgrMutex);
  216.     TScopeIndex::const_iterator iter = sm_ScopeIdx.find(nc_ref);
  217.     if (iter == sm_ScopeIdx.end()) {
  218.         return NULL;
  219.     }
  220.     return iter->second;
  221. }
  222. //
  223. // GetDocument()
  224. // this actually creates and manages documents for the user
  225. //
  226. IDocument* CDocManager::CreateDocument(CScope& scope, const CSeq_id& id)
  227. {
  228.     CMutexGuard LOCK(s_DocMgrMutex);
  229.     CRef<IDocument> doc(new CSeqIdDocument(scope, id));
  230.     sm_Documents.push_back(doc);
  231.     sm_ScopeIdx[ CRef<CScope>(&scope) ] = doc;
  232.     return doc.GetPointer();
  233. }
  234. IDocument* CDocManager::CreateDocument(CScope& scope, const CSerialObject& obj)
  235. {
  236.     CMutexGuard LOCK(s_DocMgrMutex);
  237.     CRef<IDocument> doc(new CSerialObjDocument(scope, obj));
  238.     sm_Documents.push_back(doc);
  239.     sm_ScopeIdx[ CRef<CScope>(&scope) ] = doc;
  240.     return doc.GetPointer();
  241. }
  242. //
  243. // ReleaseDocument()
  244. // this is responsible for making sure that documents can indeed
  245. // be deleted
  246. //
  247. bool CDocManager::ReleaseDocument(IDocument* doc)
  248. {
  249.     CMutexGuard LOCK(s_DocMgrMutex);
  250.     CRef<IDocument> ref(doc);
  251.     TDocList::iterator iter =
  252.         std::find(sm_Documents.begin(), sm_Documents.end(), ref);
  253.     if (iter != sm_Documents.end()) {
  254.         // clear all views from the document first
  255.         doc->Clear();
  256.         sm_Documents.erase(iter);
  257.         // also remove it from the scope index
  258.         NON_CONST_ITERATE (TScopeIndex, iter, sm_ScopeIdx) {
  259.             if (iter->second.GetPointer() == doc) {
  260.                 sm_ScopeIdx.erase(iter);
  261.                 break;
  262.             }
  263.         }
  264.         UpdateAllViews();
  265.         LOG_POST(Error << "unloaded document: " << ref->GetShortTitle());
  266.         return true;
  267.     } else {
  268.         return false;
  269.     }
  270. }
  271. //
  272. // CachePluginMessage
  273. // Cache the plugin messgae for the Most Recent Used list
  274. // 
  275. void CDocManager::AddMRUEntry(objects::CPluginMessage& msg, string label)
  276. {
  277.     // Cache messages whose reply is not formatted
  278.     if (msg.GetReply().IsSetFormatted()) {
  279.         return;
  280.     }
  281.     
  282.     CMutexGuard LOCK(s_DocMgrMutex);
  283. //    sm_PluginMessageCache.Add(msg, CPluginUtils::GetPluginMessageLabel(msg));
  284.     GetMRUCache().Add(msg, label);
  285. }
  286. CPluginMRUList& CDocManager::GetMRUCache(void)
  287. {
  288.     if ( !sm_PluginMessageCache ) {
  289.         CMutexGuard LOCK(s_DocMgrMutex);
  290.         if ( !sm_PluginMessageCache ) {
  291.             sm_PluginMessageCache.Reset(new CPluginMRUList("mru-cache"));
  292.         }
  293.     }
  294.     return *sm_PluginMessageCache;
  295. }
  296. END_NCBI_SCOPE
  297. /*
  298.  * ===========================================================================
  299.  * $Log: doc_manager.cpp,v $
  300.  * Revision 1000.5  2004/06/01 20:43:48  gouriano
  301.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.50
  302.  *
  303.  * Revision 1.50  2004/06/01 18:02:19  dicuccio
  304.  * Changed GetPluginMessageCache() -> GetMRUCache()
  305.  *
  306.  * Revision 1.49  2004/05/21 22:27:40  gorelenk
  307.  * Added PCH ncbi_pch.hpp
  308.  *
  309.  * Revision 1.48  2004/05/18 11:13:24  friedman
  310.  * Handle adding recently loaded documents into the MRU list.
  311.  *
  312.  * Revision 1.47  2004/05/07 15:40:33  dicuccio
  313.  * gui/objutils/clipboard -> gui/objutils/obj_clipboard
  314.  *
  315.  * Revision 1.46  2004/05/03 12:48:46  dicuccio
  316.  * gui/utils --> gui/objutils where needed
  317.  *
  318.  * Revision 1.45  2004/04/21 17:12:33  dicuccio
  319.  * Added const version of GetDocumentFromScope()
  320.  *
  321.  * Revision 1.44  2004/04/16 14:37:28  dicuccio
  322.  * Remove dead code in Update()
  323.  *
  324.  * Revision 1.43  2004/04/07 12:45:06  dicuccio
  325.  * Formatting changes.  Added scope -> document index.  Added
  326.  * GetDocumentFromScope()
  327.  *
  328.  * Revision 1.42  2004/03/30 17:09:01  tereshko
  329.  * Added NotifyAllViews function
  330.  *
  331.  * Revision 1.41  2004/02/17 20:35:23  rsmith
  332.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  333.  *
  334.  * Revision 1.40  2004/02/03 21:24:11  dicuccio
  335.  * Clear the clipboard on ShutDown()
  336.  *
  337.  * Revision 1.39  2004/01/07 17:39:01  vasilche
  338.  * Fixed include path to genbank loader.
  339.  *
  340.  * Revision 1.38  2003/12/22 19:18:48  dicuccio
  341.  * COmmented out unnecessary view update
  342.  *
  343.  * Revision 1.37  2003/11/14 17:50:58  dicuccio
  344.  * Fix silly compiler error introduced in last commit.
  345.  *
  346.  * Revision 1.36  2003/11/14 17:44:18  dicuccio
  347.  * Changed ShutDown() to clear more components
  348.  *
  349.  * Revision 1.35  2003/11/04 17:15:52  dicuccio
  350.  * Added more to ShutDown(): clear the object store; clear the registry
  351.  *
  352.  * Revision 1.34  2003/10/07 13:46:14  dicuccio
  353.  * Drop documents in reverse order (safety concern if documents are
  354.  * interdependent)
  355.  *
  356.  * Revision 1.33  2003/09/16 14:01:40  dicuccio
  357.  * Removed CSeqannotDocument - replaced with generic CSerialObjDocument
  358.  *
  359.  * Revision 1.32  2003/09/04 14:01:51  dicuccio
  360.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  361.  *
  362.  * Revision 1.31  2003/06/30 13:32:34  dicuccio
  363.  * Removed GenBank data loader - this now lives in a plugin of its own
  364.  *
  365.  * Revision 1.30  2003/06/29 13:10:17  dicuccio
  366.  * Use DEFINE_STATIC_MUTEX() instead of static member variables
  367.  *
  368.  * Revision 1.29  2003/06/25 17:02:54  dicuccio
  369.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  370.  * implementation file.  Lots of #include file clean-ups.
  371.  *
  372.  * Revision 1.28  2003/06/18 13:54:48  rsmith
  373.  * cnstr/destr of sm_Views or sm_Documents uses s_DocMgrMutex. Set order
  374.  * accordingly.  Useless to guard GetSettings since a reference is returned.
  375.  *
  376.  * Revision 1.27  2003/06/02 16:06:17  dicuccio
  377.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  378.  *     - src/objects/asn2asn --> arc/app/asn2asn
  379.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  380.  *     - src/objects/objmgr --> src/objmgr
  381.  *     - src/objects/util --> src/objmgr/util
  382.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  383.  *     - src/objects/flat --> src/objtools/flat
  384.  *     - src/objects/validator --> src/objtools/validator
  385.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  386.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  387.  * replaces the three libmmdb? libs.
  388.  *
  389.  * Revision 1.26  2003/05/30 14:15:41  dicuccio
  390.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  391.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  392.  * unresolved external and conflict with the Win32 API :(.
  393.  *
  394.  * Revision 1.25  2003/05/30 12:56:50  dicuccio
  395.  * Converted code to use MessageBox() instead of
  396.  * fl_ask()/fl_message()/fl_alert()
  397.  *
  398.  * Revision 1.24  2003/05/09 14:29:35  dicuccio
  399.  * Remember to update all docmanager views after deleting a document.  Changed
  400.  * log messaged for deleted document
  401.  *
  402.  * Revision 1.23  2003/05/08 20:10:24  dicuccio
  403.  * Added LOG_POST for unloading documents
  404.  *
  405.  * Revision 1.22  2003/05/08 16:18:59  dicuccio
  406.  * Changed CFastMutex --> CMutex - guards against recursive locking
  407.  *
  408.  * Revision 1.21  2003/04/30 13:53:14  dicuccio
  409.  * Made access of CDocManager internals thread safe
  410.  *
  411.  * Revision 1.20  2003/04/29 14:37:17  dicuccio
  412.  * Removed old typing system
  413.  *
  414.  * Revision 1.19  2003/04/24 16:27:09  dicuccio
  415.  * Added new marshalling functions for creating documents from given object
  416.  * components.
  417.  *
  418.  * Revision 1.18  2003/04/16 11:38:13  dicuccio
  419.  * Reordered shutdown procedure - clear current doc manager views first
  420.  *
  421.  * Revision 1.17  2003/03/17 14:49:54  dicuccio
  422.  * Removed header file dependency on view.hpp
  423.  *
  424.  * Revision 1.16  2003/03/10 22:58:51  kuznets
  425.  * iterate -> ITERATE
  426.  *
  427.  * Revision 1.15  2003/02/20 19:49:54  dicuccio
  428.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  429.  * over to use new plugin architecture.
  430.  *
  431.  * Revision 1.14  2003/02/05 19:50:52  dicuccio
  432.  * Wrapped creation of a data loader in a try{}...catch(){} to avoid fatal
  433.  * exceptions if there is no network available.
  434.  *
  435.  * Revision 1.13  2003/01/15 21:07:52  dicuccio
  436.  * Added CSettings member variable.  Removed a number of dead _TRACE()
  437.  * statements
  438.  *
  439.  * Revision 1.12  2003/01/13 13:10:06  dicuccio
  440.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  441.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  442.  *
  443.  * Revision 1.11  2003/01/10 17:36:41  dicuccio
  444.  * Changed TPluginList --> TPlugins
  445.  *
  446.  * Revision 1.10  2002/12/30 17:53:26  dicuccio
  447.  * Modified function of ReleaseDocument() - don't call UpdateAllViews() (this
  448.  * function is called from a menu callback; we delay this call to avoid
  449.  * inadvertently returning to a destroyed object).
  450.  *
  451.  * Revision 1.9  2002/12/20 19:16:49  dicuccio
  452.  * Better handling of document release - must free views before releasing
  453.  * document; also, notify all views and documents of a release through a new
  454.  * event
  455.  *
  456.  * Revision 1.8  2002/12/12 15:17:30  dicuccio
  457.  * Added a selection buffer specific to the document manager - provides global
  458.  * selections
  459.  *
  460.  * Revision 1.7  2002/11/29 16:34:59  dicuccio
  461.  * Reformatted tabs -> spaces
  462.  *
  463.  * Revision 1.6  2002/11/29 16:03:06  dicuccio
  464.  * Removed a bunch of dead code.  Modified the use of NCBI_THROW to be correct
  465.  * and avoid compile errors on Windows.
  466.  *
  467.  * Revision 1.5  2002/11/25 20:53:05  dicuccio
  468.  * Changed singleton implementation of CDocManager to pure static implementation
  469.  * (more in line with rest of framework)
  470.  *
  471.  * Revision 1.4  2002/11/14 16:15:48  dicuccio
  472.  * Removed unecessary _TRACE() macros
  473.  *
  474.  * Revision 1.3  2002/11/09 20:50:09  dicuccio
  475.  * Changed IDocument::x_GetViews() (non-const) and x_AttachView() from private
  476.  * to public.
  477.  *
  478.  * Revision 1.2  2002/11/07 18:38:21  dicuccio
  479.  * Changed the auto_ptr<> implementation to be a static auto_ptr<>.
  480.  * Changed code to use ERR_POST() and _TRACE().
  481.  *
  482.  * Revision 1.1  2002/11/06 15:49:47  dicuccio
  483.  * Initial revision
  484.  *
  485.  * ===========================================================================
  486.  */