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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: layout.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:20:51  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: layout.cpp,v 1000.0 2004/06/01 21:20:51 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.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/objutils/layout.hpp>
  41. BEGIN_NCBI_SCOPE
  42. //
  43. //
  44. // CLayoutObject
  45. //
  46. //
  47. // virtual dtor for our layout objects
  48. CLayoutObject::~CLayoutObject()
  49. {
  50. }
  51. //
  52. //
  53. //
  54. // CLayout
  55. //
  56. //
  57. //
  58. // clear opur internal list of objects
  59. void CLayout::Clear(void)
  60. {
  61.     m_Layout.clear();
  62. }
  63. // access the entire layout
  64. const CLayout::TLayout& CLayout::GetLayout(void) const
  65. {
  66.     return m_Layout;
  67. }
  68. CLayout::TLayout& CLayout::SetLayout(void)
  69. {
  70.     return m_Layout;
  71. }
  72. // access a row of the layout
  73. const CLayout::TLayoutRow& CLayout::GetRow(size_t row) const
  74. {
  75.     _ASSERT(row < m_Layout.size());
  76.     return m_Layout[row];
  77. }
  78. CLayout::TLayoutRow& CLayout::SetRow(size_t row)
  79. {
  80.     _ASSERT(row < m_Layout.size());
  81.     return m_Layout[row];
  82. }
  83. // add a new row to the layout
  84. CLayout::TLayoutRow& CLayout::AddRow(void)
  85. {
  86.     return AddRow(TLayoutRow());
  87. }
  88. // add a new row to the layout
  89. CLayout::TLayoutRow& CLayout::AddRow(const TLayoutRow& row)
  90. {
  91.     m_Layout.push_back(row);
  92.     return m_Layout.back();
  93. }
  94. void CLayout::Append(const CLayout& layout)
  95. {
  96.     ITERATE (TLayout, row_iter, layout.GetLayout()) {
  97.         m_Layout.push_back(*row_iter);
  98.     }
  99. }
  100. //
  101. //
  102. //
  103. // C2DLayoutEngine
  104. //
  105. //
  106. //
  107. // perform 2D layout
  108. // this arranges a set of layout objects into a non-overlapping series of rows
  109. void C2DLayoutEngine::Layout(const TObjects& objects, CLayout& layout)
  110. {
  111.     // clear our layout to start
  112.     layout.Clear();
  113.     // for each member in the incoming list...
  114.     ITERATE (TObjects, iter, objects) {
  115.         const TSeqRange& new_range = (*iter)->GetLocation().GetTotalRange();
  116.         TSignedSeqPos start = 0;
  117.         TSignedSeqPos end   = 0;
  118.         if (new_range.GetFrom() < new_range.GetTo()) {
  119.             start = new_range.GetFrom() - m_MinDist;
  120.             end   = new_range.GetTo()   + m_MinDist;
  121.         } else {
  122.             start = new_range.GetTo()   - m_MinDist;
  123.             end   = new_range.GetFrom() + m_MinDist;
  124.         }
  125.         // scan the current layout
  126.         bool inserted = false;
  127.         NON_CONST_ITERATE (CLayout::TLayout, row_iter, layout.SetLayout()) {
  128.             // ... and try to insert at the end
  129.             // since we're sorted by position, we only need to check the end
  130.             const CLayoutObject& last_obj = *row_iter->back();
  131.             const TSeqRange& last_range = last_obj.GetLocation().GetTotalRange();
  132.             if (last_range.GetFrom() < last_range.GetTo()) {
  133.                 if (TSignedSeqPos(last_range.GetTo()) <= start) {
  134.                     row_iter->push_back(*iter);
  135.                     inserted = true;
  136.                     break;
  137.                 }
  138.             } else {
  139.                 if (TSignedSeqPos(last_range.GetFrom()) <= start) {
  140.                     row_iter->push_back(*iter);
  141.                     inserted = true;
  142.                     break;
  143.                 }
  144.             }
  145.         }
  146.         // insert our interval info as we need
  147.         if ( !inserted ) {
  148.             // begin an entirely new row
  149.             CLayout::TLayoutRow& row = layout.AddRow();
  150.             row.push_back(*iter);
  151.         }
  152.     }
  153. #if 0
  154.     {
  155.         int i;
  156.         int j;
  157.         _TRACE("n" << features.size() << " items, spacing = " << spacing);
  158.         for (i = 0;  i < features.size();  ++i) {
  159.             _TRACE(i + 1 << ": "
  160.                    << features[i]->GetTextId() << ": {"
  161.                    << features[i]->GetExtent().GetFrom() << " - "
  162.                    << features[i]->GetExtent().GetTo() << "}");
  163.         }
  164.         for (i = 0;  i < pack.size();  ++i) {
  165.             _TRACE(i + 1 << ":");
  166.             for (j = 0;  j < pack[i].size();  ++j) {
  167.                 dumpRecursive(*pack[i][j]);
  168.             }
  169.             cerr << endl;
  170.         }
  171.         cerr << endl;
  172.     }
  173. #endif
  174. }
  175. END_NCBI_SCOPE
  176. /*
  177.  * ===========================================================================
  178.  * $Log: layout.cpp,v $
  179.  * Revision 1000.0  2004/06/01 21:20:51  gouriano
  180.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.2
  181.  *
  182.  * Revision 1.2  2004/05/21 22:27:44  gorelenk
  183.  * Added PCH ncbi_pch.hpp
  184.  *
  185.  * Revision 1.1  2004/04/30 11:48:16  dicuccio
  186.  * Initial commit - split out from src/gui/utils
  187.  *
  188.  * Revision 1.3  2004/03/11 17:49:40  dicuccio
  189.  * Use TSeqRange instead of TRange
  190.  *
  191.  * Revision 1.2  2003/07/21 19:35:21  dicuccio
  192.  * Changed storage mechanism - CLayoutObject::GetObject() is now pure virtual.
  193.  * Changed CFeature to wrap a CMappedFeat instead of a CSeq_feat / CSeq_loc pair
  194.  *
  195.  * Revision 1.1  2003/06/09 19:32:24  dicuccio
  196.  * Initial revision
  197.  *
  198.  * ===========================================================================
  199.  */