]> git.saurik.com Git - wxWidgets.git/blob - include/wx/univ/menu.h
added raw key code and flags support (based on patch from Bryce Denney)
[wxWidgets.git] / include / wx / univ / menu.h
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: wx/univ/menu.h
3 // Purpose: wxMenu and wxMenuBar classes for wxUniversal
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 05.05.01
7 // RCS-ID: $Id$
8 // Copyright: (c) 2001 SciTech Software, Inc. (www.scitechsoft.com)
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_UNIV_MENU_H_
13 #define _WX_UNIV_MENU_H_
14
15 #ifdef __GNUG__
16 #pragma interface "univmenu.h"
17 #endif
18
19 #if wxUSE_ACCEL
20 #include "wx/accel.h"
21 #endif // wxUSE_ACCEL
22
23 #include "wx/dynarray.h"
24
25 // fwd declarations
26 class WXDLLEXPORT wxMenuInfo;
27 WX_DECLARE_OBJARRAY(wxMenuInfo, wxMenuInfoArray);
28
29 class WXDLLEXPORT wxMenuGeometryInfo;
30 class WXDLLEXPORT wxPopupMenuWindow;
31 class WXDLLEXPORT wxRenderer;
32
33 // ----------------------------------------------------------------------------
34 // wxMenu
35 // ----------------------------------------------------------------------------
36
37 class WXDLLEXPORT wxMenu : public wxMenuBase
38 {
39 public:
40 // ctors and dtor
41 wxMenu(const wxString& title, long style = 0)
42 : wxMenuBase(title, style) { Init(); }
43
44 wxMenu(long style = 0) : wxMenuBase(style) { Init(); }
45
46 virtual ~wxMenu();
47
48 // called by wxMenuItem when an item of this menu changes
49 void RefreshItem(wxMenuItem *item);
50
51 // does the menu have any items?
52 bool IsEmpty() const { return !GetMenuItems().GetFirst(); }
53
54 // show this menu at the given position (in screen coords) and optionally
55 // select its first item
56 void Popup(const wxPoint& pos, const wxSize& size,
57 bool selectFirst = TRUE);
58
59 // dismiss the menu
60 void Dismiss();
61
62 // override the base class methods to connect/disconnect event handlers
63 virtual void Attach(wxMenuBarBase *menubar);
64 virtual void Detach();
65
66 // implementation only from here
67
68 // do as if this item were clicked, return TRUE if the resulting event was
69 // processed, FALSE otherwise
70 bool ClickItem(wxMenuItem *item);
71
72 // process the key event, return TRUE if done
73 bool ProcessKeyDown(int key);
74
75 #if wxUSE_ACCEL
76 // find the item for the given accel and generate an event if found
77 bool ProcessAccelEvent(const wxKeyEvent& event);
78 #endif // wxUSE_ACCEL
79
80 protected:
81 // implement base class virtuals
82 virtual bool DoAppend(wxMenuItem *item);
83 virtual bool DoInsert(size_t pos, wxMenuItem *item);
84 virtual wxMenuItem *DoRemove(wxMenuItem *item);
85
86 // common part of DoAppend and DoInsert
87 void OnItemAdded(wxMenuItem *item);
88
89 // called by wxPopupMenuWindow when the window is hidden
90 void OnDismiss(bool dismissParent);
91
92 // return true if the menu is currently shown on screen
93 bool IsShown() const;
94
95 // get the menu geometry info
96 const wxMenuGeometryInfo& GetGeometryInfo() const;
97
98 // forget old menu geometry info
99 void InvalidateGeometryInfo();
100
101 // return either the menubar or the invoking window, normally never NULL
102 wxWindow *GetRootWindow() const;
103
104 // get the renderer we use for drawing: either the one of the menu bar or
105 // the one of the window if we're a popup menu
106 wxRenderer *GetRenderer() const;
107
108 #if wxUSE_ACCEL
109 // add/remove accel for the given menu item
110 void AddAccelFor(wxMenuItem *item);
111 void RemoveAccelFor(wxMenuItem *item);
112 #endif // wxUSE_ACCEL
113
114 private:
115 // common part of all ctors
116 void Init();
117
118 // the exact menu geometry is defined by a struct derived from this one
119 // which is opaque and defined by the renderer
120 wxMenuGeometryInfo *m_geometry;
121
122 // the menu shown on screen or NULL if not currently shown
123 wxPopupMenuWindow *m_popupMenu;
124
125 #if wxUSE_ACCEL
126 // the accel table for this menu
127 wxAcceleratorTable m_accelTable;
128 #endif // wxUSE_ACCEL
129
130 // it calls out OnDismiss()
131 friend class wxPopupMenuWindow;
132 DECLARE_DYNAMIC_CLASS(wxMenu)
133 };
134
135 // ----------------------------------------------------------------------------
136 // wxMenuBar
137 // ----------------------------------------------------------------------------
138
139 class WXDLLEXPORT wxMenuBar : public wxMenuBarBase
140 {
141 public:
142 // ctors and dtor
143 wxMenuBar(long WXUNUSED(style) = 0) { Init(); }
144 virtual ~wxMenuBar();
145
146 // implement base class virtuals
147 virtual bool Append( wxMenu *menu, const wxString &title );
148 virtual bool Insert(size_t pos, wxMenu *menu, const wxString& title);
149 virtual wxMenu *Replace(size_t pos, wxMenu *menu, const wxString& title);
150 virtual wxMenu *Remove(size_t pos);
151
152 virtual void EnableTop(size_t pos, bool enable);
153 virtual bool IsEnabledTop(size_t pos) const;
154
155 virtual void SetLabelTop(size_t pos, const wxString& label);
156 virtual wxString GetLabelTop(size_t pos) const;
157
158 virtual void Attach(wxFrame *frame);
159 virtual void Detach();
160
161 // get the next item for the givan accel letter (used by wxFrame), return
162 // -1 if none
163 //
164 // if unique is not NULL, filled with TRUE if there is only one item with
165 // this accel, FALSE if two or more
166 int FindNextItemForAccel(int idxStart,
167 int keycode,
168 bool *unique = NULL) const;
169
170 // called by wxFrame to set focus to or open the given menu
171 void SelectMenu(size_t pos);
172 void PopupMenu(size_t pos);
173
174 #if wxUSE_ACCEL
175 // find the item for the given accel and generate an event if found
176 bool ProcessAccelEvent(const wxKeyEvent& event);
177 #endif // wxUSE_ACCEL
178
179 // called by wxMenu when it is dismissed
180 void OnDismissMenu(bool dismissMenuBar = FALSE);
181
182 protected:
183 // common part of all ctors
184 void Init();
185
186 // event handlers
187 void OnLeftDown(wxMouseEvent& event);
188 void OnMouseMove(wxMouseEvent& event);
189 void OnKeyDown(wxKeyEvent& event);
190 void OnKillFocus(wxFocusEvent& event);
191
192 // process the mouse move event, return TRUE if we did, FALSE to continue
193 // processing as usual
194 //
195 // the coordinates are client coordinates of menubar, convert if necessary
196 bool ProcessMouseEvent(const wxPoint& pt);
197
198 // called when the menu bar loses mouse capture - it is not hidden unlike
199 // menus, but it doesn't have modal status any longer
200 void OnDismiss();
201
202 // draw the menubar
203 virtual void DoDraw(wxControlRenderer *renderer);
204
205 // menubar geometry
206 virtual wxSize DoGetBestClientSize() const;
207
208 // has the menubar been created already?
209 bool IsCreated() const { return m_frameLast != NULL; }
210
211 // "fast" version of GetMenuCount()
212 size_t GetCount() const { return m_menuInfos.GetCount(); }
213
214 // get the (total) width of the specified menu
215 wxCoord GetItemWidth(size_t pos) const;
216
217 // get the rect of the item
218 wxRect GetItemRect(size_t pos) const;
219
220 // get the menu from the given point or -1 if none
221 int GetMenuFromPoint(const wxPoint& pos) const;
222
223 // refresh the given item
224 void RefreshItem(size_t pos);
225
226 // refresh all items after this one (including it)
227 void RefreshAllItemsAfter(size_t pos);
228
229 // hide the currently shown menu and show this one
230 void DoSelectMenu(size_t pos);
231
232 // popup the currently selected menu
233 void PopupCurrentMenu(bool selectFirst = TRUE);
234
235 // hide the currently selected menu
236 void DismissMenu();
237
238 // do we show a menu currently?
239 bool IsShowingMenu() const { return m_menuShown != 0; }
240
241 // we don't want to have focus except while selecting from menu
242 void GiveAwayFocus();
243
244 // the array containing extra menu info we need
245 wxMenuInfoArray m_menuInfos;
246
247 // the current item (only used when menubar has focus)
248 int m_current;
249
250 private:
251 // the last frame to which we were attached, NULL initially
252 wxFrame *m_frameLast;
253
254 // the currently shown menu or NULL
255 wxMenu *m_menuShown;
256
257 // should be showing the menu? this is subtly different from m_menuShown !=
258 // NULL as the menu which should be shown may be disabled in which case we
259 // don't show it - but will do as soon as the focus shifts to another menu
260 bool m_shouldShowMenu;
261
262 // it calls out ProcessMouseEvent()
263 friend class wxPopupMenuWindow;
264
265 DECLARE_EVENT_TABLE()
266 DECLARE_DYNAMIC_CLASS(wxMenuBar)
267 };
268
269 #endif // _WX_UNIV_MENU_H_