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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: theme_config_panel2.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:45:49  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  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.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/dialogs/config/theme_config_panel2.hpp>
  41. BEGIN_NCBI_SCOPE
  42. typedef Fl_Choice TDropDownMenu;
  43. static void ClearDDM(TDropDownMenu* dd_menu)
  44. {
  45.     dd_menu->clear();
  46. }
  47.    
  48. static void AddDDM(TDropDownMenu* dd_menu, const string& s)
  49. {
  50.     // dd_menu->Add(s.c_str());    // CComboxBox
  51.     dd_menu->add(s.c_str());   // Fl_Choice
  52. }
  53. static string GetValueDDM(TDropDownMenu* dd_menu)
  54. {
  55.     // return dd_menu->value();   // CComboBox
  56.     
  57.     // Fl_Choice
  58.     const char *t = dd_menu->text();
  59.     if (t) {
  60.         return t;
  61.     }
  62.     return kEmptyStr;
  63.     
  64. }
  65. static void SetValueDDM(TDropDownMenu* dd_menu, const string& s)
  66. {
  67.     // dd_menu->value(s.c_str());  // CComboBox
  68.     
  69.     // Fl_Choice
  70.     const Fl_Menu_Item* menu_items = dd_menu->menu();
  71.     for (int item_n = 0; menu_items != NULL  &&  menu_items->label() != NULL; ++menu_items, ++item_n) {
  72.         if (s == menu_items->label()) {
  73.             dd_menu->value(item_n);
  74.             return;
  75.         }
  76.     }
  77.     return;
  78. }
  79. CThemeConfigPanel2::CThemeConfigPanel2() :
  80.     m_ConfigPanel(0),
  81.     m_Preview(0),
  82.     m_LayoutDirection(CThemeConfigPanel2::eLayoutDirection_Horizontal)
  83. {
  84. }
  85. Fl_Group* CThemeConfigPanel2::GetConfigPanel()
  86. {
  87.     return m_ConfigPanel;
  88. }
  89. void CThemeConfigPanel2::MakeWidgets()
  90. {
  91.     x_MakeWidgets();
  92.     UpdateWidgets();
  93. }
  94. void  CThemeConfigPanel2::UpdateWidgets()
  95. {
  96.     ITERATE (vector <SItemData>, item_it, m_ItemData) {
  97.         const string& item_desc = item_it->desc;
  98.         x_SetStyles(item_desc);
  99.     
  100.         string this_style = GetCurrentStyleByDesc(item_desc);
  101.         
  102.         SetValueDDM(x_GetChoice(item_desc), this_style);
  103.     }
  104.     m_ConfigPanel->redraw();
  105. }
  106. void CThemeConfigPanel2::x_SetStyles(const string& item)
  107. {    
  108.     Fl_Choice*   this_menu = x_GetChoice(item);
  109.     if (this_menu) {
  110.         ClearDDM(this_menu);
  111.         const TStyleList& styles = GetStylesByDesc(item);
  112.         ITERATE(TStyleList, style_it, styles) {
  113.             AddDDM(this_menu, *style_it);
  114.         }
  115.     }
  116. }
  117. void CThemeConfigPanel2::x_StyleChosen(Fl_Choice * w)
  118. {
  119.     SetCurrentStyleByDesc(x_GetItem(w), GetValueDDM(w) );
  120.     // m_Preview->redraw();
  121. }
  122. void CThemeConfigPanel2::SetLayoutDirection(CThemeConfigPanel2::ELayoutDirection d)
  123. {
  124.     m_LayoutDirection = d;
  125. }
  126. CThemeConfigPanel2::ELayoutDirection  CThemeConfigPanel2::GetLayoutDirection()
  127. {
  128.     return m_LayoutDirection;
  129. }
  130. namespace {
  131.     const int   kSpaceVertical  = 5;
  132.     const int   kMarginLeft     = 10;
  133.     const int   kMarginRight    = 5;
  134.     const int   kSpaceHoriz     = 5;
  135.     
  136.     const int   kWidgetHeight   = 25;
  137.     const int   kLabelWidth     = 100;
  138.     const int   kWidgetWidth    = 150; // must be greater than or equal to kLabelWidth.
  139. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  140.     const int   kToggleHeight   = kWidgetHeight;
  141.     const int   kToggleWidth    = kToggleHeight;
  142. #else
  143.     const int   kToggleHeight   = 0;
  144.     const int   kToggleWidth    = 0;
  145. #endif
  146.     const int   kPreviewWidthMin = 315;
  147.     const int   kPreviewHeightMin = 160;
  148. }
  149. Fl_Group* CThemeConfigPanel2::x_MakeWidgets() 
  150. {
  151.     int n_items = m_ItemData.size();
  152.     
  153.     int panel_h;
  154.     int panel_w;
  155.     int panel_x = 0;
  156.     int panel_y = 0;
  157.     int widget_group_h;
  158.     int widget_group_w;
  159.     
  160.     if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  161.         panel_h = 2 * kSpaceVertical + 2 * kWidgetHeight + kPreviewHeightMin;
  162.         panel_w = n_items * (kSpaceHoriz +  kWidgetWidth) + kSpaceHoriz;
  163. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  164.         panel_w += kToggleWidth + kSpaceHoriz;
  165. #endif 
  166.         panel_w = max(kPreviewWidthMin, panel_w);       
  167.     } else {
  168.         panel_w = kMarginLeft + kWidgetWidth + kSpaceHoriz + kPreviewWidthMin;
  169.         panel_h = n_items * (kSpaceVertical + 2*kWidgetHeight) + kSpaceVertical;
  170. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  171.         panel_h += kToggleHeight + kSpaceVertical;
  172. #endif 
  173.         panel_h = max(kPreviewHeightMin, panel_h);
  174.     }
  175.     if ( ! m_ConfigPanel) {
  176.         m_ConfigPanel = new Fl_Group(0, 0, panel_w, panel_h);
  177.         m_ConfigPanel->box(FL_FLAT_BOX);
  178.         m_ConfigPanel->color(FL_BACKGROUND_COLOR);
  179.         m_ConfigPanel->selection_color(FL_BACKGROUND_COLOR);
  180.         m_ConfigPanel->labeltype(FL_NO_LABEL);
  181.         m_ConfigPanel->activate();
  182.         m_ConfigPanel->user_data((void*)(this));
  183.     } else {
  184.         m_ConfigPanel->clear();
  185.         m_ConfigPanel->begin();
  186.         panel_x = m_ConfigPanel->x();
  187.         panel_y = m_ConfigPanel->y();
  188.     }
  189.     if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  190.         widget_group_h = 2 * kSpaceVertical + 2 * kWidgetHeight;
  191.         widget_group_w = panel_w;
  192.     } else {
  193.         widget_group_w = kMarginLeft + kWidgetWidth + kSpaceHoriz;
  194.         widget_group_h = panel_h;
  195.     }
  196.         
  197.     if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  198.         m_Preview = new Fl_Group(panel_x, panel_y + widget_group_h, panel_w, kPreviewHeightMin);
  199.         m_ConfigPanel->resizable(m_Preview);
  200.     } else {
  201.         m_Preview = new Fl_Group(widget_group_w, panel_y, kPreviewWidthMin, panel_h);
  202.     }
  203.     m_Preview->box(FL_DOWN_BOX);
  204.     m_Preview->end();
  205.     
  206.     Fl_Group* widget_group = new Fl_Group(panel_x, panel_y, widget_group_w, widget_group_h);
  207.     // widget_group->box(FL_DOWN_BOX);
  208.     widget_group->activate();
  209.     
  210. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  211.     m_DirectionBtn = new Fl_Button(panel_x + kSpaceHoriz, panel_y + kSpaceVertical, kToggleWidth, kToggleHeight);
  212.     m_DirectionBtn->label(m_LayoutDirection == eLayoutDirection_Horizontal ? "@->": "@2->" );
  213.     m_DirectionBtn->user_data((void*)(this));
  214.     m_DirectionBtn->callback((Fl_Callback*) cb_SwitchDirections );
  215. #endif
  216.     
  217.     // intialize the widget positions.
  218.     int label_x, label_y;
  219.     int widget_x, widget_y;
  220.     if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  221.         label_x = panel_x + kSpaceHoriz;
  222. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  223.         label_x += kToggleWidth + kSpaceHoriz;
  224. #endif 
  225.         label_y = panel_y + kSpaceVertical;
  226.         widget_x = label_x;
  227.         widget_y = label_y + kWidgetHeight;
  228.     } else {
  229.         label_x = panel_x + kMarginLeft;
  230.         label_y = panel_y + kSpaceVertical;
  231. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  232.         label_y += kToggleHeight + kSpaceVertical;
  233. #endif 
  234.         widget_x = label_x;
  235.         widget_y = label_y + kWidgetHeight;
  236.     }    
  237.         
  238.     // create the widgets.
  239.     ITERATE(vector<SItemData>, item_it, m_ItemData) {
  240.     
  241.         Fl_Box* label_box = new Fl_Box(label_x, label_y, kLabelWidth, kWidgetHeight, item_it->desc.c_str());
  242.         label_box->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE);
  243.         
  244.         Fl_Choice* choice = new Fl_Choice(widget_x, widget_y, kWidgetWidth, kWidgetHeight);
  245.         choice->down_box(FL_BORDER_BOX);
  246.         choice->user_data((void*)(this));
  247.         choice->callback((Fl_Callback*) cb_StyleChosen );
  248.         choice->when(FL_WHEN_RELEASE);
  249.         bool act_ive = choice->active_r();
  250.         x_AddChoice(item_it->desc, choice);
  251.         
  252.         // increment the widget positions.
  253.         if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  254.             widget_x += kWidgetWidth + kSpaceHoriz;
  255.             label_x = widget_x;
  256.         } else {
  257.             label_y += 2*kWidgetHeight + kSpaceVertical;
  258.             widget_y = label_y + kWidgetHeight;
  259.         }
  260.     }
  261.     
  262.     // make the widget group's resizable box.
  263.     // This will let the choice boxes expand in width, but not height.
  264.     Fl_Box* resizable_box;
  265.     if (m_LayoutDirection == eLayoutDirection_Horizontal) {
  266.         resizable_box = new Fl_Box(panel_x,  widget_group_h - 1, widget_group_w, 0, "resizable");
  267.     } else {
  268.         resizable_box = new Fl_Box(widget_x, widget_group_h - 1, kWidgetWidth, 0, "resizable");
  269.     }
  270.     resizable_box->labeltype(FL_NO_LABEL);
  271.     resizable_box->hide();
  272.     resizable_box->deactivate();
  273.     widget_group->resizable(resizable_box);
  274.     
  275.         
  276.     widget_group->end();
  277.     m_ConfigPanel->end();
  278.     
  279.     return m_ConfigPanel;
  280. }
  281. void CThemeConfigPanel2::cb_StyleChosen(Fl_Choice* o, void* v)
  282. {
  283.     ((CThemeConfigPanel2*)v)->x_StyleChosen(o);
  284. }
  285. void CThemeConfigPanel2::x_AddChoice(const string& item, Fl_Choice* widget)
  286. {
  287.     m_ChoiceWidgets[item] = widget;
  288. }
  289. Fl_Choice* CThemeConfigPanel2::x_GetChoice(const string& item) const
  290. {
  291.     TItemChoiceMap::const_iterator it = m_ChoiceWidgets.find(item);
  292.     if (it == m_ChoiceWidgets.end()) {
  293.         return NULL;
  294.     }
  295.     return it->second;
  296. }
  297. string CThemeConfigPanel2::x_GetItem(const Fl_Choice* widget) const
  298. {
  299.     ITERATE(TItemChoiceMap, it, m_ChoiceWidgets) {
  300.         if (it->second == widget) {
  301.             return it->first;
  302.         }
  303.     }
  304.     return kEmptyStr;
  305. }
  306.     
  307. #if NCBI_THEME_PANEL_CHANGE_DIR_BTN
  308. void CThemeConfigPanel2::x_SwitchDirections()
  309. {
  310.     if (GetLayoutDirection() == eLayoutDirection_Horizontal) {
  311.         SetLayoutDirection(eLayoutDirection_Vertical);
  312.         m_DirectionBtn->label("@2->");
  313.     } else {
  314.         SetLayoutDirection(eLayoutDirection_Horizontal);
  315.         m_DirectionBtn->label("@->");
  316.     }
  317.     MakeWidgets();
  318. }
  319. void CThemeConfigPanel2::cb_SwitchDirections(Fl_Choice* o, void* v)
  320. {
  321.     ((CThemeConfigPanel2*)v)->x_SwitchDirections();
  322. }
  323. #endif
  324. END_NCBI_SCOPE
  325. /*
  326.  * ===========================================================================
  327.  * $Log: theme_config_panel2.cpp,v $
  328.  * Revision 1000.1  2004/06/01 20:45:49  gouriano
  329.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  330.  *
  331.  * Revision 1.5  2004/05/21 22:27:41  gorelenk
  332.  * Added PCH ncbi_pch.hpp
  333.  *
  334.  * Revision 1.4  2004/02/20 16:16:50  rsmith
  335.  * Add and disable a button to dynamically switch the widget directions.
  336.  * Not currently used since the dialog/mediator architecture makes it very hard for
  337.  * this to work right with the dialog.
  338.  *
  339.  * Revision 1.3  2004/02/02 19:18:07  rsmith
  340.  * change obsolete types
  341.  *
  342.  * Revision 1.2  2004/02/02 18:39:36  rsmith
  343.  * change implementation to work with the new base class.
  344.  *
  345.  * Revision 1.1  2004/01/29 21:25:50  rsmith
  346.  * initial checkin
  347.  *
  348.  * Revision 1.2  2004/01/02 21:02:16  rsmith
  349.  * Change CComboBox to Fl_Choice and various cleanups.
  350.  *
  351.  * Revision 1.1  2003/12/30 14:09:41  dicuccio
  352.  * Initial check-in - moved from gui/config
  353.  *
  354.  * Revision 1.1  2003/12/29 14:41:36  rsmith
  355.  * initial checkin
  356.  *
  357.  *
  358.  * ===========================================================================
  359.  */