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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: config_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:45:26  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: config_dlg.cpp,v 1000.1 2004/06/01 20:45:26 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:  Robert G. Smith
  35.  *
  36.  * File Description:
  37.  *    User-modifiable implementation file for extension of basic class, 
  38.  *      CConfigDlg, a prototype dialog box used for editing preferences.
  39.  *    A suitable mediator must be supplied to instantiate one.
  40.  */
  41. #include <ncbi_pch.hpp>
  42. #include <gui/dialogs/config/config_dlg.hpp>
  43. #include <gui/dialogs/config/iconfig_mediator.hpp>
  44. #include <gui/dialogs/config/config_panel.hpp>
  45. #include <gui/utils/message_box.hpp>
  46. #include <FL/fl_ask.H>
  47. BEGIN_NCBI_SCOPE
  48. #include "config_dlg_.cpp"
  49. CConfigDlg::CConfigDlg(IConfigMediator& mediator)
  50. {
  51.     m_ConfigMediator.Reset(& mediator);
  52.     m_Window.reset(x_CreateWindow());
  53.     
  54.     SetTitle(m_ConfigMediator->GetWindowTitle());
  55.     x_SetConfigPanel(* m_ConfigMediator->GetPanel().GetConfigPanel());
  56.     
  57.     // populate our browser
  58.     x_SetStates(m_ConfigMediator->GetStates());
  59.     // select the first thing in the state browser and Load it
  60.     // NO. find out what the current state/style is and load that.
  61.     // m_StyleBrowser->deselect();
  62.     // m_StyleBrowser->value(1);
  63.     m_ConfigMediator->Load(kEmptyStr);
  64.     string first_state = m_ConfigMediator->GetCurrentState();
  65.     x_SetSelectedState(first_state);
  66.     x_SetLoadedState(first_state);
  67. }
  68. void CConfigDlg::x_SetConfigPanel(Fl_Group& new_group)
  69. {
  70.     // we don't know the size of the new group of widgets
  71.     //  so most of this code is moving things to accomodate it.
  72.     const int configPanelOffset = 0;
  73.     
  74.     Fl_Window* dlg_win = m_ConfigPanelHolder->window();
  75.     
  76.     //  find out things relative positions before we start moving stuff around.
  77.     int right_margin =
  78.         dlg_win->w() - (m_ConfigPanelHolder->x() + m_ConfigPanelHolder->w());
  79.     int pack_bot_margin =
  80.         dlg_win->h() - (m_ConfigPanelHolder->y() + m_ConfigPanelHolder->h());
  81.     int win_h = dlg_win->h();
  82.     int win_w = dlg_win->w();
  83.     
  84.     // make the whole window the right size.
  85.     // do not decrease its size. It starts at its minimum.
  86.     int new_window_width =
  87.         right_margin + (m_ConfigPanelHolder->x() + new_group.w() + 2*configPanelOffset);
  88.     new_window_width = max(new_window_width, dlg_win->w());
  89.     int new_window_height =
  90.         pack_bot_margin + (m_ConfigPanelHolder->y() + new_group.h() + 2*configPanelOffset);
  91.     new_window_height = max(new_window_height, dlg_win->h());
  92.     
  93.     dlg_win->size(new_window_width, new_window_height);
  94.     
  95.     // Right now, is the smallest this window can be.
  96.     dlg_win->size_range(dlg_win->w(), dlg_win->h());
  97.     
  98.     // make the Fl_Pack just wide enough (don't let it stretch our new group).
  99.     m_ConfigPanelHolder->clear();
  100.     // and Add it.
  101.     new_group.position(m_ConfigPanelHolder->x() + configPanelOffset, m_ConfigPanelHolder->y() + configPanelOffset);
  102.     m_ConfigPanelHolder->size(new_group.w() + 2*configPanelOffset, new_group.h() + 2*configPanelOffset);
  103.     m_ConfigPanelHolder->add(& new_group);
  104.     
  105.     // necessary before we resize the window
  106.     // since we might not have drawn this all yet.
  107.     m_Tile->init_sizes();
  108.     new_group.init_sizes();
  109.     m_ConfigPanelHolder->init_sizes();
  110.     m_RightGroup->init_sizes();
  111. }
  112. void CConfigDlg::x_SetStates(list<string> const& states)
  113. {
  114.     m_StyleBrowser->clear();
  115.     ITERATE(list<string>, state_it, states) {
  116.         m_StyleBrowser->add(state_it->c_str());
  117.     }
  118. }
  119. //
  120. // Browser selection -> State
  121. // Return in the state param the string displayed
  122. // on the selected line in the browser.
  123. // If nothing was selected returns false and 'state'
  124. // is unmodified.
  125. //
  126. bool CConfigDlg::x_GetSelectedState(string& state)
  127. {
  128.     int sel_idx = m_StyleBrowser->value();
  129.     if (sel_idx == 0) {
  130.         return false;
  131.     }
  132.     
  133.     const char *browser_text = m_StyleBrowser->text(sel_idx);
  134.     if (browser_text == NULL) {
  135.         return false;
  136.     }
  137.     string the_state(browser_text);
  138.     state.swap(the_state);
  139.     return true;
  140. }
  141. // State -> Browser selection
  142. // Select the line in the browser that has text the same
  143. // as the 'state' parameter. 
  144. // Does nothing if that text was not found.
  145. void CConfigDlg::x_SetSelectedState(const string& state)
  146. {
  147.     int n = m_StyleBrowser->size();
  148.     int i;
  149.     for (i = 1; i <= n; ++i) {
  150.         const char *a_text = m_StyleBrowser->text(i);
  151.         if (a_text != NULL  &&  state == a_text) {
  152.             m_StyleBrowser->deselect();
  153.             m_StyleBrowser->value(i);
  154.             x_UpdateSetBtns();
  155.             return;
  156.         }
  157.     }
  158. }
  159. void CConfigDlg::x_SelectFirstState()
  160. {
  161.     m_StyleBrowser->deselect();
  162.     m_StyleBrowser->value(1);
  163.     x_UpdateSetBtns();
  164. }
  165. string CConfigDlg::x_GetLoadedState()
  166. {
  167.     return m_CurrentStyleText->value();
  168. }
  169. // show which state is loaded.
  170. void CConfigDlg::x_SetLoadedState(const string& state)
  171. {
  172.     m_CurrentStyleText->value(state.c_str());
  173. }
  174. // load the currently selected state.
  175. void CConfigDlg::x_OnUse()
  176. {
  177.     string this_state;
  178.     if ( ! x_GetSelectedState(this_state) ) {
  179.         return;
  180.     }
  181.     
  182.     // TODO: Make auto-save optional
  183.     m_ConfigMediator->Save(kEmptyStr);
  184.     m_ConfigMediator->Load(this_state);
  185.     x_SetLoadedState(this_state);
  186.     
  187.     m_Window->redraw();
  188. }
  189. void CConfigDlg::x_OnAdd()
  190. {
  191.     string  new_state;
  192.     if ( m_ConfigMediator->AddState(new_state) ) {
  193.         x_SetStates(m_ConfigMediator->GetStates());
  194.         x_SetSelectedState(new_state);
  195.         // x_OnUse();
  196.         m_Window->redraw();
  197.     } else {
  198.         NcbiMessageBox("Failed to add new state.");
  199.     }
  200. }
  201. void CConfigDlg::x_OnCopy()
  202. {
  203.     string this_state;
  204.     if ( ! x_GetSelectedState(this_state) ) {
  205.         return;
  206.     }
  207.     
  208.     string  new_state;
  209.     if ( m_ConfigMediator->DuplicateState(this_state, new_state) ) {
  210.         x_SetStates(m_ConfigMediator->GetStates());
  211.         x_SetSelectedState(new_state);
  212.         // x_OnUse();
  213.         m_Window->redraw();
  214.     } else {
  215.         string msg("Can not copy ");
  216.         msg += this_state;
  217.         NcbiMessageBox(msg);
  218.     }
  219. }
  220. void CConfigDlg::x_OnRename()
  221. {
  222.     string this_state;
  223.     if ( ! x_GetSelectedState(this_state) ) {
  224.         return;
  225.     }
  226.     
  227.     // can we do this?
  228.     if ( ! m_ConfigMediator->CanRenameState(this_state)) {
  229.         string msg("Can not rename ");
  230.         msg += this_state;
  231.         NcbiMessageBox(msg);
  232.         return;
  233.     }
  234.     
  235.     // Get a new name from the user (requested name).
  236.     const char * req_state_cp =
  237.         fl_input("Rename %s as:", this_state.c_str(), this_state.c_str());
  238.     if (req_state_cp == 0) { // Canceled input
  239.         return;
  240.     }
  241.     string  req_state(req_state_cp);
  242.     if (req_state.empty()  ||  req_state  ==  this_state) {
  243.         // requested name blank or no change to the name.
  244.         return;
  245.     }
  246.     
  247.     // rename it, get back the new name actually used.
  248.     string  new_state;
  249.     if ( m_ConfigMediator->RenameState(this_state, req_state, new_state) ) {
  250.         x_SetStates(m_ConfigMediator->GetStates());
  251.         x_SetSelectedState(new_state);
  252.         // did we rename the currently loaded state?
  253.         if (x_GetLoadedState() == this_state) {
  254.             x_SetLoadedState(new_state);
  255.         }
  256.         m_Window->redraw();
  257.     } else {
  258.         // something else went wrong.
  259.         string msg("Can not rename ");
  260.         msg += this_state;
  261.         NcbiMessageBox(msg);
  262.     }
  263. }
  264. void CConfigDlg::x_OnDelete()
  265. {
  266.     string this_state;
  267.     if ( ! x_GetSelectedState(this_state) ) {
  268.         return;
  269.     }
  270.     
  271.     if ( m_ConfigMediator->DeleteState(this_state) ) {
  272.         m_StyleBrowser->deselect();
  273.         x_SetStates(m_ConfigMediator->GetStates());
  274.         
  275.         // did we delete the currently loaded state?
  276.         if (x_GetLoadedState() == this_state) {
  277.             // select and load the first state in the list.
  278.             x_SelectFirstState();
  279.             x_OnUse();
  280.         }
  281.         m_Window->redraw();
  282.     } else {
  283.         string msg("Can not delete ");
  284.         msg += this_state;
  285.         NcbiMessageBox(msg);
  286.     }
  287. }
  288. // Default callback for clicking the 'OK' button
  289. void CConfigDlg::x_OnOK()
  290. {
  291.     m_ConfigMediator->Save(kEmptyStr);
  292.     CDialog::x_OnOK();
  293. }
  294. void CConfigDlg::x_OnDefVals()
  295. {
  296.     m_ConfigMediator->LoadDefault();
  297.     m_Window->redraw();
  298. }
  299. void CConfigDlg::x_OnClicks()
  300. {
  301.     x_UpdateSetBtns();
  302.     if (Fl::event_clicks()) {
  303.         x_OnUse();
  304.     }
  305. }
  306. void CConfigDlg::x_UpdateSetBtns()
  307. {
  308.     bool    delRenameOn = true;
  309.     
  310.     string this_state;
  311.     if ( x_GetSelectedState(this_state) ) {
  312.         if ( ! m_ConfigMediator->CanRenameState(this_state)) {
  313.             delRenameOn = false;
  314.         }
  315.     }
  316.     
  317.     if (delRenameOn) {
  318.         m_RenameBtn->activate();
  319.         m_DeleteBtn->activate();
  320.     } else {
  321.         m_RenameBtn->deactivate();
  322.         m_DeleteBtn->deactivate();
  323.     }
  324.      
  325. }
  326. END_NCBI_SCOPE
  327. /*
  328.  * ===========================================================================
  329.  * $Log: config_dlg.cpp,v $
  330.  * Revision 1000.1  2004/06/01 20:45:26  gouriano
  331.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.3
  332.  *
  333.  * Revision 1.3  2004/05/21 22:27:41  gorelenk
  334.  * Added PCH ncbi_pch.hpp
  335.  *
  336.  * Revision 1.2  2004/01/02 21:04:53  rsmith
  337.  * remove misleading comment
  338.  *
  339.  * Revision 1.1  2003/12/30 14:09:38  dicuccio
  340.  * Initial check-in - moved from gui/config
  341.  *
  342.  * Revision 1.5  2003/12/29 14:38:14  rsmith
  343.  * take out SetTitle since it is supplied by the parent class.
  344.  *
  345.  * Revision 1.4  2003/11/21 12:52:25  rsmith
  346.  * Fix bug with renaming loaded set of values.
  347.  *
  348.  * Revision 1.3  2003/11/18 20:23:46  rsmith
  349.  * Various bug fixes and enhancements.
  350.  *
  351.  * Revision 1.2  2003/10/14 12:48:54  dicuccio
  352.  * Inherit from CDialog.  Fix resizing issues.  Standardized widget sizes.
  353.  *
  354.  * Revision 1.1  2003/10/10 17:43:42  rsmith
  355.  * moved from gui/core to gui/config
  356.  *
  357.  * Revision 1.1  2003/09/26 18:15:31  rsmith
  358.  * plugin configration data and dialog
  359.  *
  360.  * ===========================================================================
  361.  */