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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: main_window.cpp,v $
  4.  * PRODUCTION Revision 1000.7  2004/06/01 20:48:16  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.32
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: main_window.cpp,v 1000.7 2004/06/01 20:48:16 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.  *    CMainWindow -- main window for Genome Workbench
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "main_window.hpp"
  41. #include "plugin_mgr_dlg.hpp"
  42. #include "document_dlg.hpp"
  43. #include "gbench_frame.hpp"
  44. #include "about_dlg.hpp"
  45. #include "scanner_output_dlg.hpp"
  46. #include "browser_config_dlg.hpp"
  47. #include "browser_config.hpp"
  48. #include <corelib/ncbireg.hpp>
  49. #include <corelib/ncbiapp.hpp>
  50. #include <gui/core/algo_menu.hpp>
  51. #include <gui/core/dload_menu.hpp>
  52. #include <gui/core/selection_buffer.hpp>
  53. #include <gui/core/doc_manager.hpp>
  54. #include <gui/core/idocument.hpp>
  55. #include <gui/config/settings.hpp>
  56. #include <gui/core/version.hpp>
  57. #include <gui/core/iview.hpp>
  58. #include <gui/core/view_menu.hpp>
  59. #include <gui/utils/app_popup.hpp>
  60. #include <gui/widgets/fl/diag_panel.hpp>
  61. BEGIN_NCBI_SCOPE
  62. #include "main_window_.cpp"
  63. CMainWindow::CMainWindow()
  64.     : m_LastConsoleHeight(100)
  65. {
  66.     m_Window.reset(x_CreateWindow());
  67.     CNcbiApplication* app = CNcbiApplication::Instance();
  68.     _ASSERT(app);
  69.     const CNcbiRegistry& reg = app->GetConfig();
  70.     // make sure we position our window correctly
  71.     string window_size = reg.Get("APP.MainWindow", "Position");
  72.     if ( !window_size.empty() ) {
  73.         list<string> toks;
  74.         NStr::Split(window_size, ", ", toks);
  75.         try {
  76.             int win_x = m_Window->x();
  77.             int win_y = m_Window->y();
  78.             int win_w = m_Window->w();
  79.             int win_h = m_Window->h();
  80.             switch (toks.size()) {
  81.             case 2:
  82.                 {{
  83.                      list<string>::const_iterator iter = toks.begin();
  84.                      win_x = NStr::StringToInt(*iter++);
  85.                      win_y = NStr::StringToInt(*iter++);
  86.                  }}
  87.                 break;
  88.             case 4:
  89.                 {{
  90.                      list<string>::const_iterator iter = toks.begin();
  91.                      win_x = NStr::StringToInt(*iter++);
  92.                      win_y = NStr::StringToInt(*iter++);
  93.                      win_w = NStr::StringToInt(*iter++);
  94.                      win_h = NStr::StringToInt(*iter++);
  95.                  }}
  96.                 break;
  97.             default:
  98.                 // unhandled
  99.                 LOG_POST(Warning << "CMainWindow(): "
  100.                          "window size = " << window_size
  101.                          << " is poorly formatted");
  102.                 break;
  103.             }
  104.             m_Window->resize(win_x, win_y, win_w, win_h);
  105.         }
  106.         catch (...){
  107.         }
  108.     }
  109.     /** FIXME: not yet working
  110.     // hide the console window, if we need to
  111.     if (reg.Get("APP.MainWindow", "console") == "false") {
  112.         x_OnToggleConsole();
  113.     }
  114.     **/
  115.     // m_VersionStr and m_BuildStr must either be static or member variables
  116.     // (FLTK doesn't copy the contents, it just stores a pointer)
  117.     m_VersionStr = "version ";
  118.     m_VersionStr += NStr::IntToString(CPluginVersion::eMajor) + ".";
  119.     m_VersionStr += NStr::IntToString(CPluginVersion::eMinor);
  120.     m_Version->label(m_VersionStr.c_str());
  121.     m_BuildStr = "build ";
  122.     m_BuildStr += __DATE__;
  123.     m_BuildStr += "  ";
  124.     m_BuildStr += __TIME__;
  125.     m_BuildDate->label(m_BuildStr.c_str());
  126.     // establish the console window
  127.     m_ShowConsoleBtn->clear_visible_focus();
  128.     m_LastConsoleHeight = m_Console->h();;
  129.     m_Console->SetTextSize(10);
  130.     // create the menu managers
  131.     m_ToolMgr.reset     (new CAlgoMenuMgr     (m_ToolsMenu, "", this));
  132.     m_ViewMgr.reset     (new CViewMenuMgr     (m_ViewsMenu, "", this));
  133.     m_DocLoaderMgr.reset(new CDocLoaderMenuMgr(m_OpenMenu,  ""));
  134.     // refresh our dynamic menus
  135.     x_RefreshDynMenus();
  136. }
  137. CMainWindow::~CMainWindow()
  138. {
  139.     //
  140.     // here we dump the window state to the config file
  141.     //
  142.     // window size and position
  143.     string win_size;
  144.     win_size += NStr::IntToString(m_Window->x()) + ", ";
  145.     win_size += NStr::IntToString(m_Window->y()) + ", ";
  146.     win_size += NStr::IntToString(m_Window->w()) + ", ";
  147.     win_size += NStr::IntToString(m_Window->h());
  148.     
  149.     CNcbiApplication* app = CNcbiApplication::Instance();
  150.     _ASSERT(app);
  151.     CNcbiRegistry& reg = app->GetConfig();
  152.     reg.Set("APP.MainWindow", "Position", win_size,
  153.             CNcbiRegistry::ePersistent);
  154.     // hide state of the window
  155.     reg.Set("APP.MainWindow", "Console",
  156.             NStr::BoolToString(m_Console->visible() ? true : false),
  157.             CNcbiRegistry::ePersistent);
  158. }
  159. bool CMainWindow::Shown(void) const
  160. {
  161.     return (m_Window.get()  &&  m_Window->shown());
  162. }
  163. void CMainWindow::Show(int argc, char** argv)
  164. {
  165.     if (m_Window.get()) {
  166.         m_Window->show(argc, argv);
  167.     }
  168. }
  169. void CMainWindow::Show()
  170. {
  171.     if (m_Window.get()) {
  172.         m_Window->show();
  173.         m_Window->take_focus();
  174.     }
  175. }
  176. void CMainWindow::Hide()
  177. {
  178.     if (m_Window.get()) {
  179.         m_Window->hide();
  180.     }
  181. }
  182. void CMainWindow::x_OnSwitchDocs()
  183. {
  184.     const Fl_Menu_Item* item = m_OpenDocs->mvalue();
  185.     m_CurrentDoc.Reset(reinterpret_cast<IDocument*>(item->user_data()));
  186.     m_OpenDocs->label(item->label());
  187.     x_HideAllBut(m_CurrentDoc);
  188.     x_Show(m_CurrentDoc);
  189.     x_RefreshDynMenus();
  190. }
  191. void CMainWindow::Update(TUpdateFlags flags)
  192. {
  193.     if (flags & (fDocumentCreated | fDocumentReleased) ) {
  194.         // remove the document items from the menu
  195.         for (int i = 0;  i < m_OpenDocs->size() - 1;  ++i) {
  196.             if (m_OpenDocs->menu()[i].label()[0] == '{') {
  197.                 m_OpenDocs->remove(i);
  198.             }
  199.         }
  200.         int val = 0;
  201.         NON_CONST_ITERATE (CDocManager::TDocList, doc_iter, 
  202.                            CDocManager::GetDocuments()) {
  203.             IDocument* doc = *doc_iter;
  204.             string label("{");
  205.             label += NStr::IntToString(doc->GetDocID());
  206.             label += "} " + doc->GetTitle();
  207.             // escape the forward slashes
  208.             string::size_type pos = 0;
  209.             while ( (pos = label.find_first_of("/", pos)) != string::npos) {
  210.                 label.insert(pos, "\");
  211.                 pos += 2;
  212.             }
  213.             val = m_OpenDocs->add(label.c_str(), "", NULL, doc);
  214.         }
  215.         m_OpenDocs->value(val);
  216.         if (val != 0) {
  217.             m_OpenDocs->label(m_OpenDocs->mvalue()->label());
  218.             m_OpenDocs->align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_CLIP);
  219.         }
  220.         m_CurrentDoc.Reset();
  221.         if (CDocManager::GetDocuments().size()) {
  222.             m_CurrentDoc.Reset(CDocManager::GetDocuments().back());
  223.         }
  224.     }
  225.     if (m_OpenDocs->size() > 0) {
  226.         m_OpenDocs->activate();
  227.         m_ViewsMenu->activate();
  228.     } else {
  229.         m_OpenDocs->deactivate();
  230.         m_ViewsMenu->deactivate();
  231.         m_CurrentDoc.Reset();
  232.     }
  233.     // refresh our dynamic menus
  234.     x_RefreshDynMenus();
  235. }
  236. void CMainWindow::GetSelections(TConstScopedObjects& objs) const
  237. {
  238.     objs = GetSelBuffer().DecomposeToPairs();
  239. }
  240. void CMainWindow::SetSelections(const TConstScopedObjects& objs)
  241. {
  242.     // FIXME: stub only
  243. }
  244. string CMainWindow::GetTitle(void) const
  245. {
  246.     return "NCBI Genome Workbench";
  247. }
  248. void CMainWindow::x_OnToggleConsole()
  249. {
  250.     if (m_Console->visible()) {
  251.         m_LastConsoleHeight = m_Console->h();
  252.         m_Window->size(m_Window->w(), m_Window->h() - m_LastConsoleHeight);
  253.         m_Console->hide();
  254.         m_ShowConsoleBtn->label("@-22UpArrow");
  255.     } else {
  256.         m_Console->show();
  257.         m_ShowConsoleBtn->label("@-28DnArrow");
  258.         _TRACE("showing console: " << m_Window->h() << " + " << m_LastConsoleHeight);
  259.         m_Window->size(m_Window->w(), m_Window->h() + m_LastConsoleHeight);
  260.         _TRACE("showed console: " << m_Window->h());
  261.     }
  262. }
  263. void CMainWindow::x_RefreshDynMenus()
  264. {
  265.     GetSelBuffer().Clear();
  266.     if (m_CurrentDoc) {
  267.         GetSelBuffer().AddSelection(m_CurrentDoc);
  268.     }
  269.     //
  270.     // fill the algorithm plugins menus
  271.     //
  272.     m_ToolMgr->Clear();
  273.     m_ToolMgr->AddAlgoMenu();
  274.     //
  275.     // fill the Open View menu button
  276.     //
  277.     m_ViewMgr->Clear();
  278.     m_ViewMgr->AddActiveViews(m_CurrentDoc);
  279.     m_ViewMgr->AddNewViews();//   (m_CurrentDoc);
  280.     //
  281.     // fill the doc loader plugins menus
  282.     //
  283.     m_DocLoaderMgr->Clear();
  284.     m_DocLoaderMgr->AddOpenMenu();
  285.     m_DocLoaderMgr->AddRecentMenu();
  286.     m_DocLoaderMgr->AddImportMenu();
  287.     m_DocLoaderMgr->AddSaveAsMenu();
  288.     m_DocLoaderMgr->AddUnloadMenu();
  289.     m_DocLoaderMgr->AddSearchMenu();
  290.     m_DocLoaderMgr->AddManageMenu();
  291. }
  292. void CMainWindow::x_OnManagePlugins()
  293. {
  294.     if ( !m_PluginMgrDlg.get() ) {
  295.         m_PluginMgrDlg.reset(new CPluginMgrDlg());
  296.     }
  297.     m_PluginMgrDlg->Show();
  298. }
  299. void CMainWindow::x_OnBrowserConfig()
  300. {
  301.     //GBenchBrowserConfig();
  302. if ( !m_BrowserConfigDlg.get() ) {
  303.         m_BrowserConfigDlg.reset(new CBrowserConfigDlg());
  304.     }
  305.     m_BrowserConfigDlg->Show();
  306. }
  307. void CMainWindow::x_OnShowFrame()
  308. {
  309.     x_GetMainFrame().show();
  310. }
  311. void CMainWindow::x_OnShowAllRecords()
  312. {
  313.     if ( !m_DocumentDlg ) {
  314.         m_DocumentDlg.Reset(new CDocumentDlg());
  315.         CDocManager::AttachView(m_DocumentDlg);
  316.     }
  317.     m_DocumentDlg->Show();
  318. }
  319. void CMainWindow::x_OnHelpIndex()
  320. {
  321.     static const string url("http://www.ncbi.nlm.nih.gov/books/bv.fcgi?"
  322.                             "call=bv.View..ShowSection&rid=toolkit.section.3528");
  323.     CAppPopup::PopupURL(url);
  324. }
  325. void CMainWindow::x_OnHelpAbout()
  326. {
  327.     if ( !m_AboutDlg.get() ) {
  328.         m_AboutDlg.reset(new CAboutDlg());
  329.     }
  330.     m_AboutDlg->Show();
  331. }
  332. void CMainWindow::x_HideAllBut(IDocument* doc)
  333. {
  334.     NON_CONST_ITERATE (CDocManager::TDocList, doc_iter, 
  335.                        CDocManager::GetDocuments()) {
  336.         IDocument* this_doc = *doc_iter;
  337.         if (this_doc == doc) {
  338.             continue;
  339.         }
  340.         NON_CONST_ITERATE (IDocument::TViews, view_iter, doc->SetViews()) {
  341.             IView* view = *view_iter;
  342.             view->Hide();
  343.         }
  344.     }
  345. }
  346. void CMainWindow::x_Show(IDocument* doc)
  347. {
  348.     NON_CONST_ITERATE (IDocument::TViews, view_iter, doc->SetViews()) {
  349.         IView* view = *view_iter;
  350.         view->Show();
  351.     }
  352. }
  353. CGBenchFrameWindow& CMainWindow::x_GetMainFrame()
  354. {
  355.     if ( !m_AppFrame.get() ) {
  356.         m_AppFrame.reset(new CGBenchFrameWindow(1024, 768));
  357.     }
  358.     return *m_AppFrame;
  359. }
  360. END_NCBI_SCOPE
  361. /*
  362.  * ===========================================================================
  363.  * $Log: main_window.cpp,v $
  364.  * Revision 1000.7  2004/06/01 20:48:16  gouriano
  365.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.32
  366.  *
  367.  * Revision 1.32  2004/05/21 22:27:42  gorelenk
  368.  * Added PCH ncbi_pch.hpp
  369.  *
  370.  * Revision 1.31  2004/05/18 11:14:45  friedman
  371.  * Add "Recent Documents" menu entry.
  372.  *
  373.  * Revision 1.30  2004/05/17 13:25:32  dicuccio
  374.  * First implementation of new document workspace
  375.  *
  376.  * Revision 1.29  2004/04/21 17:06:58  dicuccio
  377.  * Only add current document if the document is valid
  378.  *
  379.  * Revision 1.28  2004/04/16 14:40:33  dicuccio
  380.  * Inherit from ISelection for selection marshalling
  381.  *
  382.  * Revision 1.27  2004/04/09 17:24:47  jcherry
  383.  * Implemented browser configuration for Windows, and changed how
  384.  * it works on unix for consistency
  385.  *
  386.  * Revision 1.26  2004/04/07 21:08:51  jcherry
  387.  * Added web browser configuration for gbench MIME types
  388.  * (functinal on unix only so far)
  389.  *
  390.  * Revision 1.25  2004/02/17 20:35:24  rsmith
  391.  * moved core/settings.[ch]pp and core/system_path.[ch]pp to config and utils, respectively.
  392.  *
  393.  * Revision 1.24  2003/12/04 18:12:20  dicuccio
  394.  * Fixed escaping of document names that contain a '/'.
  395.  *
  396.  * Revision 1.23  2003/11/24 15:42:02  dicuccio
  397.  * Renamed CVersion to CPluginVersion
  398.  *
  399.  * Revision 1.22  2003/11/18 17:45:29  dicuccio
  400.  * Changed handling of m_CurrentDoc inside of Update()
  401.  *
  402.  * Revision 1.21  2003/11/06 20:08:53  dicuccio
  403.  * Added help menu items
  404.  *
  405.  * Revision 1.20  2003/11/04 17:22:38  dicuccio
  406.  * Changed registry settings - use uppercase for sections, up-and-down style for
  407.  * items.  Removed some unneeded TRACE()s
  408.  *
  409.  * Revision 1.19  2003/10/27 17:40:38  dicuccio
  410.  * Restructured diagnostic handler - use CDiagPanel
  411.  *
  412.  * Revision 1.18  2003/09/04 14:02:36  dicuccio
  413.  * Introduce IDocument as abstract base class for CDocument; replace use of
  414.  * CDocument with IDocument
  415.  *
  416.  * Revision 1.17  2003/08/22 15:46:43  dicuccio
  417.  * Removed config file from CSettings - accessible through CNcbiApplication
  418.  *
  419.  * Revision 1.16  2003/08/06 13:24:31  dicuccio
  420.  * Deprecated old main window; introduced new, compact window for multiple
  421.  * document management
  422.  *
  423.  * Revision 1.15  2003/07/31 17:00:51  dicuccio
  424.  * Cleaned up handling of document menu button / label.  Added search and manage
  425.  * menu options to the data drop-down menu.  Changed "Open a record" to "Data"
  426.  *
  427.  * Revision 1.14  2003/07/30 12:21:53  dicuccio
  428.  * Added saving state of console window (not yet restored on APP restart)
  429.  *
  430.  * Revision 1.13  2003/07/21 19:30:48  dicuccio
  431.  * Changed calling conventions of CAlgoMenuMgr to match CViewMenuMgr /
  432.  * CDocMenuMgr() - updated window to match
  433.  *
  434.  * Revision 1.12  2003/07/11 15:06:37  kans
  435.  * use NcbiApplication instead of doc manager settings for registry (MND)
  436.  *
  437.  * Revision 1.11  2003/06/30 13:35:51  dicuccio
  438.  * Lots of clean-up.  Restore the original diagnostic handler before shutting
  439.  * down the application.  Moved debug settings into the .ini file.  Minor
  440.  * clean-up of handling of config file
  441.  *
  442.  * Revision 1.10  2003/06/25 17:02:56  dicuccio
  443.  * Split CPluginHandle into a handle (pointer-to-implementation) and
  444.  * implementation file.  Lots of #include file clean-ups.
  445.  *
  446.  * Revision 1.9  2003/06/09 19:19:52  dicuccio
  447.  * Added ability for window to save/restore its position
  448.  *
  449.  * Revision 1.8  2003/05/06 15:58:03  dicuccio
  450.  * Fixed bug: don't reset the current document in Update() unless the menu itself needs to be changed
  451.  *
  452.  * Revision 1.7  2003/05/05 12:44:01  dicuccio
  453.  * Add views only for current document
  454.  *
  455.  * Revision 1.6  2003/04/29 14:51:52  dicuccio
  456.  * Reworked FLUID-generated code: more explicit control over constructor, better
  457.  * memeory management
  458.  *
  459.  * Revision 1.5  2003/04/24 16:36:19  dicuccio
  460.  * Updated to reflect changes in IDocument API
  461.  *
  462.  * Revision 1.4  2003/04/08 20:09:37  dicuccio
  463.  * Minor layout changes.  Made main window smaller; reduced size of console
  464.  * window.  Also, added clipping and left-justification to items in the documents
  465.  * drop-down.
  466.  *
  467.  * Revision 1.3  2003/04/08 18:10:58  lebedev
  468.  * Document organizer added
  469.  *
  470.  * Revision 1.2  2003/04/07 17:30:26  dicuccio
  471.  * Cleaned up window initialization to support multiple top-level doc manager
  472.  * windows
  473.  *
  474.  * Revision 1.1  2003/03/31 13:36:37  dicuccio
  475.  * Initial revision.
  476.  *
  477.  * ===========================================================================
  478.  */