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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: view_phylo_tree.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:59:57  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: view_phylo_tree.cpp,v 1000.1 2004/06/01 20:59:57 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.  */
  40. #include <ncbi_pch.hpp>
  41. #include "view_phylo_tree.hpp"
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/core/version.hpp>
  44. #include <gui/plugin/PluginRequest.hpp>
  45. #include <gui/plugin/PluginCommand.hpp>
  46. #include <gui/plugin/PluginCommandSet.hpp>
  47. #include <gui/plugin/PluginInfo.hpp>
  48. #include <gui/plugin/PluginValue.hpp>
  49. #include <gui/objutils/utils.hpp>
  50. #include <gui/core/idocument.hpp>
  51. #include <gui/core/iview.hpp>
  52. #include <gui/core/view.hpp>
  53. #include <gui/core/view_menu.hpp>
  54. #include <gui/core/algo_menu.hpp>
  55. #include <gui/types.hpp>
  56. #include <serial/serialimpl.hpp>
  57. #include <algo/phy_tree/phy_tree_serial.hpp>
  58. #include <gui/widgets/phylo_tree/phylo_tree_reader.hpp>
  59. #include <serial/iterator.hpp>
  60. BEGIN_NCBI_SCOPE
  61. USING_SCOPE(objects);
  62. // We include the generated _.cpp file here.  This avoids a nasty bug in some
  63. // versions of gcc in which inline functions are not intantiated.
  64. #include "view_phylo_tree_.cpp"
  65. #define TRY_TO_USE_NEW_MENU_SYSTEM
  66. #ifdef TRY_TO_USE_NEW_MENU_SYSTEM
  67.     #define m_MenuBar m_MenuBarNew 
  68. #else 
  69.     #define m_MenuBar m_MenuBarOld 
  70. #endif
  71. // Events map
  72. EVENT_MAP_RX_BEGIN(CPhyloTreeView)
  73.     EVENT_FORWARD(CViewEvent::eSelectionChanged,  m_PhyloTree)
  74.     EVENT_FORWARD(CViewEvent::eTreeSelectionChanged, m_PhyloTree)
  75. EVENT_MAP_RX_END
  76. //
  77. // standard plugin announcement boilerplate
  78. //
  79. void CPhyloTreeView::GetInfo(CPluginInfo& info)
  80. {
  81.     info.Reset();
  82.     // version info macro
  83.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  84.                  string(__DATE__) + " " + string(__TIME__),
  85.                  "CPhyloTreeView",
  86.                  "Phylogenetic Tree Viewer",
  87.                  "Phylogenetic Tree Viewer", "");
  88.     // command info
  89.     CPluginCommandSet& cmds = info.SetCommands();
  90.     CPluginCommand&    args = cmds.AddViewCommand(eViewCommand_new_view);
  91.     args.AddArgument("tree", "Tree", CPhyTreeSerial::GetTypeInfo());
  92. }
  93. // addon to menuitem
  94. #define MENU_ITEM_RADIO(cmd, label) 
  95.     { CMenuItem::eItem, label, cmd, "", CMenuItem::eRadioItem}, 
  96. #define MENU_ITEM_RADIO_SET(cmd, label) 
  97.     { CMenuItem::eItem, label, cmd, "", CMenuItem::eRadioItem|CMenuItem::eSet}, 
  98. #define MENU_ITEM_CHECK(cmd, label) 
  99.     { CMenuItem::eItem, label, cmd, "", CMenuItem::eCheckItem}, 
  100. #define MENU_ITEM_CHECK_SET(cmd, label) 
  101.     { CMenuItem::eItem, label, cmd, "", CMenuItem::eCheckItem|CMenuItem::eSet}, 
  102. static
  103. DEFINE_MENU(Menu)
  104.     SUBMENU("Zoom")
  105.         MENU_ITEM(eCmdZoomIn, "Zoom In")
  106.         MENU_ITEM(eCmdZoomOut, "Zoom Out")
  107.         MENU_ITEM(eCmdZoomAll, "Zoom All")                
  108.     END_SUBMENU()
  109.     SUBMENU("Graph")       
  110.         MENU_ITEM_RADIO_SET(eCmdSetGraphType1, "Rectangle Cladogram")
  111.         MENU_ITEM_RADIO(eCmdSetGraphType2, "Slated Cladogram")   
  112.         MENU_ITEM_RADIO(eCmdSetGraphType3, "Radial Tree")
  113.         MENU_ITEM_RADIO(eCmdSetGraphType4, "Force Layout")
  114.         MENU_SEPARATOR()
  115.         MENU_ITEM_CHECK(eCmdUseDistances, "Distances Rendering")           
  116.     END_SUBMENU()
  117. END_MENU()
  118. CPhyloTreeView::CPhyloTreeView(const CPluginMessage& msg,
  119.                                const string& pool_name)
  120.     : CView()
  121. {
  122.     m_Window.reset(x_CreateWindow());
  123.     
  124.     m_MenuBar->SetItems(Menu);
  125.     m_MenuBar->SetCmdTarget(m_PhyloTree);
  126.        
  127. #ifdef TRY_TO_USE_NEW_MENU_SYSTEM    
  128.     int width, height;
  129.     this->GetSize(width, height);
  130.     height = m_MenuBar->GetPreferredSize().Y();    
  131.     m_MenuBar->size(width, height);    
  132.     m_MenuBar->position(0,0);    
  133. #endif
  134.     // set our core components
  135.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  136.     const CPluginArg& arg = args["tree"];
  137.     // extract tree from argument 
  138.     const CPhyTreeSerial *tree =
  139.         dynamic_cast<const CPhyTreeSerial *>(&args["tree"].AsObject());
  140.     if (!tree) {
  141.         throw runtime_error("CPhyloTreeView::Save: not a tree");
  142.     }
  143.     const IDocument* doc = arg.GetDocument();
  144.     if (tree  &&  doc) {
  145.         x_SetDocument(*doc);
  146.         m_DataSource.Reset(new CPhyloTreeDataSource());  
  147.         m_SeqIds    = tree->GetIds();
  148.         m_TreeData  = tree->GetTree();
  149.     }    
  150.     // create the view menu manager
  151. #ifndef TRY_TO_USE_NEW_MENU_SYSTEM
  152.     m_ViewMenuMgr.reset(new CViewMenuMgr(m_MenuBar, "View", this, pool_name));
  153. #endif
  154.     // setting host for sending events
  155.     m_PhyloTree->SetHost(this);
  156. }
  157. void CPhyloTreeView::OnDocumentChanged()
  158. {
  159.     if (!m_Document) {
  160.         return;
  161.     }
  162.     SetTitle(m_Document->GetShortTitle() + ": " + GetTitle());    
  163.     m_DataSource.Reset
  164.         (new CPhyloTreeDataSource(m_TreeData, m_SeqIds,
  165.                                   m_Document->GetScope()));
  166.     m_PhyloTree->SetDataSource(m_DataSource.GetPointer());     
  167.     
  168.     if ( !GetSelBuffer() ) {
  169.         ITERATE (vector< CConstRef<CSeq_id> >, iter, m_SeqIds) {
  170.             SetSelBuffer().AddSelection(GetDocument(), **iter);
  171.         }
  172.     }
  173. #ifndef TRY_TO_USE_NEW_MENU_SYSTEM
  174.     m_ViewMenuMgr->AddActiveViews(m_Document);
  175.     m_ViewMenuMgr->AddNewViews();//   (m_Document);    
  176. #endif
  177. }
  178. const string& CPhyloTreeView::GetTitle(void) const
  179. {
  180.     static string s_str("Phylogenetic Tree View");
  181.     return s_str;
  182. }
  183. void CPhyloTreeView::x_OnFileClose()
  184. {
  185.     Hide();
  186. }
  187. void CPhyloTreeView::x_OnZoomIn()
  188. {
  189.     m_PhyloTree->OnZoomIn();
  190. }
  191. void CPhyloTreeView::x_OnZoomOut()
  192. {
  193.     m_PhyloTree->OnZoomOut();
  194. }
  195. void CPhyloTreeView::x_OnZoomAll()
  196. {
  197.     m_PhyloTree->OnZoomAll();
  198. }
  199. void CPhyloTreeView::x_OnHelp()
  200. {
  201. }
  202. END_NCBI_SCOPE
  203. /*
  204.  * ===========================================================================
  205.  * $Log: view_phylo_tree.cpp,v $
  206.  * Revision 1000.1  2004/06/01 20:59:57  gouriano
  207.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.12
  208.  *
  209.  * Revision 1.12  2004/05/21 22:27:49  gorelenk
  210.  * Added PCH ncbi_pch.hpp
  211.  *
  212.  * Revision 1.11  2004/05/20 15:31:46  tereshko
  213.  * Implemented support for new updates-driven menu
  214.  *
  215.  * Revision 1.10  2004/05/06 19:44:36  tereshko
  216.  * Added force tree layout
  217.  *
  218.  * Revision 1.9  2004/05/03 17:52:53  dicuccio
  219.  * gui/utils --> gui/objutils where needed
  220.  *
  221.  * Revision 1.8  2004/04/28 19:29:22  tereshko
  222.  * Changed menu structure
  223.  *
  224.  * Revision 1.7  2004/04/16 14:45:29  dicuccio
  225.  * Code clean-up.  Use appropriate ISelection interface for dynamic menus
  226.  *
  227.  * Revision 1.6  2004/04/07 13:03:14  dicuccio
  228.  * Changed view API - require CPluginMessage instead of CPluginArgSet.  Changed name of phy tree variable to match its origin
  229.  *
  230.  * Revision 1.5  2004/04/02 16:46:12  yazhuk
  231.  * Added CScope argument to the Data Source constructor
  232.  *
  233.  * Revision 1.4  2004/03/30 17:12:52  tereshko
  234.  * Added support for events broadcasting
  235.  *
  236.  * Revision 1.3  2004/03/02 18:31:55  tereshko
  237.  * Added radial tree layout
  238.  *
  239.  * Revision 1.2  2004/02/18 15:11:59  tereshko
  240.  * Added renderer switching handle, corrected defines
  241.  *
  242.  * Revision 1.1  2004/02/17 23:45:52  tereshko
  243.  * Phylogenetic tree viewer plugin. Initial revision.
  244.  *
  245.  * Revision 1.4  2004/02/12 21:08:31  yazhuk
  246.  * Reorganized menu and added new commands
  247.  *
  248.  * Revision 1.3  2004/01/15 20:53:16  yazhuk
  249.  * Renamed m_Menu to m_MenuBar, added menu definition and menu setup code
  250.  *
  251.  * Revision 1.2  2003/12/22 19:33:15  dicuccio
  252.  * Lots of changes.  Changed to match new APIs in IView.  Added better handling of messages received from other views
  253.  *
  254.  * Revision 1.1  2003/12/05 20:06:05  yazhuk
  255.  * Initial revision
  256.  *
  257.   * ===========================================================================
  258.  */