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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: menu_window.hpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 19:56:37  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. #ifndef GUI_WIDGETS_FL___MENU_WINDOW__HPP
  10. #define GUI_WIDGETS_FL___MENU_WINDOW__HPP
  11. /*  $Id: menu_window.hpp,v 1000.0 2004/06/01 19:56:37 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.hpp
  40.  
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbi_tree.hpp>
  43. #include <gui/utils/command.hpp>
  44. #include <gui/utils/gui_event.hpp>
  45. #include <gui/widgets/fl/rect.hpp>
  46. #include <gui/widgets/fl/menu_item.hpp>
  47. #include <gui/widgets/fl/resource_manager.hpp>
  48. #include <gui/widgets/fl/tooltip.hpp>
  49. #include <gui/widgets/fl/fltk_timer.hpp>
  50. #include <FL/Fl_Menu_.H>
  51. #include <FL/Fl_Menu_Item.H>
  52. #include <FL/Fl_Double_Window.H>
  53. #include <FL/Fl_Image.H>
  54. /** @addtogroup GUI_FltkWidgets
  55.  *
  56.  * @{
  57.  */
  58. BEGIN_NCBI_SCOPE
  59. ///////////////////////////////////////////////////////////////////////////////
  60. ///
  61. class NCBI_GUIWIDGETS_FL_EXPORT IMenuHintListener
  62. {
  63. public:
  64.     virtual ~IMenuHintListener()    {};
  65.     virtual void    OnHint(const string& hint) = 0;
  66. };
  67. ///////////////////////////////////////////////////////////////////////////////
  68. /// class CMenu - base class for all menus
  69. ///
  70. /// Access key is underlined letter in the menu item label. When a menu is active,
  71. /// the user can select a menu item by pressing the key that corresponds to the 
  72. /// item's underlined letter. 
  73. /// Accelerator is a combination of key with a number of modifiers corresponding 
  74. /// to a command. Menu shows accelerator labels next to corresponding command items.
  75. ///
  76. class NCBI_GUIWIDGETS_FL_EXPORT CMenu : public IMenu
  77. {
  78. public:
  79.     enum    EColorType  {
  80.         eBack = 0,
  81.         eFocusedBack,
  82.         eCheckedBack,
  83.         ePushedBack,
  84.         ePopupBack,
  85.         eFrame,
  86.         eText,
  87.         eDisabledText,
  88.         eFocusedDisabledText,
  89.         ePushedText,
  90.         eFocusedFrame,
  91.         eIconArea,
  92.         eBorder,
  93.         eLast
  94.     };
  95.     /// CProperties holds common properties for all CMenu derived classes;
  96.     class CProperties
  97.     {    
  98.     public:
  99.         CProperties(void);
  100.         inline  Fl_Color    GetColor(EColorType type)   const   {   return m_Colors[type];  } 
  101.     public:
  102.         int m_FontType;
  103.         int m_FontSize;
  104.     
  105.         Fl_Color    m_Colors[eLast];
  106.     };
  107. public:
  108.     CMenu(void);
  109.     virtual ~CMenu(void);
  110.     static  CRef<CResourceManager>      GetResourceManager(void);
  111.     static  void    SetResourceManager(CRef<CResourceManager> manager);
  112.     
  113.     static  void    SetCmdHint(TCmdID cmd, const string& hint);
  114.     static  string  GetCmdHint(TCmdID cmd);
  115.     /// @name IMenu* implementation
  116.     /// @{
  117.     virtual void    SetCmdTarget(CCommandTarget* target);
  118.     virtual CCommandTarget*    GetCmdTarget(void);
  119.     /// @}
  120.     virtual void    SetItemImageSize(int size);
  121.     virtual void    SetItems(const SMenuItemRec* items);
  122.     virtual void    SetItems(CMenuItem* root_item); // takes ownership of the given structure
  123.     virtual void    SetHintListener(IMenuHintListener* listener);
  124.     virtual IMenuHintListener*  GetHintListener();
  125.     
  126.     virtual CPoint  GetPreferredSize(void) const;
  127.     virtual void    SetSelected(CMenuItem* item);
  128.     
  129.     CMenuItem*      GetRootItem(void);
  130.     int             GetBorder(void) const;
  131.     /// returns pointer to widget hosting CMenu instance
  132.     virtual Fl_Widget&        GetWidget(void) = 0;
  133.     virtual const Fl_Widget&  GetWidget(void) const = 0;
  134.     
  135.     bool    x_IsSubMenuPushed() const   {   return m_PushedItem  && m_PushedItem->IsSubmenu();  }
  136.     bool    x_IsItemPushed() const   {   return m_PushedItem  && m_PushedItem->IsItem();  }
  137. protected:
  138.     struct  SItemEntry  
  139.     {
  140.         CMenuItem*  m_Item;
  141.         CFLTKImageHandle    m_hIcon;
  142.         int         m_Size;
  143.         string      m_AccelLabel; // symbolic representation of accelerator
  144.     };
  145.     
  146. protected:    
  147.     virtual bool    x_IsKeyActivated() const;
  148.     virtual void    x_SetItems(CMenuItem* root_item, bool take_ownership);
  149.     virtual void    x_Clear(void);
  150.     virtual void    x_Layout(void);
  151.     virtual void    x_UpdateItems(void);
  152.     
  153.     virtual void    x_Draw(int x, int y);
  154.     virtual void    x_DrawItems(int x, int y);
  155.     virtual void    x_ExecuteCommand(const CMenuItem& item);
  156.     
  157.     virtual bool    x_IsHorizontal(void)  const = 0;
  158.     
  159.     virtual void    x_MeasureItem(const SItemEntry& entry, int& text_w) const;
  160.     virtual void    x_DrawItem(SItemEntry& entry, int x, int y, int w, int h);
  161.     virtual void    x_DrawItemText(const SItemEntry& entry, int x, int y, int w, int h);
  162.     virtual void    x_DrawItemIcon(SItemEntry& entry, int x, int y, Fl_Color back_color);
  163.     CMenuItem*      x_HitTest(int x, int y);
  164.     // returns rectangle used to position submenu
  165.     virtual CRect   x_GetPopupItemRect(const CMenuItem& item);
  166.     
  167. protected:  
  168.     typedef vector<SItemEntry>      TEntries;
  169.     typedef map<char, CMenuItem*>   TAccessKeyToItemMap; 
  170.     typedef map<TCmdID, string>     TCmdToHintMap;
  171.     
  172.     static  CProperties         sm_Props; // common properties for all menus
  173.     static  CRef<CResourceManager>   sm_ResManager; // singleton Resource Manager
  174.     static  TCmdToHintMap       sm_CmdToHint;
  175.       
  176.     CMenuItem*  m_RootItem;
  177.     bool        m_bOwnItems;  /// if "true" CMenu does not assume ownership of m_RootItem
  178.     
  179.     CCommandTarget*     m_CmdTarget; /// root command target
  180.     IMenuHintListener*   m_Listener;
  181.     TEntries            m_Entries;  /// menu item entires
  182.     TAccessKeyToItemMap m_AccessKeyToItem; /// access key table
  183.     
  184.     int     m_Width;  // total width including borders
  185.     int     m_Height; // total height including borders 
  186.     int     m_Border; // width(height) of the border around menu items
  187.     int     m_IconSize;
  188.     int     m_MaxLabelW;
  189.     EColorType  m_BackColor;
  190.     
  191.     CMenuItem*  m_Selected; // selected (focused) item
  192.     CMenuItem*  m_PushedItem; // item pushed by mouse or keyboard
  193.     bool        m_bKeyActivated; // menu was activated using keyboard
  194.     
  195.     CFLTKImageHandle    m_hCheckIcon;
  196.     CFLTKImageHandle    m_hRadioIcon;
  197. };
  198. ///////////////////////////////////////////////////////////////////////////////
  199. /// CMenuCmdUI
  200. class NCBI_GUIWIDGETS_FL_EXPORT CMenuCmdUI : public ICmdUI
  201. {
  202. public:
  203.     CMenuCmdUI(CMenuItem& item);
  204.     /// @name ICmdUI implementation
  205.     /// @{
  206.     virtual TCmdID  GetCommand() const;
  207.     virtual void    Enable(bool en);
  208.     virtual void    SetCheck(bool set);
  209.     virtual void    SetRadio(bool set);
  210.     virtual void    SetLabel(const string& label);
  211.     /// @}
  212. protected:
  213.     CMenuItem& m_Item;
  214. };
  215. ///////////////////////////////////////////////////////////////////////////////
  216. /// CPopupMenu1
  217. typedef Fl_Double_Window    TPopupMenuParent;
  218. class  NCBI_GUIWIDGETS_FL_EXPORT CPopupMenu1 :  public TPopupMenuParent,
  219.                                                 public CMenu,
  220.                                                 public ITimerListener 
  221. {    
  222.     friend class CMenuBar1;
  223. public:    
  224.     CPopupMenu1(int x, int y, CMenuItem* root_item, CCommandTarget* target = NULL,
  225.                 IMenuHintListener* listener = NULL);
  226.     CPopupMenu1(int x, int y, const SMenuItemRec* items, CCommandTarget* target = NULL,
  227.                 IMenuHintListener* listener = NULL);
  228. protected:
  229.     /// Creates a child popup menu
  230.     CPopupMenu1(int x, int y, int left, int top, CMenuItem* root_item,
  231.                 CCommandTarget* target, IMenuHintListener* listener);
  232.     
  233.     /// Creates root popup menu stub for a menubar
  234.     CPopupMenu1(CMenuBar1& menubar, CMenuItem* root_item, CMenuItem* sel_item,
  235.                 IMenuHintListener* listener);
  236. public:        
  237.     virtual void    Popup(void); /// shows popup menu
  238.     /// @name FLTK overridables
  239.     /// @{
  240.     virtual void    show(void);
  241.     virtual void    draw(void);
  242.     virtual int     handle(int event);
  243.     /// @}
  244.     
  245.     virtual void    OnTimeout(int timer_id);
  246.     virtual Fl_Widget&        GetWidget(void);
  247.     virtual const Fl_Widget&  GetWidget(void) const;
  248. protected:
  249.     virtual void    x_Init(int x, int y, int left, int top, CMenuItem* root_item,
  250.                            CCommandTarget* target, IMenuHintListener* listener, bool root_popup);
  251.     virtual bool    x_IsHorizontal() const;   
  252.     virtual void    SetSelected(CMenuItem* item);
  253.     virtual CRect   x_GetPopupItemRect(const CMenuItem& item);
  254.     void    x_CollapseToCurrent(void);
  255.     void    x_ShowCurrItemSubmenu(bool b_select);
  256.     void    x_TogglePushItem();
  257.     
  258.     int     x_HandleKeyboard(void);
  259.     int     x_HandleShortcuts(void);
  260.     void    x_OnLeftPressed(void);
  261.     void    x_OnRightPressed(void);
  262.     void    x_SelectNextItem(void);
  263.     void    x_SelectPrevItem(void);
  264.     void    x_SelectTopItem(void);
  265.     void    x_SelectBottomItem(void);
  266.     
  267.     void    x_CloseItemSubmenu(void);
  268.     void    x_SetExecuteCommand(const CMenuItem& item);
  269.     void    x_UpdateListener();
  270.     
  271.     void    x_AdjustRectangle(void); // adjust window size and position
  272.     bool    x_IsMenuBar() const {   return m_MenuBar != NULL;   }
  273. protected:
  274.     int     m_Left;
  275.     int     m_Top;
  276.     CMenuBar1*  m_MenuBar;
  277.     bool        m_bSkipFirstRelease;
  278.     TCmdID      m_Cmd; // choosen command
  279.     CFLTKTimer  m_Timer;
  280.     CGUIEvent   m_Event;
  281. protected:
  282.     enum    EState{ 
  283.         eIdle, 
  284.         eTrack, // track item, do not expand submenus
  285.         eTrackSubmenus, // track item, show/hide submenus
  286.         eExpand, // selected item
  287.         eHide, // hide the last popup        
  288.         eMenuPush, // push on submenu
  289.         ePush,     // push on command item         
  290.         eDone   
  291.     };
  292.     typedef vector<CPopupMenu1*> TPopupVector;
  293.     static  TPopupVector    sm_Popups;
  294.     static  CMenuItem*      sm_CurrItem;
  295.     static  CPopupMenu1*    sm_CurrPopup;
  296.     static  EState          sm_State;
  297.     static  bool            sm_bMenubar;    
  298. };
  299. ///////////////////////////////////////////////////////////////////////////////
  300. /// CMenuBar1
  301. class NCBI_GUIWIDGETS_FL_EXPORT CMenuBar1 : 
  302.         public Fl_Widget, 
  303.         public CMenu,
  304.         public ITooltipClient        
  305. {
  306.     friend class CPopupMenu1;
  307. public:
  308.     CMenuBar1(int x, int y, int w, int h);
  309.     virtual void    EnableTooltips(bool b_en);
  310.     // update items state
  311.     virtual void    UpdateItems()   {   x_UpdateItems();    }
  312.     virtual void    Activate();
  313.     /// @name FLTK overridables
  314.     /// @{
  315.     virtual void    draw(void);
  316.     virtual int     handle(int event);
  317.     /// @}
  318.     
  319.     CRect   GetPopupRect() const;
  320.     /// @name ITooltipClient implementation
  321.     /// @{
  322.     virtual bool    TC_NeedTooltip(int x, int y);  
  323.     virtual string  TC_GetTooltip(int& x, int& y, int& w, int& h);
  324.     /// @}
  325.     virtual Fl_Widget&        GetWidget(void);
  326.     virtual const Fl_Widget&  GetWidget(void) const;
  327. protected:
  328.     virtual void    x_Draw(int x, int y);
  329.     virtual int     x_Handle(int event);
  330.     
  331.     int     x_HandleShortcuts(void);
  332.     void    x_ShowSubMenu(void);
  333.     virtual bool    x_IsHorizontal() const;   
  334.     virtual string  x_GetTooltip(const CMenuItem& item) const;
  335. protected:
  336.     CTooltip    m_Tooltip;
  337.     CMenuItem*  m_TooltipItem;    
  338. };
  339. END_NCBI_SCOPE
  340. /* @} */
  341. /*
  342.  * ===========================================================================
  343.  * $Log: menu_window.hpp,v $
  344.  * Revision 1000.0  2004/06/01 19:56:37  gouriano
  345.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  346.  *
  347.  * Revision 1.5  2004/05/13 17:29:30  yazhuk
  348.  * Added support for accelerators, keyboard activated menus
  349.  *
  350.  * Revision 1.4  2004/05/11 18:55:14  dicuccio
  351.  * Added doxygen modules info
  352.  *
  353.  * Revision 1.3  2004/05/07 14:19:04  yazhuk
  354.  * Added UpdateItems()
  355.  *
  356.  * Revision 1.2  2004/05/03 19:47:27  yazhuk
  357.  * Refactoring; support for command updates
  358.  *
  359.  * Revision 1.1  2004/04/22 16:53:18  yazhuk
  360.  * Initial revision: menu_window.hpp
  361.  *
  362.  * ===========================================================================
  363.  */
  364. #endif  // GUI_WIDGETS_FL___MENU_WINDOW__HPP