]> git.saurik.com Git - wxWidgets.git/blob - samples/menu/menu.cpp
wxGTK compiles (and seems to work) again after wxMenu changes
[wxWidgets.git] / samples / menu / menu.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/menu.cpp
3 // Purpose: wxMenu/wxMenuBar sample
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 01.11.99
7 // RCS-ID: $Id$
8 // Copyright: (c) 1999 Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include <wx/wxprec.h>
22
23 #ifdef __BORLANDC__
24 #pragma hdrstop
25 #endif
26
27 #ifndef WX_PRECOMP
28 #include <wx/wx.h>
29
30 #include <wx/log.h>
31 #endif
32
33 // ----------------------------------------------------------------------------
34 // classes
35 // ----------------------------------------------------------------------------
36
37 // Define a new application
38 class MyApp: public wxApp
39 {
40 public:
41 bool OnInit();
42 };
43
44 // Define a new frame
45 class MyFrame: public wxFrame
46 {
47 public:
48 MyFrame();
49
50 virtual ~MyFrame() { delete m_menu; }
51
52 void OnQuit(wxCommandEvent& event);
53 void OnAbout(wxCommandEvent& event);
54
55 void OnDummy(wxCommandEvent& event);
56
57 void OnAppendMenuItem(wxCommandEvent& event);
58 void OnAppendSubMenu(wxCommandEvent& event);
59 void OnDeleteMenuItem(wxCommandEvent& event);
60 void OnInsertMenuItem(wxCommandEvent& event);
61 void OnCheckMenuItem(wxCommandEvent& event);
62 void OnEnableMenuItem(wxCommandEvent& event);
63 void OnGetLabelMenuItem(wxCommandEvent& event);
64 void OnSetLabelMenuItem(wxCommandEvent& event);
65
66 void OnAppendMenu(wxCommandEvent& event);
67 void OnDeleteMenu(wxCommandEvent& event);
68 void OnToggleMenu(wxCommandEvent& event);
69 void OnEnableMenu(wxCommandEvent& event);
70 void OnGetLabelMenu(wxCommandEvent& event);
71 void OnSetLabelMenu(wxCommandEvent& event);
72
73 void OnRightDown(wxMouseEvent& event);
74
75 void OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event);
76
77 private:
78 wxMenu *CreateDummyMenu();
79
80 wxMenuItem *GetLastMenuItem() const;
81
82 wxMenu *m_menu;
83
84 DECLARE_EVENT_TABLE()
85 };
86
87 // ----------------------------------------------------------------------------
88 // constants
89 // ----------------------------------------------------------------------------
90
91 enum
92 {
93 Menu_File_Quit = 100,
94
95 Menu_MenuBar_Toggle = 200,
96 Menu_MenuBar_Append,
97 Menu_MenuBar_Delete,
98 Menu_MenuBar_Enable,
99 Menu_MenuBar_GetLabel,
100 Menu_MenuBar_SetLabel,
101
102 Menu_Menu_Append = 300,
103 Menu_Menu_AppendSub,
104 Menu_Menu_Insert,
105 Menu_Menu_Delete,
106 Menu_Menu_Enable,
107 Menu_Menu_Check,
108 Menu_Menu_GetLabel,
109 Menu_Menu_SetLabel,
110
111 Menu_Dummy_First = 400,
112 Menu_Dummy_Second,
113 Menu_Dummy_Third,
114 Menu_Dummy_Fourth,
115 Menu_Dummy_Last,
116
117 Menu_Help_About = 1000,
118
119 Menu_Popup_ToBeDeleted = 2000,
120 Menu_Popup_ToBeGreyed,
121 Menu_Popup_ToBeChecked,
122 Menu_Popup_Submenu,
123
124 Menu_Max
125 };
126
127 // ----------------------------------------------------------------------------
128 // event tables
129 // ----------------------------------------------------------------------------
130
131 BEGIN_EVENT_TABLE(MyFrame, wxFrame)
132 EVT_MENU(Menu_File_Quit, MyFrame::OnQuit)
133
134 EVT_MENU(Menu_Help_About, MyFrame::OnAbout)
135
136 EVT_MENU(Menu_MenuBar_Toggle, MyFrame::OnToggleMenu)
137 EVT_MENU(Menu_MenuBar_Append, MyFrame::OnAppendMenu)
138 EVT_MENU(Menu_MenuBar_Delete, MyFrame::OnDeleteMenu)
139 EVT_MENU(Menu_MenuBar_Enable, MyFrame::OnEnableMenu)
140 EVT_MENU(Menu_MenuBar_GetLabel, MyFrame::OnGetLabelMenu)
141 EVT_MENU(Menu_MenuBar_SetLabel, MyFrame::OnSetLabelMenu)
142
143 EVT_MENU(Menu_Menu_Append, MyFrame::OnAppendMenuItem)
144 EVT_MENU(Menu_Menu_AppendSub, MyFrame::OnAppendSubMenu)
145 EVT_MENU(Menu_Menu_Insert, MyFrame::OnInsertMenuItem)
146 EVT_MENU(Menu_Menu_Delete, MyFrame::OnDeleteMenuItem)
147 EVT_MENU(Menu_Menu_Enable, MyFrame::OnEnableMenuItem)
148 EVT_MENU(Menu_Menu_Check, MyFrame::OnCheckMenuItem)
149 EVT_MENU(Menu_Menu_GetLabel, MyFrame::OnGetLabelMenuItem)
150 EVT_MENU(Menu_Menu_SetLabel, MyFrame::OnSetLabelMenuItem)
151
152 EVT_MENU_RANGE(Menu_Dummy_First, Menu_Dummy_Last, MyFrame::OnDummy)
153
154 EVT_UPDATE_UI(Menu_Menu_Check, MyFrame::OnUpdateCheckMenuItemUI)
155
156 EVT_RIGHT_DOWN(MyFrame::OnRightDown)
157 END_EVENT_TABLE()
158
159 // ============================================================================
160 // implementation
161 // ============================================================================
162
163 // ----------------------------------------------------------------------------
164 // MyApp
165 // ----------------------------------------------------------------------------
166
167 IMPLEMENT_APP(MyApp)
168
169 // The `main program' equivalent, creating the windows and returning the
170 // main frame
171 bool MyApp::OnInit()
172 {
173 // Create the main frame window
174 MyFrame* frame = new MyFrame;
175
176 frame->Show(TRUE);
177
178 frame->SetStatusText("Hello, wxWindows");
179
180 SetTopWindow(frame);
181
182 return TRUE;
183 }
184
185 // ----------------------------------------------------------------------------
186 // MyFrame
187 // ----------------------------------------------------------------------------
188
189 // Define my frame constructor
190 MyFrame::MyFrame()
191 : wxFrame((wxFrame *)NULL, -1, "wxWindows menu sample",
192 wxDefaultPosition, wxSize(300, 200))
193 {
194 m_menu = NULL;
195
196 CreateStatusBar();
197
198 // create the menubar
199 wxMenu *fileMenu = new wxMenu;
200 fileMenu->Append(Menu_File_Quit, "E&xit\tAlt-X", "Quit toolbar sample" );
201
202 wxMenu *menubarMenu = new wxMenu;
203 menubarMenu->Append(Menu_MenuBar_Append, "&Append menu\tCtrl-A",
204 "Append a menu to the menubar");
205 menubarMenu->Append(Menu_MenuBar_Delete, "&Delete menu\tCtrl-D",
206 "Delete the last menu from the menubar");
207 menubarMenu->Append(Menu_MenuBar_Toggle, "&Toggle menu\tCtrl-T",
208 "Toggle the first menu in the menubar", TRUE);
209 menubarMenu->AppendSeparator();
210 menubarMenu->Append(Menu_MenuBar_Enable, "&Enable menu\tCtrl-E",
211 "Enable or disable the last menu", TRUE);
212 menubarMenu->AppendSeparator();
213 menubarMenu->Append(Menu_MenuBar_GetLabel, "&Get menu label\tCtrl-G",
214 "Get the label of the last menu");
215 menubarMenu->Append(Menu_MenuBar_SetLabel, "&Set menu label\tCtrl-S",
216 "Change the label of the last menu");
217
218 wxMenu *menuMenu = new wxMenu;
219 menuMenu->Append(Menu_Menu_Append, "&Append menu item\tAlt-A",
220 "Append a menu item to the last menu");
221 menuMenu->Append(Menu_Menu_AppendSub, "&Append sub menu\tAlt-S",
222 "Append a sub menu to the last menu");
223 menuMenu->Append(Menu_Menu_Insert, "&Insert menu item\tAlt-I",
224 "Insert a menu item in head of the last menu");
225 menuMenu->Append(Menu_Menu_Delete, "&Delete menu item\tAlt-D",
226 "Delete the last menu item from the last menu");
227 menuMenu->AppendSeparator();
228 menuMenu->Append(Menu_Menu_Enable, "&Enable menu item\tAlt-E",
229 "Enable or disable the last menu item", TRUE);
230 menuMenu->Append(Menu_Menu_Check, "&Check menu item\tAlt-C",
231 "Check or uncheck the last menu item", TRUE);
232 menuMenu->AppendSeparator();
233 menuMenu->Append(Menu_Menu_GetLabel, "&Get menu item label\tAlt-G",
234 "Get the label of the last menu item");
235 menuMenu->Append(Menu_Menu_SetLabel, "&Set menu item label\tAlt-S",
236 "Change the label of the last menu item");
237
238 wxMenu *helpMenu = new wxMenu;
239 helpMenu->Append(Menu_Help_About, "&About\tF1", "About menu sample");
240
241 wxMenuBar* menuBar = new wxMenuBar( wxMB_DOCKABLE );
242
243 menuBar->Append(fileMenu, "&File");
244 menuBar->Append(menubarMenu, "Menu&bar");
245 menuBar->Append(menuMenu, "&Menu");
246 menuBar->Append(helpMenu, "&Help");
247
248 // these items should be initially checked
249 menuBar->Check(Menu_MenuBar_Toggle, TRUE);
250 menuBar->Check(Menu_MenuBar_Enable, TRUE);
251 menuBar->Check(Menu_Menu_Enable, TRUE);
252 menuBar->Check(Menu_Menu_Check, FALSE);
253
254 // associate the menu bar with the frame
255 SetMenuBar(menuBar);
256 }
257
258 wxMenu *MyFrame::CreateDummyMenu()
259 {
260 wxMenu *menu = new wxMenu;
261 menu->Append(Menu_Dummy_First, "First item\tCtrl-F1");
262 menu->AppendSeparator();
263 menu->Append(Menu_Dummy_Second, "Second item\tCtrl-F2", "", TRUE);
264
265 return menu;
266 }
267
268 wxMenuItem *MyFrame::GetLastMenuItem() const
269 {
270 wxMenuBar *menubar = GetMenuBar();
271 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
272
273 wxMenuItemList::Node *node = menu->GetMenuItems().GetLast();
274 if ( !node )
275 {
276 wxLogWarning("No last item in the last menu!");
277
278 return NULL;
279 }
280 else
281 {
282 return node->GetData();
283 }
284 }
285
286 void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
287 {
288 Close(TRUE);
289 }
290
291 void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
292 {
293 (void)wxMessageBox("wxWindows toolbar sample",
294 "About wxWindows menu sample",
295 wxICON_INFORMATION);
296 }
297
298 void MyFrame::OnDeleteMenu(wxCommandEvent& WXUNUSED(event))
299 {
300 wxMenuBar *mbar = GetMenuBar();
301
302 size_t count = mbar->GetMenuCount();
303 if ( count == 2 )
304 {
305 // don't let delete the first 2 menus
306 wxLogError("Can't delete any more menus");
307 }
308 else
309 {
310 delete mbar->Remove(count - 1);
311 }
312 }
313
314 void MyFrame::OnAppendMenu(wxCommandEvent& WXUNUSED(event))
315 {
316 static int s_count = 0;
317
318 wxString title;
319 title.Printf("Dummy menu &%d", ++s_count);
320
321 GetMenuBar()->Append(CreateDummyMenu(), title);
322 }
323
324 void MyFrame::OnToggleMenu(wxCommandEvent& WXUNUSED(event))
325 {
326 wxMenuBar *mbar = GetMenuBar();
327 if ( !m_menu )
328 {
329 // hide the menu
330 m_menu = mbar->Remove(0);
331 }
332 else
333 {
334 // restore it
335 mbar->Insert(0, m_menu, "&File");
336 m_menu = NULL;
337 }
338 }
339
340 void MyFrame::OnEnableMenu(wxCommandEvent& WXUNUSED(event))
341 {
342 wxMenuBar *mbar = GetMenuBar();
343 size_t count = mbar->GetMenuCount();
344
345 static bool s_enabled = TRUE;
346
347 s_enabled = !s_enabled;
348 mbar->EnableTop(count - 1, s_enabled);
349 }
350
351 void MyFrame::OnGetLabelMenu(wxCommandEvent& WXUNUSED(event))
352 {
353 wxMenuBar *mbar = GetMenuBar();
354 size_t count = mbar->GetMenuCount();
355
356 wxLogMessage("The label of the last menu item is '%s'",
357 mbar->GetLabelTop(count - 1).c_str());
358 }
359
360 void MyFrame::OnSetLabelMenu(wxCommandEvent& WXUNUSED(event))
361 {
362 wxMenuBar *mbar = GetMenuBar();
363 size_t count = mbar->GetMenuCount();
364
365 mbar->SetLabelTop(count - 1, "Dummy label &0");
366 }
367
368 void MyFrame::OnDummy(wxCommandEvent& event)
369 {
370 wxString s;
371 s.Printf("Dummy item #%d", event.GetId() - Menu_Dummy_First + 1);
372 wxMessageBox(s, "Menu sample", wxICON_INFORMATION);
373 }
374
375 void MyFrame::OnAppendMenuItem(wxCommandEvent& WXUNUSED(event))
376 {
377 wxMenuBar *menubar = GetMenuBar();
378 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
379
380 menu->AppendSeparator();
381 menu->Append(Menu_Dummy_Third, "Third dummy item\tCtrl-F3",
382 "Checkable item", TRUE);
383 }
384
385 void MyFrame::OnAppendSubMenu(wxCommandEvent& WXUNUSED(event))
386 {
387 wxMenuBar *menubar = GetMenuBar();
388 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
389
390 menu->Append(Menu_Dummy_Last, "Dummy sub menu\tCtrl-F12",
391 CreateDummyMenu());
392 }
393
394 void MyFrame::OnDeleteMenuItem(wxCommandEvent& WXUNUSED(event))
395 {
396 wxMenuBar *menubar = GetMenuBar();
397 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
398
399 size_t count = menu->GetMenuItemCount();
400 if ( !count )
401 {
402 wxLogWarning("No items to delete!");
403 }
404 else
405 {
406 menu->Destroy(menu->GetMenuItems().Item(count - 1)->GetData());
407 }
408 }
409
410 void MyFrame::OnInsertMenuItem(wxCommandEvent& WXUNUSED(event))
411 {
412 wxMenuBar *menubar = GetMenuBar();
413 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
414
415 menu->Insert(0, wxMenuItem::New(menu, Menu_Dummy_Fourth,
416 "Fourth dummy item\tCtrl-F4"));
417 menu->Insert(1, wxMenuItem::New(menu, wxID_SEPARATOR, ""));
418 }
419
420 void MyFrame::OnEnableMenuItem(wxCommandEvent& WXUNUSED(event))
421 {
422 wxMenuItem *item = GetLastMenuItem();
423
424 if ( item )
425 {
426 item->Enable(!item->IsEnabled());
427 }
428 }
429
430 void MyFrame::OnCheckMenuItem(wxCommandEvent& WXUNUSED(event))
431 {
432 wxMenuItem *item = GetLastMenuItem();
433
434 item->Toggle();
435 }
436
437 void MyFrame::OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event)
438 {
439 wxMenuItem *item = GetLastMenuItem();
440
441 event.Enable(item && item->IsCheckable());
442 }
443
444 void MyFrame::OnGetLabelMenuItem(wxCommandEvent& WXUNUSED(event))
445 {
446 wxMenuItem *item = GetLastMenuItem();
447
448 if ( item )
449 {
450 wxLogMessage("The label of the last menu item is '%s'",
451 item->GetLabel().c_str());
452 }
453 }
454
455 void MyFrame::OnSetLabelMenuItem(wxCommandEvent& WXUNUSED(event))
456 {
457 wxMenuItem *item = GetLastMenuItem();
458
459 if ( item )
460 {
461 item->SetText("Dummy menu item text");
462 }
463 }
464
465 void MyFrame::OnRightDown(wxMouseEvent &event )
466 {
467 wxMenu menu("Test popup");
468
469 menu.Append(Menu_Help_About, "&About");
470 menu.Append(Menu_Popup_Submenu, "Submenu", CreateDummyMenu());
471 menu.Append(Menu_Popup_ToBeDeleted, "To be deleted");
472 menu.Append(Menu_Popup_ToBeChecked, "To be checked", "", TRUE);
473 menu.Append(Menu_Popup_ToBeGreyed, "To be greyed");
474 menu.AppendSeparator();
475 menu.Append(Menu_File_Quit, "E&xit");
476
477 menu.Delete(Menu_Popup_ToBeDeleted);
478 menu.Check(Menu_Popup_ToBeChecked, TRUE);
479 menu.Enable(Menu_Popup_ToBeGreyed, FALSE);
480
481 PopupMenu( &menu, event.GetX(), event.GetY() );
482 }