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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: theme_dlg.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:45:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id $
  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.  *      CThemeDlg, 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/theme_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 <gui/dialogs/config/edit_styles_dlg.hpp>
  47. #include <FL/fl_ask.H>
  48. BEGIN_NCBI_SCOPE
  49. #include "theme_dlg_.cpp"
  50. CThemeDlg::CThemeDlg(IConfigMediator& mediator)
  51. {
  52.     m_ConfigMediator.Reset(& mediator);
  53.     m_Window.reset(x_CreateWindow());
  54.     
  55.     SetTitle(m_ConfigMediator->GetWindowTitle());
  56.     SetConfigPanel(* m_ConfigMediator->GetPanel().GetConfigPanel());
  57.     
  58.     // populate our browser
  59.     x_SetStates(m_ConfigMediator->GetStates());
  60.     // select the first thing in the state browser and Load it
  61.     // NO. find out what the current state/style is and load that.
  62.     // m_StyleBrowser->deselect();
  63.     // m_StyleBrowser->value(1);
  64.     // m_ConfigMediator->Load(kEmptyStr);
  65.     string first_state = m_ConfigMediator->GetCurrentState();
  66.     x_SetLoadedState(first_state);
  67. }
  68. void CThemeDlg::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 holder_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.         holder_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.     // and Add it.
  99.     m_ConfigPanelHolder->clear();
  100.     new_group.position(m_ConfigPanelHolder->x() + configPanelOffset, m_ConfigPanelHolder->y() + configPanelOffset);
  101.     m_ConfigPanelHolder->size(new_group.w() + 2*configPanelOffset, new_group.h() + 2*configPanelOffset);
  102.     m_ConfigPanelHolder->add(& new_group);
  103. }
  104. void CThemeDlg::x_SetStates(list<string> const& states)
  105. {
  106.     m_ThemeList->clear();
  107.     ITERATE(list<string>, state_it, states) {
  108.         m_ThemeList->add(state_it->c_str());
  109.     }
  110. }
  111. string CThemeDlg::x_GetLoadedState()
  112. {
  113.     const char *t = m_ThemeList->text();
  114.     if (t) {
  115.         return t;
  116.     }
  117.     return kEmptyStr;
  118. }
  119. void CThemeDlg::x_SetLoadedState(const string& theme)
  120. {
  121. //    m_ThemeList->value(theme.c_str());
  122.     const Fl_Menu_Item* menu_items = m_ThemeList->menu();
  123.     for (int item_n = 0; menu_items != NULL  &&  menu_items->label() != NULL; ++menu_items, ++item_n) {
  124.         if (theme == menu_items->label()) {
  125.             m_ThemeList->value(item_n);
  126.             return;
  127.         }
  128.     }
  129.     return;
  130. }
  131. void CThemeDlg::x_OnUse()
  132. {
  133.     string this_state = x_GetLoadedState();
  134.     
  135.     // TODO: Make auto-save optional
  136.     m_ConfigMediator->Save(kEmptyStr);
  137.     m_ConfigMediator->Load(this_state);
  138.     
  139.     m_Window->redraw();
  140.  
  141. }
  142. // Default callback for clicking the 'OK' button
  143. void CThemeDlg::x_OnOK()
  144. {
  145.     m_ConfigMediator->Save(kEmptyStr);
  146.     CDialog::x_OnOK();
  147. }
  148. void CThemeDlg::x_OnDefVals()
  149. {
  150.     m_ConfigMediator->LoadDefault();
  151.     m_Window->redraw();
  152. }
  153. void CThemeDlg::x_OnShowStateDlg()
  154. {
  155.     CEditStylesDlg edit_styles(*m_ConfigMediator);
  156.     edit_styles.ShowModal();
  157.     // populate our browser again
  158.     x_SetStates(m_ConfigMediator->GetStates());
  159.     // find out what the current state/style is and load that.
  160.     string first_state = m_ConfigMediator->GetCurrentState();
  161.     x_SetLoadedState(first_state);
  162.     m_Window->redraw();
  163. }
  164. END_NCBI_SCOPE
  165. /*
  166.  * ===========================================================================
  167.  * $Log: theme_dlg.cpp,v $
  168.  * Revision 1000.1  2004/06/01 20:45:55  gouriano
  169.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  170.  *
  171.  * Revision 1.4  2004/05/21 22:27:41  gorelenk
  172.  * Added PCH ncbi_pch.hpp
  173.  *
  174.  * Revision 1.3  2004/01/02 21:15:31  ucko
  175.  * Include edit_styles_dlg.hpp from the right directory.
  176.  *
  177.  * Revision 1.2  2004/01/02 21:06:44  rsmith
  178.  * Add link to edit_styles dialog.
  179.  * Change CComboBox to Fl_Choice. and other cleanups.
  180.  *
  181.  * Revision 1.1  2003/12/30 14:09:42  dicuccio
  182.  * Initial check-in - moved from gui/config
  183.  *
  184.  * Revision 1.1  2003/12/29 14:41:37  rsmith
  185.  * initial checkin
  186.  *
  187.  *
  188.  * ===========================================================================
  189.  */