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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: mouse_zoom_handler.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 21:10:40  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: mouse_zoom_handler.cpp,v 1000.3 2004/06/01 21:10:40 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Andrey Yazhuk
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <gui/opengl/glhelpers.hpp>
  42. #include <gui/widgets/gl/mouse_zoom_handler.hpp>
  43. #include <math.h>
  44. #include <FL/Fl.H>
  45. BEGIN_NCBI_SCOPE
  46. ////////////////////////////////////////////////////////////////////////////////
  47. /// class CMouseZoomHandler
  48. CMouseZoomHandler::CMouseZoomHandler()
  49. :   m_pHost(NULL),
  50.     m_State(eIdle),    
  51.     m_PixPerNorm(50),
  52.     m_MouseStartX(0), m_MouseStartY(0),
  53.     m_CurrPosX(0), m_CurrPosY(0),
  54.     m_ScaleColor(0.0f, 0.5f, 0.0f, 0.5f),
  55.     m_TickColor(1.0f, 1.0f, 1.0f),
  56.     m_RectColor(0.0f, 0.5f, 0.0f, 0.25f)
  57. {
  58. }
  59. CMouseZoomHandler::~CMouseZoomHandler()
  60. {
  61. }
  62. void    CMouseZoomHandler::SetHost(IMouseZoomHandlerHost* pHost)
  63. {
  64.     m_pHost = pHost;
  65. }
  66. static int kMarkerSize = 20;
  67. static int kMarkerOffset = 10;
  68. static int kGaugeW = 60;
  69. static int kEndTickW = 20;
  70. static int kMajorTickW = 14;
  71. static int kMinorTickW = 8;
  72. static int kCenterOffset = 4;
  73. void    CMouseZoomHandler::Render(CGlPane& pane)
  74. {
  75.     CGlAttrGuard  AttrGuard(GL_ENABLE_BIT | GL_POLYGON_BIT | GL_HINT_BIT);
  76.     switch(m_State) {
  77.     case eReadyScale:
  78.     case eScale: x_RenderScale(pane); break;
  79.     case eZoomRect: x_RenderZoomRect(pane); break;
  80.     //case ePan: x_RenderPan(pane); break; // temporary disabled
  81.     default: break;
  82.     }
  83. }
  84. void CMouseZoomHandler::x_RenderScale(CGlPane& pane)
  85. {
  86.     pane.OpenPixels();
  87.     int base_x = m_MarkerPosX;
  88.     int down_y = x_NormToPixels(m_CurrNorm);
  89.     int top_y = x_NormToPixels(m_MinNorm);    
  90.     int bottom_y = x_NormToPixels(m_MaxNorm);
  91.     glColorC(m_ScaleColor);
  92.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  93.     
  94.     //drawing "gauge box"
  95.     glRectd(base_x - kGaugeW / 2, bottom_y - kCenterOffset, 
  96.             base_x + kGaugeW / 2, top_y + kCenterOffset);
  97.     
  98.     // drawing Markers
  99.     int half = kMarkerSize / 2;
  100.     x_DrawMarker(base_x - kGaugeW / 2 - kMarkerOffset, down_y, half);
  101.     x_DrawMarker(base_x + kGaugeW / 2 + kMarkerOffset, down_y, -half);
  102.     
  103.     glColorC(m_TickColor);
  104.     glLineWidth(1.0);
  105.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  106.     
  107.     //drawing "gauge box"
  108.     glRectd(base_x - kGaugeW / 2, bottom_y - kCenterOffset, 
  109.             base_x + kGaugeW / 2, top_y + kCenterOffset);
  110.     
  111.     // drawing Markers
  112.     x_DrawMarker(base_x - kGaugeW / 2 - kMarkerOffset, down_y, half);
  113.     x_DrawMarker(base_x + kGaugeW / 2 + kMarkerOffset, down_y, -half);
  114.     // draw Scale - lines and ticks
  115.     glColorC(m_TickColor);
  116.     int x1 = base_x - kCenterOffset;
  117.     int x2 = base_x + kCenterOffset;
  118.     
  119.     glBegin(GL_LINES);
  120.         // draw vertical lines
  121.         glVertex2d(x1, top_y);
  122.         glVertex2d(x1, bottom_y);
  123.         glVertex2d(x2, top_y);
  124.         glVertex2d(x2, bottom_y);
  125.         // draw min-max ticks
  126.         x_DrawTicks(base_x, top_y, kEndTickW);
  127.         x_DrawTicks(base_x, bottom_y, kEndTickW);
  128.     
  129.         // draw minor ticks every 0.2 of norm value
  130.         int start_i = (int) ceil(m_MinNorm * 5);
  131.         int end_i = (int) floor(m_MaxNorm * 5);
  132.         
  133.         // draw regular ticks
  134.         for( int i = start_i; i <= end_i; i++ )   {
  135.             TModelUnit norm = 0.2 * i; 
  136.             int y = x_NormToPixels(norm);
  137.             int width = ((i - start_i) % 5) ? kMinorTickW : kMajorTickW;
  138.             x_DrawTicks(base_x, y, width);                
  139.         }        
  140.     glEnd();
  141.     pane.Close();
  142. }
  143. void CMouseZoomHandler::x_RenderZoomRect(CGlPane& pane)
  144. {
  145.     pane.OpenPixels();
  146.     
  147.     int x1 = m_MouseStartX; 
  148.     int y1 = m_pHost->MZHH_GetVPPosByY(m_MouseStartY);
  149.     int x2 = m_CurrPosX;
  150.     int y2 = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  151.     if(x2 < x1)
  152.         swap(x1, x2);
  153.     if(y2 < y1)
  154.         swap(y1, y2);
  155.     glLineWidth(1.0f);
  156.     glColorC(m_ScaleColor);
  157.     
  158.     glLineStipple(1, 0x0F0F);
  159.     glEnable(GL_LINE_STIPPLE);
  160.     glBegin(GL_LINES);
  161.         glVertex2d(x1, y2);
  162.         glVertex2d(x2, y2);
  163.         glVertex2d(x2, y2);
  164.         glVertex2d(x2, y1);
  165.         glVertex2d(x1, y2);
  166.         glVertex2d(x1, y1);
  167.     
  168.         glVertex2d(x1, y1);
  169.         glVertex2d(x2, y1);
  170.     glEnd();
  171.     glDisable(GL_LINE_STIPPLE);
  172.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  173.     glColorC(m_RectColor);
  174.     glRectd(x1, y1, x2, y2);
  175.     
  176.     pane.Close();
  177. }
  178. static const int kArrowBodyW = 10;
  179. static const int kArrowHeadW = 20;
  180. static const int kArrowHeadL = 20;
  181. void CMouseZoomHandler::x_RenderPan(CGlPane& pane)
  182. {
  183.     pane.OpenPixels();
  184.     glLineWidth(1.0f);
  185.     glColorC(m_ScaleColor);
  186.     
  187.     glEnable(GL_POLYGON_SMOOTH);
  188.     glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
  189.     int x1 = m_MouseStartX; 
  190.     int y1 = m_pHost->MZHH_GetVPPosByY(m_MouseStartY);
  191.     int x2 = m_CurrPosX;
  192.     int y2 = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  193.     
  194.     double d_x = x2 - x1;
  195.     double d_y = y2 - y1;
  196.     double angle = 90.0 * atan2(d_y, d_x) / atan2(1.0, 0.0);
  197.     double hyp = sqrt(d_x * d_x + d_y * d_y);
  198.     // move and rotate origin and then draw arrow horizontally
  199.     glTranslated(x1, y1, 0);
  200.     glRotated(angle, 0.0, 0.0, 1.0);
  201.     
  202.     glBegin(GL_QUADS);
  203.         if(hyp > kArrowHeadL)  { // draw full arrow
  204.             glVertex2d(0, kArrowBodyW);
  205.             glVertex2d(hyp - kArrowHeadL, kArrowBodyW);
  206.             glVertex2d(hyp - kArrowHeadL, -kArrowBodyW);
  207.             glVertex2d(0, -kArrowBodyW);
  208.             glVertex2d(hyp - kArrowHeadL, 0);
  209.             glVertex2d(hyp - kArrowHeadL, kArrowHeadW);
  210.             glVertex2d(hyp, 0);
  211.             glVertex2d(hyp - kArrowHeadL, -kArrowHeadW);            
  212.         } else { // draw simplified arrow
  213.             glVertex2d(0, 0);
  214.             glVertex2d(0, kArrowHeadW);
  215.             glVertex2d(hyp, 0);
  216.             glVertex2d(0, -kArrowHeadW);
  217.         }
  218.     glEnd();
  219.     
  220.     glRotated(-angle, 0.0, 0.0, 1.0);
  221.     glTranslated(-x1, -y1, 0);
  222.     
  223.     //glDisable(GL_POLYGON_SMOOTH);
  224.     
  225.     pane.Close();
  226. }
  227. void CMouseZoomHandler::x_DrawMarker(int x_c, int y_c, int half)
  228. {
  229.     glBegin(GL_POLYGON);
  230.         glVertex2d(x_c + half, y_c);
  231.         glVertex2d(x_c, y_c - half);
  232.         glVertex2d(x_c - half, y_c - half);
  233.         glVertex2d(x_c - half, y_c + half);
  234.         glVertex2d(x_c, y_c + half);
  235.     glEnd();
  236. }
  237. void CMouseZoomHandler::x_DrawTicks(int center_x, int y, int tick_w)
  238. {
  239.     int x1 = center_x - kCenterOffset;
  240.     int x2 = center_x + kCenterOffset;
  241.         
  242.     glVertex2d(x1 - tick_w, y);
  243.     glVertex2d(x1, y);
  244.     glVertex2d(x2, y);
  245.     glVertex2d(x2 + tick_w, y);
  246. }
  247. int  CMouseZoomHandler::x_NormToPixels(TModelUnit norm) const
  248. {
  249.     int y = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  250.     return y - (int) ((norm - m_CurrNorm) * m_PixPerNorm);
  251. }
  252. int CMouseZoomHandler::handle(CGUIEvent& event, CGlPane& Pane)
  253. {
  254.     m_pPane = &Pane;
  255.     int res = 0;
  256.     switch(event.GetFLTKEvent())   {
  257.     case FL_PUSH: res =  x_OnMousePush(event); break;
  258.     case FL_DRAG: res =  x_OnMouseDrag(event); break;
  259.     case FL_RELEASE: res =  x_OnMouseRelease(event); break;
  260.     case FL_MOVE: res =  x_OnMouseMove(); break;
  261.     case FL_MOUSEWHEEL: res = x_OnMouseWheel(event); break;
  262.     case FL_KEYDOWN: res =  x_OnKeyDown(event); break;
  263.     case FL_UNFOCUS:
  264.     case FL_KEYUP: res =  x_OnKeyUp(event); break;
  265.     }
  266.     m_pPane = 0;
  267.     return res;
  268. }
  269. ////////////////////////////////////////////////////////////////////////////////
  270. /// event handlers
  271. int CMouseZoomHandler::x_OnMousePush(CGUIEvent& event)
  272. {    
  273.    if(event.GetGUISignal() == CGUIEvent::ePush  &&  Fl::event_clicks() == 0) {
  274.         CGUIEvent::EGUIState state = event.GetGUIState();
  275.         
  276.         EState ready_st = eIdle, active_st = eIdle;
  277.         switch(state)   {
  278.         case CGUIEvent::eZoomState: {
  279.             ready_st = eReadyScale;
  280.             active_st = eScale;
  281.         }; break;
  282.         case CGUIEvent::eZoomRectState: {        
  283.             ready_st = eReadyZoomRect;
  284.             active_st = eZoomRect;
  285.             x_OnSelectCursor();
  286.         }; break;
  287.         case CGUIEvent::ePanState: {        
  288.             ready_st = eReadyPan;
  289.             active_st = ePan;            
  290.         }; break;
  291.         default: break;
  292.         }
  293.         
  294.         if(ready_st != eIdle)    {
  295.             x_SwitchToReadyState(ready_st, Fl::event_x(), Fl::event_y());
  296.             x_SwithToActiveState(active_st, Fl::event_x(), Fl::event_y());
  297.             x_OnSelectCursor();
  298.         }
  299.         return 1;
  300.     }
  301.     return 0;
  302. }
  303. int CMouseZoomHandler::x_OnMouseDrag(CGUIEvent& event)
  304. {
  305.     switch(m_State) {
  306.     case eScale: {
  307.         int d_y = Fl::event_y() - m_MouseStartY;
  308.         x_OnChangeScale(d_y);
  309.     }; break;
  310.     case eZoomRect: {
  311.         x_OnChangeZoomRectPan(Fl::event_x(), Fl::event_y());
  312.     }; break;
  313.     case ePan:  {
  314.         
  315.         x_OnChangePan();
  316.         x_OnSelectCursor();
  317.     }; break;
  318.     default: break;
  319.     }
  320.     return 1; // always handle drags
  321. }
  322. void CMouseZoomHandler::x_OnChangePan()
  323. {
  324.     m_CurrPosX = Fl::event_x();
  325.     m_CurrPosY = Fl::event_y();
  326.     
  327.     int y1 = m_pHost->MZHH_GetVPPosByY(m_MouseStartY);
  328.     int y2 = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  329.     
  330.     TModelUnit m_x1 = m_pPane->UnProjectX(m_MouseStartX);
  331.     TModelUnit m_y1 = m_pPane->UnProjectY(y1);
  332.     TModelUnit m_x2 = m_pPane->UnProjectX(m_CurrPosX);
  333.     TModelUnit m_y2 = m_pPane->UnProjectY(y2);    
  334.     
  335.     m_pHost->MZHH_Scroll(m_x1 - m_x2, m_y1 - m_y2);
  336.     m_pHost->MZHH_Redraw();
  337.     m_MouseStartX = m_CurrPosX;
  338.     m_MouseStartY = m_CurrPosY;
  339. }
  340. int CMouseZoomHandler::x_OnMouseRelease(CGUIEvent& event)
  341. {
  342.     switch(m_State) {
  343.     case eScale: {
  344.         int d_y = Fl::event_y() - m_MouseStartY;
  345.         x_OnChangeScale(d_y);
  346.         x_OnEndScale(eReadyScale);
  347.         x_OnSelectCursor();
  348.         return 1;
  349.     }; break;
  350.     case eZoomRect: {
  351.         x_OnChangeZoomRectPan(Fl::event_x(), Fl::event_y());
  352.         x_OnEndZoomRect(eReadyZoomRect);
  353.         x_OnSelectCursor();
  354.         return 1;
  355.     }; break;
  356.     case ePan: {
  357.         x_OnChangeZoomRectPan(Fl::event_x(), Fl::event_y());
  358.         x_OnEndPan(eReadyPan);
  359.         x_OnSelectCursor();
  360.         return 1;
  361.     }; break;
  362.     default: break;
  363.     }
  364.     return 0;
  365. }
  366. int CMouseZoomHandler::x_OnMouseMove(void)
  367. {
  368.     if(m_State != eIdle)    {
  369.         x_OnSelectCursor();
  370.         return 1;
  371.     }
  372.     else return  0;
  373. }
  374. static int kWheelRatio = 10;
  375. int CMouseZoomHandler::x_OnMouseWheel(CGUIEvent& event)
  376. {
  377.     if(event.GetGUIState() == CGUIEvent::eZoomState) {
  378.         switch(m_State) {
  379.         case eIdle:  
  380.             x_SwitchToReadyState(eReadyScale, Fl::event_x(), Fl::event_y()); // continue                        
  381.         case eReadyScale: {
  382.             m_WheelTotalShift = 0;            
  383.             x_SwithToActiveState(eScale, Fl::event_x(), Fl::event_y());
  384.         }; // continue
  385.         case eScale: {
  386.             m_WheelTotalShift += Fl::event_dy() * kWheelRatio; 
  387.             x_OnChangeScale(m_WheelTotalShift);
  388.             
  389.             // updating shift after clipping with Min and Max norm values
  390.             m_WheelTotalShift = (int) ((m_StartNorm - m_CurrNorm) * m_PixPerNorm);
  391.         }; break;
  392.         default: _ASSERT(false); break;
  393.         }
  394.         x_OnSelectCursor();
  395.         return 1;
  396.     } else return 0;
  397. }
  398. int CMouseZoomHandler::x_OnKeyDown(CGUIEvent& event)
  399. {
  400.     if(m_State == eIdle)    {
  401.         EState ready_st = eIdle;
  402.         switch(event.GetGUIState()) {
  403.         case CGUIEvent::eZoomState: ready_st =  eReadyScale; break;
  404.         case CGUIEvent::eZoomRectState: ready_st =  eReadyZoomRect; break;
  405.         case CGUIEvent::ePanState: ready_st =  eReadyPan; break;
  406.         default: break;
  407.         }
  408.         if(ready_st != eIdle)   {
  409.             x_SwitchToReadyState(ready_st, Fl::event_x(), Fl::event_y()); 
  410.             x_OnSelectCursor();
  411.         }
  412.     }
  413.     return (m_State == eIdle) ? 0 : 1;   
  414. }
  415. int CMouseZoomHandler::x_OnKeyUp(CGUIEvent& event)
  416. {    
  417.     CGUIEvent::EGUIState state = event.GetGUIState();
  418.     if(state != CGUIEvent::eZoomState  &&  
  419.         state != CGUIEvent::eZoomRectState)  {
  420.         switch(m_State) {
  421.         case    eIdle: break;
  422.         case    eReadyScale:
  423.         case    eReadyZoomRect:
  424.         case    eReadyPan:
  425.         case    eZoomRect: 
  426.         case    ePan: {
  427.             m_pHost->MZHH_Redraw(); 
  428.             m_State = eIdle;
  429.             x_OnSelectCursor();
  430.         }; break;
  431.         case    eScale: {
  432.             x_OnEndScale(eIdle); 
  433.             m_State = eIdle;
  434.             x_OnSelectCursor();
  435.         }; break;
  436.         default: break;
  437.         };
  438.     }    
  439.     return (m_State == eIdle) ? 0 : 1;   
  440. }
  441. ////////////////////////////////////////////////////////////////////////////////
  442. /// Signal handlers
  443. void    CMouseZoomHandler::x_SwitchToReadyState(EState new_state, int pos_x, int pos_y)
  444. {    
  445.     _ASSERT(m_pHost);
  446.     if(m_State != new_state)   {
  447.         m_State = new_state; 
  448.         m_CurrPosX = m_MarkerPosX = pos_x;
  449.         m_CurrPosY = m_MarkerPosY = pos_y;
  450.                 
  451.         if(m_State == eReadyScale)  {            
  452.             m_CurrNorm = m_StartNorm = x_ScaleToNorm(m_pHost->MZHH_GetScale(IMouseZoomHandlerHost::eCurrent));
  453.     
  454.             m_MinNorm = x_ScaleToNorm(m_pHost->MZHH_GetScale(IMouseZoomHandlerHost::eMin));
  455.             m_MaxNorm = x_ScaleToNorm(m_pHost->MZHH_GetScale(IMouseZoomHandlerHost::eMax));                
  456.         }    
  457.         m_pHost->MZHH_Redraw();
  458.     }
  459. }
  460. void    CMouseZoomHandler::x_SwithToActiveState(EState state, int pos_x, int pos_y)
  461. {    
  462.     _ASSERT(m_pHost);
  463.     
  464.     m_State = state;
  465.     m_MouseStartX = pos_x;
  466.     m_MouseStartY = pos_y;
  467.     m_ptStart = m_pPane->UnProject(m_MouseStartX, m_pHost->MZHH_GetVPPosByY(m_MouseStartY));
  468. }
  469. /// d_y is the absolute shift in pixels from  the position where m_StartNorm have
  470. /// been initialized
  471. void    CMouseZoomHandler::x_OnChangeScale(int d_y)
  472.     if(d_y) {
  473.         TModelUnit norm = m_StartNorm - ((TModelUnit) (d_y)) / m_PixPerNorm;
  474.         norm = max(norm, m_MinNorm);
  475.         norm = min(norm, m_MaxNorm);
  476.         if(norm != m_CurrNorm)  {
  477.             m_CurrNorm = norm;
  478.             TModelUnit scale = x_NormToScale(norm);
  479.             
  480.             m_pHost->MZHH_SetScale(scale, m_ptStart);            
  481.         }
  482.     }
  483. }
  484. void    CMouseZoomHandler::x_OnEndScale(EState new_state)
  485. {
  486.     _ASSERT(new_state != eScale);
  487.     m_State = new_state;    
  488.     m_StartNorm = m_CurrNorm;
  489.     
  490.     m_pHost->MZHH_Redraw();    
  491. }
  492. void    CMouseZoomHandler::x_OnChangeZoomRectPan(int x, int y)
  493.     if(x != m_CurrPosX  ||  y != m_CurrPosY) {
  494.         m_CurrPosX = x;
  495.         m_CurrPosY = y;
  496.         m_pHost->MZHH_Redraw();
  497.     }
  498. }
  499. void    CMouseZoomHandler::x_OnEndZoomRect(EState new_state)
  500. {
  501.     m_State = new_state;    
  502.     
  503.     TModelRect rc;
  504.     
  505.     int x1 = m_MouseStartX; 
  506.     int y1 = m_pHost->MZHH_GetVPPosByY(m_MouseStartY);
  507.     int x2 = m_CurrPosX;
  508.     int y2 = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  509.     
  510.     rc.SetLeft(m_pPane->UnProjectX(min(x1, x2)));
  511.     rc.SetRight(m_pPane->UnProjectX(max(x1, x2)));
  512.     rc.SetBottom(m_pPane->UnProjectY(min(y1, y2)));
  513.     rc.SetTop(m_pPane->UnProjectY(max(y1, y2)));
  514.     m_pHost->MZHH_ZoomRect(rc);    
  515.     m_pHost->MZHH_Redraw();    
  516. }
  517. void    CMouseZoomHandler::x_OnEndPan(EState new_state)
  518. {
  519.     m_State = new_state;    
  520.     int y1 = m_pHost->MZHH_GetVPPosByY(m_MouseStartY);
  521.     int y2 = m_pHost->MZHH_GetVPPosByY(m_CurrPosY);
  522.     
  523.     TModelUnit m_x1 = m_pPane->UnProjectX(m_MouseStartX);
  524.     TModelUnit m_y1 = m_pPane->UnProjectY(y1);
  525.     TModelUnit m_x2 = m_pPane->UnProjectX(m_CurrPosX);
  526.     TModelUnit m_y2 = m_pPane->UnProjectY(y2);    
  527.     
  528.     m_pHost->MZHH_Scroll(m_x1 - m_x2, m_y1 - m_y2);
  529.     m_pHost->MZHH_Redraw();    
  530. }
  531. void    CMouseZoomHandler::x_OnSelectCursor(void)
  532. {
  533.     switch(m_State)    {
  534.     case eIdle:  
  535.     case eReadyScale: m_Cursor = FL_CURSOR_DEFAULT; break;
  536.     case eScale: m_Cursor = FL_CURSOR_HAND; break;        
  537.     case eReadyPan: 
  538.     case ePan: m_Cursor = FL_CURSOR_MOVE; break;
  539.     case eReadyZoomRect:    
  540.     case eZoomRect: m_Cursor = FL_CURSOR_CROSS; break;
  541.     default: break;
  542.     }   
  543.     //cout << "nCMouseZoomHandler::x_OnSelectCursor  " << m_Cursor;
  544.     fl_cursor(m_Cursor, FL_BLACK, FL_WHITE);
  545. }
  546. ////////////////////////////////////////////////////////////////////////////////
  547. /// helper functions
  548. TModelUnit  CMouseZoomHandler::x_ScaleToNorm(TModelUnit scale) const
  549. {
  550.     return log(scale);
  551. }
  552. TModelUnit  CMouseZoomHandler::x_NormToScale(TModelUnit norm) const
  553. {
  554.     return exp(norm);
  555. }
  556. END_NCBI_SCOPE
  557. /*
  558.  * ===========================================================================
  559.  * $Log: mouse_zoom_handler.cpp,v $
  560.  * Revision 1000.3  2004/06/01 21:10:40  gouriano
  561.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.10
  562.  *
  563.  * Revision 1.10  2004/05/21 22:27:54  gorelenk
  564.  * Added PCH ncbi_pch.hpp
  565.  *
  566.  * Revision 1.9  2004/03/26 15:03:48  yazhuk
  567.  * Fixed stuff broken by previous changes
  568.  *
  569.  * Revision 1.8  2004/03/04 14:36:41  lebedev
  570.  * Enable panning while mouse drag
  571.  *
  572.  * Revision 1.7  2004/03/02 21:54:52  yazhuk
  573.  * Fixed CGlAttrGuard usage
  574.  *
  575.  * Revision 1.6  2004/02/17 15:23:01  yazhuk
  576.  * Refactoring - replaced CGlParam with CGlAttrGuard
  577.  *
  578.  * Revision 1.5  2003/12/10 16:54:32  yazhuk
  579.  * Added support for using mouse position to specify reference point for "active zoom".
  580.  *
  581.  * Revision 1.4  2003/12/08 15:12:48  yazhuk
  582.  * Implemented deactivation on FL_UNFOCUS.
  583.  *
  584.  * Revision 1.3  2003/12/01 22:32:14  yazhuk
  585.  * GCC ompilation fixes
  586.  *
  587.  * Revision 1.2  2003/12/01 16:41:30  yazhuk
  588.  * Refactored event handling - introduced CGUIEvent; implemented zooming by
  589.  * rectangle and panoraming.
  590.  *
  591.  * Revision 1.1  2003/11/17 20:24:51  yazhuk
  592.  * Moved from widgetsaln_multiple
  593.  *
  594.  * Revision 1.3  2003/10/29 23:32:47  yazhuk
  595.  * Updated includes
  596.  *
  597.  * Revision 1.2  2003/10/20 16:27:55  yazhuk
  598.  * x_OnKeyUp() bug fix.
  599.  *
  600.  * Revision 1.1  2003/10/20 15:44:58  yazhuk
  601.  * Initial revision.
  602.  *
  603.  * ===========================================================================
  604.  */