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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmulti_pane.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 21:07:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alnmulti_pane.cpp,v 1000.6 2004/06/01 21:07:09 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/ncbistl.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <gui/opengl/glutils.hpp>
  43. #include <gui/utils/command.hpp>
  44. #include <gui/widgets/aln_multiple/alnmulti_settings.hpp>
  45. #include <gui/widgets/aln_multiple/alnmulti_pane.hpp>
  46. #include <algorithm>
  47. #include <FL/Fl.H>
  48. BEGIN_NCBI_SCOPE
  49. static const int kRulerSpace = 4;
  50. static const int kMasterRowSpace = 4;
  51. CAlnMultiPane::CAlnMultiPane(int PosX, int PosY, int Width, int Height, const char* Label)
  52. : CGlCanvas2d(PosX, PosY, Width, Height, Label),
  53.   m_pParent(NULL),
  54.   m_pModel(NULL),
  55.   m_pCurrHandler(NULL),
  56.   m_Renderer(TVPRect(0, 0, Width, Height))
  57. {
  58.     m_Tooltip.SetMode(CTooltip::eHideOnMove);
  59.     m_HandlerPane.EnableOffset();
  60.     m_Renderer.SetBackColor(CGlColor(0.95f, 1.0f, 0.95f));
  61.     
  62.     //setup Event Handlers
  63.     m_MarkHandler.SetHost(static_cast<IAlignMarkHandlerHost*>(this));
  64.     x_AddHandler(dynamic_cast<IEventHandler*>(&m_MarkHandler), fAlignArea);
  65.     m_SelHandler.SetHost(static_cast<ISelHandlerHost*>(this));
  66.     x_AddHandler(dynamic_cast<IEventHandler*>(&m_SelHandler), fAlignArea);
  67.     
  68.     m_MouseZoomHandler.SetHost(static_cast<IMouseZoomHandlerHost*>(this));
  69.     x_AddHandler(dynamic_cast<IEventHandler*>(&m_MouseZoomHandler), fAlignArea);
  70.     x_AddHandler(dynamic_cast<IEventHandler*>(this), fDescrArea);
  71.     m_Event.StandardConfig();
  72. }
  73. void CAlnMultiPane::SetWidget(IAlnMultiPaneParent* p_parent)
  74. {
  75.     m_pParent = p_parent;
  76. }
  77. void CAlnMultiPane::SetContext(IAlnMultiRendererContext* p_context)    
  78. {
  79.     m_pContext = p_context;
  80.     m_Renderer.SetContext(m_pContext);
  81.     if(m_pContext)   {
  82.         m_HandlerPane = x_GetContext()->GetAlignPort();
  83.     }
  84. }
  85. void    CAlnMultiPane::SetBackColor(const CGlColor Color)
  86. {
  87.     m_Renderer.SetBackColor(Color);
  88. }
  89. CRuler&    CAlnMultiPane::GetRuler()
  90. {
  91.     return m_Renderer.GetRuler();
  92. }
  93. CAlnMultiRenderer&  CAlnMultiPane::GetRenderer()
  94. {
  95.     return m_Renderer;
  96. }
  97. void    CAlnMultiPane::resize(int x, int y, int w, int h)
  98. {
  99.     CGlCanvas2d::resize(x, y, w, h);
  100.     
  101.     m_Renderer.Resize(TVPRect(0, 0, w - 1, h - 1));
  102.     
  103.     if(x_GetParent())   
  104.         x_GetParent()->OnChildResize();
  105. }
  106. int  CAlnMultiPane::handle(int event)
  107. {
  108.     m_Event.OnFLTKEvent(event);
  109.     int res = 0;
  110.     switch(event)   {
  111.     case FL_FOCUS:
  112.     case FL_UNFOCUS:    redraw();   return 1;
  113.     case FL_KEYDOWN:
  114.     case FL_KEYUP:  res = x_HandleKeyEvent(); break;
  115.     case FL_MOVE:   res = x_HandleMouseMove(); break;
  116.     case FL_PUSH:   res = x_HandleMousePush(); break;
  117.     case FL_DRAG: res = x_HandleMouseDrag(); break;
  118.     case FL_RELEASE: res = x_HandleMouseRelease(); break;
  119.     case FL_MOUSEWHEEL: res = x_HandleMouseWheel(); break;
  120.     case FL_ENTER: 
  121.     case FL_LEAVE:  
  122.         //fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); // drop to default
  123.     default: res = CGlCanvas2d::handle(event);
  124.     }     
  125.     m_Tooltip.Handle(event);  
  126.     return res;
  127. }
  128. int    CAlnMultiPane::x_HandleKeyEvent()
  129. {
  130.     IEventHandler* pH = NULL; //dummy
  131.     int res = x_Handlers_handle(fAllAreas, pH, false);    
  132.     if(res == 0  &&  m_Event.GetFLTKEvent() == FL_KEYDOWN)   {
  133.         switch(m_Event.GetGUISignal())   {
  134.         case CGUIEvent::eZoomInSignal:  x_SendCommand(eCmdZoomIn); break;
  135.         case CGUIEvent::eZoomOutSignal:  x_SendCommand(eCmdZoomOut); break;
  136.         case CGUIEvent::eZoomAllSignal:  x_SendCommand(eCmdZoomAll); break;  
  137.         default: break;
  138.         }
  139.     }
  140.     return res;
  141. }
  142. void   CAlnMultiPane::x_SendCommand(TCmdID cmd)
  143. {
  144.     CCommandTarget* target = dynamic_cast<CCommandTarget*>(m_pParent);
  145.     if(target)  {
  146.         target->OnCommand(cmd);
  147.     }
  148. }
  149. int    CAlnMultiPane::x_HandleMouseMove()
  150. {
  151.     int res = 0;
  152.     IEventHandler* pH = NULL; //dummy
  153.     EColumnType type = m_Renderer.GetColumnTypeByX(Fl::event_x());
  154.     
  155.     switch(type)  {
  156.     case IAlignRow::eDescr: res = x_Handlers_handle(fDescrArea, pH, true); break;
  157.     case IAlignRow::eAlignment: 
  158.         res = x_Handlers_handle(fAlignArea, pH); break;
  159.     default: break;
  160.     }
  161.     if(res == 0)    { 
  162.         fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); 
  163.     }    
  164.     x_UpdateTooltip();
  165.     
  166.     m_pCurrHandler = NULL;
  167.     return res;
  168. }
  169. int    CAlnMultiPane::x_HandleMousePush()
  170. {
  171.     if(Fl::focus() != static_cast<Fl_Widget*>(this))    {
  172.         take_focus();
  173.         
  174.         m_Event.OnFLTKEvent(FL_PUSH); // restore event state after focus handling
  175.     }
  176.     
  177.     int res = 0;
  178.     if(m_Event.GetGUISignal() == CGUIEvent::ePopupSignal)   {
  179.         x_GetParent()->OnShowPopup();
  180.         res = 1;
  181.     } else {
  182.         IEventHandler* pH = NULL; //dummy
  183.         EColumnType type = m_Renderer.GetColumnTypeByX(Fl::event_x());
  184.     
  185.         switch(type)  {
  186.         case IAlignRow::eDescr: res = x_Handlers_handle(fDescrArea, pH, true); break;
  187.         case IAlignRow::eIcons: res = x_Row_handle(); break;
  188.         case IAlignRow::eAlignment: 
  189.             res = x_Handlers_handle(fAlignArea, pH); break;
  190.         default: break;
  191.         }
  192.         m_pCurrHandler = pH;
  193.     }    
  194.     if(res == 0)    {
  195.         fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); 
  196.     }
  197.     return res;
  198. }
  199. int    CAlnMultiPane::x_HandleMouseDrag()
  200. {
  201.     int res = 0;
  202.     if(m_pCurrHandler)  {
  203.         res = m_pCurrHandler->handle(m_Event, m_HandlerPane);
  204.     }
  205.     if(res ==0) {
  206.         fl_cursor(FL_CURSOR_DEFAULT, FL_BLACK, FL_WHITE); 
  207.     }
  208.     return res;
  209. }
  210. int    CAlnMultiPane::x_HandleMouseRelease()
  211. {
  212.     if(m_Event.GetGUISignal() == CGUIEvent::ePopupSignal)   {
  213.         x_GetParent()->OnShowPopup();
  214.         return 1;
  215.     } else return x_HandleMouseDrag();
  216. }
  217. int    CAlnMultiPane::x_HandleMouseWheel()
  218. {
  219.     IEventHandler* pH = NULL; //dummy
  220.     int res = x_Handlers_handle(fAllAreas, pH, false);    
  221.     if(! res)   {
  222.         int d_y = Fl::event_dy();
  223.         x_GetParent()->OnScroll(0, (TModelUnit) d_y);
  224.     }
  225.     return res;
  226. }
  227. int    CAlnMultiPane::x_Row_handle()
  228. {
  229.     int i_line = x_GetLineByWindowY(Fl::event_y());
  230.     if(i_line >= 0)  {
  231.         IAlignRow* p_row = x_GetContext()->GetRowByLine(i_line);
  232.         _ASSERT(p_row);
  233.         
  234.         int i_col = m_Renderer.GetColumnIndexByX(Fl::event_x());
  235.         IAlignRow::EColumnType type = (IAlignRow::EColumnType) 
  236.                                 (int) m_Renderer.GetColumn(i_col).m_UserData;
  237.         const CGlPane& VP = x_GetContext()->GetAlignPort();        
  238.         int vp_top_y = m_Renderer.GetVPListTop() + (int) VP.GetVisibleRect().Top() 
  239.                     - x_GetContext()->GetLinePosY(i_line);
  240.         CGlPane pane(CGlPane::eNeverUpdate);       
  241.         pane.EnableOffset();
  242.         m_Renderer.SetupPaneForRow(pane, p_row, vp_top_y);
  243.         m_Renderer.SetupPaneForColumn(pane, i_col);
  244.         return p_row->handle(m_Event, type, pane);
  245.     }
  246.     return 0;
  247. }
  248. void    CAlnMultiPane::x_UpdateTooltip()
  249. {
  250.     int x = Fl::event_x();
  251.     int y = Fl::event_y();
  252.         
  253.     int vp_top = m_Renderer.GetRulerAreaHeight() + m_Renderer.GetMasterAreaHeight();
  254.     bool b_deactivate = true;
  255.     IAlignRow* p_row = NULL;
  256.     int row_top_y = 0; 
  257.     if(x_GetContext()->GetMasterRow()  &&  
  258.        y >= m_Renderer.GetRulerAreaHeight() + kMasterRowSpace  &&
  259.        y < vp_top - kMasterRowSpace)   {
  260.         p_row = x_GetContext()->GetMasterRow();
  261.         row_top_y = m_Renderer.GetRulerAreaHeight() + kMasterRowSpace;
  262.     } else  if(y >= vp_top  &&  y < h())    { // show tooltips only for rows
  263.         int line =  x_GetLineByWindowY(y);  
  264.         if(line >= 0)   {      
  265.             p_row = x_GetContext()->GetRowByLine(line);
  266.             row_top_y = x_GetContext()->GetLinePosY(line);
  267.         }
  268.     }
  269.     if(p_row)  {                    
  270.         int i_col = m_Renderer.GetColumnIndexByX(x);
  271.         if(i_col != -1) {
  272.             const CGlPane& VP = x_GetContext()->GetAlignPort();        
  273.             int vp_top_y = m_Renderer.GetVPListTop() + (int) VP.GetVisibleRect().Top() - row_top_y;
  274.             string s_tip = x_GetRowTooltip(p_row, i_col, vp_top_y);
  275.             if(s_tip.size())   {
  276.                 b_deactivate = false;
  277.                 m_Tooltip.Activate(this, s_tip, x, y);
  278.             }
  279.         }
  280.     }
  281.     if(b_deactivate)    {
  282.         m_Tooltip.Deactivate(true);
  283.     }    
  284. }
  285. string CAlnMultiPane::x_GetRowTooltip(IAlignRow* p_row, int i_col, int vp_top_y)
  286. {
  287.     CGlPane pane;       
  288.     pane.EnableOffset();
  289.     m_Renderer.SetupPaneForRow(pane, p_row, vp_top_y);        
  290.     m_Renderer.SetupPaneForColumn(pane, i_col);
  291.     
  292.     EColumnType type = m_Renderer.GetColumnTypeByIndex(i_col);
  293.     return p_row->GetTooltip(type, pane);
  294. }
  295. ///////////////////////////////////////////////////////////////////////////////
  296. // Handlers management
  297. void    CAlnMultiPane::x_AddHandler(IEventHandler* handler, int area)
  298. {
  299.     _ASSERT(handler  &&  area);
  300.     m_lsHandlers.push_back(make_pair(handler, area));
  301. }
  302. int CAlnMultiPane::x_Handlers_handle(int area, 
  303.                                      IEventHandler*& handler, bool ignore_curr)
  304. {    
  305.     int res = 0;
  306.  
  307.     IEventHandler* pFirst = ignore_curr ? NULL : m_pCurrHandler;
  308.     if(pFirst)  {
  309.         handler = m_pCurrHandler;
  310.         res = m_pCurrHandler->handle(m_Event, m_HandlerPane);
  311.     }
  312.     
  313.     if(res == 0)    { // not handles by pFirst - iterate through over handlers
  314.         NON_CONST_ITERATE(THandlerList, it, m_lsHandlers) {
  315.             handler = it->first;
  316.             if( (it->second & area)  &&  (handler != pFirst) )    {
  317.                 res = handler->handle(m_Event, m_HandlerPane);
  318.                 if(res) break;
  319.             }
  320.         }
  321.     }
  322.     if(res == 0)    handler = NULL;
  323.     return res;
  324. }
  325. void    CAlnMultiPane::draw()
  326. {    
  327.     Render();    
  328. }
  329. void    CAlnMultiPane::Render()
  330. {
  331.     //_TRACE("nnCAlnMultiPane::Render()");
  332.     //CStopWatch sw;
  333.     //sw.Start();
  334.     
  335.     m_Renderer.SetFocused(Fl::focus() == this);
  336.     //CAlnMultiRenderer::TAreaVector areas;
  337.     //m_Renderer.Render(areas);
  338.     m_Renderer.Render();
  339.     x_RenderSelection();  
  340.     x_RenderMark(); 
  341.     x_RenderZoomHandler();
  342.     //_TRACE("nEND CAlnMultiPane::Render()  " << sw.Elapsed());
  343. }
  344. void    CAlnMultiPane::Update() 
  345. {
  346.     //_TRACE("nnBEGIN CAlnMultiPane::Update() ");        
  347.     m_Renderer.Update();
  348.     if(x_GetParent())   
  349.         x_GetParent()->OnChildResize();
  350.     //_TRACE("nEND CAlnMultiPane::Update() ");
  351. }
  352. //
  353. void    CAlnMultiPane::SetRulerHeight(int height)
  354. {
  355.     m_Renderer.SetRulerHeight(height);
  356. }
  357. CRange<TSeqPos> CAlnMultiPane::GetSelectionLimits()
  358. {
  359.     return m_SelHandler.GetSelectionLimits();
  360. }
  361. const CAlnMultiPane::TRangeColl&   CAlnMultiPane::GetSelection() const
  362. {
  363.     return m_SelHandler.GetSelection();
  364. }
  365. void    CAlnMultiPane::SetSelection(const TRangeColl& C, bool bRedraw)
  366. {
  367.     m_SelHandler.SetSelection(C, bRedraw);
  368. }
  369. void    CAlnMultiPane::ResetSelection(bool bRedraw)
  370. {
  371.     m_SelHandler.ResetSelection(bRedraw);
  372. }
  373. void    CAlnMultiPane::MarkSelectedRows(const TRangeColl& C, bool bMark)
  374. {
  375.     m_MarkHandler.MarkSelectedRows(C, bMark);
  376. }
  377. void    CAlnMultiPane::UnMarkAll()
  378. {
  379.     m_MarkHandler.UnMarkAll();
  380. }
  381. const   CAlnMultiPane::TRowToMarkMap&  CAlnMultiPane::GetMarks() const
  382. {
  383.     return m_MarkHandler.GetMarks();
  384. }
  385. int     CAlnMultiPane::GetAlignVPHeight() const
  386. {
  387.     return GetListAreaHeight();
  388. }
  389. int     CAlnMultiPane::GetAlignVPWidth() const
  390. {
  391.     int iAlign = m_Renderer.GetColumnIndexByType(IAlignRow::eAlignment);
  392.     return m_Renderer.GetColumn(iAlign).m_Width;
  393. }
  394. ////////////////////////////////////////////////////////////////////////////////
  395. /// protected members
  396. void    CAlnMultiPane::x_RenderSelection()
  397. {
  398.     if(x_GetParent()) {
  399.         const CGlPane& VP = x_GetContext()->GetAlignPort();
  400.         if(! VP.GetVisibleRect().IsEmpty())
  401.         {   
  402.             TVPRect rc_vp = m_Renderer.GetColumnRect(IAlignRow::eAlignment);
  403.             if(rc_vp.Width() > 0)   {
  404.                 m_HandlerPane.EnableOffset();
  405.                 m_HandlerPane.SetViewport(rc_vp);
  406.     
  407.                 TModelRect rcM = VP.GetModelLimitsRect();  
  408.                 rcM.SetVert(0, 1);          
  409.                 m_HandlerPane.SetModelLimitsRect(rcM);    
  410.                 TModelRect rcV = VP.GetVisibleRect();        
  411.                 rcV.SetVert(0, 1);          
  412.                 m_HandlerPane.SetVisibleRect(rcV);
  413.                 glEnable(GL_BLEND);
  414.                 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  415.                 m_SelHandler.Render(m_HandlerPane);
  416.        
  417.                 glDisable(GL_BLEND);
  418.             }
  419.         }
  420.     }
  421. }
  422. void    CAlnMultiPane::x_RenderMark()
  423. {
  424.     if(x_GetParent()) {
  425.         const CGlPane& VP = x_GetContext()->GetAlignPort();
  426.         
  427.         TVPRect rc_vp = m_Renderer.GetColumnRect(IAlignRow::eAlignment);
  428.         if(rc_vp.Width() > 0)   {
  429.             rc_vp.SetTop(m_Renderer.GetVPListTop()); 
  430.             m_HandlerPane.SetViewport(rc_vp);                
  431.         
  432.             TModelRect rcM = VP.GetModelLimitsRect();  
  433.             m_HandlerPane.SetModelLimitsRect(rcM);    
  434.             TModelRect rcV = VP.GetVisibleRect();        
  435.             rcV.SetBottom(rcV.Top() + rc_vp.Height());
  436.             m_HandlerPane.SetVisibleRect(rcV);
  437.             glEnable(GL_BLEND);
  438.             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  439.             m_MarkHandler.Render(m_HandlerPane);        
  440.             glDisable(GL_BLEND);
  441.         }
  442.     }
  443. }
  444. void    CAlnMultiPane::x_RenderZoomHandler()
  445. {
  446.     if(x_GetParent()) {       
  447.         TVPRect rc_vp = m_Renderer.GetColumnRect(IAlignRow::eAlignment);
  448.         if(rc_vp.Width() > 0)   {
  449.             m_HandlerPane.SetViewport(rc_vp);
  450.             
  451.             glEnable(GL_BLEND);
  452.             glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  453.             m_MouseZoomHandler.Render(m_HandlerPane);
  454.        
  455.             glDisable(GL_BLEND);
  456.         }
  457.     }
  458. }
  459. int     CAlnMultiPane::x_GetLineByWindowY(int WinY) const
  460. {
  461.     int vpY = WinY - m_Renderer.GetListTop();
  462.     int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();        
  463.     return x_GetContext()->GetLineByModelY(vpY + OffsetY);
  464. }
  465. TVPRect CAlnMultiPane::x_GetLineRect(int Index)
  466. {
  467.     int Top = 0, H = 0;
  468.     if(x_GetParent()  &&  Index >= 0) {
  469.         int OffsetY = (int) x_GetContext()->GetAlignPort().GetVisibleRect().Top();        
  470.         Top = x_GetContext()->GetLinePosY(Index) - OffsetY;
  471.         H = x_GetContext()->GetLineHeight(Index);
  472.     }
  473.     return TVPRect(0, Top + H -1, w()-1, Top);
  474. }
  475. ////////////////////////////////////////////////////////////////////////////////
  476. // ISelListView implementation
  477. void  CAlnMultiPane::SLV_SetModel(TSelListModel* pModel)
  478. {
  479.     m_pModel = pModel;
  480. }
  481. void  CAlnMultiPane::SLV_UpdateItems(const TIndexVector& v_indexes)
  482. {
  483.     bool bRedraw = false;
  484.     TVPRect rcVisible(0, 0, w() - 1, h() - 1);
  485.     for( size_t i = 0;  i < v_indexes.size() &&  ! bRedraw;  i++ ) {
  486.         int index = v_indexes[i];
  487.         TVPRect rcItem = x_GetLineRect(index);
  488.         bRedraw = rcItem.Intersects(rcVisible); 
  489.     }
  490.     if(bRedraw)
  491.         redraw();
  492.     x_NotifyParent(IAlnMultiPaneParent::eRowSelChanged);
  493. }
  494. void  CAlnMultiPane::SLV_UpdateRange(int iFirstItem, int iLastItem)
  495. {
  496.     if(iLastItem >= iFirstItem) {
  497.         TVPRect rcFirst = x_GetLineRect(iFirstItem);
  498.         TVPRect rcLast = x_GetLineRect(iLastItem);
  499.         rcFirst.CombineWith(rcLast);
  500.         TVPRect rcVisible(0, 0, w() - 1, h() - 1);
  501.     
  502.         if(rcFirst.Intersects(rcVisible))
  503.             redraw();
  504.     } else redraw();
  505.     x_NotifyParent(IAlnMultiPaneParent::eRowSelChanged);
  506. }
  507. ////////////////////////////////////////////////////////////////////////////////
  508. /// CSelListController extension
  509. CAlnMultiPane::TSelListModel* CAlnMultiPane::SLC_GetModel()
  510. {
  511.     return x_GetModel();
  512. }
  513. int     CAlnMultiPane::SLC_GetHeight()
  514. {
  515.     return h();
  516. }
  517. int CAlnMultiPane::SLC_GetLineByWindowY(int WinY, bool b_clip)
  518. {
  519.     int h = m_Renderer.GetRulerAreaHeight() + m_Renderer.GetMasterAreaHeight();
  520.     if(! b_clip  ||  WinY >= h) {
  521.         return  x_GetLineByWindowY(WinY);
  522.     } else return -1;
  523. }
  524. void    CAlnMultiPane::SLC_VertScrollToMakeVisible(int Index)
  525. {
  526.     // not implemented
  527. }
  528. ////////////////////////////////////////////////////////////////////////////////
  529. /// ISelHandlerHost implementation
  530. void CAlnMultiPane::SHH_Redraw()
  531. {
  532.     redraw();
  533. }
  534. TModelUnit  CAlnMultiPane::SHH_GetModelByWindow(int z, EOrientation orient)
  535. {
  536.     switch(orient)  {
  537.     case eHorz: return m_HandlerPane.UnProjectX(z);
  538.     case eVert: return m_HandlerPane.UnProjectY(h() - z);
  539.     default:    _ASSERT(false); return -1;
  540.     }
  541. }
  542. TVPUnit     CAlnMultiPane::SHH_GetWindowByModel(TModelUnit z, EOrientation orient)
  543. {
  544.     switch(orient)  {
  545.     case eHorz: return m_HandlerPane.ProjectX(z);
  546.     case eVert: return h() - m_HandlerPane.ProjectY(z);
  547.     default:    _ASSERT(false); return -1;
  548.     }
  549. }
  550. ////////////////////////////////////////////////////////////////////////////////
  551. /// IAlnMarkHandlerHost implementation
  552. const IAlnMultiDataSource*      CAlnMultiPane::MHH_GetAlnDS() const
  553. {
  554.     return x_GetParent()->GetDataSource();
  555. }
  556. const CAlnMultiPane::TSelListModel*    CAlnMultiPane::MHH_GetSelListModel() const
  557. {
  558.     return x_GetModel();
  559. }
  560. CAlnMultiPane::TNumrow    CAlnMultiPane::MHH_GetRowByLine(int Index) const
  561. {
  562.     return x_GetParent()->GetRowNumByLine(Index);
  563. }
  564. int CAlnMultiPane::MHH_GetLineByRowNum(TNumrow Row) const
  565. {
  566.     return x_GetParent()->GetLineByRowNum(Row);
  567. }
  568. int CAlnMultiPane::MHH_GetLineByWindowY(int Y) const
  569. {
  570.     return x_GetLineByWindowY(Y);
  571. }
  572. int CAlnMultiPane::MHH_GetLinePosY(int Index) const
  573. {
  574.     return x_GetContext()->GetLinePosY(Index);
  575. }
  576. int CAlnMultiPane::MHH_GetLineHeight(int Index) const
  577. {
  578.     return x_GetContext()->GetLineHeight(Index);
  579. }
  580. ///### refactor ??
  581. TModelUnit  CAlnMultiPane::MHH_GetSeqPosByX(int X) const
  582. {
  583.     return m_HandlerPane.UnProjectX(X);
  584. }
  585. void    CAlnMultiPane::MHH_Redraw()
  586. {
  587.     redraw();
  588. }
  589. TModelUnit  CAlnMultiPane::MZHH_GetScale(EScaleType type)
  590. {
  591.     const CGlPane& port = x_GetContext()->GetAlignPort();
  592.     switch(type)    {
  593.     case eCurrent:   return port.GetScaleX();
  594.     case eMin: return port.GetMinScaleX();
  595.     case eMax: return port.GetZoomAllScaleX();
  596.     default: _ASSERT(false); return -1;
  597.     }
  598. }
  599. void    CAlnMultiPane::MZHH_SetScale(TModelUnit scale, const TModelPoint& point) 
  600. {
  601.     x_GetParent()->OnSetScaleX(scale, point);
  602. }
  603. void     CAlnMultiPane::MZHH_ZoomRect(const TModelRect& rc)
  604. {
  605.     x_GetParent()->OnZoomRect(rc);
  606. }
  607. void    CAlnMultiPane::MZHH_Scroll(TModelUnit d_x, TModelUnit d_y)
  608. {
  609.     x_GetParent()->OnScroll(d_x, d_y);
  610. }
  611. TVPUnit  CAlnMultiPane::MZHH_GetVPPosByY(int y) const
  612. {
  613.     return h() - 1  - y;
  614. }
  615. void    CAlnMultiPane::MZHH_Redraw(void)
  616. {
  617.     redraw();
  618. }
  619. void    CAlnMultiPane::ARH_OnRowChanged(IAlignRow* p_row)
  620. {
  621.     x_GetParent()->OnRowChanged(p_row);
  622. }
  623. TVPPoint    CAlnMultiPane::ARH_GetVPMousePos()
  624. {
  625.     int y = h() - 1 - Fl::event_y();
  626.     int x = Fl::event_x();
  627.     return TVPPoint(x, y);
  628. }
  629. END_NCBI_SCOPE
  630. /*
  631.  * ===========================================================================
  632.  * $Log: alnmulti_pane.cpp,v $
  633.  * Revision 1000.6  2004/06/01 21:07:09  gouriano
  634.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.42
  635.  *
  636.  * Revision 1.42  2004/05/21 22:27:52  gorelenk
  637.  * Added PCH ncbi_pch.hpp
  638.  *
  639.  * Revision 1.41  2004/05/10 17:46:35  yazhuk
  640.  * Addressed GCC warnings
  641.  *
  642.  * Revision 1.40  2004/04/22 17:10:34  yazhuk
  643.  * Fixed rendering of focus state
  644.  *
  645.  * Revision 1.39  2004/04/06 16:05:24  yazhuk
  646.  * Clean-up
  647.  *
  648.  * Revision 1.38  2004/04/06 13:34:50  dicuccio
  649.  * Commented unused iteration over HTML active areas
  650.  *
  651.  * Revision 1.37  2004/04/05 14:50:05  yazhuk
  652.  * Zoom from keyboard
  653.  *
  654.  * Revision 1.36  2004/04/02 16:39:13  yazhuk
  655.  * Implemented parent notification about changes in selection
  656.  *
  657.  * Revision 1.35  2004/03/29 19:06:24  yazhuk
  658.  * Added GetRenderer(), implemented CHTMLActiveArea-s generation
  659.  *
  660.  * Revision 1.34  2004/03/25 13:05:49  dicuccio
  661.  * Use _TRACE() instead of cout
  662.  *
  663.  * Revision 1.33  2004/03/17 20:13:18  yazhuk
  664.  * Added SetContext(), modified SetWidget()
  665.  *
  666.  * Revision 1.32  2004/03/09 21:02:59  yazhuk
  667.  * Replaced some of the calls to x_GetParent() with x_GetContext(); cleaned-up
  668.  *
  669.  * Revision 1.31  2004/03/08 15:41:32  yazhuk
  670.  * Moved rendering to CAlnMultiRenderer class.
  671.  *
  672.  * Revision 1.30  2004/03/02 15:12:45  yazhuk
  673.  * Expanded "Icons" column
  674.  *
  675.  * Revision 1.29  2004/02/18 02:17:34  ucko
  676.  * Portability fix: don't try to use the return value of map<>::erase(),
  677.  * which yields void in many implementations.
  678.  *
  679.  * Revision 1.28  2004/02/17 15:19:24  yazhuk
  680.  * Support for graphics caching
  681.  *
  682.  * Revision 1.27  2004/01/15 20:14:46  yazhuk
  683.  * Fixed bug in focus handling; added new argument to SLC_GetLineByWindowY
  684.  *
  685.  * Revision 1.26  2004/01/08 19:43:24  yazhuk
  686.  * Refactored and improved tooltips support
  687.  *
  688.  * Revision 1.25  2003/12/29 23:21:27  yazhuk
  689.  * Implemented tooltips support using CTooltip
  690.  *
  691.  * Revision 1.24  2003/12/22 16:24:27  yazhuk
  692.  * Added SetRulerHeight(), clean-up
  693.  *
  694.  * Revision 1.23  2003/12/18 21:22:42  yazhuk
  695.  * Updated code to support template ISelListModel
  696.  *
  697.  * Revision 1.22  2003/12/10 17:10:04  yazhuk
  698.  * Updated IMouseZoomHandlerHost implementation.
  699.  * Basic support for popup menus.
  700.  *
  701.  * Revision 1.21  2003/12/08 15:15:18  yazhuk
  702.  * Removed x_RenderContent(). Implemented workaround for OpenGL precision problems.
  703.  *
  704.  * Revision 1.20  2003/12/01 17:00:22  yazhuk
  705.  * Refactored event handling - introduced CGUIEvent, updated
  706.  * ISelHandlerHost implementation.
  707.  *
  708.  * Revision 1.19  2003/11/24 20:32:22  friedman
  709.  * Commented out check for Fl:damage() == 0
  710.  *
  711.  * Revision 1.18  2003/11/24 15:15:27  dicuccio
  712.  * Added check for Fl::damage() = 0
  713.  *
  714.  * Revision 1.17  2003/11/18 17:58:08  yazhuk
  715.  * Fixed GCC warnings
  716.  *
  717.  * Revision 1.16  2003/11/17 21:20:10  yazhuk
  718.  * Fixed spelling errors, renamed GetScale() to MZHH_GetScale()
  719.  *
  720.  * Revision 1.15  2003/11/03 16:55:54  yazhuk
  721.  * Implemented IAlignRowHost interface and handling events by IAlignRow
  722.  * objects. Added x_SetupPaneForRow(), x_SetupPaneForColumn() functions.
  723.  *
  724.  * Revision 1.14  2003/10/29 23:33:16  yazhuk
  725.  * Migrated to new classes, did a lot of refactoring
  726.  *
  727.  * Revision 1.13  2003/10/20 15:50:28  yazhuk
  728.  * Implemented generalized event handling using IEventHandler. Added CMouseZoomHandler.
  729.  *
  730.  * Revision 1.12  2003/10/15 21:26:38  yazhuk
  731.  * Migrated from using CAlnVec to accessing data via "generic" interface in CAlignDataSource.
  732.  *
  733.  * Revision 1.11  2003/10/10 19:02:52  yazhuk
  734.  * Changed inheritance from CAlnMultiEditPane to CGlCanvas2d
  735.  *
  736.  * Revision 1.10  2003/09/29 17:00:09  dicuccio
  737.  * fl.H -> Fl.H
  738.  *
  739.  * Revision 1.9  2003/09/29 15:53:42  dicuccio
  740.  * Reordered #include statements
  741.  *
  742.  * Revision 1.8  2003/09/29 13:42:39  yazhuk
  743.  * Added "SeqEnd" column, implemented GetMarks()
  744.  *
  745.  * Revision 1.7  2003/09/23 21:05:20  yazhuk
  746.  * Added support for Marks, implemented mouse event handling functions, added x_RenderRow function
  747.  *
  748.  * Revision 1.6  2003/09/15 13:39:18  yazhuk
  749.  * SColumn::m_UserData compilation fix
  750.  *
  751.  * Revision 1.5  2003/09/10 21:49:47  yazhuk
  752.  * GCC compilation fixes
  753.  *
  754.  * Revision 1.4  2003/09/10 20:43:05  yazhuk
  755.  * Merged 4 Pane classes into CAlnMultiPane class. Introduced notion of Columns.
  756.  *
  757.  * Revision 1.3  2003/09/08 16:25:10  yazhuk
  758.  * Modified IAlignParent function calls
  759.  *
  760.  * Revision 1.2  2003/09/02 16:53:57  yazhuk
  761.  * GCC compilation fixes
  762.  *
  763.  * Revision 1.1  2003/08/28 18:25:28  yazhuk
  764.  * Initial revision
  765.  *
  766.  * ===========================================================================
  767.  */