plugin_arg_dialog.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:14k
- /*
- * ===========================================================================
- * PRODUCTION $Log: plugin_arg_dialog.cpp,v $
- * PRODUCTION Revision 1000.3 2004/06/01 20:44:15 gouriano
- * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.55
- * PRODUCTION
- * ===========================================================================
- */
- /* $Id: plugin_arg_dialog.cpp,v 1000.3 2004/06/01 20:44:15 gouriano Exp $
- * ===========================================================================
- *
- * PUBLIC DOMAIN NOTICE
- * National Center for Biotechnology Information
- *
- * This software / database is a "United States Government Work" under the
- * terms of the United States Copyright Act. It was written as part of
- * the author's official duties as a United States Government employee and
- * thus cannot be copyrighted. This software / database is freely available
- * to the public for use. The National Library of Medicine and the U.S.
- * Government have not placed any restriction on its use or reproduction.
- *
- * Although all reasonable efforts have been taken to ensure the accuracy
- * and reliability of the software and data, the NLM and the U.S.
- * Government do not and cannot warrant the performance or results that
- * may be obtained by using this software or data. The NLM and the U.S.
- * Government disclaim all warranties, express or implied, including
- * warranties of performance, merchantability or fitness for any particular
- * purpose.
- *
- * Please cite the author in any work or product based on this material.
- *
- * ===========================================================================
- *
- * Authors: Mike DiCuccio
- *
- * File Description:
- * CPluginArgDialog -- standard handler for plugin arguments
- */
- #include <ncbi_pch.hpp>
- #include <gui/core/doc_manager.hpp>
- #include <gui/core/idocument.hpp>
- #include <gui/core/obj_convert.hpp>
- #include <gui/core/plugin_arg_dialog.hpp>
- #include <gui/core/plugin_registry.hpp>
- #include <gui/core/plugin_utils.hpp>
- #include <gui/core/selection_buffer.hpp>
- #include <gui/dialogs/entry_form/table.hpp>
- #include <gui/plugin/PluginLibInfo.hpp>
- #include <gui/plugin/PluginValue.hpp>
- #include <gui/utils/app_popup.hpp>
- #include <gui/utils/message_box.hpp>
- #include <gui/widgets/fl/form.hpp>
- #include <gui/widgets/fl/frame.hpp>
- #include "plugin_arg_form.hpp"
- #include <FL/Fl_Multi_Browser.H>
- #include <FL/Fl_Check_Button.H>
- #include <FL/Fl_Menu_Button.H>
- #include <FL/Fl_Menu_Item.H>
- #include <FL/Enumerations.H>
- #include <objects/seq/Bioseq.hpp>
- #include <serial/serial.hpp>
- #include <serial/objostrasn.hpp>
- #include <serial/typeinfo.hpp>
- #include <algorithm>
- #include <map>
- #include <FL/fl_ask.H>
- BEGIN_NCBI_SCOPE
- USING_SCOPE(objects);
- #include "plugin_arg_dialog_.cpp"
- //
- // constants controlling layout
- //
- // default row height, in pixels
- static const int sc_RowHeight = 25;
- // default fraction of the width devoted to labels
- static const float sc_LabelFrac = 0.33f;
- CPluginArgDialog::CPluginArgDialog(CPluginHandle handle,
- CPluginArgSet& args,
- const TConstScopedObjects& selections)
- : m_Handle(handle),
- m_Args(NULL)
- {
- m_Window.reset(x_CreateWindow());
- SetArgs(args, selections);
- string str = handle.GetMenuItem();
- if ( !str.empty() ) {
- string::size_type pos = str.length() - 1;
- while ( (pos = str.find_last_of("/", pos)) != string::npos) {
- if (pos != 0 && str[pos-1] != '\') {
- str.erase(0, pos + 1);
- break;
- }
- }
- } else {
- str = "Plugin Launcher Options";
- }
- SetTitle(str);
- if (m_Handle.GetHelpFile().empty()) {
- m_HelpButton->deactivate();
- }
- }
- void CPluginArgDialog::Show()
- {
- if (m_Window.get()) {
- m_Window->size(m_Window->w(), m_Form->GetHeight() + 50);
- // center the dialog over the currently active window
- CenterOnActive();
- }
- CDialog::Show();
- }
- void CPluginArgDialog::SetTitle(const string& title)
- {
- m_Title = title;
- if (m_Window.get()) {
- m_Window->label(m_Title.c_str());
- }
- }
- // Set the size of the window
- void CPluginArgDialog::Size(int w, int h)
- {
- if (m_Window.get()) {
- m_Window->size(w, h);
- }
- }
- void CPluginArgDialog::SetArgs(CPluginArgSet& args,
- const TConstScopedObjects& selections)
- {
- if ( !m_Window.get() ) {
- return;
- }
- m_Args = &args;
- m_Selections = selections;
- // clear the pack that holds our information
- m_Form->SetArgs(args, selections);
- }
- void CPluginArgDialog::x_OnSaveOptions()
- {
- //
- // FIXME: reimplement so that object arguments are not processed
- //
- // first, process all of our formatters
- m_Form->Process();
- // now, verify that our set of arguments is valid
- ITERATE (CPluginArgSet::Tdata, iter, m_Args->Get()) {
- const CPluginArg& arg = **iter;
- if ( !CPluginUtils::IsValid(arg) &&
- !(arg.IsSetOptional() && arg.GetOptional() && arg.IsEmpty())
- ) {
- string msg("Field '");
- msg += arg.GetDesc();
- msg += "' does not contain a valid value";
- NcbiMessageBox(msg);
- return;
- }
- }
- const char* text = fl_input("Enter the menu item to use for these options");
- if ( !text || !*text ) {
- return;
- }
- CRef<CPluginLibInfo> libinfo(new CPluginLibInfo());
- libinfo->Assign(m_Handle.GetLibInfo());
- libinfo->SetInfo().SetMenu_item(text);
- CPluginRegistry::AddPlugin(*libinfo);
- }
- void CPluginArgDialog::x_OnOK()
- {
- // first, process all of our formatters
- m_Form->Process();
- // now, verify that our set of arguments is valid
- ITERATE (CPluginArgSet::Tdata, iter, m_Args->Get()) {
- const CPluginArg& arg = **iter;
- if ( !CPluginUtils::IsValid(arg) &&
- !(arg.IsSetOptional() && arg.GetOptional() && arg.IsEmpty())
- ) {
- string msg("Field '");
- msg += arg.GetDesc();
- msg += "' does not contain a valid value";
- NcbiMessageBox(msg);
- return;
- }
- }
- // call the base class
- CDialog::x_OnOK();
- }
- void CPluginArgDialog::x_OnHelp()
- {
- string url = m_Handle.GetHelpFile();
- if ( url.empty() ) {
- NcbiMessageBox("No help is available for this plugin.");
- } else {
- CAppPopup::PopupURL(url);
- }
- }
- END_NCBI_SCOPE
- /*
- * ===========================================================================
- * $Log: plugin_arg_dialog.cpp,v $
- * Revision 1000.3 2004/06/01 20:44:15 gouriano
- * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.55
- *
- * Revision 1.55 2004/06/01 18:03:18 dicuccio
- * Large rewrite: refactored argument form as a separate widget; lots of
- * code-clean-up
- *
- * Revision 1.54 2004/05/21 22:27:40 gorelenk
- * Added PCH ncbi_pch.hpp
- *
- * Revision 1.53 2004/04/07 12:46:01 dicuccio
- * Use TConstScopedObjects instead of CSelectionBuffer::TSelList
- *
- * Revision 1.52 2004/03/04 20:52:21 dicuccio
- * Initialize the un-initialized...
- *
- * Revision 1.51 2004/02/17 17:18:15 dicuccio
- * Be careful to use the most efficient possible path of object conversion in
- * CConvertCache
- *
- * Revision 1.50 2004/01/27 18:31:52 dicuccio
- * Added #includes. Added unused classes for work-in-progress refactoring
- *
- * Revision 1.49 2004/01/21 12:38:18 dicuccio
- * redesigned CObjectCOnverter API to eliminate temporary object creation
- *
- * Revision 1.48 2004/01/07 15:47:30 dicuccio
- * Adjusted for API change in CPluginUtils::GetLabel()
- *
- * Revision 1.47 2004/01/05 19:10:16 dicuccio
- * Ignore blank lines in multiline input dialogs
- *
- * Revision 1.46 2003/12/31 20:27:40 dicuccio
- * Altered plugin arg dialog to correctly set the document in a document menu
- *
- * Revision 1.45 2003/12/23 20:23:21 jcherry
- * Make argument values persist across invocations of plugin
- *
- * Revision 1.44 2003/12/22 19:20:00 dicuccio
- * Code formatting
- *
- * Revision 1.43 2003/12/19 19:25:27 jcherry
- * Removed a bit of debugging code
- *
- * Revision 1.42 2003/12/16 21:51:11 jcherry
- * Processing of file parameters
- *
- * Revision 1.41 2003/12/16 20:39:47 jcherry
- * Added support for plugin arguments of type file
- *
- * Revision 1.40 2003/12/09 15:44:32 dicuccio
- * Use CDialog::CenterOnActive() instead of home-grown centering
- *
- * Revision 1.39 2003/12/04 18:09:49 dicuccio
- * Center the window in the screen
- *
- * Revision 1.38 2003/11/06 20:03:21 dicuccio
- * Added help button
- *
- * Revision 1.37 2003/10/27 17:37:11 dicuccio
- * Changed AddUserPlugin() to AddPlugin()
- *
- * Revision 1.36 2003/10/24 02:12:54 ucko
- * Implement CPluginArgDialog::Size (cribbed from CEntryFormTable)
- *
- * Revision 1.35 2003/10/23 16:15:48 dicuccio
- * Transitioned to use CFlForm instead of CEntryFormDialog. Added initial API to
- * save user-defined plugins
- *
- * Revision 1.34 2003/10/10 16:05:51 friedman
- * Using CObjectConverter::Convert instead of CPluginUtils::Convert.
- * Use CConvertCache to cahce the object conversions.
- *
- * Revision 1.33 2003/10/07 13:36:09 dicuccio
- * Renamed CPluginURL* to CPluginValue*. Moved validation code into CPluginUtils
- *
- * Revision 1.32 2003/09/29 17:15:30 dicuccio
- * Fixed callback for OK - should be (protected) x_OnOK()
- *
- * Revision 1.31 2003/09/29 15:28:16 dicuccio
- * OK callback is noew x_OnOK()
- *
- * Revision 1.30 2003/09/24 18:23:52 dicuccio
- * Code clean-ups. Make sure that all sections are labelled if flag values are
- * present
- *
- * Revision 1.29 2003/09/04 14:01:51 dicuccio
- * Introduce IDocument and IView as abstract base classes for CDocument and CView
- *
- * Revision 1.28 2003/08/21 12:01:37 dicuccio
- * Correctly set the dialog title
- *
- * Revision 1.27 2003/08/20 16:28:30 ucko
- * More strstream-related fixes. (Sigh.)
- *
- * Revision 1.26 2003/08/20 14:33:38 ucko
- * Fix use of CNcbiOstrstreamToString, which doesn't directly produce a string.
- *
- * Revision 1.25 2003/08/20 12:18:54 ucko
- * ostringstream is not 100% portable to older compilers; substitute
- * CNcbiOstrstream{,ToString}.
- *
- * Revision 1.24 2003/08/19 18:52:41 friedman
- * Large Menus (> 20) for Object coice menu and slector browser
- * is split into submenus according to Document and, within the
- * documents, into submenus of 20 entries.
- *
- * Revision 1.23 2003/08/06 14:21:58 friedman
- * Added plugin GUI for selecting multiple entries that is derived from the CObject
- * selected and the CObject specified, by the plugin, for the plugin arg.
- *
- * Revision 1.22 2003/07/31 16:55:20 dicuccio
- * Meaningless whitespace change
- *
- * Revision 1.21 2003/07/29 15:03:22 kuznets
- * Fixed crash with two-column checkbox layout.
- *
- * Revision 1.20 2003/07/23 17:54:14 dicuccio
- * Removed spurious comment about FLTK not saving the label of menu items
- *
- * Revision 1.19 2003/07/22 15:29:10 dicuccio
- * Changed to support new API in Convert(). Dropped support for
- * CSeqVector as a named type
- *
- * Revision 1.18 2003/07/21 19:28:05 dicuccio
- * CSelectionBuffer::TSelection is now an internal class with named members
- *
- * Revision 1.17 2003/07/21 14:55:27 friedman
- * Changed font of sebmenu label to FL_HELVETICA_BOLD_ITALIC
- *
- * Revision 1.16 2003/07/17 03:05:27 friedman
- * Added handling Flag/Boolean args as Check buttons.
- * Added passing in a TConstScopedObjects to CPluginArgDialog
- * Added handling CObjects - Bioseq as a menu drop down list.
- *
- * Revision 1.15 2003/07/16 15:22:36 dicuccio
- * Implemented tool tips for arguments
- *
- * Revision 1.14 2003/06/25 17:02:54 dicuccio
- * Split CPluginHandle into a handle (pointer-to-implementation) and
- * implementation file. Lots of #include file clean-ups.
- *
- * Revision 1.13 2003/05/30 14:15:41 dicuccio
- * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
- * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
- * unresolved external and conflict with the Win32 API :(.
- *
- * Revision 1.12 2003/05/30 12:56:50 dicuccio
- * Converted code to use MessageBox() instead of fl_ask()/fl_message()/fl_alert()
- *
- * Revision 1.11 2003/05/19 13:35:59 dicuccio
- * Moved gui/core/plugin/ -> gui/plugin/. Merged gui/core/algo, gui/core/doc/,
- * and gui/core/view/ into one library (gui/core/)
- *
- * Revision 1.10 2003/05/12 15:58:48 dicuccio
- * Added check - don't show hidden parameters
- *
- * Revision 1.9 2003/05/09 16:45:07 dicuccio
- * Correctly handle optional arguments - invalid but empty arguments are
- * permitted.
- *
- * Revision 1.8 2003/05/08 20:11:38 dicuccio
- * Added new menu for selecting seq-ids from documents. Removed some dead
- * debugging code. Fixed 0-based/1-based index for selecing current values in
- * Fl_Choice
- *
- * Revision 1.7 2003/04/29 14:40:31 dicuccio
- * Implemented multiline entry for entering sets of items (ints, doubles, strings)
- *
- * Revision 1.6 2003/04/24 16:28:30 dicuccio
- * Removed inappropriate creation of document selector for object argument type.
- * Fixed given API changes to IDocument
- *
- * Revision 1.5 2003/04/24 12:30:04 dicuccio
- * Added first representation of a document selector. Changed internal API for
- * entry form tables - added ability to provide label rows, added ability to
- * inherit / extend base table
- *
- * Revision 1.4 2003/04/16 11:39:11 dicuccio
- * Large rewrite. Fixed erroneous assumptions about data entering entry forms
- * - labels and drop-downs now work correctly
- *
- * Revision 1.3 2003/03/28 19:19:46 dicuccio
- * Split x_AddOptions() into multiple sub-functions. Changed handling of
- * labels: use only the persistent label supplied by the argument itself.
- *
- * Revision 1.2 2003/03/25 13:10:29 dicuccio
- * Lots of changes. Implemented argument formatter wrapper class - used to
- * pass values from FLTK widgets into individual represented arguments. Added
- * OK click handler that validates and processes arguments.
- *
- * Revision 1.1 2003/03/21 13:43:20 dicuccio
- * Initial revision
- *
- * ===========================================================================
- */