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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: dload_menu.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:43:46  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: dload_menu.cpp,v 1000.3 2004/06/01 20:43:46 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.  *    CDLoadMenuData_Impl -- Abstract class to hold callback information
  39.  *                          necessary to spawn a document / data loader plugin
  40.  *                          from an FLTK callback
  41.  *
  42.  *    COpenMenuData      -- Class to hold / launch plugin to open a new
  43.  *                          document
  44.  *    CImportMenuData    -- Class to hold / launch plugin to import data into
  45.  *                          an existing record
  46.  *    CSaveAsMenuData    -- Class to hold / launch plugin to save the current
  47.  *                          record
  48.  *    CUnloadMenuData    -- Class to unload a document from memory
  49.  *
  50.  *    CDocLoaderMenuMgr  -- Manager for dynamic FLTK document laoder plugin
  51.  *                          menu + callback data
  52.  */
  53. #include <ncbi_pch.hpp>
  54. #include <gui/plugin/PluginMessage.hpp>
  55. #include <gui/plugin/PluginMRUList.hpp>
  56. #include <gui/plugin/PluginMRUEntry.hpp>
  57. #include <gui/core/dload_factory.hpp>
  58. #include <gui/core/dload_menu.hpp>
  59. #include <gui/core/doc_manager.hpp>
  60. #include <gui/core/idocument.hpp>
  61. #include <gui/core/plugin_registry.hpp>
  62. #include <gui/core/plugin_utils.hpp>
  63. #include <gui/core/plugin_handle.hpp>
  64. #include <gui/core/plugin_dlg.hpp>
  65. #include <gui/utils/message_box.hpp>
  66. BEGIN_NCBI_SCOPE
  67. USING_SCOPE(objects);
  68. //
  69. // internal base class used by suclasses.  This class exists to keep
  70. // CPluginHandle private within the context of this header.
  71. //
  72. class CDLoadMenuData_Impl : public IDLoadMenuData
  73. {
  74. public:
  75.     //CDLoadMenuData_Impl(CPluginHandle plugin);
  76.     CDLoadMenuData_Impl(const string& plugin_name);
  77.     virtual ~CDLoadMenuData_Impl() {}
  78. protected:
  79.     string        m_Plugin;
  80. };
  81. //
  82. // concrete data class for loading new documents
  83. //
  84. class COpenMenuData : public CDLoadMenuData_Impl
  85. {
  86. public:
  87.     COpenMenuData(const string& plugin)
  88.         : CDLoadMenuData_Impl(plugin)
  89.     {
  90.     }
  91.     COpenMenuData(CPluginHandle plugin)
  92.         : CDLoadMenuData_Impl(plugin.GetClassName())
  93.     {
  94.     }
  95.     //
  96.     // DoCallback()
  97.     // here we handle the meat of creating a new view
  98.     //
  99.     void DoCallback()
  100.     {
  101.         if ( m_Plugin.empty() ) {
  102.             return;
  103.         }
  104.         // we create a dummy selection buffer to hold our single document
  105.         CPluginUtils::CallPlugin(m_Plugin, eDataCommand_load);
  106.     }
  107. };
  108. class COpenMenuDataEx : public IDLoadMenuData
  109. {
  110. public:
  111.     COpenMenuDataEx()
  112.     {
  113.     }
  114.     //
  115.     // DoCallback()
  116.     // here we handle the meat of creating a new view
  117.     //
  118.     void DoCallback()
  119.     {
  120.         if ( !m_Dlg.get() ) {
  121.             m_Dlg.reset(new CPluginDlg(eDataCommand_load));
  122.         }
  123.         m_Dlg->Show();
  124.     }
  125. private:
  126.     auto_ptr<CPluginDlg> m_Dlg;
  127. };
  128. //
  129. // concrete data class for loading new documents
  130. //
  131. class CSearchMenuData : public CDLoadMenuData_Impl
  132. {
  133. public:
  134.     CSearchMenuData(const string& plugin)
  135.         : CDLoadMenuData_Impl(plugin)
  136.     {
  137.     }
  138.     CSearchMenuData(CPluginHandle plugin)
  139.         : CDLoadMenuData_Impl(plugin.GetClassName())
  140.     {
  141.     }
  142.     //
  143.     // DoCallback()
  144.     // here we handle the meat of creating a new view
  145.     //
  146.     void DoCallback()
  147.     {
  148.         if ( m_Plugin.empty() ) {
  149.             return;
  150.         }
  151.         CPluginUtils::CallPlugin(m_Plugin, eDataCommand_search);
  152.     }
  153. };
  154. //
  155. // concrete data class for loading new documents
  156. //
  157. class CManageMenuData : public CDLoadMenuData_Impl
  158. {
  159. public:
  160.     CManageMenuData(const string& plugin)
  161.         : CDLoadMenuData_Impl(plugin)
  162.     {
  163.     }
  164.     CManageMenuData(CPluginHandle plugin)
  165.         : CDLoadMenuData_Impl(plugin.GetClassName())
  166.     {
  167.     }
  168.     //
  169.     // DoCallback()
  170.     // here we handle the meat of creating a new view
  171.     //
  172.     void DoCallback()
  173.     {
  174.         if ( m_Plugin.empty() ) {
  175.             return;
  176.         }
  177.         CPluginUtils::CallPlugin(m_Plugin, eDataCommand_manage);
  178.     }
  179. };
  180. //
  181. // concrete data class for importing into current documents
  182. //
  183. class CImportMenuData : public CDLoadMenuData_Impl
  184. {
  185. public:
  186.     CImportMenuData(CPluginHandle plugin, IDocument* doc)
  187.         : CDLoadMenuData_Impl(plugin.GetClassName()),
  188.           m_Doc(doc)
  189.     {
  190.     }
  191.     //
  192.     // DoCallback()
  193.     // here we handle the meat of creating a new view
  194.     //
  195.     void DoCallback()
  196.     {
  197.         if ( m_Plugin.empty()  ||  !m_Doc ) {
  198.             return;
  199.         }
  200.         CPluginUtils::CallPlugin(m_Plugin, eDataCommand_import, m_Doc);
  201.     }
  202. private:
  203.     IDocument* m_Doc;
  204. };
  205. //
  206. // concrete data class for saving current documents
  207. //
  208. class CSaveMenuData : public CDLoadMenuData_Impl
  209. {
  210. public:
  211.     CSaveMenuData(const string& plugin_name, IDocument* doc)
  212.         : CDLoadMenuData_Impl(plugin_name),
  213.           m_Doc(doc)
  214.     {
  215.     }
  216.     
  217.     CSaveMenuData(CPluginHandle plugin, IDocument* doc)
  218.         : CDLoadMenuData_Impl(plugin.GetClassName()),
  219.           m_Doc(doc)
  220.     {
  221.     }
  222.     
  223.     //
  224.     // DoCallback()
  225.     // here we handle the meat of creating a new view
  226.     //
  227.     void DoCallback()
  228.     {
  229.         if ( m_Plugin.empty()  ||  !m_Doc ) {
  230.             return;
  231.         }
  232.         CPluginUtils::CallPlugin(m_Plugin, eDataCommand_save, m_Doc);
  233.     }
  234. private:
  235.     IDocument* m_Doc;
  236. };
  237. //
  238. // concrete data class for unloading documents
  239. //
  240. class CUnloadMenuData : public CDLoadMenuData_Impl
  241. {
  242. public:
  243.     CUnloadMenuData(IDocument* doc)
  244.         : CDLoadMenuData_Impl(kEmptyStr),
  245.           m_Doc(doc)
  246.     {
  247.     }
  248.     //
  249.     // DoCallback()
  250.     // here we handle the meat of creating a new view
  251.     //
  252.     void DoCallback()
  253.     {
  254.         if ( !m_Doc ) {
  255.             return;
  256.         }
  257.         if (CDocManager::ReleaseDocument(m_Doc)) {
  258.             m_Doc = NULL;
  259.         }
  260.     }
  261. private:
  262.     IDocument* m_Doc;
  263. };
  264. //
  265. // concrete data class for most recently used documents
  266. //
  267. class CRecentMenuData : public CDLoadMenuData_Impl
  268. {
  269. public:
  270.     CRecentMenuData(CPluginMessage& msg)
  271.         : CDLoadMenuData_Impl(kEmptyStr),
  272.           m_Msg(&msg)
  273.     {
  274.     }
  275.     //
  276.     // DoCallback()
  277.     // here we handle the meat of creating a new view
  278.     //
  279.     void DoCallback()
  280.     {
  281.         if ( !m_Msg ) {
  282.             return;
  283.         }
  284.         CPluginUtils::CallPlugin(*m_Msg);
  285.     }
  286. private:
  287.     CPluginMessage* m_Msg;
  288. };
  289. //
  290. // default ctor for our base menu data class
  291. //
  292. CDLoadMenuData_Impl::CDLoadMenuData_Impl(const string& plugin_name)
  293.     : m_Plugin(plugin_name)
  294. {
  295. }
  296. //
  297. // default ctor for the view menu manager class
  298. //
  299. CDocLoaderMenuMgr::CDocLoaderMenuMgr(Fl_Menu_* menu, const string& base)
  300.     : CFltkMenuMgrBase<IDLoadMenuData>(menu)
  301. {
  302.     SetMenuBase(base);
  303. }
  304. //
  305. // Clear()
  306. // this clears the contents of our two submenus
  307. //
  308. void CDocLoaderMenuMgr::Clear()
  309. {
  310.     // Do our base class clear
  311.     x_ClearData();
  312.     if ( !m_Menu ) {
  313.         return;
  314.     }
  315.     string base = m_Base;
  316.     if ( !base.empty() ) {
  317.         base += "/";
  318.     }
  319.     x_RemoveSubitems(base + "Open");
  320.     x_RemoveSubitems(base + "Import");
  321.     x_RemoveSubitems(base + "Save as");
  322.     x_RemoveSubitems(base + "Unload");
  323.     x_RemoveSubitems(base + "Recent Documents");
  324. }
  325. //
  326. // AddOpenMenu()
  327. // This fills out a new menu to hold the 
  328. //
  329. void CDocLoaderMenuMgr::AddOpenMenu()
  330. {
  331.     string menu_base = m_Base;
  332.     if ( !menu_base.empty() ) {
  333.         menu_base += "/";
  334.     }
  335.     menu_base += "Open";
  336. #if 0
  337.     x_AddItem(menu_base, new COpenMenuDataEx());
  338. #else
  339.     int items_added = 0;
  340.     CPluginRegistry::TPlugins plugins =
  341.         CPluginRegistry::GetPlugins(CPluginCommandSet::e_Data);
  342.     NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  343.         // verify that we support the 'load' command
  344.         CPluginHandle plugin = *iter;
  345.         if ( !plugin.HasCommandSubtype(eDataCommand_load) ) {
  346.             continue;
  347.         }
  348.         string s = plugin.GetMenuItem();
  349.         if ( !menu_base.empty() ) {
  350.             s = menu_base + s;
  351.         }
  352.         x_AddItem(s, new COpenMenuData(plugin.GetClassName()));
  353.         ++items_added;
  354.     }
  355.     if (items_added == 0) {
  356.         x_AddNullItem(menu_base + "(no plugins loaded)");
  357.     }
  358. #endif
  359. }
  360. //
  361. // AddRecentMenu()
  362. // This fills out a new menu to hold the 
  363. //
  364. void CDocLoaderMenuMgr::AddRecentMenu()
  365. {
  366.     string menu_base = m_Base;
  367.     if ( !menu_base.empty() ) {
  368.         menu_base += "/";
  369.     }
  370.     menu_base += "Recent Documents/";
  371.     int items_added = 0;
  372.     ITERATE (CPluginMRUList::Tdata, iter, CDocManager::GetMRUCache().Get()) {
  373.         ++items_added;
  374.         CRef<CPluginMRUEntry> entry = *iter;
  375.         string s = menu_base + "&" +
  376.             NStr::IntToString(items_added) + " " + entry->GetLabel();
  377.         x_AddItem(s, new CRecentMenuData(entry->SetMessage()));
  378.     }
  379.     if (items_added == 0) {
  380.         x_AddNullItem(menu_base + "(no plugins loaded)");
  381.     }
  382. }
  383. //
  384. // AddImportMenu()
  385. // This fills out a dynamic menu for importing into a given document.  If the
  386. // parameter 'doc' is NULL, then a menu is produced for importing into every
  387. // loaded document.
  388. //
  389. void CDocLoaderMenuMgr::AddImportMenu(IDocument* doc)
  390. {
  391.     string menu_base = m_Base;
  392.     if ( !menu_base.empty() ) {
  393.         menu_base += "/";
  394.     }
  395.     menu_base += "Import/";
  396.     int items_added = 0;
  397.     if (doc) {
  398.         // we add an import menu for this document only
  399.         CPluginRegistry::TPlugins plugins =
  400.             CPluginRegistry::GetPlugins(eDataCommand_import, doc);
  401.         NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  402.             // verify that we support the 'load' command
  403.             CPluginHandle plugin = *iter;
  404.             string s = plugin.GetMenuItem();
  405.             if ( !menu_base.empty() ) {
  406.                 s = menu_base + s;
  407.             }
  408.             x_AddItem(s, new CImportMenuData(plugin, doc));
  409.             ++items_added;
  410.         }
  411.     } else if (CDocManager::GetDocuments().size() != 0) {
  412.         // we add an import menu for all documents
  413.         NON_CONST_ITERATE (CDocManager::TDocList, doc_iter,
  414.                            CDocManager::GetDocuments()) {
  415.             doc = *doc_iter;
  416.             if ( !doc ) {
  417.                 continue;
  418.             }
  419.             string base = menu_base + doc->GetShortTitle();
  420.             CPluginRegistry::TPlugins plugins =
  421.                 CPluginRegistry::GetPlugins(eDataCommand_import, doc);
  422.             NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  423.                 // verify that we support the 'load' command
  424.                 CPluginHandle plugin = *iter;
  425.                 string s = plugin.GetMenuItem();
  426.                 if ( !base.empty() ) {
  427.                     s = base + "/" + s;
  428.                 }
  429.                 x_AddItem(s, new CImportMenuData(plugin, doc));
  430.                 ++items_added;
  431.             }
  432.         }
  433.     }
  434.     if (items_added == 0) {
  435.         x_AddNullItem(menu_base + "(no records loaded)");
  436.     }
  437. }
  438. //
  439. // AddSearchMenu()
  440. // This fills out a new menu to hold the 
  441. //
  442. void CDocLoaderMenuMgr::AddSearchMenu()
  443. {
  444.     string menu_base = m_Base;
  445.     if ( !menu_base.empty() ) {
  446.         menu_base += "/";
  447.     }
  448.     menu_base += "Search/";
  449.     int items_added = 0;
  450.     CPluginRegistry::TPlugins plugins =
  451.         CPluginRegistry::GetPlugins(CPluginCommandSet::e_Data);
  452.     NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  453.         // verify that we support the 'load' command
  454.         CPluginHandle plugin = *iter;
  455.         if ( !plugin.HasCommandSubtype(eDataCommand_search) ) {
  456.             continue;
  457.         }
  458.         string s = plugin.GetMenuItem();
  459.         if ( !menu_base.empty() ) {
  460.             s = menu_base + s;
  461.         }
  462.         x_AddItem(s, new CSearchMenuData(plugin.GetClassName()));
  463.         ++items_added;
  464.     }
  465.     if (items_added == 0) {
  466.         x_AddNullItem(menu_base + "(no plugins loaded)");
  467.     }
  468. }
  469. //
  470. // AddManageMenu()
  471. // This fills out a new menu to hold the 
  472. //
  473. void CDocLoaderMenuMgr::AddManageMenu()
  474. {
  475.     string menu_base = m_Base;
  476.     if ( !menu_base.empty() ) {
  477.         menu_base += "/";
  478.     }
  479.     menu_base += "Manage Data Sources/";
  480.     int items_added = 0;
  481.     CPluginRegistry::TPlugins plugins =
  482.         CPluginRegistry::GetPlugins(CPluginCommandSet::e_Data);
  483.     NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  484.         // verify that we support the 'load' command
  485.         CPluginHandle plugin = *iter;
  486.         if ( !plugin.HasCommandSubtype(eDataCommand_manage) ) {
  487.             continue;
  488.         }
  489.         string s = plugin.GetMenuItem();
  490.         if ( !menu_base.empty() ) {
  491.             s = menu_base + s;
  492.         }
  493.         x_AddItem(s, new CManageMenuData(plugin.GetClassName()));
  494.         ++items_added;
  495.     }
  496.     if (items_added == 0) {
  497.         x_AddNullItem(menu_base + "(no plugins loaded)");
  498.     }
  499. }
  500. //
  501. // AddSaveAsMenu()
  502. // This fills out a dynamic menu for saving a given document.  If the
  503. // parameter 'doc' is NULL, then a menu is produced for saving every
  504. // loaded document.
  505. //
  506. void CDocLoaderMenuMgr::AddSaveAsMenu(IDocument* doc)
  507. {
  508.     string menu_base = m_Base;
  509.     if ( !menu_base.empty() ) {
  510.         menu_base += "/";
  511.     }
  512.     menu_base += "Save as/";
  513.     int items_added = 0;
  514.     if (doc) {
  515.         // we add an import menu for this document only
  516.         CPluginRegistry::TPlugins plugins =
  517.             CPluginRegistry::GetPlugins(eDataCommand_save, doc);
  518.         NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  519.             // verify that we support the 'save' command
  520.             CPluginHandle plugin = *iter;
  521.             string s = plugin.GetMenuItem();
  522.             if ( !menu_base.empty() ) {
  523.                 s = menu_base + s;
  524.             }
  525.             x_AddItem(s, new CSaveMenuData(plugin, doc));
  526.             ++items_added;
  527.         }
  528.     } else if (CDocManager::GetDocuments().size() != 0) {
  529.         // we add an import menu for all documents
  530.         NON_CONST_ITERATE (CDocManager::TDocList, doc_iter,
  531.                            CDocManager::GetDocuments()) {
  532.             doc = *doc_iter;
  533.             if ( !doc ) {
  534.                 continue;
  535.             }
  536.             string base = menu_base + doc->GetShortTitle();
  537.             CPluginRegistry::TPlugins plugins =
  538.                 CPluginRegistry::GetPlugins(eDataCommand_save, doc);
  539.             NON_CONST_ITERATE (CPluginRegistry::TPlugins, iter, plugins) {
  540.                 // verify that we support the 'save' command
  541.                 CPluginHandle plugin = *iter;
  542.                 string s = plugin.GetMenuItem();
  543.                 if ( !base.empty() ) {
  544.                     s = menu_base + s;
  545.                 }
  546.                 x_AddItem(s, new CSaveMenuData(plugin, doc));
  547.                 ++items_added;
  548.             }
  549.         }
  550.     }
  551.     if (items_added == 0) {
  552.         x_AddNullItem(menu_base + "(no records loaded)");
  553.     }
  554. }
  555. //
  556. // AddUnloadMenu()
  557. // This produces a menu for explicitly unloading a given document
  558. //
  559. void CDocLoaderMenuMgr::AddUnloadMenu(IDocument* doc)
  560. {
  561.     string menu_base = m_Base;
  562.     if ( !menu_base.empty() ) {
  563.         menu_base += "/";
  564.     }
  565.     menu_base += "Unload/";
  566.     int items_added = 0;
  567.     if (doc) {
  568.         // we add an import menu for this document only
  569.         x_AddItem(menu_base, new CUnloadMenuData(doc));
  570.         ++items_added;
  571.     } else if (CDocManager::GetDocuments().size() != 0) {
  572.         // we add an import menu for all documents
  573.         NON_CONST_ITERATE (CDocManager::TDocList, doc_iter,
  574.                            CDocManager::GetDocuments()) {
  575.             doc = *doc_iter;
  576.             if ( !doc ) {
  577.                 continue;
  578.             }
  579.             string s = menu_base + doc->GetShortTitle();
  580.             x_AddItem(s, new CUnloadMenuData(*doc_iter));
  581.             ++items_added;
  582.         }
  583.     }
  584.     if (items_added == 0) {
  585.         x_AddNullItem(menu_base + "(no records loaded)");
  586.     }
  587. }
  588. END_NCBI_SCOPE
  589. /*
  590.  * ===========================================================================
  591.  * $Log: dload_menu.cpp,v $
  592.  * Revision 1000.3  2004/06/01 20:43:46  gouriano
  593.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.30
  594.  *
  595.  * Revision 1.30  2004/06/01 18:38:35  dicuccio
  596.  * Fixed multiple definition compiler error
  597.  *
  598.  * Revision 1.29  2004/06/01 18:01:58  dicuccio
  599.  * Updated to match new API in CDocManager.  Added commented-out implementation of
  600.  * new plugin options dialog
  601.  *
  602.  * Revision 1.28  2004/05/21 22:27:40  gorelenk
  603.  * Added PCH ncbi_pch.hpp
  604.  *
  605.  * Revision 1.27  2004/05/18 15:06:15  friedman
  606.  * Removed included tha does not exist
  607.  *
  608.  * Revision 1.26  2004/05/18 11:13:24  friedman
  609.  * Handle adding recently loaded documents into the MRU list.
  610.  *
  611.  * Revision 1.25  2004/04/16 14:37:10  dicuccio
  612.  * Drop unneeded selection buffer parameter
  613.  *
  614.  * Revision 1.24  2003/11/06 20:06:29  dicuccio
  615.  * Moved USING_SCOPE(objects) to implementation files
  616.  *
  617.  * Revision 1.23  2003/10/27 17:36:38  dicuccio
  618.  * Removed #include for pld request status enum
  619.  *
  620.  * Revision 1.22  2003/09/16 13:59:00  dicuccio
  621.  * Code clean-up.  Renamed interface class for doc loader menu data
  622.  *
  623.  * Revision 1.21  2003/09/04 14:01:51  dicuccio
  624.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  625.  *
  626.  * Revision 1.20  2003/08/04 17:29:42  dicuccio
  627.  * Changed menu signature for manage to 'Manage Data Sources'
  628.  *
  629.  * Revision 1.19  2003/07/31 16:53:21  dicuccio
  630.  * Added implementations for search / manage plugin commands
  631.  *
  632.  * Revision 1.18  2003/07/21 19:26:48  dicuccio
  633.  * Changed data class interface from Run() to DoCallback() -- more descriptive.
  634.  * Modified all menu structures to accept a selection buffer; use selection
  635.  * buffers internally for all operations.  Fixed screening of plugins based on
  636.  * selection contents
  637.  *
  638.  * Revision 1.17  2003/07/14 11:00:22  shomrat
  639.  * Plugin messageing system related changes
  640.  *
  641.  * Revision 1.16  2003/06/25 17:02:54  dicuccio
  642.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  643.  * implementation file.  Lots of #include file clean-ups.
  644.  *
  645.  * Revision 1.15  2003/05/30 14:15:41  dicuccio
  646.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  647.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  648.  * unresolved external and conflict with the Win32 API :(.
  649.  *
  650.  * Revision 1.14  2003/05/30 12:56:50  dicuccio
  651.  * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert()
  652.  *
  653.  * Revision 1.13  2003/04/29 14:36:49  dicuccio
  654.  * Fully implemented screening of plugins based on selection content - updated
  655.  * API to match
  656.  *
  657.  * Revision 1.12  2003/04/24 16:26:32  dicuccio
  658.  * Plugins are now responsible for marshalling documents (not the framework's
  659.  * function).  Also, fixed given API changes to IDocument
  660.  *
  661.  * Revision 1.11  2003/04/16 18:19:20  dicuccio
  662.  * Modified menu handlers to use generic plugin launch mechanism (CallPlugin())
  663.  *
  664.  * Revision 1.10  2003/03/10 22:58:51  kuznets
  665.  * iterate -> ITERATE
  666.  *
  667.  * Revision 1.9  2003/02/26 17:53:31  dicuccio
  668.  * Cleaned up the dynamic menus to make the dynamic menus resistant to menu
  669.  * refreshes while the menu callback is running
  670.  *
  671.  * Revision 1.8  2003/02/24 13:03:15  dicuccio
  672.  * Renamed classes in plugin spec:
  673.  *     CArgSeg --> CPluginArgSet
  674.  *     CArgument --> CPluginArg
  675.  *     CPluginArgs --> CPluginCommand
  676.  *     CPluginCommands --> CPluginCommandSet
  677.  *
  678.  * Revision 1.7  2003/02/20 19:49:54  dicuccio
  679.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH frameowrk
  680.  * over to use new plugin architecture.
  681.  *
  682.  * Revision 1.6  2003/02/05 19:48:29  dicuccio
  683.  * Implemented save for data loader dynamic menus
  684.  *
  685.  * Revision 1.5  2003/01/15 21:06:51  dicuccio
  686.  * Removed useless _TRACE()
  687.  *
  688.  * Revision 1.4  2003/01/13 13:10:06  dicuccio
  689.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  690.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  691.  *
  692.  * Revision 1.3  2003/01/10 17:36:41  dicuccio
  693.  * Changed TPluginList --> TPlugins
  694.  *
  695.  * Revision 1.2  2002/12/30 17:52:18  dicuccio
  696.  * Added private menu callback handler - delays call to
  697.  * CDocManager::UpdateAllViews(), which invalidates current menu data objects.
  698.  *
  699.  * Revision 1.1  2002/12/20 19:15:54  dicuccio
  700.  * Initial revision.
  701.  *
  702.  * ===========================================================================
  703.  */