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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: layout.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:55:27  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_UTILS___LAYOUT_OBJ__HPP
  10. #define GUI_UTILS___LAYOUT_OBJ__HPP
  11. /*  $Id: layout.hpp,v 1000.0 2004/06/01 19:55:27 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Mike DiCuccio
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbiobj.hpp>
  42. #include <gui/gui.hpp>
  43. #include <objects/seqloc/Seq_loc.hpp>
  44. /** @addtogroup GUI_UTILS
  45.  *
  46.  * @{
  47.  */
  48. BEGIN_NCBI_SCOPE
  49. //
  50. // class CLayoutObject defines an interface that wraps a rectilinear abstract
  51. // object.
  52. // 
  53. // CLayoutObject defines how an axis-aligned rectilinear object appears to a
  54. // layout algorithm.  The basic concepts supported include:
  55. //  -- querying rectilnear position or interval as a total range
  56. //  -- functors for sorting
  57. //  -- Draw() for rendering the object, once it is laid out
  58. //
  59. class NCBI_GUIOBJUTILS_EXPORT CLayoutObject : public CObject
  60. {
  61. public:
  62.     // type of layout objects currently supported
  63.     enum EType {
  64.         eAlign,
  65.         eAlignPairwise,
  66.         eAlignSmear,
  67.         eComment,
  68.         eFeat,
  69.         eFeatLabel,
  70.         eFeatPack,
  71.         eFeatProtProduct,
  72.         eGraph,
  73.         eHistogram,
  74.         eLabel,
  75.         eMatepair,
  76.         eSeqMap,
  77.         eSequence
  78.     };
  79.     virtual ~CLayoutObject();
  80.     // access the position of this object.
  81.     virtual const objects::CSeq_loc& GetLocation(void) const = 0;
  82.     // compare this object to another, based on position
  83.     virtual bool LessByPos (const CLayoutObject& obj) const = 0;
  84.     // compare this object to another, based on size
  85.     virtual bool LessBySize(const CLayoutObject& obj) const = 0;
  86.     // access our core component - we wrap an object(s) of some sort.
  87.     // This returns the object at a given sequence position; this is useful if
  88.     // the layout object wraps more than one object
  89.     virtual const CObject* GetObject(TSeqPos pos) const = 0;
  90.     // check if the wrapped object(s) is the one
  91.     virtual bool HasObject(const CObject* obj) const = 0;
  92.     // retrieve the type of this object
  93.     virtual EType GetType() const = 0;
  94. };
  95. inline
  96. bool operator< (const CLayoutObject& o1, const CLayoutObject& o2)
  97. {
  98.     return o1.LessByPos(o2);
  99. }
  100. //
  101. // basic sort by position function
  102. //
  103. struct SLayoutByPos
  104. {
  105.     bool operator() (const CRef<CLayoutObject>& ref_obj1,
  106.                      const CRef<CLayoutObject>& ref_obj2) const
  107.     {
  108.         return (ref_obj1->LessByPos(*ref_obj2));
  109.     }
  110.     bool operator() (const CLayoutObject& obj1,
  111.                      const CLayoutObject& obj2) const
  112.     {
  113.         return (obj1.LessByPos(obj2));
  114.     }
  115. };
  116. //
  117. // basic sort by size function
  118. //
  119. struct SLayoutBySize
  120. {
  121.     bool operator() (const CRef<CLayoutObject>& ref_obj1,
  122.                      const CRef<CLayoutObject>& ref_obj2) const
  123.     {
  124.         return (ref_obj1->LessBySize(*ref_obj2));
  125.     }
  126.     bool operator() (const CLayoutObject& obj1,
  127.                      const CLayoutObject& obj2) const
  128.     {
  129.         return (obj1.LessBySize(obj2));
  130.     }
  131. };
  132. //
  133. // class CLayout is a container of objects laid out in a series of rows or
  134. // tracks.  The meaning of each row is left to the user; it is possible, for
  135. // example, to create two layout objects and append the layout of one to
  136. // another.
  137. //
  138. class NCBI_GUIOBJUTILS_EXPORT CLayout : public CObject
  139. {
  140. public:
  141.     typedef vector< CRef<CLayoutObject> > TLayoutRow;
  142.     typedef vector<TLayoutRow>            TLayout;
  143.     // clear opur internal list of objects
  144.     void Clear(void);
  145.     // access the entire layout
  146.     const TLayout&  GetLayout(void) const;
  147.     TLayout&        SetLayout(void);
  148.     // access a row of the layout
  149.     const TLayoutRow& GetRow(size_t row) const;
  150.     TLayoutRow&       SetRow(size_t row);
  151.     // add a row to the layout
  152.     TLayoutRow& AddRow(void);
  153.     TLayoutRow& AddRow(const TLayoutRow& row);
  154.     // append an entire layout to this one
  155.     void Append(const CLayout& layout);
  156. private:
  157.     // our layout.  This is a nested container - a set of rows.
  158.     TLayout m_Layout;
  159. };
  160. //
  161. // class CLayoutEngine defines the abstract interface for a given alyout
  162. // algorithm.  This interface imposes little on the actual functioning of the
  163. // layout engine, beyond the fact that it takes a list of layout objects and
  164. // produced a layout.
  165. //
  166. class CLayoutEngine : public CObject
  167. {
  168. public:
  169.     typedef list< CRef<CLayoutObject> > TObjects;
  170.     // perform our layout functions
  171.     virtual void Layout(const TObjects& objects, CLayout& layout) = 0;
  172. };
  173. //
  174. // class C2DLayoutEngine defines the interface for a standard 2D layout engine.
  175. // This class can perform layout of a number of objects into a single panel f
  176. // multiple rows.
  177. //
  178. class NCBI_GUIOBJUTILS_EXPORT C2DLayoutEngine : public CLayoutEngine
  179. {
  180. public:
  181.     // access the minimum distance, in bases, that we permit between objects on
  182.     // a given row
  183.     TSeqPos GetMinDist(void) const;
  184.     void    SetMinDist(TSeqPos dist);
  185.     void Layout(const TObjects& objects, CLayout& layout);
  186. private:
  187.     // the minimum distance we permit two items to be within
  188.     TSeqPos m_MinDist;
  189. };
  190. inline
  191. TSeqPos C2DLayoutEngine::GetMinDist(void) const
  192. {
  193.     return m_MinDist;
  194. }
  195. inline
  196. void C2DLayoutEngine::SetMinDist(TSeqPos dist)
  197. {
  198.     m_MinDist = dist;
  199. }
  200. END_NCBI_SCOPE
  201. /* @} */
  202. /*
  203.  * ===========================================================================
  204.  * $Log: layout.hpp,v $
  205.  * Revision 1000.0  2004/06/01 19:55:27  gouriano
  206.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.3
  207.  *
  208.  * Revision 1.3  2004/05/14 14:24:47  dicuccio
  209.  * Added new pure virtual requirement on CLayoutObject(): GetType(), returns enum
  210.  * defined in CLayoutObject
  211.  *
  212.  * Revision 1.2  2004/05/03 12:41:35  dicuccio
  213.  * Fixed #includes and export specifiers
  214.  *
  215.  * Revision 1.1  2004/04/30 11:52:53  dicuccio
  216.  * Split out from gui/utils
  217.  *
  218.  * Revision 1.10  2004/04/16 14:27:17  dicuccio
  219.  * Added doxygen module tag
  220.  *
  221.  * Revision 1.9  2004/04/15 12:57:43  lebedev
  222.  * Changed GetObject to return NULL or const pointer based on given position
  223.  *
  224.  * Revision 1.8  2004/03/11 17:20:43  dicuccio
  225.  * Use gui/gui instead of gui/types
  226.  *
  227.  * Revision 1.7  2003/09/29 15:20:08  dicuccio
  228.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp
  229.  *
  230.  * Revision 1.6  2003/08/22 15:57:11  dicuccio
  231.  * Removed 'USING_SCOPE(objects)'.  Removed export specifier from inline structs
  232.  *
  233.  * Revision 1.5  2003/07/21 19:24:09  dicuccio
  234.  * Changed storage mechanism: CLayoutObject::GetObject() is pure virtual.  Also,
  235.  * CFeature now stores a CMappedFeat object instead of a CSeq_feat / CSeq_loc pair
  236.  *
  237.  * Revision 1.4  2003/07/11 12:40:01  dicuccio
  238.  * Code clean-ups.  Fixed sorting of features to perform correct feature-order
  239.  * sorting
  240.  *
  241.  * Revision 1.3  2003/07/11 11:47:20  dicuccio
  242.  * Changed member variable binding form private to protected
  243.  *
  244.  * Revision 1.2  2003/06/11 13:49:08  dicuccio
  245.  * Added export specifiers
  246.  *
  247.  * Revision 1.1  2003/06/09 19:31:56  dicuccio
  248.  * Initial revision
  249.  *
  250.  * ===========================================================================
  251.  */
  252. #endif  // GUI_UTILS___LAYOUT_OBJ__HPP