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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: view_menu.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 20:44:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: view_menu.cpp,v 1000.4 2004/06/01 20:44:49 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  *    IViewMenuData -- Class to hold callback information necessary to spawn a
  39.  *                     view plugin from an FLTK callback
  40.  *
  41.  *    CNewViewMenuData      -- Class to hold / launch plugin to create a new
  42.  *                             view around a given document
  43.  *    CExistingViewMenuData -- Class to show a current view
  44.  *
  45.  *    CViewMenuMgr  -- Manager for dynamic FLTK view plugin menu + callback
  46.  *                     data
  47.  */
  48. #include <ncbi_pch.hpp>
  49. #include <gui/core/doc_manager.hpp>
  50. #include <gui/core/idocument.hpp>
  51. #include <gui/core/iview.hpp>
  52. #include <gui/core/plugin_registry.hpp>
  53. #include <gui/core/plugin_utils.hpp>
  54. #include <gui/core/selection_buffer.hpp>
  55. #include <gui/core/view_factory.hpp>
  56. #include <gui/core/view_menu.hpp>
  57. #include <gui/plugin/PluginArgSet.hpp>
  58. #include <gui/objutils/iselection.hpp>
  59. #include <gui/utils/message_box.hpp>
  60. BEGIN_NCBI_SCOPE
  61. USING_SCOPE(objects);
  62. //
  63. // concrete data class for new menus
  64. //
  65. class CNewViewMenuData : public IViewMenuData
  66. {
  67. public:
  68.     CNewViewMenuData(const string& plugin_name, ISelection* sel_source,
  69.                      const string& pool_name)
  70.         : IViewMenuData(),
  71.           m_Plugin(plugin_name),
  72.           m_SelSource(sel_source),
  73.           m_PoolName(pool_name)
  74.     {
  75.     }
  76.     //
  77.     // DoCallback()
  78.     // here we handle the meat of creating a new view
  79.     //
  80.     void DoCallback()
  81.     {
  82.         if ( m_Plugin.empty()  ) {
  83.             return;
  84.         }
  85.         TConstScopedObjects objs;
  86.         m_SelSource->GetSelections(objs);
  87.         CSelectionBuffer empty_buf;
  88.         NON_CONST_ITERATE (TConstScopedObjects, iter, objs) {
  89.             const IDocument* doc = CDocManager::GetDocumentFromScope(*iter->scope);
  90.             if (doc) {
  91.                 empty_buf.AddSelection(doc, *iter->object);
  92.             }
  93.         }
  94.         CPluginUtils::CallPlugin(m_Plugin, eViewCommand_new_view,
  95.                                  empty_buf, NULL, m_PoolName);
  96.     }
  97. private:
  98.     string m_Plugin;
  99.     string m_PoolName;
  100.     ISelection* m_SelSource;
  101. };
  102. //
  103. // concrete data class for existing views menu
  104. //
  105. class CExistingViewMenuData : public IViewMenuData
  106. {
  107. public:
  108.     CExistingViewMenuData(IView* view)
  109.         : IViewMenuData(),
  110.           m_View(view)
  111.     {
  112.     }
  113.     //
  114.     // DoCallback()
  115.     // here we handle the meat of showing a given view
  116.     //
  117.     void DoCallback()
  118.     {
  119.         if ( !m_View ) {
  120.             return;
  121.         }
  122.         m_View->Show();
  123.     }
  124. protected:
  125.     IView* m_View;
  126. };
  127. //
  128. // default ctor for the view menu manager class
  129. //
  130. CViewMenuMgr::CViewMenuMgr(Fl_Menu_* menu, const string& base,
  131.                            ISelection* sel_source,
  132.                            const string& pool_name)
  133.     : CFltkMenuMgrBase<IViewMenuData>(menu)
  134.     , m_PoolName(pool_name)
  135.     , m_SelSource(sel_source)
  136. {
  137.     SetMenuBase(base);
  138. }
  139. //
  140. // Clear()
  141. // this clears the contents of our two submenus
  142. //
  143. void CViewMenuMgr::Clear()
  144. {
  145.     // Do our base class clear
  146.     x_ClearData();
  147.     if ( !m_Menu ) {
  148.         return;
  149.     }
  150.     // we remove two sub-items - one for active views and one for new views
  151.     string base = m_Base;
  152.     if ( !base.empty() ) {
  153.         base += "/";
  154.     }
  155.     x_RemoveSubitems(base + "Current Views");
  156.     x_RemoveSubitems(base + "New View");
  157. }
  158. //
  159. // AddEmptyNewViews()
  160. // This adds an empty, non-selectable new views menu
  161. //
  162. void CViewMenuMgr::AddEmptyNewViews(const string& message)
  163. {
  164.     string base = m_Base;
  165.     if ( !base.empty() ) {
  166.         base += "/";
  167.     }
  168.     x_AddNullItem(base + "&New View/" + message);
  169. }
  170. //
  171. // AddEmptyActiveViews()
  172. // This adds an empty, non-selectable new views menu
  173. //
  174. void CViewMenuMgr::AddEmptyActiveViews(const string& message)
  175. {
  176.     string base = m_Base;
  177.     if ( !base.empty() ) {
  178.         base += "/";
  179.     }
  180.     x_AddNullItem(base + "&Current Views/" + message);
  181. }
  182. //
  183. // AddNewViews()
  184. // This will fill a menu with entries sufficient for creating new views for a
  185. // given document.  By default the menu itesm appear in the item
  186. // "(m_Base)/NewViews"
  187. //
  188. void CViewMenuMgr::AddNewViews()
  189. {
  190.     string menu_base = m_Base;
  191.     if ( !menu_base.empty() ) {
  192.         menu_base += "/";
  193.     }
  194.     menu_base += "New View/";
  195.     // determine what pool we live in
  196.     // if the pool name is empty, we create a new one
  197.     string pool_name(m_PoolName);
  198.     if (pool_name.empty()) {
  199.         static CAtomicCounter s_ac;
  200.         int id = s_ac.Add(1);
  201.         pool_name = "View Pool " + NStr::IntToString(id);
  202.     }
  203.     CPluginRegistry::TPlugins factories =
  204.         CPluginRegistry::GetPlugins(eViewCommand_new_view);
  205.     NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, factories) {
  206.         CPluginHandle plugin = *iter;
  207.         if ( !plugin ) {
  208.             continue;
  209.         }
  210.         string s = plugin.GetMenuItem();
  211.         if ( !menu_base.empty() ) {
  212.             s = menu_base + s;
  213.         }
  214.         x_AddItem(s, new CNewViewMenuData(plugin.GetClassName(), m_SelSource,
  215.                                           pool_name));
  216.     }
  217. }
  218. //
  219. // AddExistingViews()
  220. // This adds a submenu for the existing views for a given document
  221. //
  222. void CViewMenuMgr::AddActiveViews(IDocument* doc)
  223. {
  224.     if ( !doc ) {
  225.         return;
  226.     }
  227.     string menu_base = m_Base;
  228.     if ( !menu_base.empty() ) {
  229.         menu_base += "/";
  230.     }
  231.     menu_base += "Current Views/";
  232.     if (doc->GetViews().size()) {
  233.         NON_CONST_ITERATE (IDocument::TViews, iter, doc->SetViews()) {
  234.             IView* view = *iter;
  235.             if ( !view ) {
  236.                 continue;
  237.             }
  238.             string s = view->GetTitle();
  239.             if ( !menu_base.empty() ) {
  240.                 s = menu_base + s;
  241.             }
  242.             x_AddItem(s, new CExistingViewMenuData(view));
  243.         }
  244.     } else {
  245.         x_AddNullItem(menu_base + "(no views open)");
  246.     }
  247. }
  248. void CViewMenuMgr::AddActiveViews()
  249. {
  250.     string menu_base = m_Base;
  251.     if ( !menu_base.empty() ) {
  252.         menu_base += "/";
  253.     }
  254.     menu_base += "Current Views/";
  255.     NON_CONST_ITERATE (CDocManager::TDocList, doc_iter,
  256.                        CDocManager::GetDocuments()) {
  257.         IDocument* doc = *doc_iter;
  258.         string doc_base = menu_base + "/" + doc->GetShortTitle() + "/";
  259.         if (doc->GetViews().size()) {
  260.             NON_CONST_ITERATE (IDocument::TViews, iter, doc->SetViews()) {
  261.                 IView* view = *iter;
  262.                 if ( !view ) {
  263.                     continue;
  264.                 }
  265.                 string s = view->GetTitle();
  266.                 if ( !doc_base.empty() ) {
  267.                     s = doc_base + s;
  268.                 }
  269.                 x_AddItem(s, new CExistingViewMenuData(view));
  270.             }
  271.         } else {
  272.             x_AddNullItem(doc_base + "(no active views)");
  273.         }
  274.     }
  275. }
  276. END_NCBI_SCOPE
  277. /*
  278.  * ===========================================================================
  279.  * $Log: view_menu.cpp,v $
  280.  * Revision 1000.4  2004/06/01 20:44:49  gouriano
  281.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.31
  282.  *
  283.  * Revision 1.31  2004/05/21 22:27:41  gorelenk
  284.  * Added PCH ncbi_pch.hpp
  285.  *
  286.  * Revision 1.30  2004/05/20 12:28:20  dicuccio
  287.  * Adjusted names - Active Views --> Current Views
  288.  *
  289.  * Revision 1.29  2004/05/03 12:51:37  dicuccio
  290.  * Back out most of previous commit - inadvertent work-in-progress committed.
  291.  *
  292.  * Revision 1.28  2004/05/03 12:49:28  dicuccio
  293.  * gui/utils --> gui/objutils where needed
  294.  *
  295.  * Revision 1.27  2004/04/16 14:39:12  dicuccio
  296.  * Use ISelection as selection source instead of selection buffer
  297.  *
  298.  * Revision 1.26  2004/04/07 12:49:09  dicuccio
  299.  * Pass NULL for IReporter for views
  300.  *
  301.  * Revision 1.25  2003/12/31 20:27:57  dicuccio
  302.  * Deleted dead code
  303.  *
  304.  * Revision 1.24  2003/11/06 20:05:29  dicuccio
  305.  * Added handling of context parameter for view creation
  306.  *
  307.  * Revision 1.23  2003/09/29 15:42:05  dicuccio
  308.  * Deprecated gui/scope.hpp.  Merged gui/core/types.hpp into gui/types.hpp
  309.  *
  310.  * Revision 1.22  2003/09/16 14:02:32  dicuccio
  311.  * Renamed interface class for view menu data
  312.  *
  313.  * Revision 1.21  2003/09/04 14:01:51  dicuccio
  314.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  315.  *
  316.  * Revision 1.20  2003/08/05 17:07:15  dicuccio
  317.  * Changed calling semantics for the message queue - pass by reference, not
  318.  * CConstRef<>
  319.  *
  320.  * Revision 1.19  2003/07/21 19:26:48  dicuccio
  321.  * Changed data class interface from Run() to DoCallback() -- more descriptive.
  322.  * Modified all menu structures to accept a selection buffer; use selection
  323.  * buffers internally for all operations.  Fixed screening of plugins based on
  324.  * selection contents
  325.  *
  326.  * Revision 1.18  2003/07/14 11:01:35  shomrat
  327.  * Plugin messageing system related changes
  328.  *
  329.  * Revision 1.17  2003/06/25 17:02:55  dicuccio
  330.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  331.  * implementation file.  Lots of #include file clean-ups.
  332.  *
  333.  * Revision 1.16  2003/05/30 14:15:41  dicuccio
  334.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  335.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  336.  * unresolved external and conflict with the Win32 API :(.
  337.  *
  338.  * Revision 1.15  2003/05/30 12:56:50  dicuccio
  339.  * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert()
  340.  *
  341.  * Revision 1.14  2003/05/19 13:35:59  dicuccio
  342.  * Moved gui/core/plugin/ -> gui/plugin/.  Merged gui/core/algo, gui/core/doc/,
  343.  * and gui/core/view/ into one library (gui/core/)
  344.  *
  345.  * Revision 1.13  2003/05/06 15:56:57  dicuccio
  346.  * Removed unnecessary _TRACE().
  347.  *
  348.  * Revision 1.12  2003/05/05 12:43:22  dicuccio
  349.  * Added additional interface functions for creating view menus.
  350.  *
  351.  * Revision 1.11  2003/04/29 14:49:57  dicuccio
  352.  * Changed API for retrieving command-specific plugins
  353.  *
  354.  * Revision 1.10  2003/04/24 16:35:27  dicuccio
  355.  * Updated to reflect changes in IDocument API
  356.  *
  357.  * Revision 1.9  2003/04/16 18:23:45  dicuccio
  358.  * Modified menu callbacks to use generic plugin launch facility (CallPlugin())
  359.  *
  360.  * Revision 1.8  2003/03/10 23:06:13  kuznets
  361.  * iterate -> ITERATE
  362.  *
  363.  * Revision 1.7  2003/02/26 17:53:31  dicuccio
  364.  * Cleaned up the dynamic menus to make the dynamic menus resistant to menu
  365.  * refreshes while the menu callback is running
  366.  *
  367.  * Revision 1.6  2003/02/24 13:03:17  dicuccio
  368.  * Renamed classes in plugin spec:
  369.  *     CArgSeg --> CPluginArgSet
  370.  *     CArgument --> CPluginArg
  371.  *     CPluginArgs --> CPluginCommand
  372.  *     CPluginCommands --> CPluginCommandSet
  373.  *
  374.  * Revision 1.5  2003/02/20 19:49:57  dicuccio
  375.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  376.  * over to use new plugin architecture.
  377.  *
  378.  * Revision 1.4  2003/01/15 21:09:08  dicuccio
  379.  * Added private callback for handling dynamic view menu items
  380.  *
  381.  * Revision 1.3  2003/01/13 13:10:07  dicuccio
  382.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  383.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  384.  *
  385.  * Revision 1.2  2003/01/10 17:38:33  dicuccio
  386.  * Changed TPluginList --> TPlugins.  Added accessor for all available plugins.
  387.  *
  388.  * Revision 1.1  2002/12/20 19:20:07  dicuccio
  389.  * Initial revision.
  390.  *
  391.  * ===========================================================================
  392.  */