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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_renderer.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:51:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GUI_WIDGETS_ALNMULTI___ALNMULTI_RENDERER__HPP
  10. #define __GUI_WIDGETS_ALNMULTI___ALNMULTI_RENDERER__HPP
  11. /*  $Id: alnmulti_renderer.hpp,v 1000.1 2004/06/01 19:51:39 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:  Andrey Yazhuk
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <gui/widgets/gl/ruler.hpp>
  43. #include <gui/widgets/aln_multiple/alnmulti_ds.hpp>
  44. #include <gui/widgets/aln_multiple/ialign_row.hpp>
  45. BEGIN_NCBI_SCOPE
  46. ////////////////////////////////////////////////////////////////////////////
  47. /// IAlnMultiRendererContext - this interface represents context in which
  48. /// CAlnMultiRenderer lives. It provides callbacks necessary for Renderer's
  49. /// functioning.
  50. class NCBI_GUIWIDGETS_ALNMULTIPLE_EXPORT IAlnMultiRendererContext
  51. {
  52. public:
  53.     typedef IAlnMultiDataSource::TNumrow    TNumrow;
  54.     
  55.     virtual ~IAlnMultiRendererContext()  {};
  56.     virtual const CGlPane& GetAlignPort(void) const = 0;
  57.         
  58.     virtual TNumrow     GetLinesCount() = 0;
  59.     virtual bool    IsRendererFocused() = 0;
  60.     virtual int     GetFocusedItemIndex() const = 0;
  61.     virtual bool    IsItemSelected(int index) const = 0;
  62.     
  63.     virtual IAlignRow*  GetMasterRow()= 0;
  64.     
  65.     /// all Y coordinates are OpenGL Viewport coordinates (not widget coords)
  66.     /// "index" is a line index (not row in alignment)
  67.     
  68.     virtual IAlignRow*  GetRowByLine(int index) = 0;
  69.     virtual int     GetLineByRowNum(TNumrow row) const = 0;
  70.     virtual int     GetLineByModelY(int y) const = 0;
  71.     virtual int     GetLinePosY(int index) const = 0;
  72.     virtual int     GetLineHeight(int index) const = 0;
  73. };
  74. ////////////////////////////////////////////////////////////////////////////////
  75. /// class CAlnMultiRenderer - renders multiple alignment represented by
  76. /// IAlnMultiRendererContext (the Model).
  77. /// 
  78. /// IAlnMultiRenderer renders a grid where row corresponds to IAlignRow object and
  79. /// columns represent different types of information related to rows. Columns are 
  80. /// configurable using "Column management" API.
  81. class NCBI_GUIWIDGETS_ALNMULTIPLE_EXPORT CAlnMultiRenderer
  82. {
  83. public:
  84.     typedef IAlignRow::EColumnType      EColumnType;
  85.     typedef vector<CHTMLActiveArea>     TAreaVector;
  86.     CAlnMultiRenderer(const TVPRect& rc);
  87.     virtual ~CAlnMultiRenderer() {}
  88.     void    SetContext(IAlnMultiRendererContext* pContext);
  89.     
  90.     void    SetBackColor(const CGlColor Color);
  91.     const CGlColor&    GetBackColor() const;
  92.     void    SetFocused(bool b_set)    {   m_bFocused  = b_set;  }
  93.     
  94.     virtual void    Resize(const TVPRect& rc);
  95.     virtual void    Update();
  96.     /// renders OpenGL graphics
  97.     virtual void    Render();
  98.     
  99.     /// renders OpenGL graphics and generate CHTMLActiveArea objects
  100.     virtual void    Render(TAreaVector& areas);     
  101.     CRuler&    GetRuler();
  102.     void       SetRulerHeight(int height);
  103.     
  104.     int     GetRulerAreaHeight()    const   {   return m_RulerAreaHeight;  }    
  105.     int     GetMasterAreaHeight()    const   {   return m_MasterAreaHeight;  }    
  106.     int     GetListAreaHeight() const   {   return m_ListAreaHeight;    }    
  107.     
  108.     int     GetListTop() const;
  109.     int     GetColumnIndexByType(EColumnType Type) const;
  110.     TVPRect         GetColumnRect(int i_col)   const;
  111.     TVPRect         GetColumnRect(EColumnType Type)   const;
  112.     EColumnType     GetColumnTypeByIndex(int i_col)   const;
  113.     EColumnType     GetColumnTypeByX(int X)   const;
  114.     
  115.     /// return OpenGL viewport coordinate of the top pixel in the list area
  116.     int     GetVPListTop() const;    
  117.     
  118.     void    SetupPaneForRow(CGlPane& pane, const IAlignRow* p_row, 
  119.                             int vp_top_y) const;
  120.     void    SetupPaneForColumn(CGlPane& pane, int i_col) const;    
  121.     /// @name Columns management
  122.     /// @{
  123.     /// SColumn describes a single column
  124.     struct SColumn   {   
  125.         int     m_Pos; /// horizontal position in viewport     
  126.         int     m_Width; /// width in pixels
  127.         string  m_Label;        
  128.         int     m_UserData; /// can be used to identify column       
  129.         bool    m_bVisible;
  130.         double  m_Share; /// portion of the resizable space, negative if
  131.         /// this is a fixed size column.
  132.         SColumn();
  133.         inline  bool    FixedSize() const   {   return m_Share < 0.0;   }
  134.         inline  int     VisibleWidth()  const   {   return m_bVisible ? m_Width : 0;    }
  135.     };
  136.     /// Columns can be "fixed size" or "resizable". Fixed size columns are redndered
  137.     /// with specifed width. Remaining screen space is divided between "resizable"
  138.     /// columns proportionally to m_Share.
  139.     int     GetColumnsCount() const;
  140.     const   SColumn&  GetColumn(int index) const;
  141.     int     GetColumnIndexByX(int x) const;
  142.     
  143.     int     AddColumn(void);
  144.     int     AddColumn(int width, const string& label, int data, 
  145.                       double share = -1.0);
  146.     int     InsertColumn(int pos, int width, const string& label, int data,
  147.                          double share = -1.0);
  148.     
  149.     void    SetColumnWidth(int index, int width);
  150.     void    SetColumnUserData(int index, int data);
  151.     void    SetColumnVisible(int index, bool b_visible);
  152.     
  153.     void    UpdateColumns(); // update positions
  154.     /// @}
  155. protected:    
  156.     IAlnMultiRendererContext* x_GetContext()    {   return m_pContext;   }
  157.     const IAlnMultiRendererContext* x_GetContext()  const    {   return m_pContext;   }
  158.     void    x_Layout();
  159.     
  160.     // Rendering functions
  161.     void    x_Render(TAreaVector* p_areas);
  162.     void    x_RenderRuler(TAreaVector* p_areas);
  163.     void    x_RenderItems(TAreaVector* p_areas);
  164.     void    x_RenderItemsRange(int iFisrt, int iLast, TAreaVector* p_areas);    
  165.     void    x_RenderRow(IAlignRow* pRow, CGlPane& pane, int State, int TopY,
  166.                         TAreaVector* p_areas);
  167.     void    x_RenderMasterRow();
  168.     void    x_ResetRowListMap();
  169.     void    x_PurgeRowListMap();
  170.     int     x_GetLineByWindowY(int WinY) const;
  171.     TVPRect x_GetLineRect(int Index);
  172.    
  173.     inline EColumnType     x_GetColumnType(const SColumn& C) 
  174.     {
  175.         return (IAlignRow::EColumnType) C.m_UserData;
  176.     }
  177.     void    x_LayoutColumns();
  178.     
  179. protected:
  180.     IAlnMultiRendererContext* m_pContext;
  181.     TVPRect m_rcBounds; // size of renderer in parents's coordinates
  182.     CGlColor m_BackColor;
  183.     CRuler  m_Ruler;
  184.     CGlPane m_RulerPane;
  185.     
  186.     // Layout
  187.     int m_RulerAreaHeight;
  188.     int m_MasterAreaHeight;    
  189.     int m_ListAreaHeight;
  190.     
  191.     typedef     map<IAlignRow*, bool>     TRowToList;    
  192.     TRowToList      m_RowToList; // value == "true" if key has an OpenGL Display List
  193.     // columns 
  194.     typedef vector<SColumn> TColumnVector;
  195.     TColumnVector m_vColumns;
  196.     bool m_bFocused; /// indicate whether it shoulde be rendered using "focused"
  197.     // color or not
  198. };
  199. END_NCBI_SCOPE
  200. /*
  201.  * ===========================================================================
  202.  * $Log: alnmulti_renderer.hpp,v $
  203.  * Revision 1000.1  2004/06/01 19:51:39  gouriano
  204.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  205.  *
  206.  * Revision 1.11  2004/05/05 14:18:50  dicuccio
  207.  * Added virtual dtor
  208.  *
  209.  * Revision 1.10  2004/04/22 17:11:11  yazhuk
  210.  * Added m_bFocused and SetFocused()
  211.  *
  212.  * Revision 1.9  2004/04/06 19:08:09  yazhuk
  213.  * Added "TAreaVector* p_areas" argument ot x_RenderRuler
  214.  *
  215.  * Revision 1.8  2004/04/06 16:02:02  yazhuk
  216.  * Added cloumns management API to CAlnMultiRenderer, eliminated CColumnWidget
  217.  *
  218.  * Revision 1.7  2004/04/06 13:29:59  dicuccio
  219.  * CHanged TAreaVector to use CHTMLActiveArea directly
  220.  *
  221.  * Revision 1.6  2004/04/05 15:34:39  johnson
  222.  * added a few consts to SetupPane methods
  223.  *
  224.  * Revision 1.5  2004/03/29 19:04:23  yazhuk
  225.  * Support for  CHTMLActiveArea-s generation
  226.  *
  227.  * Revision 1.4  2004/03/17 20:12:03  yazhuk
  228.  * Added GetLineByRowNum()
  229.  *
  230.  * Revision 1.3  2004/03/09 21:03:24  yazhuk
  231.  * Clean-up
  232.  *
  233.  * Revision 1.2  2004/03/08 23:04:41  johnson
  234.  * make CColumnWidget exportable for windows
  235.  *
  236.  * Revision 1.1  2004/03/08 15:37:14  yazhuk
  237.  * Initial revision
  238.  *
  239.  * ===========================================================================
  240.  */
  241. #endif  // __GUI_WIDGETS_ALNMULTI___ALNMULTI_RENDERER__HPP