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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: plugin_arg_dialog.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 20:44:15  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.55
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: plugin_arg_dialog.cpp,v 1000.3 2004/06/01 20:44:15 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.  *    CPluginArgDialog -- standard handler for plugin arguments
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/core/doc_manager.hpp>
  41. #include <gui/core/idocument.hpp>
  42. #include <gui/core/obj_convert.hpp>
  43. #include <gui/core/plugin_arg_dialog.hpp>
  44. #include <gui/core/plugin_registry.hpp>
  45. #include <gui/core/plugin_utils.hpp>
  46. #include <gui/core/selection_buffer.hpp>
  47. #include <gui/dialogs/entry_form/table.hpp>
  48. #include <gui/plugin/PluginLibInfo.hpp>
  49. #include <gui/plugin/PluginValue.hpp>
  50. #include <gui/utils/app_popup.hpp>
  51. #include <gui/utils/message_box.hpp>
  52. #include <gui/widgets/fl/form.hpp>
  53. #include <gui/widgets/fl/frame.hpp>
  54. #include "plugin_arg_form.hpp"
  55. #include <FL/Fl_Multi_Browser.H>
  56. #include <FL/Fl_Check_Button.H>
  57. #include <FL/Fl_Menu_Button.H>
  58. #include <FL/Fl_Menu_Item.H>
  59. #include <FL/Enumerations.H>
  60. #include <objects/seq/Bioseq.hpp>
  61. #include <serial/serial.hpp>
  62. #include <serial/objostrasn.hpp>
  63. #include <serial/typeinfo.hpp>
  64. #include <algorithm>
  65. #include <map>
  66. #include <FL/fl_ask.H>
  67. BEGIN_NCBI_SCOPE
  68. USING_SCOPE(objects);
  69. #include "plugin_arg_dialog_.cpp"
  70. //
  71. // constants controlling layout
  72. //
  73. // default row height, in pixels
  74. static const int sc_RowHeight = 25;
  75. // default fraction of the width devoted to labels
  76. static const float sc_LabelFrac = 0.33f;
  77. CPluginArgDialog::CPluginArgDialog(CPluginHandle handle,
  78.                                    CPluginArgSet& args, 
  79.                                    const TConstScopedObjects& selections)
  80.     : m_Handle(handle),
  81.       m_Args(NULL)
  82. {
  83.     m_Window.reset(x_CreateWindow());
  84.     SetArgs(args, selections);
  85.     string str = handle.GetMenuItem();
  86.     if ( !str.empty() ) {
  87.         string::size_type pos = str.length() - 1;
  88.         while ( (pos = str.find_last_of("/", pos)) != string::npos) {
  89.             if (pos != 0  &&  str[pos-1] != '\') {
  90.                 str.erase(0, pos + 1);
  91.                 break;
  92.             }
  93.         }
  94.     } else {
  95.         str = "Plugin Launcher Options";
  96.     }
  97.     SetTitle(str);
  98.     if (m_Handle.GetHelpFile().empty()) {
  99.         m_HelpButton->deactivate();
  100.     }
  101. }
  102. void CPluginArgDialog::Show()
  103. {
  104.     if (m_Window.get()) {
  105.         m_Window->size(m_Window->w(), m_Form->GetHeight() + 50);
  106.         // center the dialog over the currently active window
  107.         CenterOnActive();
  108.     }
  109.     CDialog::Show();
  110. }
  111. void CPluginArgDialog::SetTitle(const string& title)
  112. {
  113.     m_Title = title;
  114.     if (m_Window.get()) {
  115.         m_Window->label(m_Title.c_str());
  116.     }
  117. }
  118. // Set the size of the window
  119. void CPluginArgDialog::Size(int w, int h)
  120. {
  121.     if (m_Window.get()) {
  122.         m_Window->size(w, h);
  123.     }
  124. }
  125. void CPluginArgDialog::SetArgs(CPluginArgSet& args,
  126.                                const TConstScopedObjects& selections)
  127. {
  128.     if ( !m_Window.get() ) {
  129.         return;
  130.     }
  131.     m_Args = &args;
  132.     m_Selections = selections;
  133.     // clear the pack that holds our information
  134.     m_Form->SetArgs(args, selections);
  135. }
  136. void CPluginArgDialog::x_OnSaveOptions()
  137. {
  138.     //
  139.     // FIXME: reimplement so that object arguments are not processed
  140.     //
  141.     // first, process all of our formatters
  142.     m_Form->Process();
  143.     // now, verify that our set of arguments is valid
  144.     ITERATE (CPluginArgSet::Tdata, iter, m_Args->Get()) {
  145.         const CPluginArg& arg = **iter;
  146.         if ( !CPluginUtils::IsValid(arg)  &&
  147.              !(arg.IsSetOptional()  &&  arg.GetOptional()  && arg.IsEmpty())
  148.              ) {
  149.             string msg("Field '");
  150.             msg += arg.GetDesc();
  151.             msg += "' does not contain a valid value";
  152.             NcbiMessageBox(msg);
  153.             return;
  154.         }
  155.     }
  156.     const char* text = fl_input("Enter the menu item to use for these options");
  157.     if ( !text  ||  !*text ) {
  158.         return;
  159.     }
  160.     CRef<CPluginLibInfo> libinfo(new CPluginLibInfo());
  161.     libinfo->Assign(m_Handle.GetLibInfo());
  162.     libinfo->SetInfo().SetMenu_item(text);
  163.     CPluginRegistry::AddPlugin(*libinfo);
  164. }
  165. void CPluginArgDialog::x_OnOK()
  166. {
  167.     // first, process all of our formatters
  168.     m_Form->Process();
  169.     // now, verify that our set of arguments is valid
  170.     ITERATE (CPluginArgSet::Tdata, iter, m_Args->Get()) {
  171.         const CPluginArg& arg = **iter;
  172.         if ( !CPluginUtils::IsValid(arg)  &&
  173.              !(arg.IsSetOptional()  &&  arg.GetOptional()  && arg.IsEmpty())
  174.              ) {
  175.             string msg("Field '");
  176.             msg += arg.GetDesc();
  177.             msg += "' does not contain a valid value";
  178.             NcbiMessageBox(msg);
  179.             return;
  180.         }
  181.     }
  182.     // call the base class
  183.     CDialog::x_OnOK();
  184. }
  185. void CPluginArgDialog::x_OnHelp()
  186. {
  187.     string url = m_Handle.GetHelpFile();
  188.     if ( url.empty() ) {
  189.         NcbiMessageBox("No help is available for this plugin.");
  190.     } else {
  191.         CAppPopup::PopupURL(url);
  192.     }
  193. }
  194. END_NCBI_SCOPE
  195. /*
  196.  * ===========================================================================
  197.  * $Log: plugin_arg_dialog.cpp,v $
  198.  * Revision 1000.3  2004/06/01 20:44:15  gouriano
  199.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.55
  200.  *
  201.  * Revision 1.55  2004/06/01 18:03:18  dicuccio
  202.  * Large rewrite: refactored argument form as a separate widget; lots of
  203.  * code-clean-up
  204.  *
  205.  * Revision 1.54  2004/05/21 22:27:40  gorelenk
  206.  * Added PCH ncbi_pch.hpp
  207.  *
  208.  * Revision 1.53  2004/04/07 12:46:01  dicuccio
  209.  * Use TConstScopedObjects instead of CSelectionBuffer::TSelList
  210.  *
  211.  * Revision 1.52  2004/03/04 20:52:21  dicuccio
  212.  * Initialize the un-initialized...
  213.  *
  214.  * Revision 1.51  2004/02/17 17:18:15  dicuccio
  215.  * Be careful to use the most efficient possible path of object conversion in
  216.  * CConvertCache
  217.  *
  218.  * Revision 1.50  2004/01/27 18:31:52  dicuccio
  219.  * Added #includes.  Added unused classes for work-in-progress refactoring
  220.  *
  221.  * Revision 1.49  2004/01/21 12:38:18  dicuccio
  222.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  223.  *
  224.  * Revision 1.48  2004/01/07 15:47:30  dicuccio
  225.  * Adjusted for API change in CPluginUtils::GetLabel()
  226.  *
  227.  * Revision 1.47  2004/01/05 19:10:16  dicuccio
  228.  * Ignore blank lines in multiline input dialogs
  229.  *
  230.  * Revision 1.46  2003/12/31 20:27:40  dicuccio
  231.  * Altered plugin arg dialog to correctly set the document in a document menu
  232.  *
  233.  * Revision 1.45  2003/12/23 20:23:21  jcherry
  234.  * Make argument values persist across invocations of plugin
  235.  *
  236.  * Revision 1.44  2003/12/22 19:20:00  dicuccio
  237.  * Code formatting
  238.  *
  239.  * Revision 1.43  2003/12/19 19:25:27  jcherry
  240.  * Removed a bit of debugging code
  241.  *
  242.  * Revision 1.42  2003/12/16 21:51:11  jcherry
  243.  * Processing of file parameters
  244.  *
  245.  * Revision 1.41  2003/12/16 20:39:47  jcherry
  246.  * Added support for plugin arguments of type file
  247.  *
  248.  * Revision 1.40  2003/12/09 15:44:32  dicuccio
  249.  * Use CDialog::CenterOnActive() instead of home-grown centering
  250.  *
  251.  * Revision 1.39  2003/12/04 18:09:49  dicuccio
  252.  * Center the window in the screen
  253.  *
  254.  * Revision 1.38  2003/11/06 20:03:21  dicuccio
  255.  * Added help button
  256.  *
  257.  * Revision 1.37  2003/10/27 17:37:11  dicuccio
  258.  * Changed AddUserPlugin() to AddPlugin()
  259.  *
  260.  * Revision 1.36  2003/10/24 02:12:54  ucko
  261.  * Implement CPluginArgDialog::Size (cribbed from CEntryFormTable)
  262.  *
  263.  * Revision 1.35  2003/10/23 16:15:48  dicuccio
  264.  * Transitioned to use CFlForm instead of CEntryFormDialog.  Added initial API to
  265.  * save user-defined plugins
  266.  *
  267.  * Revision 1.34  2003/10/10 16:05:51  friedman
  268.  * Using CObjectConverter::Convert instead of CPluginUtils::Convert.
  269.  * Use CConvertCache to cahce the object conversions.
  270.  *
  271.  * Revision 1.33  2003/10/07 13:36:09  dicuccio
  272.  * Renamed CPluginURL* to CPluginValue*.  Moved validation code into CPluginUtils
  273.  *
  274.  * Revision 1.32  2003/09/29 17:15:30  dicuccio
  275.  * Fixed callback for OK - should be (protected) x_OnOK()
  276.  *
  277.  * Revision 1.31  2003/09/29 15:28:16  dicuccio
  278.  * OK callback is noew x_OnOK()
  279.  *
  280.  * Revision 1.30  2003/09/24 18:23:52  dicuccio
  281.  * Code clean-ups.  Make sure that all sections are labelled if flag values are
  282.  * present
  283.  *
  284.  * Revision 1.29  2003/09/04 14:01:51  dicuccio
  285.  * Introduce IDocument and IView as abstract base classes for CDocument and CView
  286.  *
  287.  * Revision 1.28  2003/08/21 12:01:37  dicuccio
  288.  * Correctly set the dialog title
  289.  *
  290.  * Revision 1.27  2003/08/20 16:28:30  ucko
  291.  * More strstream-related fixes.  (Sigh.)
  292.  *
  293.  * Revision 1.26  2003/08/20 14:33:38  ucko
  294.  * Fix use of CNcbiOstrstreamToString, which doesn't directly produce a string.
  295.  *
  296.  * Revision 1.25  2003/08/20 12:18:54  ucko
  297.  * ostringstream is not 100% portable to older compilers; substitute
  298.  * CNcbiOstrstream{,ToString}.
  299.  *
  300.  * Revision 1.24  2003/08/19 18:52:41  friedman
  301.  * Large Menus (> 20) for Object coice menu and slector browser
  302.  * is split into submenus according to Document and, within the
  303.  * documents, into submenus of 20 entries.
  304.  *
  305.  * Revision 1.23  2003/08/06 14:21:58  friedman
  306.  * Added plugin GUI for selecting multiple entries that is derived from the CObject
  307.  * selected and the CObject specified, by the plugin, for the plugin arg.
  308.  *
  309.  * Revision 1.22  2003/07/31 16:55:20  dicuccio
  310.  * Meaningless whitespace change
  311.  *
  312.  * Revision 1.21  2003/07/29 15:03:22  kuznets
  313.  * Fixed crash with two-column checkbox layout.
  314.  *
  315.  * Revision 1.20  2003/07/23 17:54:14  dicuccio
  316.  * Removed spurious comment about FLTK not saving the label of menu items
  317.  *
  318.  * Revision 1.19  2003/07/22 15:29:10  dicuccio
  319.  * Changed to support new API in Convert().  Dropped support for
  320.  * CSeqVector as a named type
  321.  *
  322.  * Revision 1.18  2003/07/21 19:28:05  dicuccio
  323.  * CSelectionBuffer::TSelection is now an internal class with named members
  324.  *
  325.  * Revision 1.17  2003/07/21 14:55:27  friedman
  326.  * Changed font of sebmenu label to FL_HELVETICA_BOLD_ITALIC
  327.  *
  328.  * Revision 1.16  2003/07/17 03:05:27  friedman
  329.  * Added handling Flag/Boolean args as Check buttons.
  330.  * Added passing in a TConstScopedObjects to CPluginArgDialog
  331.  * Added handling CObjects - Bioseq as a menu drop down list.
  332.  *
  333.  * Revision 1.15  2003/07/16 15:22:36  dicuccio
  334.  * Implemented tool tips for arguments
  335.  *
  336.  * Revision 1.14  2003/06/25 17:02:54  dicuccio
  337.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  338.  * implementation file.  Lots of #include file clean-ups.
  339.  *
  340.  * Revision 1.13  2003/05/30 14:15:41  dicuccio
  341.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  342.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  343.  * unresolved external and conflict with the Win32 API :(.
  344.  *
  345.  * Revision 1.12  2003/05/30 12:56:50  dicuccio
  346.  * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert()
  347.  *
  348.  * Revision 1.11  2003/05/19 13:35:59  dicuccio
  349.  * Moved gui/core/plugin/ -> gui/plugin/.  Merged gui/core/algo, gui/core/doc/,
  350.  * and gui/core/view/ into one library (gui/core/)
  351.  *
  352.  * Revision 1.10  2003/05/12 15:58:48  dicuccio
  353.  * Added check - don't show hidden parameters
  354.  *
  355.  * Revision 1.9  2003/05/09 16:45:07  dicuccio
  356.  * Correctly handle optional arguments - invalid but empty arguments are
  357.  * permitted.
  358.  *
  359.  * Revision 1.8  2003/05/08 20:11:38  dicuccio
  360.  * Added new menu for selecting seq-ids from documents.  Removed some dead
  361.  * debugging code.  Fixed 0-based/1-based index for selecing current values in
  362.  * Fl_Choice
  363.  *
  364.  * Revision 1.7  2003/04/29 14:40:31  dicuccio
  365.  * Implemented multiline entry for entering sets of items (ints, doubles, strings)
  366.  *
  367.  * Revision 1.6  2003/04/24 16:28:30  dicuccio
  368.  * Removed inappropriate creation of document selector for object argument type.
  369.  * Fixed given API changes to IDocument
  370.  *
  371.  * Revision 1.5  2003/04/24 12:30:04  dicuccio
  372.  * Added first representation of a document selector.  Changed internal API for
  373.  * entry form tables - added ability to provide label rows, added ability to
  374.  * inherit / extend base table
  375.  *
  376.  * Revision 1.4  2003/04/16 11:39:11  dicuccio
  377.  * Large rewrite.  Fixed erroneous assumptions about data entering entry forms
  378.  * - labels and drop-downs now work correctly
  379.  *
  380.  * Revision 1.3  2003/03/28 19:19:46  dicuccio
  381.  * Split x_AddOptions() into multiple sub-functions.  Changed handling of
  382.  * labels: use only the persistent label supplied by the argument itself.
  383.  *
  384.  * Revision 1.2  2003/03/25 13:10:29  dicuccio
  385.  * Lots of changes.  Implemented argument formatter wrapper class - used to
  386.  * pass values from FLTK widgets into individual represented arguments.  Added
  387.  * OK click handler that validates and processes arguments.
  388.  *
  389.  * Revision 1.1  2003/03/21 13:43:20  dicuccio
  390.  * Initial revision
  391.  *
  392.  * ===========================================================================
  393.  */