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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_pane.hpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/04/12 18:15:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GUI_WIDGETS_ALNMULTI___ALNMULTI_PANE__HPP
  10. #define __GUI_WIDGETS_ALNMULTI___ALNMULTI_PANE__HPP
  11. /*  $Id: alnmulti_pane.hpp,v 1000.4 2004/04/12 18:15:55 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/opengl/glcanvas2d.hpp>
  43. #include <gui/widgets/gl/ruler.hpp>
  44. #include <gui/widgets/gl/mouse_zoom_handler.hpp>
  45. #include <gui/widgets/gl/linear_sel_handler.hpp>
  46. #include <gui/widgets/fl/tooltip.hpp>
  47. #include <gui/widgets/aln_multiple/alnmulti_renderer.hpp>
  48. #include <gui/widgets/aln_multiple/alnmulti_base_pane.hpp>
  49. #include <gui/widgets/aln_multiple/list_mvc.hpp>
  50. #include <gui/widgets/aln_multiple/sel_list_controller.hpp>
  51. #include <gui/widgets/aln_multiple/align_mark_handler.hpp>
  52. BEGIN_NCBI_SCOPE
  53. typedef ISelListView<IAlnMultiDataSource::TNumrow>  TNumrowSelListView;
  54. typedef CSelListController<IAlnMultiDataSource::TNumrow>    TNumrowSelListController;
  55. ////////////////////////////////////////////////////////////////////////////////
  56. /// class CAlnMultiPane 
  57. class NCBI_GUIWIDGETS_ALNMULTIPLE_EXPORT CAlnMultiPane
  58.     : public CGlCanvas2d,
  59.       public TNumrowSelListController,
  60.       public TNumrowSelListView,
  61.       public ISelHandlerHost,
  62.       public IAlignMarkHandlerHost,
  63.       public IMouseZoomHandlerHost,
  64.       public IAlignRowHost                    
  65. {
  66. public:
  67.     typedef CLinearSelHandler::TRangeColl TRangeColl;
  68.     typedef IAlignRow::EColumnType      EColumnType;
  69.     typedef map<TNumrow, TRangeColl>    TRowToMarkMap;    
  70.     typedef ISelListModel<TNumrow>      TSelListModel;
  71.     CAlnMultiPane(int PosX, int PosY, int Width, int Height, const char* Label = NULL);
  72.    
  73.     void    SetWidget(IAlnMultiPaneParent* p_arent);
  74.     void    SetContext(IAlnMultiRendererContext* p_context);
  75.     void    SetBackColor(const CGlColor Color);
  76.     
  77.     // FLTK overridables
  78.     virtual void resize(int x, int y, int w, int h);
  79.     virtual int  handle(int event);
  80.     virtual void draw();   
  81.     /// @name Interface for a Widget
  82.     /// @{
  83.     int     GetAlignVPHeight() const;
  84.     int     GetAlignVPWidth() const;
  85.     virtual void    Update();
  86.     virtual void    Render();
  87.     CRuler&    GetRuler();
  88.     void       SetRulerHeight(int height);
  89.     
  90.     CAlnMultiRenderer&  GetRenderer();
  91.     CRange<TSeqPos>     GetSelectionLimits();
  92.     const TRangeColl&   GetSelection() const;
  93.     void    SetSelection(const TRangeColl& C, bool bRedraw);
  94.     void    ResetSelection(bool bRedraw);     
  95.     
  96.     void    MarkSelectedRows(const TRangeColl& C, bool bMark);
  97.     void    UnMarkAll();
  98.     const   TRowToMarkMap&  GetMarks() const;   
  99.     /// @}
  100.     /// @name CSelListController extension 
  101.     /// @{
  102.     virtual TSelListModel* SLC_GetModel();
  103.     virtual int     SLC_GetHeight(); 
  104.     virtual int     SLC_GetLineByWindowY(int WinY, bool b_clip = false);
  105.     virtual void    SLC_VertScrollToMakeVisible(int Index);
  106.     /// @}
  107.     /// @name TNumrowSelListView implementation
  108.     /// @{
  109.     virtual void    SLV_SetModel(TSelListModel* pModel);
  110.     virtual void    SLV_UpdateItems(const TIndexVector& vIndices);
  111.     virtual void    SLV_UpdateRange(int iFirstItem, int iLastItem); 
  112.     /// @}
  113.     /// @name ISelHandlerHost implementation
  114.     /// @{
  115.     virtual void    SHH_Redraw();
  116.     virtual TModelUnit  SHH_GetModelByWindow(int z, EOrientation orient);
  117.     virtual TVPUnit     SHH_GetWindowByModel(TModelUnit z, EOrientation orient);
  118.     /// @}
  119.     /// @name IAlnMarkHandlerHost implementation
  120.     /// @{
  121.     virtual const IAlnMultiDataSource*      MHH_GetAlnDS() const;
  122.     virtual const TSelListModel*    MHH_GetSelListModel() const;
  123.     virtual TNumrow    MHH_GetRowByLine(int Index) const;
  124.     virtual int MHH_GetLineByRowNum(TNumrow Row) const;
  125.     virtual int MHH_GetLineByWindowY(int Y) const;
  126.     virtual int MHH_GetLinePosY(int Index) const;
  127.     virtual int MHH_GetLineHeight(int Index) const;    
  128.     
  129.     virtual TModelUnit  MHH_GetSeqPosByX(int X) const;
  130.     virtual void    MHH_Redraw();
  131.     /// @}
  132.     /// @name IMouseZoomHandlerHost implementation
  133.     /// @{
  134.     virtual TModelUnit  MZHH_GetScale(EScaleType type);
  135.     virtual void        MZHH_SetScale(TModelUnit scale, const TModelPoint& point);
  136.     virtual void        MZHH_ZoomRect(const TModelRect& rc);
  137.     virtual void        MZHH_Scroll(TModelUnit d_x, TModelUnit d_y);
  138.     virtual TVPUnit     MZHH_GetVPPosByY(int y) const;
  139.     virtual void        MZHH_Redraw(void);
  140.     /// @}
  141.     /// @name IAlignRowHost implementation
  142.     /// @{
  143.     virtual void        ARH_OnRowChanged(IAlignRow* p_row);
  144.     virtual TVPPoint    ARH_GetVPMousePos();
  145.     /// @}
  146.     int     GetListAreaHeight() const   {   return m_Renderer.GetListAreaHeight();    }    
  147. protected:    
  148.     // Rendering functions    
  149.     void    x_RenderSelection();
  150.     void    x_RenderMark();
  151.     void    x_RenderZoomHandler();
  152.     void    x_Layout();
  153.     /// @name Event handling
  154.     /// @{
  155.     int     x_HandleKeyEvent();
  156.     int     x_HandleMouseMove();
  157.     int     x_HandleMousePush();
  158.     int     x_HandleMouseDrag();
  159.     int     x_HandleMouseRelease();
  160.     int     x_HandleMouseWheel();
  161.     int     x_Row_handle();
  162.     void    x_UpdateTooltip();
  163.     virtual string  x_GetRowTooltip(IAlignRow* p_row, int i_col, int vp_top_y);
  164.     /// @}
  165.     
  166.     /// @name IEventHandler management function
  167.     /// @{
  168.     void    x_AddHandler(IEventHandler* handler, int area);
  169.     int     x_Handlers_handle(int area, IEventHandler*& handler, bool ignore_curr = true);
  170.     
  171.     int     x_GetLineByWindowY(int WinY) const;
  172.     TVPRect x_GetLineRect(int Index);
  173.     /// @}
  174.     IAlnMultiPaneParent* x_GetParent()    {   return m_pParent;   }
  175.     const IAlnMultiPaneParent* x_GetParent()  const    {   return m_pParent;   }
  176.     void    x_SendCommand(TCmdID cmd);
  177.     IAlnMultiRendererContext* x_GetContext()    {   return m_pContext;   }
  178.     const IAlnMultiRendererContext* x_GetContext()  const    {   return m_pContext;   }
  179.     inline TSelListModel*  x_GetModel()   {   return m_pModel;    }
  180.     inline const TSelListModel*  x_GetModel()   const {   return m_pModel;    }
  181.     inline void x_NotifyParent(IAlnMultiPaneParent::ENotification notification);
  182.     
  183. protected:
  184.     enum EHandlerArea   {
  185.         fDescrArea = 0x1,
  186.         fAlignArea = 0x2,
  187.         fAllAreas
  188.     };
  189.     typedef list<pair<IEventHandler*, int> >    THandlerList;
  190.     
  191.     IAlnMultiPaneParent*         m_pParent;
  192.     IAlnMultiRendererContext*    m_pContext;
  193.     TSelListModel*  m_pModel;
  194.     // event handling
  195.     CGUIEvent   m_Event;
  196.     THandlerList    m_lsHandlers;
  197.     IEventHandler*  m_pCurrHandler;
  198.     
  199.     CLinearSelHandler   m_SelHandler;
  200.     CAlignMarkHandler   m_MarkHandler;
  201.     CMouseZoomHandler   m_MouseZoomHandler;
  202.     CGlPane     m_HandlerPane;
  203.     CTooltip  m_Tooltip;
  204.     CAlnMultiRenderer   m_Renderer;
  205. };
  206. inline void CAlnMultiPane::x_NotifyParent(IAlnMultiPaneParent::ENotification notification)
  207. {
  208.     if(x_GetParent())   {
  209.         x_GetParent()->OnNotify(notification);
  210.     }
  211. }
  212. END_NCBI_SCOPE
  213. /*
  214.  * ===========================================================================
  215.  * $Log: alnmulti_pane.hpp,v $
  216.  * Revision 1000.4  2004/04/12 18:15:55  gouriano
  217.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.30
  218.  *
  219.  * Revision 1.30  2004/04/05 14:50:21  yazhuk
  220.  * Zoom from keyboard
  221.  *
  222.  * Revision 1.29  2004/04/02 16:28:30  yazhuk
  223.  * Implemented support for selection broadcasting
  224.  *
  225.  * Revision 1.28  2004/03/29 19:05:05  yazhuk
  226.  * Added GetRenderer()
  227.  *
  228.  * Revision 1.27  2004/03/17 20:12:37  yazhuk
  229.  * Added SetContext()
  230.  *
  231.  * Revision 1.26  2004/03/09 21:01:39  yazhuk
  232.  * Clean-up; added comments
  233.  *
  234.  * Revision 1.25  2004/03/08 15:41:21  yazhuk
  235.  * Moved rendering to CAlnMultiRenderer class.
  236.  *
  237.  * Revision 1.24  2004/02/17 15:19:37  yazhuk
  238.  * Support for graphics caching
  239.  *
  240.  * Revision 1.23  2004/01/15 20:17:01  yazhuk
  241.  * Added new argument to SLC_GetLineByWindowY()
  242.  *
  243.  * Revision 1.22  2004/01/08 19:42:12  yazhuk
  244.  * Added x_GetColumnTypeByIndex(), modified x_GetRowTooltip()
  245.  *
  246.  * Revision 1.21  2003/12/29 23:20:23  yazhuk
  247.  * Implemented tooltips using CTooltip
  248.  *
  249.  * Revision 1.20  2003/12/29 16:05:48  johnson
  250.  * added msvc export specifier to CAlnMultiPane
  251.  *
  252.  * Revision 1.19  2003/12/22 16:20:59  yazhuk
  253.  * Added access to Ruler
  254.  *
  255.  * Revision 1.18  2003/12/18 21:25:01  yazhuk
  256.  * Updated code to support template ISelListModel
  257.  *
  258.  * Revision 1.17  2003/12/10 17:08:06  yazhuk
  259.  * Updated IMouseZoomHandlerHost implementation. Added x_HandleMouseRelease().
  260.  *
  261.  * Revision 1.16  2003/12/08 15:10:20  yazhuk
  262.  * Killed x_RenderContent() declaration
  263.  *
  264.  * Revision 1.15  2003/12/01 16:54:35  yazhuk
  265.  * Refactored event handling - introduced CGUIEvent; added support for zooming by
  266.  * rectangle and panoraming.
  267.  *
  268.  * Revision 1.14  2003/11/17 21:15:06  yazhuk
  269.  * Update include for mouse_zoom_handler.hpp, fixed speling errors, renamed
  270.  * GetScale() function
  271.  *
  272.  * Revision 1.13  2003/11/07 20:45:21  rsmith
  273.  * Qualifiers like CAlnMultiPane:: are not allowed in the definition of class CAlnMultiPane.
  274.  *
  275.  * Revision 1.12  2003/11/03 16:55:33  yazhuk
  276.  * Implemented IAlignRowHost interface and handling events by IAlignRow
  277.  * objects. Added x_SetupPaneForRow(), x_SetupPaneForColumn() functions.
  278.  *
  279.  * Revision 1.11  2003/10/31 14:05:36  dicuccio
  280.  * Fixed spelling error: CRuler -> CRuler
  281.  *
  282.  * Revision 1.10  2003/10/29 23:36:33  yazhuk
  283.  * Replaced old classes with a new ones
  284.  *
  285.  * Revision 1.9  2003/10/20 15:50:09  yazhuk
  286.  * Implemented generalized event handling using IEventHandler. Added CMouseZoomHandler.
  287.  *
  288.  * Revision 1.8  2003/10/15 21:21:42  yazhuk
  289.  * Migrated from using CAlnVec to accessing data via "generic" interface in CAlignDataSource.
  290.  *
  291.  * Revision 1.7  2003/10/10 19:02:14  yazhuk
  292.  * Changed inheritance from CAlnMultiEditPane to CGlCanvas2d
  293.  *
  294.  * Revision 1.6  2003/09/29 13:42:59  yazhuk
  295.  * Implemented GetMarks()
  296.  *
  297.  * Revision 1.5  2003/09/23 21:04:28  yazhuk
  298.  * Added support for Marks, added mouse event handling functions, added x_RenderRow function
  299.  *
  300.  * Revision 1.4  2003/09/15 13:39:48  yazhuk
  301.  * SColumn::m_UserData compilation fix
  302.  *
  303.  * Revision 1.3  2003/09/10 21:48:19  yazhuk
  304.  * GCC compilation fixes
  305.  *
  306.  * Revision 1.2  2003/09/10 20:42:52  yazhuk
  307.  * Merged 4 Pane classes into CAlnMultiPane class. Introduced notion of Columns.
  308.  *
  309.  * Revision 1.1  2003/08/28 18:22:45  yazhuk
  310.  * Initial revision
  311.  *
  312.  * ===========================================================================
  313.  */
  314. #endif  // __GUI_WIDGETS_ALNMULTI___ALNMULTI_PANE__HPP