]> git.saurik.com Git - wxWidgets.git/blame - samples/menu/menu.cpp
Fix wxStandardDialogLayoutAdapter compilation with wxUSE_BUTTON==0.
[wxWidgets.git] / samples / menu / menu.cpp
CommitLineData
717a57c2
VZ
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".
92a19c2e 21#include "wx/wxprec.h"
717a57c2
VZ
22
23#ifdef __BORLANDC__
24 #pragma hdrstop
25#endif
26
27#ifndef WX_PRECOMP
f91bf72f
GD
28 #include "wx/app.h"
29 #include "wx/frame.h"
30 #include "wx/menu.h"
31 #include "wx/msgdlg.h"
32 #include "wx/log.h"
33 #include "wx/textctrl.h"
5c7766de 34 #include "wx/textdlg.h"
717a57c2
VZ
35#endif
36
6d5b2a57
VZ
37#if !wxUSE_MENUS
38 // nice try...
39 #error "menu sample requires wxUSE_MENUS=1"
40#endif // wxUSE_MENUS
41
62ad15a5
VZ
42// not all ports have support for EVT_CONTEXT_MENU yet, don't define
43// USE_CONTEXT_MENU for those which don't
aaf996e5 44#if defined(__WXMOTIF__) || defined(__WXPM__) || defined(__WXX11__) || defined(__WXMGL__)
51a9eb73
VZ
45 #define USE_CONTEXT_MENU 0
46#else
47 #define USE_CONTEXT_MENU 1
62ad15a5
VZ
48#endif
49
1242c2d9
WS
50// this sample is usefull when new port is developed
51// and usually new port has majority of flags turned off
52#if wxUSE_LOG && wxUSE_TEXTCTRL
53 #define USE_LOG_WINDOW 1
54#else
55 #define USE_LOG_WINDOW 0
56#endif
57
67160991 58#if wxUSE_OWNER_DRAWN || defined(__WXGTK__)
fcaf9e70 59#include "copy.xpm"
c1a48eaf 60#endif
fcaf9e70 61
41f02b9a
FM
62#ifndef __WXMSW__
63 #include "../sample.xpm"
64#endif
65
717a57c2
VZ
66// ----------------------------------------------------------------------------
67// classes
68// ----------------------------------------------------------------------------
69
70// Define a new application
71class MyApp: public wxApp
72{
73public:
74 bool OnInit();
75};
76
77// Define a new frame
78class MyFrame: public wxFrame
79{
80public:
81 MyFrame();
82
3ca6a5f0
BP
83 virtual ~MyFrame();
84
85 void LogMenuEvent(const wxCommandEvent& event);
717a57c2 86
e421922f 87protected:
717a57c2 88 void OnQuit(wxCommandEvent& event);
1242c2d9 89#if USE_LOG_WINDOW
e421922f 90 void OnClearLog(wxCommandEvent& event);
cfbf301d
VZ
91 void OnClearLogUpdateUI(wxUpdateUIEvent& event);
92#endif // USE_LOG_WINDOW
e421922f 93
717a57c2
VZ
94 void OnAbout(wxCommandEvent& event);
95
96 void OnDummy(wxCommandEvent& event);
97
98 void OnAppendMenuItem(wxCommandEvent& event);
99 void OnAppendSubMenu(wxCommandEvent& event);
100 void OnDeleteMenuItem(wxCommandEvent& event);
08e78a54 101 void OnDeleteSubMenu(wxCommandEvent& event);
717a57c2
VZ
102 void OnInsertMenuItem(wxCommandEvent& event);
103 void OnCheckMenuItem(wxCommandEvent& event);
104 void OnEnableMenuItem(wxCommandEvent& event);
105 void OnGetLabelMenuItem(wxCommandEvent& event);
1242c2d9 106#if wxUSE_TEXTDLG
717a57c2 107 void OnSetLabelMenuItem(wxCommandEvent& event);
1242c2d9 108#endif
a80c322c 109 void OnGetMenuItemInfo(wxCommandEvent& event);
1242c2d9 110#if wxUSE_TEXTDLG
f6d90fb9 111 void OnFindMenuItem(wxCommandEvent& event);
1242c2d9 112#endif
717a57c2
VZ
113
114 void OnAppendMenu(wxCommandEvent& event);
f03ec224 115 void OnInsertMenu(wxCommandEvent& event);
717a57c2
VZ
116 void OnDeleteMenu(wxCommandEvent& event);
117 void OnToggleMenu(wxCommandEvent& event);
118 void OnEnableMenu(wxCommandEvent& event);
119 void OnGetLabelMenu(wxCommandEvent& event);
120 void OnSetLabelMenu(wxCommandEvent& event);
1242c2d9 121#if wxUSE_TEXTDLG
f6d90fb9 122 void OnFindMenu(wxCommandEvent& event);
1242c2d9 123#endif
717a57c2 124
d65c269b
VZ
125 void OnTestNormal(wxCommandEvent& event);
126 void OnTestCheck(wxCommandEvent& event);
127 void OnTestRadio(wxCommandEvent& event);
128
c377f1be
JS
129 void OnUpdateSubMenuNormal(wxUpdateUIEvent& event);
130 void OnUpdateSubMenuCheck(wxUpdateUIEvent& event);
131 void OnUpdateSubMenuRadio(wxUpdateUIEvent& event);
132
62ad15a5 133#if USE_CONTEXT_MENU
ac103441 134 void OnContextMenu(wxContextMenuEvent& event);
ccef86c7
VZ
135#else
136 void OnRightUp(wxMouseEvent& event)
137 { ShowContextMenu(event.GetPosition()); }
138#endif
139
140 void OnMenuOpen(wxMenuEvent& event)
1242c2d9
WS
141 {
142#if USE_LOG_WINDOW
9a83f860 143 LogMenuOpenOrClose(event, wxT("opened")); event.Skip();
1242c2d9
WS
144#endif
145 }
ccef86c7 146 void OnMenuClose(wxMenuEvent& event)
1242c2d9
WS
147 {
148#if USE_LOG_WINDOW
9a83f860 149 LogMenuOpenOrClose(event, wxT("closed")); event.Skip();
1242c2d9
WS
150#endif
151 }
717a57c2
VZ
152
153 void OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event);
154
e421922f
VZ
155 void OnSize(wxSizeEvent& event);
156
717a57c2 157private:
ccef86c7
VZ
158 void LogMenuOpenOrClose(const wxMenuEvent& event, const wxChar *what);
159 void ShowContextMenu(const wxPoint& pos);
160
f03ec224 161 wxMenu *CreateDummyMenu(wxString *title);
717a57c2
VZ
162
163 wxMenuItem *GetLastMenuItem() const;
164
e421922f
VZ
165 // the menu previously detached from the menubar (may be NULL)
166 wxMenu *m_menu;
717a57c2 167
e421922f 168 // the count of dummy menus already created
f03ec224
VZ
169 size_t m_countDummy;
170
1242c2d9 171#if USE_LOG_WINDOW
e421922f
VZ
172 // the control used for logging
173 wxTextCtrl *m_textctrl;
1242c2d9 174#endif
e421922f
VZ
175
176 // the previous log target
177 wxLog *m_logOld;
178
717a57c2
VZ
179 DECLARE_EVENT_TABLE()
180};
181
3ca6a5f0
BP
182// A small helper class which intercepts all menu events and logs them
183class MyEvtHandler : public wxEvtHandler
184{
185public:
186 MyEvtHandler(MyFrame *frame) { m_frame = frame; }
187
188 void OnMenuEvent(wxCommandEvent& event)
189 {
190 m_frame->LogMenuEvent(event);
191
192 event.Skip();
193 }
194
195private:
196 MyFrame *m_frame;
197
198 DECLARE_EVENT_TABLE()
199};
200
717a57c2
VZ
201// ----------------------------------------------------------------------------
202// constants
203// ----------------------------------------------------------------------------
204
205enum
206{
1242c2d9
WS
207 Menu_File_Quit = wxID_EXIT,
208#if USE_LOG_WINDOW
cfbf301d 209 Menu_File_ClearLog = 100,
1242c2d9 210#endif
717a57c2
VZ
211
212 Menu_MenuBar_Toggle = 200,
213 Menu_MenuBar_Append,
f03ec224 214 Menu_MenuBar_Insert,
717a57c2
VZ
215 Menu_MenuBar_Delete,
216 Menu_MenuBar_Enable,
217 Menu_MenuBar_GetLabel,
1242c2d9 218#if wxUSE_TEXTDLG
717a57c2 219 Menu_MenuBar_SetLabel,
f6d90fb9 220 Menu_MenuBar_FindMenu,
1242c2d9 221#endif
717a57c2
VZ
222
223 Menu_Menu_Append = 300,
224 Menu_Menu_AppendSub,
225 Menu_Menu_Insert,
226 Menu_Menu_Delete,
08e78a54 227 Menu_Menu_DeleteSub,
717a57c2
VZ
228 Menu_Menu_Enable,
229 Menu_Menu_Check,
230 Menu_Menu_GetLabel,
1242c2d9 231#if wxUSE_TEXTDLG
717a57c2 232 Menu_Menu_SetLabel,
1242c2d9 233#endif
a80c322c 234 Menu_Menu_GetInfo,
1242c2d9 235#if wxUSE_TEXTDLG
f6d90fb9 236 Menu_Menu_FindItem,
1242c2d9 237#endif
717a57c2 238
d65c269b
VZ
239 Menu_Test_Normal = 400,
240 Menu_Test_Check,
241 Menu_Test_Radio1,
242 Menu_Test_Radio2,
243 Menu_Test_Radio3,
244
c377f1be
JS
245 Menu_SubMenu = 450,
246 Menu_SubMenu_Normal,
247 Menu_SubMenu_Check,
248 Menu_SubMenu_Radio1,
249 Menu_SubMenu_Radio2,
250 Menu_SubMenu_Radio3,
251
d65c269b 252 Menu_Dummy_First = 500,
717a57c2
VZ
253 Menu_Dummy_Second,
254 Menu_Dummy_Third,
255 Menu_Dummy_Fourth,
256 Menu_Dummy_Last,
257
1242c2d9 258 Menu_Help_About = wxID_ABOUT,
717a57c2
VZ
259
260 Menu_Popup_ToBeDeleted = 2000,
261 Menu_Popup_ToBeGreyed,
262 Menu_Popup_ToBeChecked,
263 Menu_Popup_Submenu,
264
00a77b7c
VZ
265 Menu_PopupChoice,
266
717a57c2
VZ
267 Menu_Max
268};
269
270// ----------------------------------------------------------------------------
271// event tables
272// ----------------------------------------------------------------------------
273
274BEGIN_EVENT_TABLE(MyFrame, wxFrame)
e421922f 275 EVT_MENU(Menu_File_Quit, MyFrame::OnQuit)
1242c2d9 276#if USE_LOG_WINDOW
e421922f 277 EVT_MENU(Menu_File_ClearLog, MyFrame::OnClearLog)
cfbf301d 278 EVT_UPDATE_UI(Menu_File_ClearLog, MyFrame::OnClearLogUpdateUI)
1242c2d9 279#endif
717a57c2
VZ
280
281 EVT_MENU(Menu_Help_About, MyFrame::OnAbout)
282
283 EVT_MENU(Menu_MenuBar_Toggle, MyFrame::OnToggleMenu)
284 EVT_MENU(Menu_MenuBar_Append, MyFrame::OnAppendMenu)
f03ec224 285 EVT_MENU(Menu_MenuBar_Insert, MyFrame::OnInsertMenu)
717a57c2
VZ
286 EVT_MENU(Menu_MenuBar_Delete, MyFrame::OnDeleteMenu)
287 EVT_MENU(Menu_MenuBar_Enable, MyFrame::OnEnableMenu)
288 EVT_MENU(Menu_MenuBar_GetLabel, MyFrame::OnGetLabelMenu)
1242c2d9 289#if wxUSE_TEXTDLG
717a57c2 290 EVT_MENU(Menu_MenuBar_SetLabel, MyFrame::OnSetLabelMenu)
f6d90fb9 291 EVT_MENU(Menu_MenuBar_FindMenu, MyFrame::OnFindMenu)
1242c2d9 292#endif
717a57c2
VZ
293
294 EVT_MENU(Menu_Menu_Append, MyFrame::OnAppendMenuItem)
295 EVT_MENU(Menu_Menu_AppendSub, MyFrame::OnAppendSubMenu)
296 EVT_MENU(Menu_Menu_Insert, MyFrame::OnInsertMenuItem)
297 EVT_MENU(Menu_Menu_Delete, MyFrame::OnDeleteMenuItem)
08e78a54 298 EVT_MENU(Menu_Menu_DeleteSub, MyFrame::OnDeleteSubMenu)
717a57c2 299 EVT_MENU(Menu_Menu_Enable, MyFrame::OnEnableMenuItem)
a80c322c 300 EVT_MENU(Menu_Menu_Check, MyFrame::OnCheckMenuItem)
717a57c2 301 EVT_MENU(Menu_Menu_GetLabel, MyFrame::OnGetLabelMenuItem)
1242c2d9 302#if wxUSE_TEXTDLG
717a57c2 303 EVT_MENU(Menu_Menu_SetLabel, MyFrame::OnSetLabelMenuItem)
1242c2d9 304#endif
a80c322c 305 EVT_MENU(Menu_Menu_GetInfo, MyFrame::OnGetMenuItemInfo)
1242c2d9 306#if wxUSE_TEXTDLG
f6d90fb9 307 EVT_MENU(Menu_Menu_FindItem, MyFrame::OnFindMenuItem)
1242c2d9 308#endif
717a57c2 309
d65c269b
VZ
310 EVT_MENU(Menu_Test_Normal, MyFrame::OnTestNormal)
311 EVT_MENU(Menu_Test_Check, MyFrame::OnTestCheck)
312 EVT_MENU(Menu_Test_Radio1, MyFrame::OnTestRadio)
313 EVT_MENU(Menu_Test_Radio2, MyFrame::OnTestRadio)
314 EVT_MENU(Menu_Test_Radio3, MyFrame::OnTestRadio)
315
c377f1be
JS
316 EVT_UPDATE_UI(Menu_SubMenu_Normal, MyFrame::OnUpdateSubMenuNormal)
317 EVT_UPDATE_UI(Menu_SubMenu_Check, MyFrame::OnUpdateSubMenuCheck)
318 EVT_UPDATE_UI(Menu_SubMenu_Radio1, MyFrame::OnUpdateSubMenuRadio)
319 EVT_UPDATE_UI(Menu_SubMenu_Radio2, MyFrame::OnUpdateSubMenuRadio)
320 EVT_UPDATE_UI(Menu_SubMenu_Radio3, MyFrame::OnUpdateSubMenuRadio)
321
717a57c2
VZ
322 EVT_MENU_RANGE(Menu_Dummy_First, Menu_Dummy_Last, MyFrame::OnDummy)
323
324 EVT_UPDATE_UI(Menu_Menu_Check, MyFrame::OnUpdateCheckMenuItemUI)
325
62ad15a5 326#if USE_CONTEXT_MENU
ccef86c7
VZ
327 EVT_CONTEXT_MENU(MyFrame::OnContextMenu)
328#else
e421922f 329 EVT_RIGHT_UP(MyFrame::OnRightUp)
ccef86c7
VZ
330#endif
331
332 EVT_MENU_OPEN(MyFrame::OnMenuOpen)
333 EVT_MENU_CLOSE(MyFrame::OnMenuClose)
e421922f
VZ
334
335 EVT_SIZE(MyFrame::OnSize)
717a57c2
VZ
336END_EVENT_TABLE()
337
3ca6a5f0 338BEGIN_EVENT_TABLE(MyEvtHandler, wxEvtHandler)
1242c2d9 339 EVT_MENU(wxID_ANY, MyEvtHandler::OnMenuEvent)
3ca6a5f0
BP
340END_EVENT_TABLE()
341
717a57c2
VZ
342// ============================================================================
343// implementation
344// ============================================================================
345
346// ----------------------------------------------------------------------------
347// MyApp
348// ----------------------------------------------------------------------------
349
350IMPLEMENT_APP(MyApp)
351
352// The `main program' equivalent, creating the windows and returning the
353// main frame
354bool MyApp::OnInit()
355{
45e6e6f8
VZ
356 if ( !wxApp::OnInit() )
357 return false;
358
717a57c2
VZ
359 // Create the main frame window
360 MyFrame* frame = new MyFrame;
361
6ee9b7b5 362 frame->Show(true);
717a57c2 363
6d5b2a57 364#if wxUSE_STATUSBAR
9a83f860 365 frame->SetStatusText(wxT("Welcome to wxWidgets menu sample"));
6d5b2a57 366#endif // wxUSE_STATUSBAR
717a57c2
VZ
367
368 SetTopWindow(frame);
369
6ee9b7b5 370 return true;
717a57c2
VZ
371}
372
373// ----------------------------------------------------------------------------
374// MyFrame
375// ----------------------------------------------------------------------------
376
377// Define my frame constructor
378MyFrame::MyFrame()
9a83f860 379 : wxFrame((wxFrame *)NULL, wxID_ANY, wxT("wxWidgets menu sample"))
717a57c2 380{
41f02b9a
FM
381 SetIcon(wxICON(sample));
382
1242c2d9 383#if USE_LOG_WINDOW
268766dd 384 m_textctrl = NULL;
1242c2d9 385#endif
717a57c2 386 m_menu = NULL;
f03ec224 387 m_countDummy = 0;
e421922f 388 m_logOld = NULL;
717a57c2 389
6d5b2a57 390#if wxUSE_STATUSBAR
e421922f 391 CreateStatusBar();
6d5b2a57 392#endif // wxUSE_STATUSBAR
717a57c2
VZ
393
394 // create the menubar
395 wxMenu *fileMenu = new wxMenu;
6d5b2a57 396
ab73fe8d 397 wxMenu *stockSubMenu = new wxMenu;
ee0a94cf
RR
398 stockSubMenu->Append(wxID_ADD);
399 stockSubMenu->Append(wxID_APPLY);
6b1eedc1 400 stockSubMenu->Append(wxID_BACKWARD);
ee0a94cf 401 stockSubMenu->Append(wxID_BOLD);
6b1eedc1 402 stockSubMenu->Append(wxID_BOTTOM);
ee0a94cf 403 stockSubMenu->Append(wxID_CANCEL);
6b1eedc1 404 stockSubMenu->Append(wxID_CDROM);
ee0a94cf
RR
405 stockSubMenu->Append(wxID_CLEAR);
406 stockSubMenu->Append(wxID_CLOSE);
6b1eedc1 407 stockSubMenu->Append(wxID_CONVERT);
ee0a94cf
RR
408 stockSubMenu->Append(wxID_COPY);
409 stockSubMenu->Append(wxID_CUT);
410 stockSubMenu->Append(wxID_DELETE);
ee0a94cf 411 stockSubMenu->Append(wxID_DOWN);
6b1eedc1
VZ
412 stockSubMenu->Append(wxID_EXECUTE);
413 stockSubMenu->Append(wxID_EXIT);
414 stockSubMenu->Append(wxID_FIND);
415 stockSubMenu->Append(wxID_FIRST);
416 stockSubMenu->Append(wxID_FLOPPY);
ee0a94cf 417 stockSubMenu->Append(wxID_FORWARD);
6b1eedc1 418 stockSubMenu->Append(wxID_HARDDISK);
ee0a94cf
RR
419 stockSubMenu->Append(wxID_HELP);
420 stockSubMenu->Append(wxID_HOME);
421 stockSubMenu->Append(wxID_INDENT);
422 stockSubMenu->Append(wxID_INDEX);
6b1eedc1 423 stockSubMenu->Append(wxID_INFO);
ee0a94cf 424 stockSubMenu->Append(wxID_ITALIC);
6b1eedc1 425 stockSubMenu->Append(wxID_JUMP_TO);
ee0a94cf
RR
426 stockSubMenu->Append(wxID_JUSTIFY_CENTER);
427 stockSubMenu->Append(wxID_JUSTIFY_FILL);
428 stockSubMenu->Append(wxID_JUSTIFY_LEFT);
429 stockSubMenu->Append(wxID_JUSTIFY_RIGHT);
6b1eedc1
VZ
430 stockSubMenu->Append(wxID_LAST);
431 stockSubMenu->Append(wxID_NETWORK);
ee0a94cf
RR
432 stockSubMenu->Append(wxID_NEW);
433 stockSubMenu->Append(wxID_NO);
434 stockSubMenu->Append(wxID_OK);
435 stockSubMenu->Append(wxID_OPEN);
436 stockSubMenu->Append(wxID_PASTE);
437 stockSubMenu->Append(wxID_PREFERENCES);
ee0a94cf 438 stockSubMenu->Append(wxID_PREVIEW);
6b1eedc1 439 stockSubMenu->Append(wxID_PRINT);
ee0a94cf 440 stockSubMenu->Append(wxID_PROPERTIES);
ee0a94cf
RR
441 stockSubMenu->Append(wxID_REDO);
442 stockSubMenu->Append(wxID_REFRESH);
443 stockSubMenu->Append(wxID_REMOVE);
6b1eedc1 444 stockSubMenu->Append(wxID_REPLACE);
ee0a94cf
RR
445 stockSubMenu->Append(wxID_REVERT_TO_SAVED);
446 stockSubMenu->Append(wxID_SAVE);
447 stockSubMenu->Append(wxID_SAVEAS);
6b1eedc1
VZ
448 stockSubMenu->Append(wxID_SELECT_COLOR);
449 stockSubMenu->Append(wxID_SELECT_FONT);
450 stockSubMenu->Append(wxID_SORT_ASCENDING);
451 stockSubMenu->Append(wxID_SORT_DESCENDING);
452 stockSubMenu->Append(wxID_SPELL_CHECK);
ee0a94cf 453 stockSubMenu->Append(wxID_STOP);
6b1eedc1
VZ
454 stockSubMenu->Append(wxID_STRIKETHROUGH);
455 stockSubMenu->Append(wxID_TOP);
ee0a94cf
RR
456 stockSubMenu->Append(wxID_UNDELETE);
457 stockSubMenu->Append(wxID_UNDERLINE);
458 stockSubMenu->Append(wxID_UNDO);
459 stockSubMenu->Append(wxID_UNINDENT);
6b1eedc1 460 stockSubMenu->Append(wxID_UP);
ee0a94cf
RR
461 stockSubMenu->Append(wxID_YES);
462 stockSubMenu->Append(wxID_ZOOM_100);
463 stockSubMenu->Append(wxID_ZOOM_FIT);
464 stockSubMenu->Append(wxID_ZOOM_IN);
465 stockSubMenu->Append(wxID_ZOOM_OUT);
9a83f860 466 fileMenu->AppendSubMenu(stockSubMenu, wxT("&Standard items demo"));
ab73fe8d 467
1242c2d9 468#if USE_LOG_WINDOW
e421922f 469 wxMenuItem *item = new wxMenuItem(fileMenu, Menu_File_ClearLog,
9a83f860 470 wxT("Clear &log\tCtrl-L"));
67160991 471#if wxUSE_OWNER_DRAWN || defined(__WXGTK__)
e421922f 472 item->SetBitmap(copy_xpm);
1242c2d9 473#endif
e421922f
VZ
474 fileMenu->Append(item);
475 fileMenu->AppendSeparator();
ab73fe8d
VZ
476#endif // USE_LOG_WINDOW
477
9a83f860 478 fileMenu->Append(Menu_File_Quit, wxT("E&xit\tAlt-X"), wxT("Quit menu sample"));
717a57c2
VZ
479
480 wxMenu *menubarMenu = new wxMenu;
9a83f860
VZ
481 menubarMenu->Append(Menu_MenuBar_Append, wxT("&Append menu\tCtrl-A"),
482 wxT("Append a menu to the menubar"));
483 menubarMenu->Append(Menu_MenuBar_Insert, wxT("&Insert menu\tCtrl-I"),
484 wxT("Insert a menu into the menubar"));
485 menubarMenu->Append(Menu_MenuBar_Delete, wxT("&Delete menu\tCtrl-D"),
486 wxT("Delete the last menu from the menubar"));
487 menubarMenu->Append(Menu_MenuBar_Toggle, wxT("&Toggle menu\tCtrl-T"),
488 wxT("Toggle the first menu in the menubar"), true);
717a57c2 489 menubarMenu->AppendSeparator();
9a83f860
VZ
490 menubarMenu->Append(Menu_MenuBar_Enable, wxT("&Enable menu\tCtrl-E"),
491 wxT("Enable or disable the last menu"), true);
717a57c2 492 menubarMenu->AppendSeparator();
9a83f860
VZ
493 menubarMenu->Append(Menu_MenuBar_GetLabel, wxT("&Get menu label\tCtrl-G"),
494 wxT("Get the label of the last menu"));
1242c2d9 495#if wxUSE_TEXTDLG
9a83f860
VZ
496 menubarMenu->Append(Menu_MenuBar_SetLabel, wxT("&Set menu label\tCtrl-S"),
497 wxT("Change the label of the last menu"));
f6d90fb9 498 menubarMenu->AppendSeparator();
9a83f860
VZ
499 menubarMenu->Append(Menu_MenuBar_FindMenu, wxT("&Find menu from label\tCtrl-F"),
500 wxT("Find a menu by searching for its label"));
1242c2d9 501#endif
717a57c2 502
c377f1be 503 wxMenu* subMenu = new wxMenu;
9a83f860
VZ
504 subMenu->Append(Menu_SubMenu_Normal, wxT("&Normal submenu item"), wxT("Disabled submenu item"));
505 subMenu->AppendCheckItem(Menu_SubMenu_Check, wxT("&Check submenu item"), wxT("Check submenu item"));
506 subMenu->AppendRadioItem(Menu_SubMenu_Radio1, wxT("Radio item &1"), wxT("Radio item"));
507 subMenu->AppendRadioItem(Menu_SubMenu_Radio2, wxT("Radio item &2"), wxT("Radio item"));
508 subMenu->AppendRadioItem(Menu_SubMenu_Radio3, wxT("Radio item &3"), wxT("Radio item"));
c377f1be 509
9a83f860 510 menubarMenu->Append(Menu_SubMenu, wxT("Submenu"), subMenu);
c377f1be 511
717a57c2 512 wxMenu *menuMenu = new wxMenu;
9a83f860
VZ
513 menuMenu->Append(Menu_Menu_Append, wxT("&Append menu item\tAlt-A"),
514 wxT("Append a menu item to the last menu"));
515 menuMenu->Append(Menu_Menu_AppendSub, wxT("&Append sub menu\tAlt-S"),
516 wxT("Append a sub menu to the last menu"));
517 menuMenu->Append(Menu_Menu_Insert, wxT("&Insert menu item\tAlt-I"),
518 wxT("Insert a menu item in head of the last menu"));
519 menuMenu->Append(Menu_Menu_Delete, wxT("&Delete menu item\tAlt-D"),
520 wxT("Delete the last menu item from the last menu"));
08e78a54
VZ
521 menuMenu->Append(Menu_Menu_DeleteSub, wxT("Delete last &submenu\tAlt-K"),
522 wxT("Delete the last submenu from the last menu"));
717a57c2 523 menuMenu->AppendSeparator();
9a83f860
VZ
524 menuMenu->Append(Menu_Menu_Enable, wxT("&Enable menu item\tAlt-E"),
525 wxT("Enable or disable the last menu item"), true);
526 menuMenu->Append(Menu_Menu_Check, wxT("&Check menu item\tAlt-C"),
527 wxT("Check or uncheck the last menu item"), true);
717a57c2 528 menuMenu->AppendSeparator();
9a83f860
VZ
529 menuMenu->Append(Menu_Menu_GetInfo, wxT("Get menu item in&fo\tAlt-F"),
530 wxT("Show the state of the last menu item"));
532d575b 531#if wxUSE_TEXTDLG
9a83f860
VZ
532 menuMenu->Append(Menu_Menu_SetLabel, wxT("Set menu item label\tAlt-L"),
533 wxT("Set the label of a menu item"));
532d575b 534#endif
1242c2d9 535#if wxUSE_TEXTDLG
a80c322c 536 menuMenu->AppendSeparator();
9a83f860
VZ
537 menuMenu->Append(Menu_Menu_FindItem, wxT("Find menu item from label"),
538 wxT("Find a menu item by searching for its label"));
1242c2d9 539#endif
717a57c2 540
d65c269b 541 wxMenu *testMenu = new wxMenu;
9a83f860 542 testMenu->Append(Menu_Test_Normal, wxT("&Normal item"));
d65c269b 543 testMenu->AppendSeparator();
9a83f860 544 testMenu->AppendCheckItem(Menu_Test_Check, wxT("&Check item"));
d65c269b 545 testMenu->AppendSeparator();
9a83f860
VZ
546 testMenu->AppendRadioItem(Menu_Test_Radio1, wxT("Radio item &1"));
547 testMenu->AppendRadioItem(Menu_Test_Radio2, wxT("Radio item &2"));
548 testMenu->AppendRadioItem(Menu_Test_Radio3, wxT("Radio item &3"));
d65c269b 549
717a57c2 550 wxMenu *helpMenu = new wxMenu;
9a83f860 551 helpMenu->Append(Menu_Help_About, wxT("&About\tF1"), wxT("About menu sample"));
717a57c2
VZ
552
553 wxMenuBar* menuBar = new wxMenuBar( wxMB_DOCKABLE );
554
9a83f860
VZ
555 menuBar->Append(fileMenu, wxT("&File"));
556 menuBar->Append(menubarMenu, wxT("Menu&bar"));
557 menuBar->Append(menuMenu, wxT("&Menu"));
558 menuBar->Append(testMenu, wxT("&Test"));
559 menuBar->Append(helpMenu, wxT("&Help"));
717a57c2
VZ
560
561 // these items should be initially checked
6ee9b7b5
JS
562 menuBar->Check(Menu_MenuBar_Toggle, true);
563 menuBar->Check(Menu_MenuBar_Enable, true);
564 menuBar->Check(Menu_Menu_Enable, true);
565 menuBar->Check(Menu_Menu_Check, false);
717a57c2
VZ
566
567 // associate the menu bar with the frame
568 SetMenuBar(menuBar);
3ca6a5f0
BP
569
570 // intercept all menu events and log them in this custom event handler
571 PushEventHandler(new MyEvtHandler(this));
e421922f 572
1242c2d9 573#if USE_LOG_WINDOW
e421922f 574 // create the log text window
532d575b 575 m_textctrl = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
e421922f
VZ
576 wxDefaultPosition, wxDefaultSize,
577 wxTE_MULTILINE);
6ee9b7b5 578 m_textctrl->SetEditable(false);
5c7766de 579
7f2bcd06 580 wxLog::DisableTimestamp();
e421922f
VZ
581 m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_textctrl));
582
08e78a54 583 wxLogMessage(wxT("Brief explanations: the commands in the \"Menu\" menu ")
9a83f860 584 wxT("append/insert/delete items to/from the last menu.\n")
08e78a54 585 wxT("The commands in the \"Menubar\" menu work with the ")
9a83f860
VZ
586 wxT("menubar itself.\n\n")
587 wxT("Right click the band below to test popup menus.\n"));
1242c2d9 588#endif
92f07cf8
JS
589#ifdef __POCKETPC__
590 EnableContextMenu();
591#endif
3ca6a5f0
BP
592}
593
594MyFrame::~MyFrame()
595{
596 delete m_menu;
597
598 // delete the event handler installed in ctor
6ee9b7b5 599 PopEventHandler(true);
e421922f 600
1242c2d9 601#if USE_LOG_WINDOW
e421922f
VZ
602 // restore old logger
603 delete wxLog::SetActiveTarget(m_logOld);
1242c2d9 604#endif
717a57c2
VZ
605}
606
f03ec224 607wxMenu *MyFrame::CreateDummyMenu(wxString *title)
717a57c2
VZ
608{
609 wxMenu *menu = new wxMenu;
9a83f860 610 menu->Append(Menu_Dummy_First, wxT("&First item\tCtrl-F1"));
717a57c2 611 menu->AppendSeparator();
9a83f860 612 menu->AppendCheckItem(Menu_Dummy_Second, wxT("&Second item\tCtrl-F2"));
717a57c2 613
f03ec224
VZ
614 if ( title )
615 {
9a83f860 616 title->Printf(wxT("Dummy menu &%u"), (unsigned)++m_countDummy);
f03ec224
VZ
617 }
618
717a57c2
VZ
619 return menu;
620}
621
622wxMenuItem *MyFrame::GetLastMenuItem() const
623{
624 wxMenuBar *menubar = GetMenuBar();
625 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
626
65c0217e 627 wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetLast();
717a57c2
VZ
628 if ( !node )
629 {
9a83f860 630 wxLogWarning(wxT("No last item in the last menu!"));
717a57c2
VZ
631
632 return NULL;
633 }
634 else
635 {
636 return node->GetData();
637 }
638}
639
3ca6a5f0
BP
640void MyFrame::LogMenuEvent(const wxCommandEvent& event)
641{
642 int id = event.GetId();
e421922f 643
9a83f860 644 wxString msg = wxString::Format(wxT("Menu command %d"), id);
030f50ef
VZ
645
646 // catch all checkable menubar items and also the check item from the popup
647 // menu
648 wxMenuItem *item = GetMenuBar()->FindItem(id);
649 if ( (item && item->IsCheckable()) || id == Menu_Popup_ToBeChecked )
3ca6a5f0 650 {
9a83f860
VZ
651 msg += wxString::Format(wxT(" (the item is currently %schecked)"),
652 event.IsChecked() ? wxT("") : wxT("not "));
3ca6a5f0
BP
653 }
654
e421922f 655 wxLogMessage(msg);
3ca6a5f0
BP
656}
657
658// ----------------------------------------------------------------------------
659// menu callbacks
660// ----------------------------------------------------------------------------
661
717a57c2
VZ
662void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
663{
6ee9b7b5 664 Close(true);
717a57c2
VZ
665}
666
1242c2d9 667#if USE_LOG_WINDOW
cfbf301d 668
e421922f
VZ
669void MyFrame::OnClearLog(wxCommandEvent& WXUNUSED(event))
670{
671 m_textctrl->Clear();
672}
cfbf301d
VZ
673
674void MyFrame::OnClearLogUpdateUI(wxUpdateUIEvent& event)
675{
676 // if we only enable this item when the log window is empty, we never see
677 // it in the disable state as a message is logged whenever the menu is
678 // opened, so we disable it if there is not "much" text in the window
679 event.Enable( m_textctrl->GetNumberOfLines() > 5 );
680}
681
682#endif // USE_LOG_WINDOW
e421922f 683
717a57c2
VZ
684void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
685{
9a83f860
VZ
686 (void)wxMessageBox(wxT("wxWidgets menu sample\n(c) 1999-2001 Vadim Zeitlin"),
687 wxT("About wxWidgets menu sample"),
e8c0d573 688 wxOK | wxICON_INFORMATION);
717a57c2
VZ
689}
690
691void MyFrame::OnDeleteMenu(wxCommandEvent& WXUNUSED(event))
692{
693 wxMenuBar *mbar = GetMenuBar();
694
695 size_t count = mbar->GetMenuCount();
696 if ( count == 2 )
697 {
698 // don't let delete the first 2 menus
9a83f860 699 wxLogError(wxT("Can't delete any more menus"));
717a57c2
VZ
700 }
701 else
702 {
703 delete mbar->Remove(count - 1);
704 }
705}
706
f03ec224 707void MyFrame::OnInsertMenu(wxCommandEvent& WXUNUSED(event))
717a57c2 708{
717a57c2 709 wxString title;
f03ec224
VZ
710 wxMenu *menu = CreateDummyMenu(&title);
711 GetMenuBar()->Insert(0, menu, title);
712}
717a57c2 713
f03ec224
VZ
714void MyFrame::OnAppendMenu(wxCommandEvent& WXUNUSED(event))
715{
716 wxString title;
717 wxMenu *menu = CreateDummyMenu(&title);
718 GetMenuBar()->Append(menu, title);
717a57c2
VZ
719}
720
721void MyFrame::OnToggleMenu(wxCommandEvent& WXUNUSED(event))
722{
723 wxMenuBar *mbar = GetMenuBar();
724 if ( !m_menu )
725 {
726 // hide the menu
727 m_menu = mbar->Remove(0);
728 }
729 else
730 {
731 // restore it
9a83f860 732 mbar->Insert(0, m_menu, wxT("&File"));
717a57c2
VZ
733 m_menu = NULL;
734 }
735}
736
e421922f 737void MyFrame::OnEnableMenu(wxCommandEvent& event)
717a57c2
VZ
738{
739 wxMenuBar *mbar = GetMenuBar();
740 size_t count = mbar->GetMenuCount();
741
e421922f 742 mbar->EnableTop(count - 1, event.IsChecked());
717a57c2
VZ
743}
744
745void MyFrame::OnGetLabelMenu(wxCommandEvent& WXUNUSED(event))
746{
747 wxMenuBar *mbar = GetMenuBar();
748 size_t count = mbar->GetMenuCount();
749
9a83f860 750 wxCHECK_RET( count, wxT("no last menu?") );
5c7766de 751
9a83f860 752 wxLogMessage(wxT("The label of the last menu item is '%s'"),
52af3158 753 mbar->GetMenuLabel(count - 1).c_str());
717a57c2
VZ
754}
755
1242c2d9 756#if wxUSE_TEXTDLG
717a57c2
VZ
757void MyFrame::OnSetLabelMenu(wxCommandEvent& WXUNUSED(event))
758{
759 wxMenuBar *mbar = GetMenuBar();
760 size_t count = mbar->GetMenuCount();
761
9a83f860 762 wxCHECK_RET( count, wxT("no last menu?") );
5c7766de
VZ
763
764 wxString label = wxGetTextFromUser
765 (
9a83f860
VZ
766 wxT("Enter new label: "),
767 wxT("Change last menu text"),
52af3158 768 mbar->GetMenuLabel(count - 1),
5c7766de
VZ
769 this
770 );
771
772 if ( !label.empty() )
773 {
52af3158 774 mbar->SetMenuLabel(count - 1, label);
5c7766de 775 }
717a57c2
VZ
776}
777
f6d90fb9
GD
778void MyFrame::OnFindMenu(wxCommandEvent& WXUNUSED(event))
779{
780 wxMenuBar *mbar = GetMenuBar();
781 size_t count = mbar->GetMenuCount();
782
9a83f860 783 wxCHECK_RET( count, wxT("no last menu?") );
f6d90fb9
GD
784
785 wxString label = wxGetTextFromUser
786 (
9a83f860
VZ
787 wxT("Enter label to search for: "),
788 wxT("Find menu"),
532d575b 789 wxEmptyString,
f6d90fb9
GD
790 this
791 );
792
793 if ( !label.empty() )
794 {
795 int index = mbar->FindMenu(label);
796
797 if (index == wxNOT_FOUND)
798 {
9a83f860 799 wxLogWarning(wxT("No menu with label '%s'"), label.c_str());
f6d90fb9
GD
800 }
801 else
802 {
9a83f860 803 wxLogMessage(wxT("Menu %d has label '%s'"), index, label.c_str());
f6d90fb9
GD
804 }
805 }
806}
1242c2d9 807#endif
f6d90fb9 808
717a57c2
VZ
809void MyFrame::OnDummy(wxCommandEvent& event)
810{
9a83f860 811 wxLogMessage(wxT("Dummy item #%d"), event.GetId() - Menu_Dummy_First + 1);
717a57c2
VZ
812}
813
814void MyFrame::OnAppendMenuItem(wxCommandEvent& WXUNUSED(event))
815{
816 wxMenuBar *menubar = GetMenuBar();
817 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
818
819 menu->AppendSeparator();
9a83f860
VZ
820 menu->Append(Menu_Dummy_Third, wxT("&Third dummy item\tCtrl-F3"),
821 wxT("Checkable item"), true);
717a57c2
VZ
822}
823
824void MyFrame::OnAppendSubMenu(wxCommandEvent& WXUNUSED(event))
825{
826 wxMenuBar *menubar = GetMenuBar();
f6bcfd97 827
0c2d3577 828 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 2);
f6bcfd97 829
9a83f860
VZ
830 menu->Append(Menu_Dummy_Last, wxT("&Dummy sub menu"),
831 CreateDummyMenu(NULL), wxT("Dummy sub menu help"));
717a57c2
VZ
832}
833
834void MyFrame::OnDeleteMenuItem(wxCommandEvent& WXUNUSED(event))
835{
836 wxMenuBar *menubar = GetMenuBar();
837 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
838
839 size_t count = menu->GetMenuItemCount();
840 if ( !count )
841 {
9a83f860 842 wxLogWarning(wxT("No items to delete!"));
717a57c2
VZ
843 }
844 else
845 {
846 menu->Destroy(menu->GetMenuItems().Item(count - 1)->GetData());
847 }
848}
849
08e78a54
VZ
850void MyFrame::OnDeleteSubMenu(wxCommandEvent& WXUNUSED(event))
851{
852 wxMenuBar *menubar = GetMenuBar();
853 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 2);
854
855 for ( int n = menu->GetMenuItemCount() - 1; n >=0 ; --n )
856 {
857 wxMenuItem* item = menu->FindItemByPosition(n);
858 if (item->IsSubMenu())
859 {
860 menu->Destroy(item);
861 return;
862 }
863 }
864
865 wxLogWarning(wxT("No submenu to delete!"));
866}
867
717a57c2
VZ
868void MyFrame::OnInsertMenuItem(wxCommandEvent& WXUNUSED(event))
869{
870 wxMenuBar *menubar = GetMenuBar();
871 wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1);
872
873 menu->Insert(0, wxMenuItem::New(menu, Menu_Dummy_Fourth,
9a83f860 874 wxT("Fourth dummy item\tCtrl-F4")));
532d575b 875 menu->Insert(1, wxMenuItem::New(menu, wxID_SEPARATOR));
717a57c2
VZ
876}
877
878void MyFrame::OnEnableMenuItem(wxCommandEvent& WXUNUSED(event))
879{
880 wxMenuItem *item = GetLastMenuItem();
881
882 if ( item )
883 {
884 item->Enable(!item->IsEnabled());
885 }
886}
887
888void MyFrame::OnCheckMenuItem(wxCommandEvent& WXUNUSED(event))
889{
890 wxMenuItem *item = GetLastMenuItem();
891
892 item->Toggle();
893}
894
895void MyFrame::OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event)
896{
32db328c
VZ
897 wxLogNull nolog;
898
717a57c2
VZ
899 wxMenuItem *item = GetLastMenuItem();
900
901 event.Enable(item && item->IsCheckable());
902}
903
904void MyFrame::OnGetLabelMenuItem(wxCommandEvent& WXUNUSED(event))
905{
906 wxMenuItem *item = GetLastMenuItem();
907
908 if ( item )
909 {
68bc148c 910 wxString label = item->GetItemLabel();
9a83f860 911 wxLogMessage(wxT("The label of the last menu item is '%s'"),
68bc148c 912 label.c_str());
717a57c2
VZ
913 }
914}
915
1242c2d9 916#if wxUSE_TEXTDLG
717a57c2
VZ
917void MyFrame::OnSetLabelMenuItem(wxCommandEvent& WXUNUSED(event))
918{
919 wxMenuItem *item = GetLastMenuItem();
920
921 if ( item )
922 {
5c7766de
VZ
923 wxString label = wxGetTextFromUser
924 (
9a83f860
VZ
925 wxT("Enter new label: "),
926 wxT("Change last menu item text"),
52af3158 927 item->GetItemLabel(),
5c7766de
VZ
928 this
929 );
9a83f860 930 label.Replace( wxT("\\t"), wxT("\t") );
5c7766de
VZ
931
932 if ( !label.empty() )
933 {
52af3158 934 item->SetItemLabel(label);
5c7766de 935 }
717a57c2
VZ
936 }
937}
1242c2d9 938#endif
717a57c2 939
a80c322c
VZ
940void MyFrame::OnGetMenuItemInfo(wxCommandEvent& WXUNUSED(event))
941{
942 wxMenuItem *item = GetLastMenuItem();
943
944 if ( item )
945 {
946 wxString msg;
9a83f860
VZ
947 msg << wxT("The item is ") << (item->IsEnabled() ? wxT("enabled")
948 : wxT("disabled"))
949 << wxT('\n');
f6bcfd97 950
a80c322c
VZ
951 if ( item->IsCheckable() )
952 {
9a83f860
VZ
953 msg << wxT("It is checkable and ") << (item->IsChecked() ? wxT("") : wxT("un"))
954 << wxT("checked\n");
a80c322c
VZ
955 }
956
957#if wxUSE_ACCEL
958 wxAcceleratorEntry *accel = item->GetAccel();
959 if ( accel )
960 {
9a83f860 961 msg << wxT("Its accelerator is ");
a80c322c
VZ
962
963 int flags = accel->GetFlags();
964 if ( flags & wxACCEL_ALT )
9a83f860 965 msg << wxT("Alt-");
a80c322c 966 if ( flags & wxACCEL_CTRL )
9a83f860 967 msg << wxT("Ctrl-");
a80c322c 968 if ( flags & wxACCEL_SHIFT )
9a83f860 969 msg << wxT("Shift-");
a80c322c
VZ
970
971 int code = accel->GetKeyCode();
972 switch ( code )
973 {
974 case WXK_F1:
975 case WXK_F2:
976 case WXK_F3:
977 case WXK_F4:
978 case WXK_F5:
979 case WXK_F6:
980 case WXK_F7:
981 case WXK_F8:
982 case WXK_F9:
983 case WXK_F10:
984 case WXK_F11:
985 case WXK_F12:
9a83f860 986 msg << wxT('F') << code - WXK_F1 + 1;
a80c322c
VZ
987 break;
988
989 // if there are any other keys wxGetAccelFromString() may return,
990 // we should process them here
991
992 default:
993 if ( wxIsalnum(code) )
994 {
995 msg << (wxChar)code;
996
997 break;
998 }
999
9a83f860 1000 wxFAIL_MSG( wxT("unknown keyboard accel") );
a80c322c
VZ
1001 }
1002
1003 delete accel;
1004 }
1005 else
1006 {
9a83f860 1007 msg << wxT("It doesn't have an accelerator");
a80c322c
VZ
1008 }
1009#endif // wxUSE_ACCEL
1010
1011 wxLogMessage(msg);
1012 }
1013}
1014
1242c2d9 1015#if wxUSE_TEXTDLG
f6d90fb9
GD
1016void MyFrame::OnFindMenuItem(wxCommandEvent& WXUNUSED(event))
1017{
1018 wxMenuBar *mbar = GetMenuBar();
1019 size_t count = mbar->GetMenuCount();
1020
9a83f860 1021 wxCHECK_RET( count, wxT("no last menu?") );
f6d90fb9
GD
1022
1023 wxString label = wxGetTextFromUser
1024 (
9a83f860
VZ
1025 wxT("Enter label to search for: "),
1026 wxT("Find menu item"),
532d575b 1027 wxEmptyString,
f6d90fb9
GD
1028 this
1029 );
1030
1031 if ( !label.empty() )
1032 {
6ee9b7b5 1033 size_t menuindex;
f6d90fb9 1034 int index = wxNOT_FOUND;
62ad15a5 1035
f6d90fb9
GD
1036 for (menuindex = 0; (menuindex < count) && (index == wxNOT_FOUND); ++menuindex)
1037 {
1038 index = mbar->FindMenuItem(mbar->GetMenu(menuindex)->GetTitle(), label);
1039 }
1040 if (index == wxNOT_FOUND)
1041 {
9a83f860 1042 wxLogWarning(wxT("No menu item with label '%s'"), label.c_str());
f6d90fb9
GD
1043 }
1044 else
1045 {
9a83f860 1046 wxLogMessage(wxT("Menu item %d in menu %lu has label '%s'"),
2e491df9 1047 index, (unsigned long)menuindex, label.c_str());
f6d90fb9
GD
1048 }
1049 }
1050}
1242c2d9 1051#endif
f6d90fb9 1052
ccef86c7 1053void MyFrame::ShowContextMenu(const wxPoint& pos)
717a57c2 1054{
42b16af4 1055 wxMenu menu;
717a57c2 1056
00a77b7c
VZ
1057 if ( wxGetKeyState(WXK_SHIFT) )
1058 {
1059 // when Shift is pressed, demonstrate the use of a simple function
1060 // returning the id of the item selected in the popup menu
1061 menu.SetTitle("Choose one of:");
1062 static const char *choices[] = { "Apple", "Banana", "Cherry" };
1063 for ( size_t n = 0; n < WXSIZEOF(choices); n++ )
1064 menu.Append(Menu_PopupChoice + n, choices[n]);
1065
1066 const int rc = GetPopupMenuSelectionFromUser(menu, pos);
1067 if ( rc == wxID_NONE )
1068 {
1069 wxLogMessage("No selection");
1070 }
1071 else
1072 {
1073 wxLogMessage("You have selected \"%s\"",
1074 choices[rc - Menu_PopupChoice]);
1075 }
1076 }
1077 else // normal case, shift not pressed
1078 {
9a83f860
VZ
1079 menu.Append(Menu_Help_About, wxT("&About"));
1080 menu.Append(Menu_Popup_Submenu, wxT("&Submenu"), CreateDummyMenu(NULL));
1081 menu.Append(Menu_Popup_ToBeDeleted, wxT("To be &deleted"));
1082 menu.AppendCheckItem(Menu_Popup_ToBeChecked, wxT("To be &checked"));
1083 menu.Append(Menu_Popup_ToBeGreyed, wxT("To be &greyed"),
1084 wxT("This menu item should be initially greyed out"));
00a77b7c 1085 menu.AppendSeparator();
9a83f860 1086 menu.Append(Menu_File_Quit, wxT("E&xit"));
00a77b7c
VZ
1087
1088 menu.Delete(Menu_Popup_ToBeDeleted);
1089 menu.Check(Menu_Popup_ToBeChecked, true);
1090 menu.Enable(Menu_Popup_ToBeGreyed, false);
1091
1092 PopupMenu(&menu, pos);
1093
1094 // test for destroying items in popup menus
e421922f 1095#if 0 // doesn't work in wxGTK!
00a77b7c 1096 menu.Destroy(Menu_Popup_Submenu);
f6bcfd97 1097
00a77b7c 1098 PopupMenu( &menu, event.GetX(), event.GetY() );
f6bcfd97 1099#endif // 0
00a77b7c 1100 }
717a57c2 1101}
e421922f 1102
256b8649 1103void MyFrame::OnTestNormal(wxCommandEvent& WXUNUSED(event))
d65c269b 1104{
9a83f860 1105 wxLogMessage(wxT("Normal item selected"));
d65c269b
VZ
1106}
1107
1108void MyFrame::OnTestCheck(wxCommandEvent& event)
1109{
9a83f860
VZ
1110 wxLogMessage(wxT("Check item %schecked"),
1111 event.IsChecked() ? wxT("") : wxT("un"));
d65c269b
VZ
1112}
1113
1114void MyFrame::OnTestRadio(wxCommandEvent& event)
1115{
9a83f860 1116 wxLogMessage(wxT("Radio item %d selected"),
d65c269b
VZ
1117 event.GetId() - Menu_Test_Radio1 + 1);
1118}
1119
1242c2d9 1120#if USE_LOG_WINDOW
ccef86c7
VZ
1121void MyFrame::LogMenuOpenOrClose(const wxMenuEvent& event, const wxChar *what)
1122{
6ee9b7b5 1123 wxString msg;
9a83f860
VZ
1124 msg << wxT("A ")
1125 << ( event.IsPopup() ? wxT("popup ") : wxT("") )
1126 << wxT("menu has been ")
6ee9b7b5 1127 << what
9a83f860 1128 << wxT(".");
62ad15a5 1129
6ee9b7b5 1130 wxLogStatus(this, msg.c_str());
ccef86c7 1131}
1242c2d9 1132#endif
ccef86c7 1133
c377f1be
JS
1134void MyFrame::OnUpdateSubMenuNormal(wxUpdateUIEvent& event)
1135{
6ee9b7b5 1136 event.Enable(false);
c377f1be
JS
1137}
1138
1139void MyFrame::OnUpdateSubMenuCheck(wxUpdateUIEvent& event)
1140{
6ee9b7b5 1141 event.Enable(true);
c377f1be
JS
1142}
1143
1144void MyFrame::OnUpdateSubMenuRadio(wxUpdateUIEvent& event)
1145{
1146 int which = (event.GetId() - Menu_SubMenu_Radio1 + 1);
1147 if (which == 2)
6ee9b7b5 1148 event.Check(true);
c377f1be 1149 else
6ee9b7b5 1150 event.Check(false);
c377f1be
JS
1151}
1152
ac103441
RR
1153#if USE_CONTEXT_MENU
1154void MyFrame::OnContextMenu(wxContextMenuEvent& event)
1155{
1156 wxPoint point = event.GetPosition();
1157 // If from keyboard
1158 if (point.x == -1 && point.y == -1) {
1159 wxSize size = GetSize();
1160 point.x = size.x / 2;
1161 point.y = size.y / 2;
1162 } else {
1163 point = ScreenToClient(point);
1164 }
1165 ShowContextMenu(point);
1166}
1167#endif
1168
256b8649 1169void MyFrame::OnSize(wxSizeEvent& WXUNUSED(event))
e421922f 1170{
1242c2d9 1171#if USE_LOG_WINDOW
268766dd
VZ
1172 if ( !m_textctrl )
1173 return;
1174
e421922f
VZ
1175 // leave a band below for popup menu testing
1176 wxSize size = GetClientSize();
1177 m_textctrl->SetSize(0, 0, size.x, (3*size.y)/4);
1242c2d9 1178#endif
e421922f
VZ
1179
1180 // this is really ugly but we have to do it as we can't just call
1181 // event.Skip() because wxFrameBase would make the text control fill the
1182 // entire frame then
1183#ifdef __WXUNIVERSAL__
1184 PositionMenuBar();
1185#endif // __WXUNIVERSAL__
1186}
1187