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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: document.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:44:03  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.48
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: document.cpp,v 1000.5 2004/06/01 20:44:03 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.  *    CDocument -- the basic data unit for GBENCH
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbicntr.hpp>
  41. #include <gui/core/doc_exception.hpp>
  42. #include <gui/core/doc_manager.hpp>
  43. #include <gui/core/document.hpp>
  44. #include <gui/core/obj_convert.hpp>
  45. #include <gui/core/iview.hpp>
  46. #include <objects/seqset/Seq_entry.hpp>
  47. #include "doc_wkspace.hpp"
  48. BEGIN_NCBI_SCOPE
  49. USING_SCOPE(objects);
  50. // static counter for all documents
  51. static CAtomicCounter s_DocIdCounter;
  52. // the steps for tiling new views
  53. static const int kTilingXStep = 25;
  54. static const int kTilingYStep = 25;
  55. // the default "top" positions
  56. static const int kTopXPos = 25;
  57. static const int kTopYPos = 25;
  58. CDocument::CDocument()
  59.     : m_LastX(kTopXPos),
  60.       m_LastY(kTopYPos),
  61.       m_DocId(s_DocIdCounter.Add(1)),
  62.       m_AllViewsName("All Views"),
  63.       m_MsgPosted(false)
  64. {
  65. }
  66. CDocument::~CDocument()
  67. {
  68. }
  69. void CDocument::SetScope(CScope& scope)
  70. {
  71.     CMutexGuard LOCK(m_Mutex);
  72.     m_Scope.Reset(&scope);
  73. }
  74. // Show the workspace associated with this document
  75. void CDocument::ShowWorkspace(void)
  76. {
  77.     CMutexGuard LOCK(m_Mutex);
  78.     NON_CONST_ITERATE (TViews, iter, m_Views) {
  79.         (*iter)->Show();
  80.     }
  81. }
  82. // Hide the workspace associated with this document
  83. void CDocument::HideWorkspace(void)
  84. {
  85.     CMutexGuard LOCK(m_Mutex);
  86.     NON_CONST_ITERATE (TViews, iter, m_Views) {
  87.         (*iter)->Hide();
  88.     }
  89. }
  90. // internal function to retrieve a single message pool
  91. CDocument::TViewMsgPool* CDocument::x_GetMessagePool(const string& name,
  92.                                                      bool create)
  93. {
  94.     if ( !m_MsgPoolMgr.get() ) {
  95.         m_MsgPoolMgr.reset(new TViewMsgPoolMgr());
  96.     }
  97.     TViewMsgPool* pool = m_MsgPoolMgr->FindPool(name);
  98.     if ( !pool  &&  create) {
  99.         pool = m_MsgPoolMgr->CreatePool(name);
  100.     }
  101.     return pool;
  102. }
  103. CDocument::TViewMsgPool& CDocument::x_GetAllViewsPool()
  104. {
  105.     if ( !m_AllViewsPool ) {
  106.         m_AllViewsPool.Reset(x_GetMessagePool(m_AllViewsName, true));
  107.     }
  108.     return *m_AllViewsPool;
  109. }
  110. // internal message posting function
  111. void CDocument::x_PostMessage(TViewMsgPool* pool,
  112.                               TUpdateFlags event, const void* data)
  113. {
  114.     CMutexGuard LOCK(m_Mutex);
  115.     if (m_MsgPosted) {
  116.         // UpdateAllViews has been called from a message event
  117.         //  handler. This is not allowed.
  118.         LOG_POST(Error << "CDocument::x_PostMessage(): invoked from "
  119.                           "a message event handler");
  120.         return;
  121.     }
  122.     m_MsgPosted = true;
  123.     pool->PostMessage(event, data);
  124.     m_MsgPosted = false;
  125. }
  126. //
  127. // function to update all of our views
  128. //
  129. void CDocument::UpdateAllViews()
  130. {
  131.     PostDocumentChanged();
  132. }
  133. void CDocument::PostDocumentChanged(const string& msg_pool)
  134. {
  135.     TViewMsgPool* pool = x_GetMessagePool(msg_pool);
  136.     if ( !pool ) {
  137.         pool = &x_GetAllViewsPool();
  138.     }
  139.     x_PostMessage(pool, fDocumentChanged, NULL);
  140. }
  141. // Force all views to update themselves to show a given visible range
  142. void CDocument::PostVisibleRangeChanged(const CSeq_loc& loc,
  143.                                         const string& msg_pool)
  144. {
  145.     TViewMsgPool* pool = x_GetMessagePool(msg_pool);
  146.     if ( !pool ) {
  147.         pool = &x_GetAllViewsPool();
  148.     }
  149.     x_PostMessage(pool, fVisibleRangeChanged, &loc);
  150. }
  151. // Force all views to update themselves to set a group of selections
  152. void CDocument::PostSelectionChanged(const CSelectionBuffer& buf,
  153.                                      const string& msg_pool)
  154. {
  155.     TViewMsgPool* pool = x_GetMessagePool(msg_pool);
  156.     if ( !pool ) {
  157.         pool = &x_GetAllViewsPool();
  158.     }
  159.     x_PostMessage(pool, fSelectionChanged, &buf);
  160. }
  161. void CDocument::PostViewCreated(IView& view)
  162. {
  163.     x_PostMessage(&x_GetAllViewsPool(), fViewCreated, &view);
  164. }
  165. void CDocument::PostViewReleased(IView& view)
  166. {
  167.     x_PostMessage(&x_GetAllViewsPool(), fViewReleased, &view);
  168. }
  169. // Send event to a views group message pool
  170. void CDocument::PostGroupMessage(IView* view, TUpdateFlags event,
  171.                                  const void* user_data)
  172. {
  173.     TViewGroupPools::iterator iter = m_ViewGroupPools.find(view);
  174.     if (iter == m_ViewGroupPools.end()) {
  175.         LOG_POST(Error << "CDocument::PostGroupMessage: "
  176.                           "No group pool for the view"); 
  177.         return;
  178.     }
  179.     x_PostMessage(iter->second, event, user_data);
  180. }
  181. //
  182. // attach a view to the current document
  183. void CDocument::AttachView(IView* view, const string& pool_name)
  184. {
  185.     CMutexGuard LOCK(m_Mutex);
  186.     m_Views.push_back(CRef<IView>(view));
  187.     //
  188.     // make sure our new view comes up at a tiled position
  189.     //
  190.     int width;
  191.     int height;
  192.     view->GetSize(width, height);
  193.     m_LastX += kTilingXStep;
  194.     m_LastY += kTilingYStep;
  195.     if (m_LastX > Fl::w() - width) {
  196.         m_LastX = kTopXPos;
  197.     }
  198.     if (m_LastY > Fl::h() - height) {
  199.         m_LastY = kTopYPos;
  200.     }
  201.     view->SetPosition(m_LastX, m_LastY);
  202.     //
  203.     // make sure the window is sized to appear wholly in the screen
  204.     //
  205.     bool resize = false;
  206.     if (Fl::w() - m_LastX - width < 0) {
  207.         width = Fl::w() - m_LastX;
  208.         resize = true;
  209.     }
  210.     if (Fl::h() - m_LastY - height < 0) {
  211.         height = Fl::h() - m_LastY;
  212.         resize = true;
  213.     }
  214.     if (resize) {
  215.         view->SetSize(width, height);
  216.     }
  217.     // Add view to "All Views" message pool
  218.     x_GetAllViewsPool().Join(*view);
  219.     // add to the named pool
  220.     if ( !pool_name.empty() ) {
  221.         CRef<TViewMsgPool> my_pool(x_GetMessagePool(pool_name, true));
  222.         my_pool->Join(*view);
  223.         
  224.         // Add view->msgpool map entry
  225.         m_ViewGroupPools[view] = my_pool;
  226.     }
  227.     PostViewCreated(*view);
  228.     CDocManager::UpdateAllViews(fViewCreated);
  229.     // event routing
  230.     IEventTransmitter * vt = view->QueryInterfaceTransmitter();
  231.     if (vt) vt->SetHost(this);    
  232. }
  233. void CDocument::DetachView(IView* view)
  234. {
  235.     CMutexGuard LOCK(m_Mutex);
  236.     CRef<IView> ref(view);
  237.     m_Views.remove(ref);
  238.     // Remove view to "All Views" message pool
  239.     x_GetAllViewsPool().Leave(*view);
  240.     // Remove view from group message pool and map
  241.     TViewGroupPools::iterator iter = m_ViewGroupPools.find(view);
  242.     if (iter != m_ViewGroupPools.end()) {
  243.         (iter->second)->Leave(*view);
  244.         m_ViewGroupPools.erase(iter);
  245.     }
  246.     PostViewReleased(*view);
  247.     CDocManager::UpdateAllViews(fViewReleased);
  248. }
  249. //
  250. // clear this document
  251. //
  252. void CDocument::Clear()
  253. {
  254.     CMutexGuard LOCK(m_Mutex);
  255.     m_Views.clear();
  256.     // clear the message pools
  257.     m_AllViewsPool.Reset();
  258.     m_ViewGroupPools.clear();
  259.     m_MsgPoolMgr.reset();
  260. }
  261. void CDocument::AttachAnnot(CSeq_annot& annot)
  262. {
  263.     CObjectConverter::TObjList objs;
  264.     CObjectConverter::Convert(GetScope(), annot,
  265.                               CSeq_entry::GetTypeInfo(), objs);
  266.     ITERATE (CObjectConverter::TObjList, obj_iter, objs) {
  267.         const CSeq_entry* entry =
  268.             dynamic_cast<const CSeq_entry*>(obj_iter->GetPointer());
  269.         if ( !entry ) {
  270.             continue;
  271.         }
  272.         GetScope().AddTopLevelSeqEntry(const_cast<CSeq_entry&>(*entry));
  273.     }
  274. }
  275. // Transmitter/reciever QI
  276. IEventTransmitter * CDocument::QueryInterfaceTransmitter(void)
  277. {
  278.     return dynamic_cast<IEventTransmitter*>(this);
  279. }
  280. IEventReceiver    * CDocument::QueryInterfaceReceiver(void)
  281. {
  282.     return dynamic_cast<IEventReceiver*>(this);
  283. }
  284. void CDocument::SetHost(IEventTransmitter * host)
  285. {
  286.     _TRACE("Error: SetHost for CDocument - something gone wrong...");
  287. }
  288. void CDocument::FireEvent(const CEvent * evt)
  289. {
  290.     CDocManager::NotifyAllViews(evt);
  291. }
  292. void CDocument::OnEvent(const CEvent * evt)
  293. {
  294.    NON_CONST_ITERATE (TViews, iter, m_Views) {
  295.        IEventTransmitter * vt = (*iter)->QueryInterfaceTransmitter();
  296.        IEventReceiver    * vr = (*iter)->QueryInterfaceReceiver();       
  297.        if (vr) {
  298.             if (vt && evt->GetSender()==vt) continue;            
  299.             vr->OnEvent(evt);
  300.        }
  301.    }
  302. }
  303. END_NCBI_SCOPE
  304. /*
  305.  * ===========================================================================
  306.  * $Log: document.cpp,v $
  307.  * Revision 1000.5  2004/06/01 20:44:03  gouriano
  308.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.48
  309.  *
  310.  * Revision 1.48  2004/05/21 22:27:40  gorelenk
  311.  * Added PCH ncbi_pch.hpp
  312.  *
  313.  * Revision 1.47  2004/05/17 13:19:35  dicuccio
  314.  * Removed old document workspace
  315.  *
  316.  * Revision 1.46  2004/03/30 17:09:25  tereshko
  317.  * Added support for events broadcasting
  318.  *
  319.  * Revision 1.45  2004/01/21 12:38:18  dicuccio
  320.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  321.  *
  322.  * Revision 1.44  2004/01/15 17:59:20  dicuccio
  323.  * Rearranged initializers to avoid warning
  324.  *
  325.  * Revision 1.43  2003/12/31 20:26:34  dicuccio
  326.  * Added internal wrappers for accessing view message pools.  Fixed error in
  327.  * Clear() - must also delete view groups's pools (caused failure to dereference
  328.  * all documents and views)
  329.  *
  330.  * Revision 1.42  2003/12/22 19:19:24  dicuccio
  331.  * Clarified process of posting messages to other views.  Removed CView::Update().
  332.  *
  333.  * Revision 1.41  2003/11/19 20:40:41  friedman
  334.  * Added grouping views into group message pools
  335.  *
  336.  * Revision 1.40  2003/11/18 17:40:16  dicuccio
  337.  * Changed AttachAnnot() to create a parallel seq-entry rather than attaching
  338.  * directly to the current seq-entry
  339.  *
  340.  * Revision 1.39  2003/11/14 17:45:33  dicuccio
  341.  * Added Clear() - clears view list and view pool manager.  Changed AttachAnnot()
  342.  * - don't attach directly to original data.  Added resize for window to fit
  343.  * screen if the resolution is smaller than the window size.
  344.  *
  345.  * Revision 1.38  2003/11/06 20:03:02  dicuccio
  346.  * Added parameter to AttachView() for view message pool
  347.  *
  348.  * Revision 1.37  2003/11/04 17:16:43  dicuccio
  349.  * Use CObjectCOnverter instead of CPluginUtils.  Added code to reposition views
  350.  * on creation to tile nicely on the screen.
  351.  *
  352.  * Revision 1.36  2003/11/04 13:08:53  dicuccio
  353.  * Changed storage of message pool to CRef<> from C++ reference
  354.  *
  355.  * Revision 1.35  2003/11/04 12:45:34  friedman
  356.  * Added all view message pool to be invoked fom UpdateAllViews. Replaces
  357.  * iterating through the all the views and calling Update.
  358.  *
  359.  * Revision 1.34  2003/10/10 17:13:34  dicuccio
  360.  * Implemented DetachView().  Notify doc manager on view creation / view release
  361.  *
  362.  * Revision 1.33  2003/09/04 14:01:51  dicuccio
  363.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  364.  *
  365.  * Revision 1.32  2003/08/05 17:02:08  dicuccio
  366.  * Changed static counter to match coding standard
  367.  *
  368.  * Revision 1.31  2003/07/31 16:53:44  dicuccio
  369.  * Added unique ID for each document
  370.  *
  371.  * Revision 1.30  2003/07/22 15:28:31  dicuccio
  372.  * Adjusted AttachAnnot() to match API changes in CPluginUtils::Convert()
  373.  *
  374.  * Revision 1.29  2003/06/25 17:02:54  dicuccio
  375.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  376.  * implementation file.  Lots of #include file clean-ups.
  377.  *
  378.  * Revision 1.28  2003/06/23 13:23:12  dicuccio
  379.  * Deprecated seq_utils.[h,c]pp - moved functions into gui.utils/utils.hpp
  380.  *
  381.  * Revision 1.27  2003/06/17 19:11:49  dicuccio
  382.  * Added AttachAnnot()
  383.  *
  384.  * Revision 1.26  2003/06/02 16:06:17  dicuccio
  385.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  386.  *     - src/objects/asn2asn --> arc/app/asn2asn
  387.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  388.  *     - src/objects/objmgr --> src/objmgr
  389.  *     - src/objects/util --> src/objmgr/util
  390.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  391.  *     - src/objects/flat --> src/objtools/flat
  392.  *     - src/objects/validator --> src/objtools/validator
  393.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  394.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  395.  * replaces the three libmmdb? libs.
  396.  *
  397.  * Revision 1.25  2003/05/09 14:29:51  dicuccio
  398.  * Cleaned out unnecessary local scope
  399.  *
  400.  * Revision 1.24  2003/05/08 16:18:59  dicuccio
  401.  * Changed CFastMutex --> CMutex - guards against recursive locking
  402.  *
  403.  * Revision 1.23  2003/05/05 12:41:55  dicuccio
  404.  * Added mutex to guard access to CDocument's members
  405.  *
  406.  * Revision 1.22  2003/04/29 14:38:04  dicuccio
  407.  * Removed old typing system
  408.  *
  409.  * Revision 1.21  2003/04/24 16:27:47  dicuccio
  410.  * Large API / internals change.  Made CDocument an abstract base class; removed
  411.  * notion of document == bioseq-handle
  412.  *
  413.  * Revision 1.20  2003/04/16 11:38:32  dicuccio
  414.  * Cleaned up CDocument's destructor
  415.  *
  416.  * Revision 1.19  2003/04/10 19:48:37  dicuccio
  417.  * Made text description a member variable
  418.  *
  419.  * Revision 1.18  2003/03/31 13:42:18  dicuccio
  420.  * Disabled MDI interface (for now).  Changed mechanism of subtype determination
  421.  * to take advantage of more efficient scope resolution
  422.  *
  423.  * Revision 1.17  2003/03/17 14:49:41  dicuccio
  424.  * Added top-level workspace, one per document.  Added Hide()/Show() functions
  425.  * for the workspace.  Removed header-file dependency on view.hpp
  426.  *
  427.  * Revision 1.16  2003/03/10 22:58:51  kuznets
  428.  * iterate -> ITERATE
  429.  *
  430.  * Revision 1.15  2003/03/03 15:18:46  dicuccio
  431.  * Added views slaved indicator (false by default)
  432.  *
  433.  * Revision 1.14  2003/02/26 14:19:36  dicuccio
  434.  * Removed some unecessary _TARCE() statements
  435.  *
  436.  * Revision 1.13  2003/02/20 19:49:55  dicuccio
  437.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  438.  * over to use new plugin architecture.
  439.  *
  440.  * Revision 1.12  2003/02/10 18:52:58  dicuccio
  441.  * Fixed compilation issues relating to CFeat_CI API change
  442.  *
  443.  * Revision 1.11  2003/02/10 18:12:59  dicuccio
  444.  * Changed mechanism for determining types to a document's features (more
  445.  * efficient mechanism is used)
  446.  *
  447.  * Revision 1.10  2003/02/05 19:52:57  dicuccio
  448.  * Cleaned up data management - save the scope for the bioseq separate from the
  449.  * bioseq; assure that shut-down happens carefully; limit the calls to
  450.  * x_SetTypes()
  451.  *
  452.  * Revision 1.9  2003/01/13 13:10:06  dicuccio
  453.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  454.  * Moved all FLUID-generated code into namespace ncbi.
  455.  *
  456.  * Revision 1.8  2003/01/08 15:33:09  dicuccio
  457.  * Make sure that all Bioseq-set types are parsed.
  458.  *
  459.  * Revision 1.7  2003/01/08 14:49:52  dicuccio
  460.  * Revamped type resolution system - now, each record stores a list of the
  461.  * available types relevant for that record.  This permits record typing based on
  462.  * sub-component presence.
  463.  *
  464.  * Revision 1.6  2002/12/09 20:33:52  dicuccio
  465.  * Use seqience::GetTitle instead of home-grown approach
  466.  *
  467.  * Revision 1.5  2002/11/25 20:53:51  dicuccio
  468.  * Added Set() function for bioseq-handle - used by data loader plugins.  Added
  469.  * default ctor.
  470.  *
  471.  * Revision 1.4  2002/11/14 16:16:48  dicuccio
  472.  * Added 'pop-set' ast document type.  Sorted document types in GetType().
  473.  *
  474.  * Revision 1.3  2002/11/09 20:50:09  dicuccio
  475.  * Changed CDocument::x_GetViews() (non-const) and x_AttachView() from private to
  476.  * public.
  477.  *
  478.  * Revision 1.2  2002/11/07 18:40:05  dicuccio
  479.  * Various std::string fixes (use string::empty(); use implicit creation for
  480.  * return from const char* <-> string).
  481.  * Chanegd code to use ERR_POST() and _TRACE().
  482.  *
  483.  * Revision 1.1  2002/11/06 15:49:48  dicuccio
  484.  * Initial revision
  485.  *
  486.  * ===========================================================================
  487.  */