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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mouse_zoom_handler.hpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/04/12 18:16:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef __GUI_WIDGETS_GL___MOUSE_ZOOM_HANDLER__HPP
  10. #define __GUI_WIDGETS_GL___MOUSE_ZOOM_HANDLER__HPP
  11. /*  $Id: mouse_zoom_handler.hpp,v 1000.2 2004/04/12 18:16:34 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/ievent_handler.hpp>
  43. #include <gui/opengl/glbitmapfont.hpp>
  44. #include <gui/opengl/glpane.hpp>
  45. #include <gui/opengl/glcolor.hpp>
  46. #include <math.h>
  47. BEGIN_NCBI_SCOPE
  48. ////////////////////////////////////////////////////////////////////////////////
  49. /// Interface IMouseZoomHandlerHost represents a context in which CMouseZoomHandler
  50. /// functions. 
  51. class NCBI_GUIWIDGETS_GL_EXPORT IMouseZoomHandlerHost
  52. {
  53. public:
  54.     enum EScaleType {
  55.         eMin, /// minimal scale
  56.         eCurrent, /// current scale
  57.         eMax, /// maximal scale
  58.     };
  59.     virtual ~IMouseZoomHandlerHost()    {}
  60.     virtual TModelUnit  MZHH_GetScale(EScaleType type) = 0;
  61.     virtual void        MZHH_SetScale(TModelUnit scale, const TModelPoint& point) = 0;
  62.     virtual void        MZHH_ZoomRect(const TModelRect& rc) = 0;
  63.     virtual void        MZHH_Scroll(TModelUnit d_x, TModelUnit d_y) = 0;
  64.     /// converts FLTK window coord to Viewport coord
  65.     virtual TVPUnit     MZHH_GetVPPosByY(int y) const = 0;
  66.     
  67.     /// redraws the Host and the handler
  68.     virtual void        MZHH_Redraw(void) = 0;
  69. };
  70. ////////////////////////////////////////////////////////////////////////////////
  71. /// CMouseZoomHandler is an event handler that allows to zoom its Host component
  72. /// using mouse.
  73. class NCBI_GUIWIDGETS_GL_EXPORT CMouseZoomHandler : public IEventHandler
  74. {
  75. public:
  76.     CMouseZoomHandler();
  77.     virtual ~CMouseZoomHandler();
  78.     void    SetHost(IMouseZoomHandlerHost* pHost);    
  79.     void    Render(CGlPane& Pane);
  80.     /// IEventHandler implementation.
  81.     virtual int     handle(CGUIEvent& event, CGlPane& Pane);    
  82. protected:
  83.     /// user event handlers - translate event to signals
  84.     int x_OnMousePush(CGUIEvent& event);
  85.     int x_OnMouseDrag(CGUIEvent& event);
  86.     int x_OnMouseRelease(CGUIEvent& event);
  87.     int x_OnMouseMove(void);
  88.     int x_OnMouseWheel(CGUIEvent& event);
  89.     int x_OnKeyDown(CGUIEvent& event);
  90.     int x_OnKeyUp(CGUIEvent& event);
  91.     enum    EState {
  92.         eIdle,
  93.         eReadyScale,
  94.         eReadyZoomRect,
  95.         eReadyPan,
  96.         eScale,
  97.         eZoomRect,
  98.         ePan   
  99.     };    
  100.     /// signal handlers - functions doing the real job
  101.     void    x_SwitchToReadyState(EState new_state, int pos_x, int pos_y);
  102.     void    x_SwithToActiveState(EState state, int pos_x, int pos_y);
  103.     void    x_OnChangeScale(int d_y);
  104.     void    x_OnEndScale(EState new_state);
  105.     
  106.     void    x_OnChangeZoomRectPan(int x, int y);
  107.     void    x_OnEndZoomRect(EState new_state);
  108.     void    x_OnEndPan(EState new_state);
  109.     void    x_OnChangePan();
  110.     
  111. protected:
  112.     // helper functions
  113.     void    x_OnSelectCursor(void);
  114.     TModelUnit  x_ScaleToNorm(TModelUnit scale) const;
  115.     TModelUnit  x_NormToScale(TModelUnit norm) const;
  116.     int         x_NormToPixels(TModelUnit norm) const;
  117.     void    x_RenderScale(CGlPane& pane);
  118.     void    x_RenderZoomRect(CGlPane& pane);
  119.     void    x_RenderPan(CGlPane& pane);
  120.     void    x_DrawTicks(int center_x, int y, int tick_w);
  121.     void    x_DrawMarker(int x_c, int y_c, int half);
  122.     const IMouseZoomHandlerHost*    x_GetHost(void) const {   return m_pHost; }
  123.     IMouseZoomHandlerHost*    x_GetHost(void) {   return m_pHost; }
  124. protected:    
  125.     IMouseZoomHandlerHost*  m_pHost;
  126.     CGlPane*    m_pPane;
  127.     EState      m_State;
  128.     Fl_Cursor   m_Cursor;
  129.     // Members used in "Scale" mode
  130.     int m_PixPerNorm;
  131.     TModelUnit  m_MaxNorm;
  132.     TModelUnit  m_MinNorm;
  133.     TModelUnit  m_StartNorm; 
  134.     TModelUnit  m_CurrNorm; // current norm value
  135.     int m_MarkerPosX, m_MarkerPosY; // point where marker is drawn
  136.     
  137.     int m_MouseStartX;
  138.     int m_MouseStartY;
  139.     int m_CurrPosX;
  140.     int m_CurrPosY; // mouse position corresponding to m_CurrNurm;
  141.     TModelPoint m_ptStart; // referrence point for Zoom
  142.     int m_WheelTotalShift;
  143.     
  144.     // scale in logarihtnic units 
  145.     CGlColor    m_ScaleColor;
  146.     CGlColor    m_TickColor;
  147.     CGlColor    m_RectColor;
  148. };
  149. END_NCBI_SCOPE
  150. /*
  151.  * ===========================================================================
  152.  * $Log: mouse_zoom_handler.hpp,v $
  153.  * Revision 1000.2  2004/04/12 18:16:34  gouriano
  154.  * PRODUCTION: UPGRADED [CATCHUP_003] Dev-tree R1.4
  155.  *
  156.  * Revision 1.4  2004/03/04 14:36:12  lebedev
  157.  * Enable panning while mouse drag
  158.  *
  159.  * Revision 1.3  2003/12/10 16:54:16  yazhuk
  160.  * Added support for using mouse position to specify reference point for "active zoom".
  161.  *
  162.  * Revision 1.2  2003/12/01 16:41:44  yazhuk
  163.  * Refactored event handling - introduced CGUIEvent; implemented zooming by
  164.  * rectangle and panoraming.
  165.  *
  166.  * Revision 1.1  2003/11/17 20:23:22  yazhuk
  167.  * Moved from widgetsaln_multiple
  168.  *
  169.  * Revision 1.1  2003/10/20 15:44:47  yazhuk
  170.  * Initial revision.
  171.  *
  172.  * ===========================================================================
  173.  */
  174. #endif  // __GUI_WIDGETS_GL___MOUSE_ZOOM_HANDLER__HPP