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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: gbench.cpp,v $
  4.  * PRODUCTION Revision 1000.6  2004/06/01 20:48:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.86
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: gbench.cpp,v 1000.6 2004/06/01 20:48:09 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.  *    CGBenchApp -- main application class for GBENCH
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "gbench.hpp"
  41. #include "gbench_exception.hpp"
  42. #include "named_pipe.hpp"
  43. #include "load_file.hpp"
  44. #include <gui/utils/system_path.hpp>
  45. #include <corelib/ncbiargs.hpp>
  46. #include <corelib/ncbienv.hpp>
  47. #include <corelib/ncbifile.hpp>
  48. #include <corelib/ncbireg.hpp>
  49. // GUI classes
  50. #include <FL/Fl.H>
  51. #include <gui/core/algo.hpp>
  52. #include <gui/core/doc_exception.hpp>
  53. #include <gui/core/doc_manager.hpp>
  54. #include <gui/core/idocument.hpp>
  55. #include <gui/core/plugin_registry.hpp>
  56. #include <gui/config/settings.hpp>
  57. #include <gui/core/version.hpp>
  58. #include <gui/core/iview.hpp>
  59. #include <gui/core/plugin_utils.hpp>
  60. #include <gui/utils/fltk_utils.hpp>
  61. #include <gui/utils/message_box.hpp>
  62. #include <gui/widgets/fl/menu_window.hpp>
  63. // dialogs
  64. #include "about_dlg.hpp"
  65. #include "main_window.hpp"
  66. #include <gui/core/message_queue.hpp>
  67. #include <gui/plugin/PluginMessage.hpp>
  68. #include <corelib/ncbi_system.hpp>
  69. #include <connect/ncbi_core_cxx.hpp>
  70. BEGIN_NCBI_SCOPE
  71. USING_SCOPE(objects);
  72. const double         sc_FLTK_WAIT_TIMEOUT  = 0.05;
  73. const unsigned int   sc_MQ_TIMEOUT_SEC     = 0;    
  74. const unsigned int   sc_MQ_TIMEOUT_NSEC    = 0;
  75. //
  76. // FLTK idle processing function
  77. //
  78. void fltkGBenchIdleFunc(void*)
  79. {
  80.     CPluginMessageQueue::ProcessMessage(sc_MQ_TIMEOUT_SEC,
  81.                                         sc_MQ_TIMEOUT_NSEC);
  82.     Fl::repeat_timeout(sc_FLTK_WAIT_TIMEOUT, fltkGBenchIdleFunc);
  83. }
  84. CGBenchApp::CGBenchApp(void)
  85.     : m_AboutDlg(NULL)
  86. {
  87. }
  88. void CGBenchApp::Init(void)
  89. {
  90.     // Create command - line argument descriptions class
  91.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  92.     // Specify USAGE context
  93.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  94.                               "NCBI Genome Workbench");
  95.     // Flag: just dump the version and exit
  96.     arg_desc->AddFlag("v", "Version");
  97.     // Set the scheme for the application as a whole
  98.     arg_desc->AddDefaultKey("scheme", "FltkScheme",
  99.                             "FLTK rendering scheme",
  100.                             CArgDescriptions::eString, "none");
  101.     arg_desc->SetConstraint("scheme",
  102.                             &(*new CArgAllow_Strings, "none", "plastic"));
  103.     // Set the background color
  104.     arg_desc->AddOptionalKey("bg", "BackgroundColor",
  105.                              "Global widget background color",
  106.                              CArgDescriptions::eString);
  107.     // Set the foreground color
  108.     arg_desc->AddOptionalKey("fg", "ForegroundColor",
  109.                              "Global widget foreground color",
  110.                              CArgDescriptions::eString);
  111.     // Flag: don't try to launch Data_File in another app instance
  112.     //   via named pipe
  113.     arg_desc->AddFlag("noremote",
  114.                       "Don't Try to open Data_File using "
  115.                       "already-running gbench; launch a new gbench instance");
  116.     arg_desc->AddFlag("nr", "Synonym for -noremote");
  117.     // Flag: try to launch Data_File in another app instance
  118.     //   via named pipe
  119.     arg_desc->AddFlag("remote",
  120.                       "Try to open Data_File using already-running gbench"
  121.                       " (default unless registry specifies otherwise)");
  122.     arg_desc->AddFlag("r", "Synonym for -remote");
  123.     // Optional file to load
  124.     arg_desc->AddOptionalPositional
  125.         ("Data_File",
  126.          "data file to read",
  127.          CArgDescriptions::eInputFile);    
  128.     
  129.     // Optional file type
  130.     arg_desc->AddDefaultKey("t", "File_Type",
  131.                             "Type of optional data file",
  132.                             CArgDescriptions::eString, "auto");
  133.     arg_desc->SetConstraint("t",
  134.                             &(*new CArgAllow_Strings, "auto", "asntext",
  135.                               "asnbin", "xml", "fasta", "textalign",
  136.                               "newick"));
  137.     // Setup arg.descriptions for this application
  138.     SetupArgDescriptions(arg_desc.release());
  139. }
  140. void CGBenchApp::ProcessMessage()
  141. {
  142. }
  143. int CGBenchApp::Run(void)
  144. {
  145.     CArgs args = GetArgs();
  146.     //
  147.     // version checking
  148.     //
  149.     if (args["v"]) {
  150.         cerr << "NCBI Genome Workbench, version "
  151.             << CPluginVersion::eMajor << "." << CPluginVersion::eMinor << endl;
  152.         cerr << "  build date: " << __DATE__ << " " << __TIME__ << endl;
  153.         return 0;
  154.     }
  155.     try {
  156.         CONNECT_Init(&GetConfig());
  157.         //
  158.         // FLTK requres a list of command line arguments
  159.         // The only strict requirement is for an application name
  160.         // We also provide a few FLTK options, which we parse out here
  161.         //
  162.         // The arguments we use are:
  163.         // NB: this must be expanded in size if we add arguments!
  164.         //  argv[0] = name
  165.         //  argv[1] = '-scheme'
  166.         //  argv[2] = scheme name
  167.         //  argv[3] = '-bg'
  168.         //  argv[4] = color
  169.         //  argv[5] = '-fg'
  170.         //  argv[6] = color
  171.         //
  172.         char* argv[7];
  173.         int argc = 0;
  174.         argv[argc++] = "gbench";
  175.         // fltk scheme
  176.         string fltk_scheme = args["scheme"].AsString();
  177.         argv[argc++] = "-scheme";
  178.         argv[argc++] = const_cast<char*> (fltk_scheme.c_str());
  179.         // initialize our default FLTK states
  180.         CFltkUtils::Init(argc, argv);
  181.         //
  182.         // first, our general app set-up stuff
  183.         // this involves connecting our various plug-ins
  184.         //
  185.         CNcbiRegistry& registry = GetConfig();
  186.         string dir;
  187.         // if handed a file on command line, try sending it to
  188.         // another application instance via the named pipe
  189.         // if the command line switches and registry
  190.         // say to do so
  191.         if (args["Data_File"] &&
  192.             (args["remote"] || args["r"]
  193.              || (registry.GetBool("APP", "RemoteByDefault", true)
  194.                  && !args["noremote"] && !args["nr"]))) {
  195.             try {
  196.                 string fname = args["Data_File"].AsString();
  197.                 // if pathname is relative, convert to absolute
  198.                 if (!CDirEntry::IsAbsolutePath(fname)) {
  199.                     fname = CDirEntry::ConcatPath(CDir::GetCwd(), fname);
  200.                 }
  201.                 // try to open via named pipe
  202.                 CGBenchPipe::OpenRemote(fname, args["t"].AsString());
  203.                 // if this was successful, we're all done
  204.                 return 0;
  205.             }
  206.             catch (exception& e) {
  207.                 LOG_POST(Info << "Remote open failed:  " << e.what());
  208.             }
  209.         }
  210.         if ( (dir = registry.Get("app", "plugin_path")).empty() ) {
  211.             registry.Set("app", "plugin_path", "<std>, <home>",
  212.                         CNcbiRegistry::ePersistent, " default plugin_path");
  213.         }
  214.         if ( !(dir = registry.Get("app", "plugin_path")).empty() ) {
  215.             x_LoadPlugins(dir);
  216.         }
  217.         // Get our various saved preferences for plugins.
  218.         if ( !(dir = registry.Get("app", "plugin_config_path")).empty() ) {
  219.             CDocManager::GetSettings().LoadPluginConfigs(dir);
  220.         } else {
  221.             CDocManager::GetSettings().LoadPluginConfig();
  222.         }    
  223.         //
  224.         // create our GUI components
  225.         //
  226.         m_MainWin = new CMainWindow();
  227.         CDocManager::AttachView(m_MainWin);
  228.         CMenu::SetResourceManager(CRef<CResourceManager>(&x_GetResourceMgr()));
  229.         //
  230.         // first, set up a custom diagnostics handler
  231.         // this has a hook to FLTK which allows us to display log messages
  232.         //
  233.         LOG_POST(Warning << "NCBI Genome Workbench, version "
  234.                  << (int)CPluginVersion::eMajor << "."
  235.                  << (int)CPluginVersion::eMinor);
  236.         LOG_POST(Warning << "  build date: " << __DATE__ << " " << __TIME__);
  237.         LOG_POST(Warning << "  Genome Workbench installation path:   "
  238.                  << CSystemPath::ResolvePath("<std>", ""));
  239.         LOG_POST(Warning << "  Genome Workbench user path:   "
  240.                  << CSystemPath::ResolvePath("<home>", ""));
  241.         // call show() and start our business
  242.         m_MainWin->Show(argc, argv);
  243.         // post messages for plugin initialization
  244.         CPluginUtils::CallPlugin("CPluginNews", eAlgoCommand_run);
  245.         // register an idle processing callback for FLTK
  246.         // this will process one message off of the queue
  247.         Fl::add_timeout(sc_FLTK_WAIT_TIMEOUT, fltkGBenchIdleFunc);
  248.         // if handed a file on command line, make a plugin call to load it
  249.         if (args["Data_File"]) {
  250.             GBenchLoadFile(args["Data_File"].AsString(),
  251.                            args["t"].AsString(), true);
  252.         }
  253.         // set up the named pipe if possible
  254.         try {
  255.             CGBenchPipe::Start();
  256.         }
  257.         catch (exception& e) {
  258.             LOG_POST(Warning << "Couldn't set up named pipe:  " << e.what());
  259.         }
  260.         while (m_MainWin->Shown()) {
  261.             // poll between the message queue and fltk event loop
  262.             Fl::wait(sc_FLTK_WAIT_TIMEOUT);
  263.         }
  264.         // shut down cleanly
  265.         CDocManager::ShutDown();
  266.         // on exit, write our config file as appropriate
  267.         if (GetConfig().Modified()) {
  268.             string home_path = CSystemPath::ResolvePath("<home>", "");
  269.             CDir home(home_path);
  270.             if ( !home.Exists() ) {
  271.                 home.Create();
  272.             }
  273.             home_path += CDirEntry::GetPathSeparator();
  274.             home_path += "gbench.ini";
  275.             CNcbiOfstream o_file(home_path.c_str(), ios::out|ios::binary);
  276.             GetConfig().Write(o_file);
  277.         }
  278.     }
  279.     catch (CException& e) {
  280.         NcbiMessageBox(string("Error:n") + e.GetMsg());
  281.         return 1;
  282.     }
  283.     catch (std::exception& e) {
  284.         NcbiMessageBox(string("Error:n") + e.what());
  285.         return 1;
  286.     }
  287. #ifndef _DEBUG
  288.     catch (...) {
  289.         NcbiMessageBox("An unknown error has occurred.");
  290.         return 1;
  291.     }
  292. #endif
  293.     return 0;
  294. }
  295. // raise the main application window to the foreground
  296. void CGBenchApp::Raise()
  297. {
  298.     CNcbiApplication* app = CNcbiApplication::Instance();
  299.     _ASSERT(app);
  300.     CGBenchApp* gbapp = dynamic_cast<CGBenchApp*>(app);
  301.     if (gbapp) {
  302.         if (gbapp->m_MainWin) {
  303.             gbapp->m_MainWin->Show();
  304.         }
  305.     }
  306. }
  307. void CGBenchApp::Exit(void)
  308. {
  309.     SetDiagStream(0);
  310. }
  311. bool CGBenchApp::LoadConfig(CNcbiRegistry& reg, const string* conf)
  312. {
  313.     string config_path;
  314.     
  315.     if (conf == NULL  ||  conf->empty()) {
  316.         config_path =
  317.             CSystemPath::ResolvePathExisting("<home>/gbench.ini, "
  318.                                              "<std>/etc/gbench.ini");
  319.         if (!config_path.empty()) {
  320.             conf = &config_path;
  321.         }
  322.    }
  323.     
  324.     // Let the base class load the config file.
  325.     // If we couldn't find it above, it will try and find it, and warn
  326.     // otherwise.
  327.     LOG_POST(Info << "loading registry file from " << *conf);
  328.     return CNcbiApplication::LoadConfig(reg, conf);
  329. }
  330. //
  331. // x_LoadPlugins()
  332. // Here, we evaluate the plugin path for valid plugin cache files and load the
  333. // descriptions as needed
  334. //
  335. void CGBenchApp::x_LoadPlugins(const string& path)
  336. {
  337.     list<string> paths;
  338.     NStr::Split(path, ",tnr", paths);
  339.     ITERATE (list<string>, iter, paths) {
  340.         string path = NStr::TruncateSpaces(*iter);;
  341.         if (path == "<std>"  ||  path == "<home>") {
  342.             path = CSystemPath::ResolvePath(path, "plugins");
  343.         } else {
  344.             path = CSystemPath::ResolvePath(path, "");
  345.         }
  346.         if ( path.empty() ) {
  347.             continue;
  348.         }
  349.         CPluginRegistry::InitPlugins(path);
  350.     }
  351. }
  352. void CGBenchApp::OnHelpAbout()
  353. {
  354.     if ( !m_AboutDlg.get() ) {
  355.         m_AboutDlg.reset(new CAboutDlg());
  356.     }
  357.     // we don't need to wait for this - just show the dialog
  358.     m_AboutDlg->Show();
  359. }
  360. void CGBenchApp::OnHelpIndex()
  361. {
  362. }
  363. // access our resource manager
  364. CResourceManager& CGBenchApp::x_GetResourceMgr()
  365. {
  366.     if ( !m_ResourceMgr ) {
  367.         m_ResourceMgr.Reset(new CResourceManager("<home>;<std>"));
  368.     }
  369.     return *m_ResourceMgr;
  370. }
  371. // the end scope must not wrap main!!!
  372. END_NCBI_SCOPE
  373. /////////////////////////////////////////////////////////////////////////////
  374. //  MAIN
  375. int main(int argc, char** argv)
  376. {
  377.     // Execute main application function
  378.     return ncbi::CGBenchApp().AppMain(argc, argv, 0, ncbi::eDS_Default);
  379. }
  380. /*
  381.  * ===========================================================================
  382.  * $Log: gbench.cpp,v $
  383.  * Revision 1000.6  2004/06/01 20:48:09  gouriano
  384.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.86
  385.  *
  386.  * Revision 1.86  2004/05/25 17:10:35  dicuccio
  387.  * Moved initialization to fltk_utils.cpp
  388.  *
  389.  * Revision 1.85  2004/05/21 22:27:42  gorelenk
  390.  * Added PCH ncbi_pch.hpp
  391.  *
  392.  * Revision 1.84  2004/05/17 13:25:32  dicuccio
  393.  * First implementation of new document workspace
  394.  *
  395.  * Revision 1.83  2004/04/12 18:14:09  dicuccio
  396.  * Added Raise() prototype to raise the application to the foreground
  397.  *
  398.  * Revision 1.82  2004/04/07 12:51:02  dicuccio
  399.  * Added CONNECT_Init()
  400.  *
  401.  * Revision 1.81  2004/03/26 18:28:08  jcherry
  402.  * Made "remote" file opening the default behavior; added -noremote
  403.  * and (synonymous) -nr flags to override this
  404.  *
  405.  * Revision 1.80  2004/03/22 16:56:13  jcherry
  406.  * Made remote-control file opening a command-line/registry option
  407.  * rather than default
  408.  *
  409.  * Revision 1.79  2004/03/22 15:40:19  jcherry
  410.  * Added file type command-line argument
  411.  *
  412.  * Revision 1.78  2004/03/19 17:12:36  jcherry
  413.  * Make relative paths absolute before trying to open via named pipe
  414.  *
  415.  * Revision 1.77  2004/03/15 16:06:18  jcherry
  416.  * Launch default viewer when opening file from command line
  417.  *
  418.  * Revision 1.76  2004/03/11 19:25:35  jcherry
  419.  * Moved load_file to gui/gbench
  420.  *
  421.  * Revision 1.75  2004/03/11 17:15:54  jcherry
  422.  * Added named pipe capabilities
  423.  *
  424.  * Revision 1.74  2004/03/09 19:53:42  jcherry
  425.  * Added optional data file command line argument
  426.  *
  427.  * Revision 1.73  2004/02/17 20:35:24  rsmith
  428.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  429.  *
  430.  * Revision 1.72  2004/01/06 20:13:59  dicuccio
  431.  * Use SetEnvironment()
  432.  *
  433.  * Revision 1.71  2003/12/31 20:20:13  dicuccio
  434.  * Use CFltkUtils::Lock()
  435.  *
  436.  * Revision 1.70  2003/12/23 03:23:38  ucko
  437.  * Conditionalize call to FL_LOCK on NCBI_THREADS.
  438.  *
  439.  * Revision 1.69  2003/12/22 19:22:48  dicuccio
  440.  * Added direct calls to plugin message queue from timeout function
  441.  *
  442.  * Revision 1.68  2003/12/09 15:45:24  dicuccio
  443.  * Use CException::GetMsg() instead of what()
  444.  *
  445.  * Revision 1.67  2003/12/02 14:42:47  dicuccio
  446.  * Removed most of the explicitly initialized plugins in favor of restored
  447.  * autorun.  Use Fl::repeat_timeout() for better idle processing
  448.  *
  449.  * Revision 1.66  2003/11/26 17:11:00  dicuccio
  450.  * Call initialization plugins explicitly
  451.  *
  452.  * Revision 1.65  2003/11/24 15:42:01  dicuccio
  453.  * Renamed CVersion to CPluginVersion
  454.  *
  455.  * Revision 1.64  2003/11/18 17:45:04  dicuccio
  456.  * Remove call to CSettingsSet::ShutDown() - handled in CDocManager
  457.  *
  458.  * Revision 1.63  2003/11/06 20:08:29  dicuccio
  459.  * Removed reference to dispatcher.  Be sure to open streams with ios::out.  Use
  460.  * ReportThis() instead of exception::what() for exception text retrieval
  461.  *
  462.  * Revision 1.62  2003/11/04 17:21:17  dicuccio
  463.  * Removed dispatcher - now part of message queue.  Tweaked argument processing -
  464.  * call Fl::args early
  465.  *
  466.  * Revision 1.61  2003/10/27 17:40:38  dicuccio
  467.  * Restructured diagnostic handler - use CDiagPanel
  468.  *
  469.  * Revision 1.60  2003/10/24 17:19:01  dicuccio
  470.  * Fixed errors in parsing comma-separated paths (trim spaces)
  471.  *
  472.  * Revision 1.59  2003/10/23 16:19:55  dicuccio
  473.  * Removed dead cache_dir statement.  Changed to use
  474.  * CSystemPath::ResolveExisting().
  475.  *
  476.  * Revision 1.58  2003/09/24 18:24:12  dicuccio
  477.  * Catched CException, not std::exception
  478.  *
  479.  * Revision 1.57  2003/09/04 14:02:36  dicuccio
  480.  * Introduce IDocument as abstract base class for CDocument; replace use of
  481.  * CDocument with IDocument
  482.  *
  483.  * Revision 1.56  2003/08/25 18:54:47  rsmith
  484.  * Load and save Settings (Plugin Config Cache)
  485.  *
  486.  * Revision 1.55  2003/08/22 15:46:43  dicuccio
  487.  * Removed config file from CSettings - accessible through CNcbiApplication
  488.  *
  489.  * Revision 1.54  2003/08/11 19:27:05  dicuccio
  490.  * Use Fl::add_timeut() instead of Fl::add_idle().  Config file access fixes
  491.  *
  492.  * Revision 1.53  2003/08/06 13:24:31  dicuccio
  493.  * Deprecated old main window; introduced new, compact window for multiple
  494.  * document management
  495.  *
  496.  * Revision 1.52  2003/08/05 17:12:13  dicuccio
  497.  * Fixed typo
  498.  *
  499.  * Revision 1.51  2003/08/05 17:09:05  dicuccio
  500.  * Changed calling semantics of message queue - pass by reference, not CConstRef<>
  501.  *
  502.  * Revision 1.50  2003/07/31 16:58:42  dicuccio
  503.  * Message queue / dispatcher clean-ups.  Added idle function processing for
  504.  * plugin message queue handling
  505.  *
  506.  * Revision 1.49  2003/07/30 12:51:53  dicuccio
  507.  * Moved 'gbench_system.[h,c]pp' to 'system_path.[h,c]pp'
  508.  *
  509.  * Revision 1.48  2003/07/30 12:19:41  dicuccio
  510.  * Cleaned up CGBenchApp.  Changed name of system path requester class.
  511.  *
  512.  * Revision 1.47  2003/07/29 18:15:08  jcherry
  513.  * Moved gbench_system.[ch]pp from gui/gbench to gui/core
  514.  *
  515.  * Revision 1.46  2003/07/14 11:21:48  shomrat
  516.  * Plugin messageing system related changes
  517.  *
  518.  * Revision 1.45  2003/07/08 16:51:20  dicuccio
  519.  * Added an explicit console message restore function - this is done before app
  520.  * shut down to make sure that FLTK doesn't throw an exception about invalid text
  521.  * buffers
  522.  *
  523.  * Revision 1.44  2003/06/30 13:35:51  dicuccio
  524.  * Lots of clean-up.  Restore the original diagnostic handler before shutting
  525.  * down the application.  Moved debug settings into the .ini file.  Minor
  526.  * clean-up of handling of config file
  527.  *
  528.  * Revision 1.43  2003/06/26 18:53:38  rsmith
  529.  * replace x_LoadConfigFile with overloading LoadConfig
  530.  *
  531.  * Revision 1.42  2003/06/25 20:11:11  rsmith
  532.  * if no plugin_path setting default to <std>,<home>
  533.  *
  534.  * Revision 1.41  2003/06/25 17:02:55  dicuccio
  535.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  536.  * implementation file.  Lots of #include file clean-ups.
  537.  *
  538.  * Revision 1.40  2003/06/25 16:53:37  rsmith
  539.  * global Settings needs a Config registry object even if there was no config file.
  540.  *
  541.  * Revision 1.39  2003/06/25 15:59:30  rsmith
  542.  * HonorDebugSettings after loading config file.
  543.  *
  544.  * Revision 1.38  2003/06/16 13:53:21  rsmith
  545.  * ResolvePath delegated to GBenchApp_System::ResolvePath
  546.  *
  547.  * Revision 1.37  2003/05/30 14:15:42  dicuccio
  548.  * Renamed MessageBox to NcbiMessageBox because brain-dead MSVC thinks this is
  549.  * ::MessageBox and rewrites the symbol as MessageBoxA, which results in an
  550.  * unresolved external and conflict with the Win32 API :(.
  551.  *
  552.  * Revision 1.36  2003/05/30 12:59:59  dicuccio
  553.  * Converted code to use MessageBox() instead of fl_alert()
  554.  *
  555.  * Revision 1.35  2003/05/06 15:58:20  dicuccio
  556.  * Removed some dead headers.
  557.  *
  558.  * Revision 1.34  2003/04/16 11:41:59  dicuccio
  559.  * Changed main windows - store as pointer, CRef<> held in CDocManager
  560.  *
  561.  * Revision 1.33  2003/04/10 12:46:13  dicuccio
  562.  * Re-enabled old main window - both are now active
  563.  *
  564.  * Revision 1.32  2003/04/08 18:10:58  lebedev
  565.  * Document organizer added
  566.  *
  567.  * Revision 1.31  2003/04/07 17:30:26  dicuccio
  568.  * Cleaned up window initialization to support multiple top-level doc manager
  569.  * windows
  570.  *
  571.  * Revision 1.30  2003/04/03 17:25:03  dicuccio
  572.  * Re-enabled the old-style window
  573.  *
  574.  * Revision 1.29  2003/03/31 20:01:07  dicuccio
  575.  * Cast enum -> int to make a couple of picky compilers happy
  576.  *
  577.  * Revision 1.28  2003/03/31 13:38:42  dicuccio
  578.  * General clean-up; changed standard start-up messages.  Added new main window
  579.  *
  580.  * Revision 1.27  2003/03/28 13:38:15  dicuccio
  581.  * Use canonical FLTK headers (*.H)
  582.  *
  583.  * Revision 1.26  2003/03/21 17:02:17  dicuccio
  584.  * Moved fltk_utils.hpp --> gui/utils.  Added link against libgui_utils
  585.  *
  586.  * Revision 1.25  2003/03/11 15:18:57  kuznets
  587.  * iterate -> ITERATE
  588.  *
  589.  * Revision 1.24  2003/02/26 19:22:36  dicuccio
  590.  * Promoted x_ResolvePath() to a public function (ResolvePath()).
  591.  *
  592.  * Revision 1.23  2003/02/26 14:29:27  dicuccio
  593.  * Removed unnecessary _TRACE() statements
  594.  *
  595.  * Revision 1.22  2003/02/25 14:48:15  dicuccio
  596.  * Implemented most of the plugin manager dialog features.
  597.  *
  598.  * Revision 1.21  2003/02/20 19:50:47  dicuccio
  599.  * Created new plugin architecture, based on ASN.1 spec.  Moved GBENCH framework
  600.  * over to use new architecture.
  601.  *
  602.  * Revision 1.20  2003/01/16 13:28:22  dicuccio
  603.  * Added fix for command-line app launch in Windows
  604.  *
  605.  * Revision 1.19  2003/01/13 13:10:10  dicuccio
  606.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace
  607.  * ncbi.  Moved all FLUID-generated code into namespace ncbi.
  608.  *
  609.  * Revision 1.18  2003/01/10 17:27:15  dicuccio
  610.  * Added first pass at plugin manager dialog - displays information about the
  611.  * currently loaded plugins, allows setting plugin paths via GUI
  612.  *
  613.  * Revision 1.17  2003/01/09 21:10:32  dicuccio
  614.  * Minor tweak - made background / foreground colors optional parameters instead
  615.  * of default parameters (default values not valid on all platforms)
  616.  *
  617.  * Revision 1.16  2003/01/09 20:57:50  dicuccio
  618.  * Added command-line arguments for FLTK-specific parameters: -scheme, -bg, -fg
  619.  * Moved WinMain to its own (windows-specific) .cpp
  620.  *
  621.  * Revision 1.15  2003/01/08 17:16:52  dicuccio
  622.  * Corrected a bug in handling of the 'gbench' std path for Windows - erase only
  623.  * the *last* 'bin' component of the path...
  624.  *
  625.  * Revision 1.14  2003/01/03 20:39:13  dicuccio
  626.  * Changed '-version' command line parameter to '-v'
  627.  *
  628.  * Revision 1.13  2002/12/23 14:12:29  dicuccio
  629.  * added new command line option to return the version of the binaries
  630.  *
  631.  * Revision 1.12  2002/12/23 13:56:48  dicuccio
  632.  * Fixed search-and-replace bug that affected a text output dialog
  633.  *
  634.  * Revision 1.11  2002/12/19 18:19:53  dicuccio
  635.  * Don't manage the main window here - it's managed by the document manager.
  636.  *
  637.  * Revision 1.10  2002/12/11 19:07:42  dicuccio
  638.  * Fixed coredump on app exit if the exit button / icon was used instead of the
  639.  * menu option 'File->Exit'.
  640.  *
  641.  * Revision 1.9  2002/11/29 19:09:18  dicuccio
  642.  * Added WinMain for windows compatibility
  643.  *
  644.  * Revision 1.8  2002/11/29 16:35:43  dicuccio
  645.  * Reformatted tabs -> spaces.  Added standard boilerplate for winmain.cpp
  646.  *
  647.  * Revision 1.7  2002/11/29 16:12:30  dicuccio
  648.  * Wrapped Run() in a try/catch block.  Added central path resolution function
  649.  * to hide platform-specifics of resolving 'standar' file locations
  650.  *
  651.  * Revision 1.6  2002/11/29 15:37:27  dicuccio
  652.  * Major interface change.  Removed the original three panels in favor of a
  653.  * single, integrated main application window.
  654.  *
  655.  * Revision 1.5  2002/11/25 20:59:46  dicuccio
  656.  * Removed old file open mechanism in favor of data loader plugins.
  657.  *
  658.  * Revision 1.4  2002/11/19 17:16:22  dicuccio
  659.  * Added cleaner handling of OS-specific mouse interaction through CFltkEvent.
  660.  *
  661.  * Revision 1.3  2002/11/09 21:02:45  dicuccio
  662.  * Removed automatic view creationon document load.
  663.  *
  664.  * Revision 1.2  2002/11/07 18:53:39  dicuccio
  665.  * Changed code to use ERR_POST() and _TRACE().  Minor string changes (use
  666.  * string::empty())
  667.  *
  668.  * Revision 1.1  2002/11/06 18:23:47  dicuccio
  669.  * Initial revision
  670.  *
  671.  * ===========================================================================
  672.  */