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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: seqgraphic_pane.hpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/04/16 17:51:18  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_SEQ_GRAPHIC___SEQGRAPHIC_PANE__HPP
  10. #define GUI_WIDGETS_SEQ_GRAPHIC___SEQGRAPHIC_PANE__HPP
  11. /*  $Id: seqgraphic_pane.hpp,v 1000.1 2004/04/16 17:51:18 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:  Vlad Lebedev
  37.  *
  38.  * File Description:
  39.  *   Pane for the Graphic Sequence Widget 
  40.  *   (see <gui/widgets/seq_graphic/seqgraphic_widget.hpp>)
  41.  *
  42.  */
  43. #include <gui/widgets/seq_graphic/seqgraphic_render.hpp>
  44. #include <gui/gui.hpp>
  45. #include <gui/opengl.h>
  46. #include <gui/opengl/glcanvas2d.hpp>
  47. #include <gui/widgets/seq_graphic/seqgraphic_ds.hpp>
  48. #include <gui/widgets/seq_graphic/seqgraphic_widget.hpp>
  49. #include <gui/widgets/seq_graphic/seqgraphic_conf.hpp>
  50. //#include <gui/widgets/seq_graphic/mouse_scroll_handler.hpp>
  51. #include <gui/widgets/gl/linear_sel_handler.hpp>
  52. #include <gui/widgets/gl/mouse_zoom_handler.hpp>
  53. #include <gui/widgets/gl/glpane_widget.hpp>
  54. #include <gui/widgets/fl/tooltip.hpp>
  55. #include <FL/Fl.H>
  56. #include <FL/Fl_Slider.H>
  57. BEGIN_NCBI_SCOPE
  58. class CSeqGraphicPane : public CGlPaneWidgetChild,
  59.                         public IMouseZoomHandlerHost, // for zooming with mouse
  60.                         //public IMouseScrollHandlerHost, // for scrolling with mouse
  61.                                                         // in the sequence overview panel
  62.                         public ISelHandlerHost, // for linear selection
  63.                         public ITooltipClient // for using with "active" CTooltip
  64. {
  65. public:
  66.     typedef CLinearSelHandler::TRangeColl TRangeColl;
  67.     
  68.     // special GUI states
  69.     enum {
  70.         eLensZoomState = (1<<8),
  71.         eZoomInState,
  72.         eZoomOutState,
  73.         eZoomInFullState,
  74.         eZoomOutFullState
  75.     };
  76.     
  77.     // Feature navigation
  78.     enum EDirection {
  79.         eNext,
  80.         ePrev
  81.     };
  82.     CSeqGraphicPane(int x, int y, int w, int h);
  83.     virtual ~CSeqGraphicPane();
  84.     void SetWidget(CSeqGraphicWidget* widget);
  85.     void SetDataSource(CSeqGraphicDataSource* ds);
  86.     const CSeqGraphicDataSource* GetDataSource(void) const;
  87.     void GetFeatureNames(vector<string>& names);
  88.     
  89.     void ShowFeature(CSeqFeatData::E_Choice t,
  90.                      CSeqFeatData::ESubtype s, bool flag);
  91.     bool IsFeatureShown(CSeqFeatData::E_Choice t, 
  92.                         CSeqFeatData::ESubtype s);
  93.     int SearchFeature(string pattern, string feature, bool is_local);
  94.     int SearchFeatureNext();
  95.     int SearchFeaturePrev();
  96.     
  97.     float GetZoomX(void) const;
  98.     void SetZoomX (float value);
  99.     void ZoomOnRange(const TSeqRange& range);
  100.     
  101.     // returns the visible sequence range
  102.     TSeqRange GetVisibleRange(void) const;
  103.     
  104.     // indicates visible sequence range has changes
  105.     bool VisibleRangeChanged() const;
  106.     void ResetVisibleRangeChanged();
  107.     void Scroll(TModelUnit x, TModelUnit y);
  108.     
  109.     void SetConfig(CRef<CSeqGraphicConfig> config);
  110.     
  111.     /// the config object just changed. Do what is necessary.
  112.     void UpdateConfig();
  113.     // set/clear selections
  114.     //void SelectObject(const CLayoutObject* obj);
  115.     void SelectObject(const CObject* obj);
  116.     void SelectSeqLoc(const CSeq_loc* loc);
  117.     void ClearSelection();
  118.     // retrieve the selections from our renderer
  119.     const TConstObjects& GetSelectedObjects(void) const;
  120.     const TRangeColl&    GetSelectedSeqRanges(void) const;
  121.     // IMouseZoomHandlerHost implementation
  122.     virtual TModelUnit MZHH_GetScale(EScaleType type);
  123.     virtual void       MZHH_SetScale(TModelUnit scale, const TModelPoint& point);
  124.     virtual void       MZHH_ZoomRect(const TModelRect& rc);
  125.     virtual void       MZHH_Scroll(TModelUnit d_x, TModelUnit d_y);
  126.     virtual TVPUnit    MZHH_GetVPPosByY(int y) const;
  127.     virtual void       MZHH_Redraw(void);
  128.     // IMouseZoomHandlerHost end
  129.     // IMouseScrollHandlerHost implementation
  130.     //virtual void       MSHH_Scroll(TVPUnit v_x);
  131.     //virtual TVPUnit    MSHH_GetVPPosByX(int y) const;
  132.     //virtual void       MSHH_Redraw(void);
  133.     // IMouseScrollHandlerHost end
  134.     
  135.     // ISelHandlerHost implementation
  136.     virtual void        SHH_Redraw();
  137.     virtual TModelUnit  SHH_GetModelByWindow(int z, EOrientation orient);
  138.     virtual TVPUnit     SHH_GetWindowByModel(TModelUnit z, EOrientation orient);
  139.     // ISelHandlerHost end
  140.     // ITooltipClient implementation
  141.     virtual bool    TC_NeedTooltip(int x, int y);    
  142.     virtual string  TC_GetTooltip(int& x, int& y, int& w, int& h);
  143.     // ITooltipClient end
  144. public:
  145.     // command handlers
  146.     void ZoomIn(void);
  147.     void ZoomOut(void);
  148.     void ZoomAll(void);
  149.     void ZoomObject(void);
  150.     void NextPrevExon(EDirection dir);
  151.     
  152. protected:
  153.     enum EHandlerArea   {
  154.         fFeaturesArea = 0x1,
  155.         fSeqRulerArea =  0x2,
  156.         fScrollArea =    0x4,
  157.         fOther = 0x80000000,
  158.         fAllAreas = fFeaturesArea | fSeqRulerArea | fScrollArea | fOther
  159.     }; 
  160.     int x_GetAreaByMousePos();
  161.     void x_OnShowPopup();
  162.     friend void s_CSeqGraphicPane_ZoomTimer(void*);
  163.     
  164. private:
  165.     CRef<CSeqGraphicDataSource> m_DS;    
  166.     CRef<CSeqGraphicRenderer>   m_Renderer;
  167.     CRef<CSeqGraphicConfig>     m_ConfigSettings;
  168.     
  169.     // always store the last selected object
  170.     CConstRef<CObject>          m_LastSelObj;
  171.     CConstRef<CLayoutObject>    m_LastSelLayoutObj;
  172.     
  173.     CSeqGraphicWidget* m_ParentWidget;
  174.     
  175.     CLinearSelHandler   m_SelHandler;
  176.     CMouseZoomHandler   m_MouseZoomHandler;
  177.     //CMouseScrollHandler m_MouseScrollHandler;
  178.     // For Tooltips
  179.     CTooltip    m_Tooltip;
  180.     string      m_TooltipText;
  181.     
  182.     // For Searches
  183.     CLayoutFeat::TFeatList  m_SearchResults;
  184.     size_t                  m_SearchIndex;
  185.     // indicate visible sequence range changes
  186.     bool m_VisibleRangeChanged;
  187.     
  188.     // Timer-specific
  189.     bool m_TimerActive;
  190.     bool m_ZoomingIn; // zooming In or Out
  191.     TVPUnit m_TimerX, m_TimerY;
  192.     void x_Render();
  193.     virtual int handle(int event);
  194.     
  195.     TVPPoint GetPortSize(void);
  196.     // --- Methods
  197.     void x_AdjustScrollBars   (void);
  198.     void x_AdjustZoomSlider   (void);
  199.     
  200.     // Event Handlers
  201.     void x_Handle_ClipboardCopy(void);
  202.     void x_Handle_LensZoom     (void);
  203.     void x_Handle_TimerZoom    (void);
  204. };
  205. END_NCBI_SCOPE
  206. /*
  207.  * ===========================================================================
  208.  * $Log: seqgraphic_pane.hpp,v $
  209.  * Revision 1000.1  2004/04/16 17:51:18  gouriano
  210.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.17
  211.  *
  212.  * Revision 1.17  2004/04/16 14:53:04  dicuccio
  213.  * Pass objects using TConstObjects, not TObjSelections.  Added ISelection
  214.  * interfaces.
  215.  *
  216.  * Revision 1.16  2004/04/15 13:02:13  lebedev
  217.  * HitTesting for LayoutObjects changed
  218.  *
  219.  * Revision 1.15  2004/03/24 15:48:55  dicuccio
  220.  * Restored inadvertent delete
  221.  *
  222.  * Revision 1.13  2004/03/24 15:14:32  dicuccio
  223.  * Changed #include for renderer
  224.  *
  225.  * Revision 1.12  2004/03/23 12:33:55  lebedev
  226.  * Made sequence and histograms bars a layout objects in the object panel.
  227.  * Made segment map a number of layout objects. Get rid of fixed size rows in the object panel.
  228.  *
  229.  * Revision 1.11  2004/03/12 15:59:00  lebedev
  230.  * Command handlers for zooming and feature navigation added.
  231.  *
  232.  * Revision 1.10  2004/03/11 17:53:06  dicuccio
  233.  * Deprecated typedefs TPosition, TDimension, TIndex, TColor.  Use TSeqRange instead of TRange
  234.  *
  235.  * Revision 1.9  2004/03/08 17:00:03  lebedev
  236.  * Zooming clicking and holding the mouse button added. 'I' key to zoom in and
  237.  * 'Shift-I' key to zoom out.
  238.  *
  239.  * Revision 1.8  2004/03/04 14:38:56  lebedev
  240.  * Avoid event handlers conflicts by inheriting from CGlPaneWidgetChild.
  241.  * Support for new mouse scroll handler added. Re-enable lens zoom (L key).
  242.  *
  243.  * Revision 1.7  2004/02/13 18:11:32  lebedev
  244.  * Use SeqGraphic config for enabling/disabling viewing options
  245.  *
  246.  * Revision 1.6  2004/02/10 13:15:33  lebedev
  247.  * ISelHandlerHost interface implemented for selections on sequence pane
  248.  *
  249.  * Revision 1.5  2004/01/30 21:10:01  dicuccio
  250.  * Reworked event loop to use CGUIEvent entirely.  Added handling of
  251.  * copy-to-clipboard
  252.  *
  253.  * Revision 1.4  2004/01/27 16:14:19  lebedev
  254.  * Changed stored selection from CLayoutObject to CObject
  255.  *
  256.  * Revision 1.3  2004/01/20 20:35:30  rsmith
  257.  * Add UpdateConfig method to notify classes when the configuration object has changed.
  258.  *
  259.  * Revision 1.2  2004/01/16 13:40:15  lebedev
  260.  * Tooltips added
  261.  *
  262.  * Revision 1.1  2003/12/22 12:59:01  lebedev
  263.  * Files renamed
  264.  *
  265.  * Revision 1.31  2003/12/16 18:55:26  lebedev
  266.  * ScaleRefPoint implementation fixed (do not project reference point into model space)
  267.  *
  268.  * Revision 1.30  2003/12/10 17:00:26  yazhuk
  269.  * Updated implementation of  IMouseZoomHandlerHost interface.
  270.  *
  271.  * Revision 1.29  2003/12/09 12:40:00  lebedev
  272.  * Implemented IMouseZoomHandlerHost interface for zooming and scrolling with mouse
  273.  *
  274.  * Revision 1.28  2003/11/19 20:37:46  friedman
  275.  * API to detect and reset visible range change
  276.  *
  277.  * Revision 1.27  2003/11/13 15:31:52  lebedev
  278.  * Methods to get visible sequence range added
  279.  *
  280.  * Revision 1.26  2003/10/28 19:01:43  dicuccio
  281.  * Fixed compilation errors.  Pass CBioseq_Handle by const-ref and store as value,
  282.  * not as pointer
  283.  *
  284.  * Revision 1.25  2003/10/28 15:29:07  lebedev
  285.  * Use new configuration library
  286.  *
  287.  * Revision 1.24  2003/10/24 13:25:56  lebedev
  288.  * Use logarithmic scale fo zoom.
  289.  * Better scrolling in sequence pane.
  290.  *
  291.  * Revision 1.23  2003/10/22 18:32:56  lebedev
  292.  * Histogram display of features added (and compressed display)
  293.  * Zoom to mouse and scroll with mouse added.
  294.  *
  295.  * Revision 1.22  2003/10/10 15:29:11  lebedev
  296.  * Selection on a sequence and icon view added
  297.  *
  298.  * Revision 1.21  2003/10/09 16:27:09  lebedev
  299.  * Widget redesign: Use independent IRenderable panels for display
  300.  *
  301.  * Revision 1.20  2003/08/18 16:18:33  lebedev
  302.  * New methods to show/hide features added
  303.  *
  304.  * Revision 1.19  2003/08/14 18:39:46  lebedev
  305.  * Search of features in the widget added.
  306.  * Display panels are fully configurable now. Use feature type and subtype
  307.  * combination to identify and configure features in the display. Some code
  308.  * cleanup.
  309.  *
  310.  * Revision 1.18  2003/07/23 19:13:41  dicuccio
  311.  * Added API to retrieve the value of a configured parameter
  312.  *
  313.  * Revision 1.17  2003/07/22 13:40:22  lebedev
  314.  * Highlign master sequence in the alignment display
  315.  * Anchor master sequence. In Lens 10x mode show viewing range on the
  316.  * sequence bar. Improved (faster) drawing of STSs and Repeat regions.
  317.  *
  318.  * Revision 1.16  2003/07/21 19:36:42  dicuccio
  319.  * Externalized selections.  Make sure to call the correct base class when
  320.  * passing to the base class.  Moved some initialization into intializer lists.
  321.  *
  322.  * Revision 1.15  2003/07/18 18:16:14  lebedev
  323.  * Get rid of static variable in handle method
  324.  *
  325.  * Revision 1.14  2003/06/20 14:55:21  dicuccio
  326.  * Minor clean-ups.  Changed derivation of the graphical widget from Fl_Gl_Window
  327.  * to CGlCanvas2d
  328.  *
  329.  * Revision 1.13  2003/06/13 12:40:42  dicuccio
  330.  * Modified handle() to use processed events from CFltkEvent
  331.  *
  332.  * Revision 1.12  2003/06/12 19:49:34  dicuccio
  333.  * Derive CSeqGraphicRenderer from CObject; manage as CRef<> in panel
  334.  *
  335.  * Revision 1.11  2003/06/11 11:10:58  lebedev
  336.  * New method to specify viewing area added
  337.  *
  338.  * Revision 1.10  2003/06/10 12:01:58  lebedev
  339.  * Rendering engine separated from FLTK into it's own class
  340.  *
  341.  * Revision 1.9  2003/06/05 11:22:32  lebedev
  342.  * Prepare to separate display renderer from the widget itself
  343.  *
  344.  * Revision 1.8  2003/06/03 16:20:11  lebedev
  345.  * FLTK calls removed from feature rendering engine. Minor clean-up.
  346.  *
  347.  * Revision 1.7  2003/06/02 16:06:29  dicuccio
  348.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  349.  *     - src/objects/asn2asn --> arc/app/asn2asn
  350.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  351.  *     - src/objects/objmgr --> src/objmgr
  352.  *     - src/objects/util --> src/objmgr/util
  353.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  354.  *     - src/objects/flat --> src/objtools/flat
  355.  *     - src/objects/validator --> src/objtools/validator
  356.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  357.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  358.  * replaces the three libmmdb? libs.
  359.  *
  360.  * Revision 1.6  2003/05/30 11:29:19  lebedev
  361.  * Added: Clickable Feature selection. Drawing of intervals.
  362.  *
  363.  * Revision 1.5  2003/05/23 16:01:51  lebedev
  364.  * Show Labels for visible genes only
  365.  *
  366.  * Revision 1.4  2003/05/23 10:56:21  lebedev
  367.  * New rendering engine, hit test engine, many other changes
  368.  *
  369.  * Revision 1.3  2003/05/19 16:53:55  dicuccio
  370.  * Better memory management.  Minor rearrangement of #includes
  371.  *
  372.  * Revision 1.2  2003/05/16 19:00:08  dicuccio
  373.  * Fixed compilation errors for linux (const functions/variables,
  374.  * #include <math.h>
  375.  *
  376.  * Revision 1.1  2003/05/16 16:46:02  lebedev
  377.  * Initial revision
  378.  *
  379.  * ===========================================================================
  380.  */
  381. #endif  /* GUI_WIDGETS_SEQ_GRAPHIC___SEQGRAPHIC_PANE__HPP */