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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: selection_buffer.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:44:38  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: selection_buffer.cpp,v 1000.3 2004/06/01 20:44:38 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.  *    Container classes for GBENCH selection information
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/core/idocument.hpp>
  41. #include <gui/core/selection_buffer.hpp>
  42. #include <gui/core/doc_manager.hpp>
  43. #include <serial/serialbase.hpp>
  44. #include <algorithm>
  45. BEGIN_NCBI_SCOPE
  46. USING_SCOPE(objects);
  47. //
  48. //
  49. // class CSelectionBuffer
  50. //
  51. //
  52. void CSelectionBuffer::Clear()
  53. {
  54.     m_SelMap.clear();
  55. }
  56. void CSelectionBuffer::Copy(const CSelectionBuffer& other)
  57. {
  58.     m_SelMap = other.m_SelMap;
  59. }
  60. void CSelectionBuffer::Clear(const IDocument* doc)
  61. {
  62.     CConstRef<IDocument> doc_ref(doc);
  63.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  64.     if (iter != m_SelMap.end()) {
  65.         m_SelMap.erase(iter);
  66.     }
  67. }
  68. void CSelectionBuffer::AddSelection(const IDocument* doc)
  69. {
  70.     CConstRef<IDocument> doc_ref(doc);
  71.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  72.     if (iter != m_SelMap.end()) {
  73.         iter->second.push_back(CConstRef<CObject>(doc));
  74.         return;
  75.     }
  76.     m_SelMap[doc_ref].push_back(CConstRef<CObject>(doc));
  77. }
  78. void CSelectionBuffer::AddSelection(const IDocument* doc,
  79.                                     const CObject& obj)
  80. {
  81.     CConstRef<IDocument> doc_ref(doc);
  82.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  83.     if (iter == m_SelMap.end()) {
  84.         m_SelMap[doc_ref] = TConstObjects();
  85.         iter = m_SelMap.find(doc_ref);
  86.     }
  87.     CConstRef<CObject> ref(&obj);
  88.     TConstObjects::const_iterator obj_iter =
  89.         std::find(iter->second.begin(), iter->second.end(),
  90.                   ref);
  91.     if (obj_iter == iter->second.end()) {
  92.         iter->second.push_back(ref);
  93.     }
  94. }
  95. void CSelectionBuffer::RemoveSelection(const IDocument* doc)
  96. {
  97.     CConstRef<IDocument> doc_ref(doc);
  98.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  99.     if (iter == m_SelMap.end()) {
  100.         return;
  101.     }
  102.     CConstRef<CObject> obj_ref(doc);
  103.     TConstObjects::iterator obj_iter =
  104.         std::find(iter->second.begin(), iter->second.end(),
  105.                   obj_ref);
  106.     if (obj_iter != iter->second.end()) {
  107.         iter->second.erase(obj_iter);
  108.     }
  109.     if (iter->second.size() == 0) {
  110.         m_SelMap.erase(iter);
  111.     }
  112. }
  113. void CSelectionBuffer::RemoveSelection(const IDocument* doc,
  114.                                        const CObject& obj)
  115. {
  116.     CConstRef<IDocument> doc_ref(doc);
  117.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  118.     if (iter == m_SelMap.end()) {
  119.         return;
  120.     }
  121.     CConstRef<CObject> ref(&obj);
  122.     TConstObjects::iterator obj_iter =
  123.         std::find(iter->second.begin(), iter->second.end(),
  124.                   ref);
  125.     if (obj_iter != iter->second.end()) {
  126.         iter->second.erase(obj_iter);
  127.     }
  128.     if (iter->second.size() == 0) {
  129.         m_SelMap.erase(iter);
  130.     }
  131. }
  132. // ISelection interface requirements
  133. void CSelectionBuffer::GetSelections(TConstScopedObjects& objs) const
  134. {
  135.     ITERATE (TSelMap, iter, m_SelMap) {
  136.         CScope& scope = iter->first->GetScope();
  137.         ITERATE (TConstObjects, obj_iter, iter->second) {
  138.             SConstScopedObject sco(**obj_iter, scope);
  139.             objs.push_back(sco);
  140.         }
  141.     }
  142. }
  143. void CSelectionBuffer::SetSelections(const TConstScopedObjects& objs)
  144. {
  145.     ITERATE (TConstScopedObjects, iter, objs) {
  146.         const IDocument* doc = CDocManager::GetDocumentFromScope(*iter->scope);
  147.         if ( !doc ) {
  148.             continue;
  149.         }
  150.         AddSelection(doc, *iter->object);
  151.     }
  152. }
  153. const TConstObjects&
  154. CSelectionBuffer::GetSelections(const IDocument* doc) const
  155. {
  156.     CConstRef<IDocument> doc_ref(doc);
  157.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  158.     if (iter == m_SelMap.end()) {
  159.         m_SelMap[doc_ref] = TConstObjects();
  160.         iter = m_SelMap.find(doc_ref);
  161.     }
  162.     return iter->second;
  163. }
  164. TConstObjects& CSelectionBuffer::SetSelections(const IDocument* doc)
  165. {
  166.     CConstRef<IDocument> doc_ref(doc);
  167.     TSelMap::iterator iter = m_SelMap.find(doc_ref);
  168.     if (iter == m_SelMap.end()) {
  169.         m_SelMap[doc_ref] = TConstObjects();
  170.         iter = m_SelMap.find(doc_ref);
  171.     }
  172.     return iter->second;
  173. }
  174. //
  175. // decompose the current selections into a series of pairs
  176. // of CObject and IDocument
  177. //
  178. TConstScopedObjects CSelectionBuffer::DecomposeToPairs(void) const
  179. {
  180.     TConstScopedObjects sels;
  181.     
  182.     ITERATE(TSelMap, iter, m_SelMap) {
  183.         if ( !iter->first ) {
  184.             continue;
  185.         }
  186.         CScope& scope = iter->first->GetScope();
  187.         ITERATE (TConstObjects, obj_iter, iter->second) {
  188.             if ( !*obj_iter ) {
  189.                 continue;
  190.             }
  191.             sels.push_back(SConstScopedObject(**obj_iter, scope));
  192.         }
  193.     }
  194.     return sels;
  195. }
  196. END_NCBI_SCOPE
  197. /*
  198.  * ===========================================================================
  199.  * $Log: selection_buffer.cpp,v $
  200.  * Revision 1000.3  2004/06/01 20:44:38  gouriano
  201.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.18
  202.  *
  203.  * Revision 1.18  2004/05/21 22:27:40  gorelenk
  204.  * Added PCH ncbi_pch.hpp
  205.  *
  206.  * Revision 1.17  2004/05/03 12:49:28  dicuccio
  207.  * gui/utils --> gui/objutils where needed
  208.  *
  209.  * Revision 1.16  2004/04/21 12:40:33  dicuccio
  210.  * Added ISelection interface.  Added checks in DecomposeToPairs() to guard
  211.  * against null ptr dereference.
  212.  *
  213.  * Revision 1.15  2004/04/16 14:29:18  dicuccio
  214.  * Simplified interface - set all selections as CObject
  215.  *
  216.  * Revision 1.14  2004/04/07 12:48:21  dicuccio
  217.  * Reworked to use structs / typedefs in objects.hpp
  218.  *
  219.  * Revision 1.13  2003/12/30 15:02:23  dicuccio
  220.  * Use const IDocument* instead of IDocument* everywhere
  221.  *
  222.  * Revision 1.12  2003/12/22 19:21:36  dicuccio
  223.  * Added Copy().  Removed GetSelections().
  224.  *
  225.  * Revision 1.11  2003/09/04 14:01:51  dicuccio
  226.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  227.  *
  228.  * Revision 1.10  2003/08/18 14:43:27  dicuccio
  229.  * Changed nales: CFeature -> CLayoutFeat; CAlignment -> CLayoutAlign; CGraph ->
  230.  * CLayoutGraph; CProtProduct -> CLayoutProtProd.
  231.  * Changed handling of CSeq_feat - return original feature always.
  232.  *
  233.  * Revision 1.9  2003/07/24 13:12:44  dicuccio
  234.  * Handle protein product layout objects correctly
  235.  *
  236.  * Revision 1.8  2003/07/21 19:29:57  dicuccio
  237.  * Removed all type-specific accessors - CSelectionBuffer is now generic.  Added
  238.  * new internal class for TSelections instead of pair<>.
  239.  *
  240.  * Revision 1.7  2003/06/25 17:02:54  dicuccio
  241.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  242.  * implementation file.  Lots of #include file clean-ups.
  243.  *
  244.  * Revision 1.6  2003/04/16 18:23:17  dicuccio
  245.  * Added retrieval of arguments as generic CObjects, and as a set of pairwise
  246.  * documents-and-objects
  247.  *
  248.  * Revision 1.5  2003/01/13 13:48:10  dicuccio
  249.  * Minor compilation fixes.  Corrected namespaces for MSVC
  250.  *
  251.  * Revision 1.4  2003/01/13 13:10:07  dicuccio
  252.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  253.  * Moved all FLUID-generated code into namespace ncbi.
  254.  *
  255.  * Revision 1.3  2002/11/29 16:17:49  dicuccio
  256.  * Added obtuse work-around for MSVC's brken handling of nested namespaces.
  257.  *
  258.  * Revision 1.2  2002/11/09 20:58:15  dicuccio
  259.  * CConstRef<> ctor is now explicit.  Also, minor formatting changes.
  260.  *
  261.  * Revision 1.1  2002/11/06 17:46:19  dicuccio
  262.  * Initial revision
  263.  *
  264.  * ===========================================================================
  265.  */