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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: phylo_tree_render.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:53:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GUI_WIDGETS_PHYLO_TREE___PHYLO_TREE_RENDER__HPP
  10. #define __GUI_WIDGETS_PHYLO_TREE___PHYLO_TREE_RENDER__HPP
  11. /*  $Id: phylo_tree_render.hpp,v 1000.1 2004/06/01 19:53:02 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:  Vladimir Tereshkov
  37.  *
  38.  * File Description:
  39.  *
  40.  */
  41. #include <corelib/ncbistl.hpp>
  42. #include <gui/opengl/glcolor.hpp>
  43. #include <gui/opengl/glpane.hpp>
  44. #include <gui/opengl/glbitmapfont.hpp>
  45. #include <gui/widgets/gl/ievent_handler.hpp>
  46. #include <gui/widgets/hit_matrix/hit_data_adapter.hpp>
  47. #include <gui/widgets/phylo_tree/phylo_tree_ds.hpp>
  48. #include <gui/widgets/phylo_tree/phylo_tree_scheme.hpp>
  49. #include <gui/widgets/phylo_tree/phylo_tree_label.hpp>
  50. #include <gui/widgets/fl/tooltip.hpp>
  51. #include <gui/math/curve_bezier.hpp>
  52. #include <gui/opengl/glcurve.hpp>
  53. #include <gui/opengl/gltube.hpp>
  54. #include <gui/opengl/gldlist.hpp>
  55. BEGIN_NCBI_SCOPE
  56. class IPhyloTreeRendererHost
  57. {
  58. public:
  59.     virtual ~IPhyloTreeRendererHost()  {};
  60.     virtual void     HMGH_Redraw(void) = 0;
  61.     virtual TVPUnit  HMGH_GetVPPosByY(int y) const = 0;
  62.     virtual void     FireCBEvent(void) = 0;
  63. };
  64. // rendering interface
  65. class IPhyloTreeRenderer : public IEventHandler,
  66.                            public CPhyloTreeScheme,
  67.                            public ITooltipClient
  68. {
  69. protected:    
  70.     CPhyloTreeDataSource * m_DS;
  71.     double  m_DimX,  m_DimY;    
  72.     double  m_xStep, m_yStep;
  73.     double  m_NormDistance;
  74.     
  75.     CGlBitmapFont   *m_pLabelFont;
  76.     IPhyloTreeRendererHost *m_pHost;
  77.     // display list for our scene
  78.     CGlDisplayList m_Dlist;
  79.     CGlCurve<CCurveBezier> m_Curve;
  80.     CTooltip            m_Tooltip; 
  81.     CPhyloTreeLabel     m_Label;
  82.     TModelRect          m_RasterRect;
  83.     /// event handling state
  84.     enum    EState {
  85.         eIdle,
  86.         eSelPoint, /// selecting a single glyph by point
  87.         eSelRect   /// selecting multiple glyphs by rectangle
  88.     }; 
  89.     
  90.     /// label alignment
  91.     enum    ELabelAlign {
  92.         eLeft,
  93.         eRight
  94.     };
  95.     /// event handling    
  96.     CGlPane         *m_pPane;
  97.     EState           m_State;
  98.     TVPPoint         m_StartPoint;
  99.     TVPPoint         m_DragPoint;
  100.     Fl_Cursor        m_Cursor;
  101.     vector<int>      m_SelectedIDs; 
  102.     bool             m_bDistMode;
  103.     
  104.     void    x_RenderSelection(CGlPane& pane);
  105.     void    x_RenderLine(double x1, double y1, double x2, double y2, double width, CGlColor color1, CGlColor color2);
  106.     void    x_RenderNode(double x, double y, double size, CGlColor color);    
  107.     void    x_RenderSpline(double x1, double y1, double x2, double y2);
  108.     
  109.     /// user event handlers - translate event to signals
  110.     int x_OnMousePush(CGUIEvent& event);
  111.     int x_OnMouseDrag(CGUIEvent& event);
  112.     int x_OnMouseRelease(CGUIEvent& event);
  113.     int x_OnMouseMove(void);
  114.     int x_OnKeyDown(void);
  115.     int x_OnKeyUp(void);
  116.     void    x_OnSelectCursor(void);
  117.     bool    x_SelectByPoint(CPhyloTreeNode * node);
  118.     bool    x_SelectByRect(CPhyloTreeNode * node);    
  119.     void    x_BuildSelVector(CPhyloTreeNode * node);    
  120.     
  121.     CPhyloTreeNode * x_TestForNode(CPhyloTreeNode * node);
  122.     virtual void x_Layout(CPhyloTreeDataSource& ds) = 0;
  123.     virtual void x_Render(CGlPane& pane, CPhyloTreeDataSource& ds) = 0;
  124.     
  125. public:    
  126.     IPhyloTreeRenderer();
  127.     virtual ~IPhyloTreeRenderer(){}
  128.     // selection set/retrieve
  129.     const vector<int> & GetSelectedIDs(void) { return m_SelectedIDs; };
  130.     void                SetSelectedIDs(const vector<int> & vect);
  131.     bool                IsSelected(CPhyloTreeNode * node);
  132.    
  133.     // ITooltipClient implementation (chain call)
  134.     virtual bool    TC_NeedTooltip(int x, int y);    
  135.     virtual string  TC_GetTooltip(int& x, int& y, int& w, int& h);
  136.     void    SetHost(IPhyloTreeRendererHost* pHost);
  137.     void    SetFont(CGlBitmapFont * font) {m_pLabelFont = font;}
  138.     void    SetDistRendering(bool flag) {m_bDistMode = flag;}
  139.     bool    GetDistRendering(void)      {return m_bDistMode;}
  140.     
  141.     virtual string  GetDescription(void)                            = 0;
  142.     virtual void    Render(CGlPane& pane, CPhyloTreeDataSource& ds);    
  143.     virtual void    Layout(CPhyloTreeDataSource& ds);    
  144.     
  145.     /// IEventHandler implementation
  146.     virtual int handle(CGUIEvent& event, CGlPane& pane);    
  147.     //
  148.     const TModelRect & GetRasterRect(void) { return m_RasterRect; }
  149.     // metrics
  150.     const static double GetDimX(void);
  151.     const static double GetDimY(void);  
  152. };
  153. END_NCBI_SCOPE
  154. /*
  155.  * ===========================================================================
  156.  * $Log: phylo_tree_render.hpp,v $
  157.  * Revision 1000.1  2004/06/01 19:53:02  gouriano
  158.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.11
  159.  *
  160.  * Revision 1.11  2004/05/11 20:53:38  tereshko
  161.  * Work in progress
  162.  *
  163.  * Revision 1.10  2004/05/06 19:41:07  tereshko
  164.  * Added force layout
  165.  *
  166.  * Revision 1.9  2004/04/28 19:27:27  tereshko
  167.  * Added support for distances rendering
  168.  *
  169.  * Revision 1.8  2004/04/20 21:57:37  tereshko
  170.  * Major rendering, labeling and performance improvements
  171.  *
  172.  * Revision 1.7  2004/04/13 20:29:22  tereshko
  173.  * Numerous renderers improvements
  174.  *
  175.  * Revision 1.6  2004/04/01 21:47:13  tereshko
  176.  * Code clean-up
  177.  *
  178.  * Revision 1.5  2004/03/30 17:11:08  tereshko
  179.  * Added support for events broadcasting
  180.  *
  181.  * Revision 1.4  2004/03/03 21:42:31  tereshko
  182.  * Added tooltips support
  183.  *
  184.  * Revision 1.3  2004/03/02 18:29:24  tereshko
  185.  * Added radial tree layout
  186.  *
  187.  * Revision 1.2  2004/02/23 22:52:47  tereshko
  188.  * Rendering Improvements
  189.  *
  190.  * Revision 1.1  2004/02/13 17:00:04  tereshko
  191.  * Phylogenetic Tree Widget initial revision
  192.  *
  193.  * ===========================================================================
  194.  */
  195. #endif  // __GUI_WIDGETS_PHYLO_TREE___PHYLO_TREE_RENDER__HPP