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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: algo_menu.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 20:43:37  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.28
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: algo_menu.cpp,v 1000.4 2004/06/01 20:43:37 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.  *    CAlgoMenuDataInternal -- Class to hold callback information necessary to spawn an
  39.  *                     algorithm plugin from an FLTK callback
  40.  *
  41.  *    CAlgoMenuMgr  -- Manager for dynamic FLTK algorithm plugin menu +
  42.  *                     callback data
  43.  */
  44. #include <ncbi_pch.hpp>
  45. #include <gui/core/idocument.hpp>
  46. #include <gui/core/doc_manager.hpp>
  47. #include <gui/core/algo.hpp>
  48. #include <gui/core/algo_menu.hpp>
  49. #include <gui/core/algo_factory.hpp>
  50. #include <gui/core/plugin_registry.hpp>
  51. #include <gui/core/plugin_utils.hpp>
  52. #include <gui/objutils/iselection.hpp>
  53. #include <gui/utils/message_box.hpp>
  54. #include <algorithm>
  55. BEGIN_NCBI_SCOPE
  56. USING_SCOPE(objects);
  57. //
  58. // internal class to manage algorithm pop-up menus
  59. // this is done to remove a header file dependency on plugin_handle.hpp
  60. //
  61. class CAlgoMenuDataInternal : public IAlgoMenuData
  62. {
  63. public:
  64.     CAlgoMenuDataInternal(const string& plugin, ISelection* sel_source);
  65.     virtual void DoCallback();
  66. private:
  67.     ISelection* m_SelSource;
  68.     string      m_Plugin;
  69. };
  70. //
  71. // default ctor for our base menu data class
  72. //
  73. CAlgoMenuDataInternal::CAlgoMenuDataInternal(const string& plugin,
  74.                                              ISelection* sel_source) 
  75.     : m_SelSource(sel_source),
  76.       m_Plugin(plugin)
  77. {
  78. }
  79. //
  80. // DoCallback() merely launches the plugin
  81. //
  82. void CAlgoMenuDataInternal::DoCallback()
  83. {
  84.     if ( m_Plugin.empty() ) {
  85.         return;
  86.     }
  87.     // make sure we supply a valid (even if empty) selection buffer
  88.     TConstScopedObjects objs;
  89.     m_SelSource->GetSelections(objs);
  90.     CSelectionBuffer empty_buf;
  91.     NON_CONST_ITERATE (TConstScopedObjects, iter, objs) {
  92.         const IDocument* doc = CDocManager::GetDocumentFromScope(*iter->scope);
  93.         if (doc) {
  94.             empty_buf.AddSelection(doc, *iter->object);
  95.         }
  96.     }
  97.     // now, call our plugin
  98.     CPluginUtils::CallPlugin(m_Plugin, eAlgoCommand_run, empty_buf);
  99. }
  100. //
  101. // default ctor for the view menu manager class
  102. //
  103. CAlgoMenuMgr::CAlgoMenuMgr(Fl_Menu_* menu, const string& base,
  104.                            ISelection* sel_source)
  105.     : CFltkMenuMgrBase<IAlgoMenuData>(menu)
  106.     , m_SelSource(sel_source)
  107. {
  108.     SetMenuBase(base);
  109. }
  110. //
  111. // Clear()
  112. // this clears the contents of our two submenus
  113. //
  114. void CAlgoMenuMgr::Clear()
  115. {
  116.     // Do our base class clear
  117.     x_ClearData();
  118.     if ( !m_Menu ) {
  119.         return;
  120.     }
  121.     // remove our managed sub-item rom the list
  122.     x_RemoveSubitems(m_Base);
  123. }
  124. //
  125. // AddAlgoMenu()
  126. // This adds a submenu for all possible plugins
  127. //
  128. void CAlgoMenuMgr::AddAlgoMenu()
  129. {
  130.     string menu_base = m_Base;
  131.     if ( !menu_base.empty() ) {
  132.         menu_base += "/";
  133.     }
  134.     CPluginRegistry::TPlugins plugins =
  135.         CPluginRegistry::GetPlugins(eAlgoCommand_run);
  136.     NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  137.         CPluginHandle plugin = *iter;
  138.         string s = plugin.GetMenuItem();
  139.         if ( !menu_base.empty() ) {
  140.             s = menu_base + s;
  141.         }
  142.         x_AddItem(s, new CAlgoMenuDataInternal(plugin.GetClassName(),
  143.                                                m_SelSource));
  144.     }
  145. }
  146. END_NCBI_SCOPE
  147. /*
  148.  * ===========================================================================
  149.  * $Log: algo_menu.cpp,v $
  150.  * Revision 1000.4  2004/06/01 20:43:37  gouriano
  151.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.28
  152.  *
  153.  * Revision 1.28  2004/05/21 22:27:40  gorelenk
  154.  * Added PCH ncbi_pch.hpp
  155.  *
  156.  * Revision 1.27  2004/05/03 12:48:46  dicuccio
  157.  * gui/utils --> gui/objutils where needed
  158.  *
  159.  * Revision 1.26  2004/04/16 14:36:49  dicuccio
  160.  * Use ISelection as selection source instead of passing selections in explicitly
  161.  *
  162.  * Revision 1.25  2003/12/22 19:18:31  dicuccio
  163.  * CSelectionBuffer::GetSelections() - dead API; use operator bool instead
  164.  *
  165.  * Revision 1.24  2003/11/06 20:06:29  dicuccio
  166.  * Moved USING_SCOPE(objects) to implementation files
  167.  *
  168.  * Revision 1.23  2003/10/23 16:15:12  dicuccio
  169.  * Removed dead code
  170.  *
  171.  * Revision 1.22  2003/09/30 13:39:42  dicuccio
  172.  * Removed spurious sort() after retrieving plugins - not needed
  173.  *
  174.  * Revision 1.21  2003/09/16 13:58:43  dicuccio
  175.  * Renamed interface base class for algo menu data
  176.  *
  177.  * Revision 1.20  2003/09/04 14:01:51  dicuccio
  178.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  179.  *
  180.  * Revision 1.19  2003/08/05 17:01:37  dicuccio
  181.  * General code clean-up.  REemoved unnecessary try/catch
  182.  *
  183.  * Revision 1.18  2003/07/21 19:26:48  dicuccio
  184.  * Changed data class interface from Run() to DoCallback() -- more descriptive.
  185.  * Modified all menu structures to accept a selection buffer; use selection
  186.  * buffers internally for all operations.  Fixed screening of plugins based on
  187.  * selection contents
  188.  *
  189.  * Revision 1.17  2003/07/14 11:00:12  shomrat
  190.  * Plugin messageing system related changes
  191.  *
  192.  * Revision 1.16  2003/06/30 20:04:04  dicuccio
  193.  * Fixed problem with odd crashing of plugins - changed menu data class to hold a
  194.  * copy of a plugin handle rather than a reference.
  195.  *
  196.  * Revision 1.15  2003/06/25 17:02:54  dicuccio
  197.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  198.  * implementation file.  Lots of #include file clean-ups.
  199.  *
  200.  * Revision 1.14  2003/05/30 14:15:41  dicuccio
  201.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  202.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  203.  * unresolved external and conflict with the Win32 API :(.
  204.  *
  205.  * Revision 1.13  2003/05/30 12:56:50  dicuccio
  206.  * Converted code to use MessageBox() instead of
  207.  * fl_ask()/fl_message()/fl_alert()
  208.  *
  209.  * Revision 1.12  2003/05/05 12:41:33  dicuccio
  210.  * Moved tools out of an explicit 'plugins' submenu
  211.  *
  212.  * Revision 1.11  2003/04/29 14:35:53  dicuccio
  213.  * Added interface function to retrieve algorithms based on contents of a
  214.  * IDocument.  Fully implemented screening of algorithms based on selection
  215.  * contents
  216.  *
  217.  * Revision 1.10  2003/04/19 01:52:57  ucko
  218.  * iterate -> ITERATE
  219.  *
  220.  * Revision 1.9  2003/04/16 18:18:50  dicuccio
  221.  * Modified algo menu to use generic plugin launch facility (CallPlugin())
  222.  *
  223.  * Revision 1.8  2003/03/31 13:41:11  dicuccio
  224.  * Added new ctor for CAlgoMenuDataInternal - initialize with just a plugin
  225.  * handle
  226.  *
  227.  * Revision 1.7  2003/03/25 13:09:26  dicuccio
  228.  * First implementation to add the plugin arguments dialog to query for user
  229.  * input
  230.  *
  231.  * Revision 1.6  2003/03/10 21:56:45  kuznets
  232.  * iterate -> ITERATE
  233.  *
  234.  * Revision 1.5  2003/02/24 13:03:14  dicuccio
  235.  * Renamed classes in plugin spec:
  236.  *     CArgSeg --> CPluginArgSet
  237.  *     CArgument --> CPluginArg
  238.  *     CPluginArgs --> CPluginCommand
  239.  *     CPluginCommands --> CPluginCommandSet
  240.  *
  241.  * Revision 1.4  2003/02/20 19:49:52  dicuccio
  242.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  243.  * over to use new plugin architecture.
  244.  *
  245.  * Revision 1.3  2003/01/13 13:10:05  dicuccio
  246.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  247.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  248.  *
  249.  * Revision 1.2  2003/01/10 17:33:07  dicuccio
  250.  * Changed TPluginList --> TPlugins
  251.  *
  252.  * Revision 1.1  2002/12/20 19:12:58  dicuccio
  253.  * Initial revision.
  254.  *
  255.  * ===========================================================================
  256.  */