| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- ///////////////////////////////////////////////////////////////////////////////
- // Name: wx/univ/menu.h
- // Purpose: wxMenu and wxMenuBar classes for wxUniversal
- // Author: Vadim Zeitlin
- // Modified by:
- // Created: 05.05.01
- // Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
- // Licence: wxWindows licence
- ///////////////////////////////////////////////////////////////////////////////
- #ifndef _WX_UNIV_MENU_H_
- #define _WX_UNIV_MENU_H_
- #if wxUSE_ACCEL
- #include "wx/accel.h"
- #endif // wxUSE_ACCEL
- #include "wx/dynarray.h"
- // fwd declarations
- class WXDLLIMPEXP_FWD_CORE wxMenuInfo;
- WX_DECLARE_EXPORTED_OBJARRAY(wxMenuInfo, wxMenuInfoArray);
- class WXDLLIMPEXP_FWD_CORE wxMenuGeometryInfo;
- class WXDLLIMPEXP_FWD_CORE wxPopupMenuWindow;
- class WXDLLIMPEXP_FWD_CORE wxRenderer;
- // ----------------------------------------------------------------------------
- // wxMenu
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_CORE wxMenu : public wxMenuBase
- {
- public:
- // ctors and dtor
- wxMenu(const wxString& title, long style = 0)
- : wxMenuBase(title, style) { Init(); }
- wxMenu(long style = 0) : wxMenuBase(style) { Init(); }
- virtual ~wxMenu();
- // called by wxMenuItem when an item of this menu changes
- void RefreshItem(wxMenuItem *item);
- // does the menu have any items?
- bool IsEmpty() const { return !GetMenuItems().GetFirst(); }
- // show this menu at the given position (in screen coords) and optionally
- // select its first item
- void Popup(const wxPoint& pos, const wxSize& size,
- bool selectFirst = true);
- // dismiss the menu
- void Dismiss();
- // override the base class methods to connect/disconnect event handlers
- virtual void Attach(wxMenuBarBase *menubar);
- virtual void Detach();
- // implementation only from here
- // do as if this item were clicked, return true if the resulting event was
- // processed, false otherwise
- bool ClickItem(wxMenuItem *item);
- // process the key event, return true if done
- bool ProcessKeyDown(int key);
- #if wxUSE_ACCEL
- // find the item for the given accel and generate an event if found
- bool ProcessAccelEvent(const wxKeyEvent& event);
- #endif // wxUSE_ACCEL
- protected:
- // implement base class virtuals
- virtual wxMenuItem* DoAppend(wxMenuItem *item);
- virtual wxMenuItem* DoInsert(size_t pos, wxMenuItem *item);
- virtual wxMenuItem* DoRemove(wxMenuItem *item);
- // common part of DoAppend and DoInsert
- void OnItemAdded(wxMenuItem *item);
- // called by wxPopupMenuWindow when the window is hidden
- void OnDismiss(bool dismissParent);
- // return true if the menu is currently shown on screen
- bool IsShown() const;
- // get the menu geometry info
- const wxMenuGeometryInfo& GetGeometryInfo() const;
- // forget old menu geometry info
- void InvalidateGeometryInfo();
- // return either the menubar or the invoking window, normally never NULL
- wxWindow *GetRootWindow() const;
- // get the renderer we use for drawing: either the one of the menu bar or
- // the one of the window if we're a popup menu
- wxRenderer *GetRenderer() const;
- #if wxUSE_ACCEL
- // add/remove accel for the given menu item
- void AddAccelFor(wxMenuItem *item);
- void RemoveAccelFor(wxMenuItem *item);
- #endif // wxUSE_ACCEL
- private:
- // common part of all ctors
- void Init();
- // terminate the current radio group, if any
- void EndRadioGroup();
- // the exact menu geometry is defined by a struct derived from this one
- // which is opaque and defined by the renderer
- wxMenuGeometryInfo *m_geometry;
- // the menu shown on screen or NULL if not currently shown
- wxPopupMenuWindow *m_popupMenu;
- #if wxUSE_ACCEL
- // the accel table for this menu
- wxAcceleratorTable m_accelTable;
- #endif // wxUSE_ACCEL
- // the position of the first item in the current radio group or -1
- int m_startRadioGroup;
- // it calls out OnDismiss()
- friend class wxPopupMenuWindow;
- DECLARE_DYNAMIC_CLASS(wxMenu)
- };
- // ----------------------------------------------------------------------------
- // wxMenuBar
- // ----------------------------------------------------------------------------
- class WXDLLIMPEXP_CORE wxMenuBar : public wxMenuBarBase
- {
- public:
- // ctors and dtor
- wxMenuBar(long WXUNUSED(style) = 0) { Init(); }
- wxMenuBar(size_t n, wxMenu *menus[], const wxString titles[], long style = 0);
- virtual ~wxMenuBar();
- // implement base class virtuals
- virtual bool Append( wxMenu *menu, const wxString &title );
- virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title);
- virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title);
- virtual wxMenu *Remove(size_t pos);
- virtual void EnableTop(size_t pos, bool enable);
- virtual bool IsEnabledTop(size_t pos) const;
- virtual void SetMenuLabel(size_t pos, const wxString& label);
- virtual wxString GetMenuLabel(size_t pos) const;
- virtual void Attach(wxFrame *frame);
- virtual void Detach();
- // get the next item for the givan accel letter (used by wxFrame), return
- // -1 if none
- //
- // if unique is not NULL, filled with true if there is only one item with
- // this accel, false if two or more
- int FindNextItemForAccel(int idxStart,
- int keycode,
- bool *unique = NULL) const;
- // called by wxFrame to set focus to or open the given menu
- void SelectMenu(size_t pos);
- void PopupMenu(size_t pos);
- #if wxUSE_ACCEL
- // find the item for the given accel and generate an event if found
- bool ProcessAccelEvent(const wxKeyEvent& event);
- #endif // wxUSE_ACCEL
- // called by wxMenu when it is dismissed
- void OnDismissMenu(bool dismissMenuBar = false);
- protected:
- // common part of all ctors
- void Init();
- // event handlers
- void OnLeftDown(wxMouseEvent& event);
- void OnMouseMove(wxMouseEvent& event);
- void OnKeyDown(wxKeyEvent& event);
- void OnKillFocus(wxFocusEvent& event);
- // process the mouse move event, return true if we did, false to continue
- // processing as usual
- //
- // the coordinates are client coordinates of menubar, convert if necessary
- bool ProcessMouseEvent(const wxPoint& pt);
- // called when the menu bar loses mouse capture - it is not hidden unlike
- // menus, but it doesn't have modal status any longer
- void OnDismiss();
- // draw the menubar
- virtual void DoDraw(wxControlRenderer *renderer);
- // menubar geometry
- virtual wxSize DoGetBestClientSize() const;
- // has the menubar been created already?
- bool IsCreated() const { return m_frameLast != NULL; }
- // "fast" version of GetMenuCount()
- size_t GetCount() const { return m_menuInfos.GetCount(); }
- // get the (total) width of the specified menu
- wxCoord GetItemWidth(size_t pos) const;
- // get the rect of the item
- wxRect GetItemRect(size_t pos) const;
- // get the menu from the given point or -1 if none
- int GetMenuFromPoint(const wxPoint& pos) const;
- // refresh the given item
- void RefreshItem(size_t pos);
- // refresh all items after this one (including it)
- void RefreshAllItemsAfter(size_t pos);
- // hide the currently shown menu and show this one
- void DoSelectMenu(size_t pos);
- // popup the currently selected menu
- void PopupCurrentMenu(bool selectFirst = true);
- // hide the currently selected menu
- void DismissMenu();
- // do we show a menu currently?
- bool IsShowingMenu() const { return m_menuShown != 0; }
- // we don't want to have focus except while selecting from menu
- void GiveAwayFocus();
- // Release the mouse capture if we have it
- bool ReleaseMouseCapture();
- // the array containing extra menu info we need
- wxMenuInfoArray m_menuInfos;
- // the current item (only used when menubar has focus)
- int m_current;
- private:
- // the last frame to which we were attached, NULL initially
- wxFrame *m_frameLast;
- // the currently shown menu or NULL
- wxMenu *m_menuShown;
- // should be showing the menu? this is subtly different from m_menuShown !=
- // NULL as the menu which should be shown may be disabled in which case we
- // don't show it - but will do as soon as the focus shifts to another menu
- bool m_shouldShowMenu;
- // it calls out ProcessMouseEvent()
- friend class wxPopupMenuWindow;
- DECLARE_EVENT_TABLE()
- DECLARE_DYNAMIC_CLASS(wxMenuBar)
- };
- #endif // _WX_UNIV_MENU_H_
|