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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: menu_item.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:56:32  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_FL___MENU_ITEM__HPP
  10. #define GUI_WIDGETS_FL___MENU_ITEM__HPP
  11. /*  $Id: menu_item.hpp,v 1000.0 2004/06/01 19:56:32 gouriano Exp $
  12.  * ===========================================================================
  13.  *
  14.  *                            PUBLIC DOMAIN NOTICE
  15.  *               National Center for Biotechnology Information
  16.  *
  17.  *  This software/database is a "United States Government Work" under the
  18.  *  terms of the United States Copyright Act.  It was written as part of
  19.  *  the author's official duties as a United States Government employee and
  20.  *  thus cannot be copyrighted.  This software/database is freely available
  21.  *  to the public for use. The National Library of Medicine and the U.S.
  22.  *  Government have not placed any restriction on its use or reproduction.
  23.  *
  24.  *  Although all reasonable efforts have been taken to ensure the accuracy
  25.  *  and reliability of the software and data, the NLM and the U.S.
  26.  *  Government do not and cannot warrant the performance or results that
  27.  *  may be obtained by using this software or data. The NLM and the U.S.
  28.  *  Government disclaim all warranties, express or implied, including
  29.  *  warranties of performance, merchantability or fitness for any particular
  30.  *  purpose.
  31.  *
  32.  *  Please cite the author in any work or product based on this material.
  33.  *
  34.  * ===========================================================================
  35.  *
  36.  * Authors:  Andrey Yazhuk
  37.  *
  38.  */
  39. /// @file menu_item.hpp
  40.  
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbi_tree.hpp>
  43. #include <gui/utils/command.hpp>
  44. #include <gui/widgets/fl/resource_manager.hpp>
  45. #include <FL/Fl_Menu_.H>
  46. #include <FL/Fl_Menu_Item.H>
  47. #include <FL/Fl_Image.H>
  48. /** @addtogroup GUI_FltkWidgets
  49.  *
  50.  * @{
  51.  */
  52. BEGIN_NCBI_SCOPE
  53. struct SMenuItemRecRec;
  54. ////////////////////////////////////////////////////////////////////////////////
  55. /// CMenuItem - represents a menu items in IMenu-style menus.
  56. class   NCBI_GUIWIDGETS_FL_EXPORT   CMenuItem 
  57. {
  58. public:
  59.     /// Type of menu item
  60.     enum    EType   {
  61.         eItem, // command item (includes "checkbox" and "radio" items)
  62.         eSubmenu,
  63.         eSeparator,
  64.     };
  65.     /// State and subtype of menu item
  66.     enum   EState  {
  67.         eDefault    = 0,
  68.         eDisabled   = 0x1, /// item is disabled (visible but inactive)
  69.         eCheckItem  = 0x2, /// "check-box" item 
  70.         eRadioItem  = 0x4, /// "radio" item
  71.         eSet   = 0x8  /// indicates that chekbox is checked or radio item is selected
  72.         // eHideIfEmpty    = 0x10, /// hide submenu if it doesn't have subitems
  73.     };
  74. protected:
  75.     typedef CTreeNode<CMenuItem*>   TItemNode;
  76. public:        
  77.     /// creates a separator item
  78.     CMenuItem();    
  79.     /// creates a submenu item
  80.     CMenuItem(const string& label, const string& image_alias = ""); 
  81.     
  82.     /// creates a command item
  83.     CMenuItem(const string& label, TCmdID cmd, const string& image_alias = "", int state = eDefault); 
  84.     
  85.     /// generic constructor, can be used to create any type of menuitem
  86.     CMenuItem(EType type, const string& label = "", TCmdID cmd = eCmdNone, 
  87.               const string& image_alias = "", int state = eDefault);
  88.     /// copy contsructor - copies attributes but not subitems
  89.     CMenuItem(const CMenuItem& item);
  90.     
  91.     virtual ~CMenuItem();
  92.     
  93.     void    Init(EType type, const string& label = "", TCmdID cmd = eCmdNone,
  94.                  const string& image_alias = "", int state = eDefault);
  95.     void    InitPopup(const string& label, const string& image_alias = "");
  96.     void    InitItem(const string& label, TCmdID cmd, const string& image_alias = "", int state = eDefault);
  97.     void    InitSeparator();
  98.     
  99.     bool    Equal(const CMenuItem& item) const;
  100.     /// clones item and its subitems
  101.     CMenuItem*  Clone() const;
  102.     EType   GetType()   const;
  103.     void    SetType(EType type);
  104.     bool    IsItem()    const;
  105.     bool    IsSubmenu() const;
  106.     bool    IsSeparator() const;
  107.     
  108.     const string&   GetLabel() const;
  109.     void    SetLabel(const string& label);
  110.      
  111.     const   TCmdID&  GetCommand()    const;
  112.     void    SetCommand(TCmdID cmd);    
  113.         
  114.     bool            HasImage()  const;
  115.     const string&   GetImageAlias() const;
  116.     void    SetImageAlias(const string& image_alias);
  117.     int     GetState()  const;
  118.     void    SetState(int state)  ;
  119.     
  120.     bool    IsEnabled() const;
  121.     void    Enable(bool b_en);
  122.     bool    IsCheckType()   const;
  123.     bool    IsChecked() const;
  124.     void    SetCheck(bool b_set);
  125.     bool    IsRadioType()   const;
  126.     bool    IsRadioSelected() const;    
  127.     void    SelectRadio(bool b_set);
  128.     bool    IsValid() const;    
  129.     bool    IsEnabledItem() const   {   return IsEnabled()  &&  IsItem();   }  
  130.     bool    IsEnabledSubmenu() const   {   return IsEnabled()  &&  IsSubmenu();   }  
  131.     /// merges menu tree represented by "item" into menu tree represented by "this"
  132.     void    Merge(const CMenuItem& item);
  133. public:
  134.     typedef TItemNode::TNodeList_I  TChildItem_I;
  135.     typedef TItemNode::TNodeList_CI TChildItem_CI;
  136.         
  137.     /// @name Operations with submenus
  138.     /// @{    
  139.     CMenuItem*  GetParent();
  140.     const   CMenuItem*  GetParent() const;
  141.     
  142.     CMenuItem*  AddSubItem(CMenuItem* item);
  143.     
  144.     /// adds separator 
  145.     CMenuItem*  AddSubItem();
  146.     
  147.     /// adds submenu
  148.     CMenuItem*  AddSubMenu(const string& Label,  const string& image_alias = "");
  149.     
  150.     /// adds command subitem
  151.     CMenuItem*  AddSubItem(const string& label, TCmdID cmd,  const string& image_alias = "", int state = eDefault);
  152.     bool    IsSubmenuEmpty();
  153.     TChildItem_I    SubItemsBegin();
  154.     TChildItem_I    SubItemsEnd();
  155.     TChildItem_CI    SubItemsBegin() const;
  156.     TChildItem_CI    SubItemsEnd() const;
  157.     CMenuItem*  FindEqualSubItem(const CMenuItem& item); 
  158.     const CMenuItem*  FindEqualSubItem(const CMenuItem& item) const;
  159.     TChildItem_I    FindSubItem(const CMenuItem& item);
  160.     TChildItem_CI    FindSubItem(const CMenuItem& item) const;
  161.     TChildItem_I    FindSubItem(const string& label);
  162.     TChildItem_CI    FindSubItem(const string& label) const;
  163.     /// @}
  164. protected:
  165.     inline void    x_SetState(int mask, bool b_en)
  166.     {
  167.         if(b_en)    {
  168.             m_State |= mask;
  169.         } else {
  170.             m_State &= ~mask;
  171.         }
  172.     }
  173.     inline void    x_SetState(int mask, int values)
  174.     {
  175.         m_State &= ~mask;
  176.         m_State |= values;
  177.     }
  178. private:
  179.     EType   m_Type;
  180.     string  m_Label;
  181.     TCmdID  m_CommandID;
  182.     string  m_ImageAlias; 
  183.     int     m_State;
  184.     
  185.     TItemNode   m_ItemNode;
  186. };
  187. ////////////////////////////////////////////////////////////////////////////////
  188. /// 
  189. struct  NCBI_GUIWIDGETS_FL_EXPORT SMenuItemRec
  190. {
  191.     int         m_Type;
  192.     const char* m_Label;
  193.     TCmdID      m_CommandID;
  194.     const char* m_ImageAlias;
  195.     int         m_State;
  196.     bool    IsSubMenu()  const
  197.     {   
  198.         return m_Type == CMenuItem::eSubmenu  &&  m_CommandID == eCmdNone;
  199.     }
  200.     bool    IsSubMenuEnd()  const
  201.     {   
  202.         return m_Type == CMenuItem::eSubmenu  &&  m_CommandID == eCmdInvalid;
  203.     }
  204. };
  205. /// creates CMenuItem hierarchy from an array of SMenuItemRecRec
  206. NCBI_GUIWIDGETS_FL_EXPORT  CMenuItem*  CreateMenuItems(const SMenuItemRec* items);
  207. #define DEFINE_MENU(name) 
  208.     const SMenuItemRec name[] = 
  209.     {   SUBMENU("Root")
  210. #define MENU_ITEM(cmd, label) 
  211.     { CMenuItem::eItem, label, cmd, "", CMenuItem::eDefault}, 
  212. #define MENU_ITEM_IM(cmd, label, image) 
  213.     { CMenuItem::eItem, label, cmd, image, CMenuItem::eDefault}, 
  214. #define MENU_SEPARATOR() 
  215.     { CMenuItem::eSeparator, "", eCmdNone, "", CMenuItem::eDefault}, 
  216. #define SUBMENU(label) 
  217.     { CMenuItem::eSubmenu, label, eCmdNone, "", CMenuItem::eDefault}, 
  218. #define SUBMENU_IM(label, image) 
  219.     { CMenuItem::eSubmenu, label, eCmdNone, image, CMenuItem::eDefault}, 
  220. #define END_SUBMENU() 
  221.     { CMenuItem::eSubmenu, "", eCmdInvalid, "", CMenuItem::eDefault}, 
  222. #define END_MENU() 
  223.     { CMenuItem::eSubmenu, "", eCmdInvalid, "", CMenuItem::eDefault},  
  224.     }; 
  225. END_NCBI_SCOPE
  226. /* @} */
  227. /*
  228.  * ===========================================================================
  229.  * $Log: menu_item.hpp,v $
  230.  * Revision 1000.0  2004/06/01 19:56:32  gouriano
  231.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  232.  *
  233.  * Revision 1.5  2004/05/13 17:30:02  yazhuk
  234.  * Commented out eHideIfEmpty  flag
  235.  *
  236.  * Revision 1.4  2004/05/11 18:55:14  dicuccio
  237.  * Added doxygen modules info
  238.  *
  239.  * Revision 1.3  2004/05/07 14:18:28  yazhuk
  240.  * Added Merge(), FindSubItem(string)
  241.  *
  242.  * Revision 1.2  2004/05/03 19:43:32  yazhuk
  243.  * Refactoring
  244.  *
  245.  * Revision 1.1  2004/04/22 16:53:18  yazhuk
  246.  * Initial revision: menu_window.hpp
  247.  *
  248.  * ===========================================================================
  249.  */
  250. #endif  // GUI_WIDGETS_FL___MENU_ITEM__HPP