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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: menu.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 21:09:08  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: menu.cpp,v 1000.1 2004/06/01 21:09:08 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:  Andrey Yazhuk
  35.  *  
  36.  */
  37. #include <ncbi_pch.hpp>
  38. #include <corelib/ncbistd.hpp>
  39. #include <FL/Fl.H>
  40. #include <FL/fl_draw.H>
  41. //###
  42. #include <FL/Fl_BMP_Image.H>
  43. #include <gui/widgets/fl/menu.hpp>
  44. BEGIN_NCBI_SCOPE
  45. ////////////////////////////////////////////////////////////////////////////////
  46. /// class CMenuBase
  47. CMenuBase::CMenuBase()
  48. :   m_CmdTarget(NULL)
  49. {
  50. }
  51.                  
  52. CMenuBase::~CMenuBase()
  53. {
  54. }
  55. void    CMenuBase::SetCmdTarget(CCommandTarget* target)
  56. {
  57.     m_CmdTarget = target;
  58. }
  59. CCommandTarget*    CMenuBase::GetCmdTarget()
  60. {
  61.     return m_CmdTarget;
  62. }
  63. bool    CMenuBase::x_CreateFLTKMenu(const string& submenu_path, CMenuItem* submenu)
  64. {
  65.     if(submenu  &&  submenu->IsSubmenu())    {
  66.         CMenuItem   *item = NULL, *next = NULL;
  67.         string path;
  68.         for(CMenuItem::TChildItem_I it = submenu->SubItemsBegin();
  69.             it != submenu->SubItemsEnd(); )    {
  70.             item = (*it)->GetValue();
  71.             ++it;
  72.             next = (it != submenu->SubItemsEnd()) ? (*it)->GetValue() : NULL;
  73.             
  74.             _ASSERT(item->IsValid());
  75.             bool b_skip = item->IsSeparator()  ||  
  76.                             (item->IsSubmenu()  &&  item->IsSubmenuEmpty() /* &&
  77.                             (item->GetState() & CMenuItem::eHideIfEmpty) != 0*/ );
  78.             if(! b_skip)   { // create FLTK item
  79.                 int fltk_flags = 0;
  80.                 path = submenu_path;
  81.                 if(path.size()) {
  82.                     path += '/';
  83.                 }
  84.                 path += item->GetLabel();
  85.                 fltk_flags |= (next  &&  next->IsSeparator()) ? FL_MENU_DIVIDER : 0;
  86.                 
  87.                 if(item->IsCheckType()) {
  88.                     fltk_flags |= FL_MENU_TOGGLE;
  89.                     if(item->IsChecked())   {
  90.                         fltk_flags |= FL_MENU_VALUE;
  91.                     }
  92.                 } else if(item->IsRadioType())  {
  93.                     fltk_flags |= FL_MENU_RADIO;
  94.                     if(item->IsChecked())   {
  95.                         fltk_flags |= FL_MENU_VALUE;
  96.                     }
  97.                 }
  98.                 
  99.                 fltk_flags |= item->IsEnabled() ? 0 : FL_MENU_INACTIVE;
  100.                 fltk_flags |= item->IsSubmenu() ? FL_SUBMENU : 0;
  101.                 
  102.                 x_AddFLTKItem(path, 0, & item->GetCommand(), fltk_flags);
  103.                 if(item->IsSubmenu())   {
  104.                     x_CreateFLTKMenu(path, item);
  105.                 }
  106.             } 
  107.         }
  108.         return true;
  109.     } else return false;
  110. }
  111. ////////////////////////////////////////////////////////////////////////////////
  112. // class CMenuBar 
  113. CMenuBar::CMenuBar(int x, int y, int w, int h, const char *label)
  114. :   Fl_Menu_Bar(x, y, w, h, label)
  115. {
  116.     textfont(FL_HELVETICA);
  117.     textsize(12);     
  118. }
  119. /// Creates a menu described by array of SMenuItem-s. CMenuBar creates a separate
  120. /// copy of a menu, so that it can be modified at run-time.
  121. void    CMenuBar::SetItems(const SMenuItemRec* items)
  122. {
  123.     clear();
  124.     CMenuItem* root = CreateMenuItems(items);
  125.     x_CreateFLTKMenu("", root);
  126. }
  127. void    CMenuBar::SetItems(CMenuItem* rootitem)
  128. {
  129.     clear();
  130.     CMenuBase::x_CreateFLTKMenu("", rootitem);
  131. }
  132. void    CMenuBar::x_AddFLTKItem(const string& path, ulong shortcut, 
  133.                                 const TCmdID* p_cmd, int flags)
  134. {
  135.     add(path.c_str(), shortcut, CMD_TARGET_FL_CALLBACK(),(void*) p_cmd, flags);
  136. }
  137. ////////////////////////////////////////////////////////////////////////////////
  138. // class CPopupMenu
  139. CPopupMenu::CPopupMenu(int x, int y, int w, int h, const char *label)
  140. :   Fl_Menu_Button(x, y, w, h, label)
  141. {
  142.     x_Init();
  143. }
  144.     
  145. void    CPopupMenu::x_Init()
  146. {
  147.     type(Fl_Menu_Button::POPUP3);
  148.     box(FL_NO_BOX);
  149.     textfont(FL_HELVETICA);
  150.     textsize(12);     
  151. }
  152. void    CPopupMenu::SetItems(const SMenuItemRec* items)
  153. {
  154.     clear();
  155.     CMenuItem* root = CreateMenuItems(items);
  156.     x_CreateFLTKMenu("", root);
  157. }
  158. void    CPopupMenu::SetItems(CMenuItem* rootitem)
  159. {
  160.     clear();
  161.     CMenuBase::x_CreateFLTKMenu("", rootitem);
  162. }
  163. void    CPopupMenu::x_AddFLTKItem(const string& path, ulong shortcut, 
  164.                                 const TCmdID* p_cmd, int flags)
  165. {
  166.     add(path.c_str(), shortcut, CMD_TARGET_FL_CALLBACK(),(void*) p_cmd, flags);
  167. }
  168. END_NCBI_SCOPE
  169. /*
  170.  * ===========================================================================
  171.  * $Log: menu.cpp,v $
  172.  * Revision 1000.1  2004/06/01 21:09:08  gouriano
  173.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  174.  *
  175.  * Revision 1.5  2004/05/21 22:27:53  gorelenk
  176.  * Added PCH ncbi_pch.hpp
  177.  *
  178.  * Revision 1.4  2004/05/13 17:30:48  yazhuk
  179.  * Removed eHideIfEmpty support
  180.  *
  181.  * Revision 1.3  2004/04/22 16:57:29  yazhuk
  182.  * Moved CMenuItem to menu_item.cpp
  183.  *
  184.  * Revision 1.2  2004/02/04 20:00:17  yazhuk
  185.  * Moved CMenuBar constructor from hpp file, changed font
  186.  *
  187.  * Revision 1.1  2004/01/15 20:08:27  yazhuk
  188.  * Initial revision
  189.  *
  190.  * ===========================================================================
  191.  */