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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: phylo_tree_widget.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/02 20:24:39  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: phylo_tree_widget.cpp,v 1000.2 2004/06/02 20:24:39 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 <gui/opengl/glfont.hpp>
  41. #include <gui/graph/igraph_utils.hpp>
  42. #include <gui/widgets/phylo_tree/phylo_tree_widget.hpp>
  43. #include <gui/widgets/fl/menu.hpp>
  44. #include <gui/widgets/fl/menu_window.hpp>
  45. #include <gui/types.hpp>
  46. #include <gui/utils/view_event.hpp>
  47. #include <list>
  48. #include <FL/Fl.H>
  49. BEGIN_NCBI_SCOPE
  50. USING_SCOPE(ncbi::objects);
  51. ////////////////////////////////////////////////////////////////////////////////
  52. /// class CPhyloTreeWidget
  53. CPhyloTreeWidget::CPhyloTreeWidget(int PosX, int PosY, int Width, int Height, const char* label)
  54. : CGlPaneWidget(PosX, PosY, Width, Height, label),
  55.   m_pDataSource(NULL),
  56.   m_pMatrixPane(NULL),
  57.   m_ScoreIndex(-1)
  58. {
  59.     // setup Port
  60.     m_Port.SetAdjustmentPolicy(CGlPane::fAdjustAll, CGlPane::fAdjustAll);
  61.     m_Port.SetMinScaleX(1 / 30.0); 
  62.     m_Port.SetMinScaleY(1 / 30.0);
  63.     
  64.     m_Port.SetOriginType(CGlPane::eOriginLeft, CGlPane::eOriginBottom);
  65.     m_Port.EnableZoom(true, true);
  66. }
  67. CPhyloTreeWidget::~CPhyloTreeWidget()
  68. {
  69. }
  70. BEGIN_CMD_MAP(CPhyloTreeWidget, CGlPaneWidget)    
  71.     ON_COMMAND(eCmdSetGraphType1, &CPhyloTreeWidget::OnSetGraphType1)
  72.     ON_COMMAND(eCmdSetGraphType2, &CPhyloTreeWidget::OnSetGraphType2)
  73.     ON_COMMAND(eCmdSetGraphType3, &CPhyloTreeWidget::OnSetGraphType3)
  74.     ON_COMMAND(eCmdSetGraphType4, &CPhyloTreeWidget::OnSetGraphType4)
  75.     ON_COMMAND(eCmdUseDistances,  &CPhyloTreeWidget::OnUseDistances)
  76.     
  77.     ON_UPDATE_COMMAND_UI(eCmdUseDistances, &CPhyloTreeWidget::OnUpdateUseDistances)
  78.     ON_UPDATE_COMMAND_UI(eCmdSetGraphType1, &CPhyloTreeWidget::OnUpdateSetGraphType1)
  79.     ON_UPDATE_COMMAND_UI(eCmdSetGraphType2, &CPhyloTreeWidget::OnUpdateSetGraphType2)
  80.     ON_UPDATE_COMMAND_UI(eCmdSetGraphType3, &CPhyloTreeWidget::OnUpdateSetGraphType3)
  81.     ON_UPDATE_COMMAND_UI(eCmdSetGraphType4, &CPhyloTreeWidget::OnUpdateSetGraphType4)
  82. END_CMD_MAP()
  83. // Events map
  84. EVENT_MAP_RX_BEGIN(CPhyloTreeWidget)
  85.     EVENT_ACCEPT(CViewEvent::eTreeSelectionChanged,  OnSelChangedEvent)
  86.     EVENT_ACCEPT(CViewEvent::eSelectionChanged,      OnSelChangedEvent)
  87. EVENT_MAP_RX_END
  88. void    CPhyloTreeWidget::OnShowPopup()
  89. {    
  90.     CMenuItem * pRootItem = new CMenuItem(CMenuItem::eSubmenu);
  91.     pRootItem->AddSubItem("Zoom In",  eCmdZoomIn);
  92.     pRootItem->AddSubItem("Zoom Out", eCmdZoomOut);
  93.     pRootItem->AddSubItem("Zoom All", eCmdZoomAll);   
  94.     (auto_ptr<CPopupMenu1>(new CPopupMenu1(Fl::event_x_root(), Fl::event_y_root(), pRootItem, this)))->Popup();            
  95. }
  96. void CPhyloTreeWidget::x_CreatePane()
  97. {
  98.     m_pMatrixPane = new CPhyloTreePane(0, 0, 0, 0);
  99.    
  100.     m_pMatrixPane->AddRenderer(new CPhyloRectCladogram());
  101.     m_pMatrixPane->AddRenderer(new CPhyloSlatedCladogram());
  102.     m_pMatrixPane->AddRenderer(new CPhyloRadial());
  103.     m_pMatrixPane->AddRenderer(new CPhyloForce());
  104.     
  105.     m_pMatrixPane->SetWidget(this);
  106. }
  107. CGlPaneWidgetChild*    CPhyloTreeWidget::x_GetPane()
  108. {
  109.     return static_cast<CGlPaneWidgetChild*>(m_pMatrixPane);
  110. }
  111. void    CPhyloTreeWidget::x_SetPortLimits()
  112. {
  113.     m_Port.SetModelLimitsRect(TModelRect(0,0, IPhyloTreeRenderer::GetDimX(), IPhyloTreeRenderer::GetDimY()));            
  114. }
  115. void   CPhyloTreeWidget::SetPortLimits(const TModelRect & rect)
  116. {
  117.     m_Port.SetModelLimitsRect(rect);  
  118.     m_Port.ZoomAll();  
  119. }
  120. void CPhyloTreeWidget::SetDataSource(CPhyloTreeDataSource* p_ds)
  121. {
  122.     m_pDataSource = p_ds;      
  123.     x_Update();
  124.     m_pMatrixPane->redraw();   
  125. }
  126. CPhyloTreeDataSource*  CPhyloTreeWidget::GetDS(void)
  127. {
  128.     return m_pDataSource;   
  129. }
  130. const CGlPane& CPhyloTreeWidget::GetPort(void) const
  131. {
  132.     return x_GetPort();
  133. }
  134. void    CPhyloTreeWidget::OnSetEqualScale()
  135. {
  136.     TModelUnit scale = min(m_Port.GetScaleX(), m_Port.GetScaleY());
  137.     m_Port.SetScale(scale, scale);
  138.     x_UpdateOnZoom();
  139. }
  140. void    CPhyloTreeWidget::OnSetGraphType1()
  141. {
  142.     SetCurrRenderer(0);    
  143. }
  144. void    CPhyloTreeWidget::OnSetGraphType2()
  145. {
  146.     SetCurrRenderer(1);    
  147. }
  148. void    CPhyloTreeWidget::OnSetGraphType3()
  149. {
  150.     SetCurrRenderer(2);    
  151. }
  152. void    CPhyloTreeWidget::OnSetGraphType4()
  153. {
  154.     SetCurrRenderer(3);    
  155. }
  156. void    CPhyloTreeWidget::OnUpdateSetGraphType1(ICmdUI* pCmdUI)
  157. {
  158.     pCmdUI->SetRadio(m_pMatrixPane->GetCurrRendererIdx()==0);     
  159. }
  160. void    CPhyloTreeWidget::OnUpdateSetGraphType2(ICmdUI* pCmdUI)
  161. {
  162.     pCmdUI->SetRadio(m_pMatrixPane->GetCurrRendererIdx()==1);
  163. }
  164. void    CPhyloTreeWidget::OnUpdateSetGraphType3(ICmdUI* pCmdUI)
  165. {
  166.     pCmdUI->SetRadio(m_pMatrixPane->GetCurrRendererIdx()==2);
  167. }
  168. void    CPhyloTreeWidget::OnUpdateSetGraphType4(ICmdUI* pCmdUI)
  169. {
  170.     pCmdUI->SetRadio(m_pMatrixPane->GetCurrRendererIdx()==3);
  171. }
  172. void    CPhyloTreeWidget::OnUseDistances()
  173. {
  174.    m_pMatrixPane->take_focus();
  175.    vector <IPhyloTreeRenderer*> vRend = m_pMatrixPane->GetRenderers();
  176.    for (vector <IPhyloTreeRenderer*>::iterator it=vRend.begin(); it!=vRend.end(); it++){   
  177.      (*it)->SetDistRendering(!(*it)->GetDistRendering());
  178.    }
  179.    x_Update();   
  180. }
  181. void    CPhyloTreeWidget::OnUpdateUseDistances(ICmdUI* pCmdUI)
  182. {
  183.     vector <IPhyloTreeRenderer*> vRend = m_pMatrixPane->GetRenderers();
  184.     if (vRend.size()>0){
  185.         pCmdUI->SetCheck((*vRend.begin())->GetDistRendering());
  186.     }
  187. }
  188. void    CPhyloTreeWidget::x_Update()
  189. {
  190.     x_SetPortLimits();
  191.     m_Port.ZoomAll();
  192.     x_UpdatePane();
  193.     x_UpdateScrollbars();
  194.     x_RedrawControls();
  195. }
  196. void    CPhyloTreeWidget::x_UpdatePane()
  197. {
  198.     m_pMatrixPane->Update();
  199. }
  200. void    CPhyloTreeWidget::OnSetScaleXY(TModelUnit scale_x, const TModelPoint& point)
  201. {
  202.     double ratio = m_Port.GetScaleY()/m_Port.GetScaleX();
  203.     m_Port.SetScaleRefPoint(scale_x, scale_x * ratio, point);    
  204.     x_UpdateOnZoom();
  205. }
  206. void    CPhyloTreeWidget::x_UpdateScrollbars()
  207. {
  208.     TModelRect rcAll = m_Port.GetModelLimitsRect();
  209.     TModelRect rcVisible = m_Port.GetVisibleRect();
  210.     
  211.     if (m_Port.NeedsScrollX()) { 
  212.         m_pScrollX->value((int) rcVisible.Left(), (int) rcVisible.Width(), 
  213.                           (int) rcAll.Left(), (int) rcAll.Width());
  214.     } else {
  215.         m_pScrollX->value(0, 0, 0, 0);
  216.     }
  217.     if (m_Port.NeedsScrollY()) {
  218.         m_pScrollY->value((int) (rcAll.Top() - rcVisible.Top()), (int) rcVisible.Height(), 
  219.                           (int) rcAll.Bottom(), (int) rcAll.Height());
  220.     } else {
  221.         m_pScrollY->value(0, 0, 0, 0);
  222.     }
  223. }
  224. void CPhyloTreeWidget::x_OnScrollX()
  225. {
  226.     int V = m_pScrollX->value();
  227.     double dX = V - m_Port.GetVisibleRect().Left();
  228.     m_Port.Scroll(dX, 0);
  229.     
  230.     x_RedrawControls(); //###
  231. }
  232. void CPhyloTreeWidget::x_OnScrollY()
  233. {
  234.     int V = m_pScrollY->value();
  235.     TModelRect rcAll = m_Port.GetModelLimitsRect();
  236.     double dY = rcAll.Top() - V - m_Port.GetVisibleRect().Top();
  237.     m_Port.Scroll(0, dY);
  238.     
  239.     x_RedrawControls();
  240. }
  241. void CPhyloTreeWidget::SetCurrRenderer(Int4 idx)
  242. {
  243.    m_pMatrixPane->take_focus();
  244.    m_pMatrixPane->SetCurrRendererIdx(idx); 
  245.    x_Update();   
  246. }
  247. vector<string>  CPhyloTreeWidget::GetRenderersNames(void)
  248. {
  249.     vector<string> retValue;
  250.     int size = m_pMatrixPane->GetRenderers().size();
  251.     for (Int4 i=0; i<size; i++) retValue.push_back(m_pMatrixPane->GetRenderers()[i]->GetDescription());
  252.     return retValue;
  253. }
  254. void  CPhyloTreeWidget :: SendSelChangedEvent()
  255. {
  256.       CObjectFor< vector<int>  > cobj;
  257.       cobj = m_pDataSource->GetSelectedIds();
  258.       CObjectFor< CPhyloTreeDataSource::TIds > csid;
  259.       csid = m_pDataSource->ConvertId2SeqId(m_pDataSource->GetSelectedIds());
  260.       // fire external event
  261.       FireEvent(CViewEvent::CreateEvent(CViewEvent::eSelectionChanged,  CViewEvent::eEventViews, CViewEvent::TEventObject(&csid), this)); 
  262.       // fire internal event
  263.       FireEvent(CViewEvent::CreateEvent(CViewEvent::eTreeSelectionChanged,  CViewEvent::eEventViews, CViewEvent::TEventObject(&cobj), this)); 
  264. }
  265. void  CPhyloTreeWidget :: OnSelChangedEvent(CViewEvent::TEventObject obj)
  266. {     
  267.     CObjectFor< vector<int> > * cobj = dynamic_cast< CObjectFor< vector<int> > *>(obj.GetPointer());
  268.     CObjectFor< CPhyloTreeDataSource::TIds > * csid = 
  269.                 dynamic_cast< CObjectFor< CPhyloTreeDataSource::TIds > *>(obj.GetPointer());
  270.     
  271.     if (cobj){
  272.         m_pMatrixPane->SetSelectedIDs(*cobj);    
  273.     }
  274.     else if (csid) {
  275.         m_pMatrixPane->SetSelectedIDs(m_pDataSource->ConvertSeqId2Id(*csid));    
  276.     }
  277. }    
  278. END_NCBI_SCOPE
  279. /*
  280.  * ===========================================================================
  281.  * $Log: phylo_tree_widget.cpp,v $
  282.  * Revision 1000.2  2004/06/02 20:24:39  gouriano
  283.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.17
  284.  *
  285.  * Revision 1.17  2004/06/02 16:39:28  tereshko
  286.  * Fixed selections and popup behavior under windows
  287.  *
  288.  * Revision 1.16  2004/05/21 22:27:54  gorelenk
  289.  * Added PCH ncbi_pch.hpp
  290.  *
  291.  * Revision 1.15  2004/05/20 15:30:18  tereshko
  292.  * Implemented support for new updates-driven menu
  293.  *
  294.  * Revision 1.14  2004/05/11 20:53:12  tereshko
  295.  * Work in progress
  296.  *
  297.  * Revision 1.13  2004/05/06 19:42:05  tereshko
  298.  * Added force layout
  299.  *
  300.  * Revision 1.12  2004/04/28 19:27:10  tereshko
  301.  * Added support for distances rendering
  302.  *
  303.  * Revision 1.11  2004/04/20 21:57:19  tereshko
  304.  * Major rendering, labeling and performance improvements
  305.  *
  306.  * Revision 1.10  2004/04/16 16:40:13  dicuccio
  307.  * Use typedef instead of raw STL container for IDs
  308.  *
  309.  * Revision 1.9  2004/04/13 20:28:53  tereshko
  310.  * Numerous renderers improvements
  311.  *
  312.  * Revision 1.8  2004/04/07 13:09:06  dicuccio
  313.  * Formatting changes.  Call redraw() on pane widget after updates.
  314.  *
  315.  * Revision 1.7  2004/04/02 16:21:24  yazhuk
  316.  * Replaced vector<CRef<>> with vector<CConstRef<>>
  317.  *
  318.  * Revision 1.6  2004/03/31 17:54:07  tereshko
  319.  * Changed selection broadcast for internal nodes
  320.  *
  321.  * Revision 1.5  2004/03/30 17:11:44  tereshko
  322.  * Added support for events broadcasting
  323.  *
  324.  * Revision 1.4  2004/03/02 18:29:38  tereshko
  325.  * Added radial tree layout
  326.  *
  327.  * Revision 1.3  2004/02/18 15:10:42  tereshko
  328.  * Added renderer switching handle
  329.  *
  330.  * Revision 1.2  2004/02/13 21:18:58  tereshko
  331.  * Updated to implement new interface functions
  332.  *
  333.  * Revision 1.1  2004/02/13 17:05:16  tereshko
  334.  * Phylogenetic Tree Widget initial revision
  335.  *
  336.  * ===========================================================================
  337.  */