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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: phylo_tree_pane.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/02 20:24:34  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: phylo_tree_pane.cpp,v 1000.2 2004/06/02 20:24:34 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:  Vladimir Tereshkov
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistl.hpp>
  41. #include <corelib/ncbitime.hpp>
  42. #include <gui/widgets/phylo_tree/phylo_tree_widget.hpp>
  43. #include <gui/widgets/phylo_tree/phylo_tree_pane.hpp>
  44. #include <FL/Fl.H>
  45. BEGIN_NCBI_SCOPE
  46. #define AXIS_AREA_W 50
  47. #define AXIS_AREA_H 30
  48. CPhyloTreePane::CPhyloTreePane(int PosX, int PosY, int Width, int Height, const char* Label)
  49. :   CGlPaneWidgetChild(PosX, PosY, Width, Height, Label),
  50.     m_BackColor(0.95f, 1.0f, 0.95f),
  51.     m_pTextFont(NULL),
  52.     m_pLblFont(NULL),
  53.     m_VertSelHandler(eVert),
  54.     m_BottomRuler(true),
  55.     m_TopRuler(true),
  56.     m_LeftRuler(false),
  57.     m_RightRuler(false),
  58.     m_CurrRenderer(-1)
  59. {
  60.     m_Renderers.clear();
  61.     m_Gen.SetIntegerMode(true, true);
  62.     m_Gen.EnableOneBased(true, true);
  63.     m_Grid.EnableIntegerCentering(true);
  64.     m_pTextFont = new CGlBitmapFont(CGlBitmapFont::eHelvetica12);
  65.     m_pLblFont = new CGlBitmapFont(CGlBitmapFont::eHelvetica10);    
  66.     m_Tooltip.EnableActiveMode(static_cast<ITooltipClient*>(this));
  67.     m_Tooltip.SetMode(CTooltip::eHideOnMove);
  68.    
  69.     m_MouseZoomHandler.SetHost(static_cast<IMouseZoomHandlerHost*>(this));
  70.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_MouseZoomHandler), fMatrixArea, &m_MatrixPane);
  71.     m_HorzSelHandler.SetHost(static_cast<ISelHandlerHost*>(this));
  72.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_HorzSelHandler), fSubjectArea, &m_MatrixPane);
  73.     m_VertSelHandler.SetHost(static_cast<ISelHandlerHost*>(this));
  74.     x_RegisterHandler(dynamic_cast<IEventHandler*>(&m_VertSelHandler), fQueryArea, &m_MatrixPane);
  75.    
  76.     m_Event.StandardConfig();
  77.         
  78.     x_Layout();
  79.     x_SetupAxes();
  80. }
  81. void    CPhyloTreePane::x_SetupAxes()
  82. {
  83.     m_TopRuler.SetHorizontal(true, CRuler::eTop);
  84.     m_RightRuler.SetHorizontal(false, CRuler::eRight);
  85. }
  86. TVPPoint CPhyloTreePane::GetPortSize(void)
  87. {
  88.     return TVPPoint(m_rcMatrix.Width(), m_rcMatrix.Height());
  89. }
  90. void CPhyloTreePane::SetWidget(CPhyloTreeWidget* pParent)
  91. {
  92.     m_pParent = pParent;
  93.     
  94.     if(m_pParent)   {
  95.         m_MatrixPane = x_GetParent()->GetPort();
  96.     }
  97. }
  98. void    CPhyloTreePane::resize(int x, int y, int w, int h)
  99. {
  100.     CGlPaneWidgetChild::resize(x, y, w, h);
  101.     x_Layout();
  102.     m_MatrixPane.SetViewport(m_rcMatrix);    
  103. }
  104. void    CPhyloTreePane::x_Render(void)
  105. {
  106.     glClearColor(m_BackColor.GetRed(), m_BackColor.GetGreen(), m_BackColor.GetBlue(), m_BackColor.GetAlpha());
  107.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    
  108.     // optional render background images    
  109.     x_RenderContent();
  110. }
  111. int CPhyloTreePane::x_HandleMouseRelease()
  112. {       
  113.     // popup event forwarding to renderer
  114.     if(m_Event.GetGUISignal() == CGUIEvent::ePopupSignal)   {                
  115.         IEventHandler * handle = dynamic_cast<IEventHandler*>(GetCurrRenderer());       
  116.         handle->handle(m_Event, m_MatrixPane);                   
  117.     }     
  118.     return CGlPaneWidgetChild::x_HandleMouseRelease();    
  119. }
  120. void    CPhyloTreePane::x_OnShowPopup()
  121. {    
  122.     x_GetParent()->OnShowPopup();
  123. }
  124. void    CPhyloTreePane::Update()
  125. {    
  126.     _ASSERT(x_GetParent());    
  127.     
  128.     if (m_CurrRenderer>=0 && x_GetParent() && x_GetParent()->GetDS()) {
  129.         GetCurrRenderer()->Layout(*x_GetParent()->GetDS());                
  130.         
  131.         // if size changed after calculation - correct it!
  132.         x_GetParent()->SetPortLimits(GetCurrRenderer()->GetRasterRect());               
  133.     }
  134. }
  135. const CPhyloTreePane::TRangeColl&     CPhyloTreePane::GetSubjectSelection() const
  136. {
  137.     return m_HorzSelHandler.GetSelection();
  138. }
  139. const CPhyloTreePane::TRangeColl&     CPhyloTreePane::GetQuerySelection() const
  140. {
  141.     return m_VertSelHandler.GetSelection();
  142. }
  143. void    CPhyloTreePane::x_Layout(void)
  144. {   
  145.     m_rcMatrix.Init(0,0,w(),h());
  146. }
  147. void    CPhyloTreePane::x_RenderContent(void)
  148. {
  149.     if(x_GetParent()) {
  150.         const CGlPane& VP = x_GetParent()->GetPort();
  151.         
  152.         // prepare CGlPanes
  153.         TModelRect rc_M = VP.GetModelLimitsRect();  
  154.         m_MatrixPane.SetModelLimitsRect(rc_M);    
  155.         TModelRect rc_V = VP.GetVisibleRect();        
  156.         m_MatrixPane.SetVisibleRect(rc_V);
  157.         // now rendering
  158.         x_RenderAxisAndGrid(m_MatrixPane);
  159.         //x_RenderSeqPanes();
  160.         if (m_CurrRenderer>=0  && m_CurrRenderer<m_Renderers.size()){
  161.             m_Renderers[m_CurrRenderer]->Render(m_MatrixPane, *x_GetParent()->GetDS());
  162.         }
  163.        // x_RenderSelHandler(true, m_MatrixPane, CLinearSelHandler::eActiveState);        
  164.         //x_RenderSelHandler(false, m_MatrixPane, CLinearSelHandler::eActiveState);
  165.         x_RenderMouseZoomHandler(m_MatrixPane);        
  166.     }
  167. }
  168. void    CPhyloTreePane::x_RenderAxisAndGrid(CGlPane& gr_pane)
  169. {
  170.     }
  171. void    CPhyloTreePane::x_RenderSeqPanes()
  172. {    
  173. }
  174. void    CPhyloTreePane::x_AdjsutToMasterPane(CGlPane& pane, bool b_model_x, bool b_model_y)
  175. {
  176.     const CGlPane& VP = x_GetParent()->GetPort();
  177.             
  178.     TModelRect rc_vis = VP.GetVisibleRect();
  179.     TModelRect rc_lim = VP.GetModelLimitsRect();  
  180.     // assuming that Viewport in the pane has been set properly
  181.     if(! b_model_x) { // adjust horz range to represent pixels
  182.         int max_x = pane.GetViewport().Width() - 1;
  183.         rc_lim.SetHorz(0, max_x);
  184.         rc_vis.SetHorz(0, max_x);
  185.     }
  186.     
  187.     if(! b_model_y) { // adjust vert range to represent pixels
  188.         int max_y = pane.GetViewport().Height() - 1;
  189.         rc_lim.SetVert(0, max_y);
  190.         rc_vis.SetVert(0, max_y);
  191.     }
  192.     pane.SetModelLimitsRect(rc_lim);    
  193.     pane.SetVisibleRect(rc_vis);
  194. }
  195. int     CPhyloTreePane::x_GetAreaByMousePos()
  196. {
  197.     int vp_x = Fl::event_x();
  198.     int vp_y = h() - Fl::event_y();
  199.     if(m_rcMatrix.PtInRect(vp_x, vp_y)) {
  200.         return fMatrixArea;
  201.     } else if(m_rcBottomSeq.PtInRect(vp_x, vp_y)) {
  202.         return fSubjectArea;
  203.     } else if(m_rcLeftSeq.PtInRect(vp_x, vp_y)) {
  204.         return fQueryArea;
  205.     }
  206.     return fOther;
  207. }
  208. void    CPhyloTreePane::x_RenderMouseZoomHandler(CGlPane& pane)
  209. {
  210.     glEnable(GL_BLEND);
  211.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  212.     m_MouseZoomHandler.Render(pane);
  213.     glDisable(GL_BLEND);
  214. }
  215. void    CPhyloTreePane::x_RenderSelHandler(bool b_horz, CGlPane& pane, CLinearSelHandler::ERenderingOption option)
  216. {
  217.     glEnable(GL_BLEND);
  218.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  219.     CLinearSelHandler& handler = b_horz ? m_HorzSelHandler : m_VertSelHandler;
  220.     handler.Render(pane, option);
  221.     glDisable(GL_BLEND);        
  222. }
  223. ////////////////////////////////////////////////////////////////////////////////
  224. /// IAlnMarkHandlerHost implementation
  225. TModelUnit  CPhyloTreePane::MZHH_GetScale(EScaleType type)
  226. {
  227.     const CGlPane& VP = x_GetParent()->GetPort();
  228.     switch(type)    {
  229.     case eCurrent:   return VP.GetScaleX();
  230.     case eMin: return VP.GetMinScaleX();
  231.     case eMax: return VP.GetZoomAllScaleX();
  232.     default: _ASSERT(false); return -1;
  233.     }
  234. }
  235. void    CPhyloTreePane::MZHH_SetScale(TModelUnit scale, const TModelPoint& point) 
  236. {
  237.     x_GetParent()->OnSetScaleXY(scale, point);    
  238. }
  239. void     CPhyloTreePane::MZHH_ZoomRect(const TModelRect& rc)
  240. {
  241.     x_GetParent()->ZoomRect(rc);
  242. }
  243. void     CPhyloTreePane::MZHH_Scroll(TModelUnit d_x, TModelUnit d_y)
  244. {
  245.     x_GetParent()->Scroll(d_x, d_y);
  246. }
  247. TVPUnit  CPhyloTreePane::MZHH_GetVPPosByY(int y) const
  248. {
  249.     return h() - 1  - y;
  250. }
  251. void    CPhyloTreePane::MZHH_Redraw(void)
  252. {
  253.     redraw();
  254. }
  255. TVPUnit  CPhyloTreePane::HMGH_GetVPPosByY(int y) const
  256. {
  257.     return h() - 1  - y;
  258. }
  259. void    CPhyloTreePane::HMGH_Redraw(void)
  260. {    
  261.     redraw();
  262. }
  263. ////////////////////////////////////////////////////////////////////////////////
  264. /// ISelHandlerHost implementation
  265. void CPhyloTreePane::SHH_Redraw()
  266. {
  267.     redraw();
  268. }
  269. TModelUnit  CPhyloTreePane::SHH_GetModelByWindow(int z, EOrientation orient)
  270. {
  271.     switch(orient)  {
  272.     case eHorz: return m_MatrixPane.UnProjectX(z);
  273.     case eVert: return m_MatrixPane.UnProjectY(h() - z);
  274.     default:    _ASSERT(false); return -1;
  275.     }
  276. }
  277. TVPUnit     CPhyloTreePane::SHH_GetWindowByModel(TModelUnit z, EOrientation orient)
  278. {
  279.     switch(orient)  {
  280.     case eHorz: return m_MatrixPane.ProjectX(z);
  281.     case eVert: return h() - m_MatrixPane.ProjectY(z);
  282.     default:    _ASSERT(false); return -1;
  283.     }
  284. }
  285. void CPhyloTreePane::AddRenderer(IPhyloTreeRenderer * renderer)
  286. {
  287.     renderer->SetFont(m_pLblFont);
  288.     m_Renderers.push_back(renderer);
  289.     
  290.     renderer->SetHost(static_cast<IPhyloTreeRendererHost*>(this));
  291.     if (m_CurrRenderer<0) SetCurrRendererIdx(0);     
  292. }
  293. void CPhyloTreePane::SetCurrRendererIdx(Int4 idx)
  294. {   
  295.     if (m_CurrRenderer != idx) {
  296.         x_UnregisterHandler(dynamic_cast<IEventHandler*>(GetCurrRenderer()));        
  297.         m_CurrRenderer = idx; 
  298.         x_RegisterHandler(dynamic_cast<IEventHandler*>(GetCurrRenderer()), fMatrixArea, &m_MatrixPane);    
  299.     }
  300. }
  301. int CPhyloTreePane::handle(int event)
  302. {    
  303.     m_Tooltip.Handle(event);
  304.     return CGlPaneWidgetChild::handle(event);
  305. }
  306. bool CPhyloTreePane::TC_NeedTooltip(int x, int y)
  307. {
  308.     return GetCurrRenderer()->TC_NeedTooltip(x, y);    
  309. }
  310. string  CPhyloTreePane::TC_GetTooltip(int& x, int& y, int& w, int& h)
  311. {
  312.     return GetCurrRenderer()->TC_GetTooltip(x, y, w, h);    
  313. }
  314. void  CPhyloTreePane::FireCBEvent(void)
  315. {
  316.     m_pParent->SendSelChangedEvent();
  317. }               
  318. END_NCBI_SCOPE
  319. /*
  320.  * ===========================================================================
  321.  * $Log: phylo_tree_pane.cpp,v $
  322.  * Revision 1000.2  2004/06/02 20:24:34  gouriano
  323.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.9
  324.  *
  325.  * Revision 1.9  2004/06/02 16:39:28  tereshko
  326.  * Fixed selections and popup behavior under windows
  327.  *
  328.  * Revision 1.8  2004/05/21 22:27:54  gorelenk
  329.  * Added PCH ncbi_pch.hpp
  330.  *
  331.  * Revision 1.7  2004/04/28 19:27:10  tereshko
  332.  * Added support for distances rendering
  333.  *
  334.  * Revision 1.6  2004/04/13 20:28:53  tereshko
  335.  * Numerous renderers improvements
  336.  *
  337.  * Revision 1.5  2004/03/30 17:11:44  tereshko
  338.  * Added support for events broadcasting
  339.  *
  340.  * Revision 1.4  2004/03/03 21:42:06  tereshko
  341.  * Added tooltips support
  342.  *
  343.  * Revision 1.3  2004/03/02 18:29:37  tereshko
  344.  * Added radial tree layout
  345.  *
  346.  * Revision 1.2  2004/02/13 21:18:58  tereshko
  347.  * Updated to implement new interface functions
  348.  *
  349.  * Revision 1.1  2004/02/13 17:05:05  tereshko
  350.  * Phylogenetic Tree Widget initial revision
  351.  *
  352.  * ===========================================================================
  353.  */