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