1 /////////////////////////////////////////////////////////////////////////////
2 // Name: samples/menu.cpp
3 // Purpose: wxMenu/wxMenuBar sample
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 1999 Vadim Zeitlin
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx/wx.h".
21 #include "wx/wxprec.h"
31 #include "wx/msgdlg.h"
33 #include "wx/textctrl.h"
34 #include "wx/textdlg.h"
39 #error "menu sample requires wxUSE_MENUS=1"
42 // not all ports have support for EVT_CONTEXT_MENU yet, don't define
43 // USE_CONTEXT_MENU for those which don't
44 #if defined(__WXMOTIF__) || defined(__WXPM__) || defined(__WXX11__) || defined(__WXMGL__)
45 #define USE_CONTEXT_MENU 0
47 #define USE_CONTEXT_MENU 1
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
55 #define USE_LOG_WINDOW 0
58 #if wxUSE_OWNER_DRAWN || defined(__WXGTK__)
63 #include "../sample.xpm"
66 // ----------------------------------------------------------------------------
68 // ----------------------------------------------------------------------------
70 // Define a new application
71 class MyApp
: public wxApp
78 class MyFrame
: public wxFrame
85 void LogMenuEvent(const wxCommandEvent
& event
);
88 void OnQuit(wxCommandEvent
& event
);
90 void OnClearLog(wxCommandEvent
& event
);
91 void OnClearLogUpdateUI(wxUpdateUIEvent
& event
);
92 #endif // USE_LOG_WINDOW
94 void OnAbout(wxCommandEvent
& event
);
96 void OnDummy(wxCommandEvent
& event
);
98 void OnAppendMenuItem(wxCommandEvent
& event
);
99 void OnAppendSubMenu(wxCommandEvent
& event
);
100 void OnDeleteMenuItem(wxCommandEvent
& event
);
101 void OnDeleteSubMenu(wxCommandEvent
& event
);
102 void OnInsertMenuItem(wxCommandEvent
& event
);
103 void OnCheckMenuItem(wxCommandEvent
& event
);
104 void OnEnableMenuItem(wxCommandEvent
& event
);
105 void OnGetLabelMenuItem(wxCommandEvent
& event
);
107 void OnSetLabelMenuItem(wxCommandEvent
& event
);
109 void OnGetMenuItemInfo(wxCommandEvent
& event
);
111 void OnFindMenuItem(wxCommandEvent
& event
);
114 void OnAppendMenu(wxCommandEvent
& event
);
115 void OnInsertMenu(wxCommandEvent
& event
);
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
);
122 void OnFindMenu(wxCommandEvent
& event
);
125 void OnTestNormal(wxCommandEvent
& event
);
126 void OnTestCheck(wxCommandEvent
& event
);
127 void OnTestRadio(wxCommandEvent
& event
);
129 void OnUpdateSubMenuNormal(wxUpdateUIEvent
& event
);
130 void OnUpdateSubMenuCheck(wxUpdateUIEvent
& event
);
131 void OnUpdateSubMenuRadio(wxUpdateUIEvent
& event
);
134 void OnContextMenu(wxContextMenuEvent
& event
);
136 void OnRightUp(wxMouseEvent
& event
)
137 { ShowContextMenu(event
.GetPosition()); }
140 void OnMenuOpen(wxMenuEvent
& event
)
143 LogMenuOpenOrClose(event
, wxT("opened")); event
.Skip();
146 void OnMenuClose(wxMenuEvent
& event
)
149 LogMenuOpenOrClose(event
, wxT("closed")); event
.Skip();
153 void OnUpdateCheckMenuItemUI(wxUpdateUIEvent
& event
);
155 void OnSize(wxSizeEvent
& event
);
158 void LogMenuOpenOrClose(const wxMenuEvent
& event
, const wxChar
*what
);
159 void ShowContextMenu(const wxPoint
& pos
);
161 wxMenu
*CreateDummyMenu(wxString
*title
);
163 wxMenuItem
*GetLastMenuItem() const;
165 // the menu previously detached from the menubar (may be NULL)
168 // the count of dummy menus already created
172 // the control used for logging
173 wxTextCtrl
*m_textctrl
;
176 // the previous log target
179 DECLARE_EVENT_TABLE()
182 // A small helper class which intercepts all menu events and logs them
183 class MyEvtHandler
: public wxEvtHandler
186 MyEvtHandler(MyFrame
*frame
) { m_frame
= frame
; }
188 void OnMenuEvent(wxCommandEvent
& event
)
190 m_frame
->LogMenuEvent(event
);
198 DECLARE_EVENT_TABLE()
201 // ----------------------------------------------------------------------------
203 // ----------------------------------------------------------------------------
207 Menu_File_Quit
= wxID_EXIT
,
209 Menu_File_ClearLog
= 100,
212 Menu_MenuBar_Toggle
= 200,
217 Menu_MenuBar_GetLabel
,
219 Menu_MenuBar_SetLabel
,
220 Menu_MenuBar_FindMenu
,
223 Menu_Menu_Append
= 300,
239 Menu_Test_Normal
= 400,
252 Menu_Dummy_First
= 500,
258 Menu_Help_About
= wxID_ABOUT
,
260 Menu_Popup_ToBeDeleted
= 2000,
261 Menu_Popup_ToBeGreyed
,
262 Menu_Popup_ToBeChecked
,
270 // ----------------------------------------------------------------------------
272 // ----------------------------------------------------------------------------
274 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
275 EVT_MENU(Menu_File_Quit
, MyFrame::OnQuit
)
277 EVT_MENU(Menu_File_ClearLog
, MyFrame::OnClearLog
)
278 EVT_UPDATE_UI(Menu_File_ClearLog
, MyFrame::OnClearLogUpdateUI
)
281 EVT_MENU(Menu_Help_About
, MyFrame::OnAbout
)
283 EVT_MENU(Menu_MenuBar_Toggle
, MyFrame::OnToggleMenu
)
284 EVT_MENU(Menu_MenuBar_Append
, MyFrame::OnAppendMenu
)
285 EVT_MENU(Menu_MenuBar_Insert
, MyFrame::OnInsertMenu
)
286 EVT_MENU(Menu_MenuBar_Delete
, MyFrame::OnDeleteMenu
)
287 EVT_MENU(Menu_MenuBar_Enable
, MyFrame::OnEnableMenu
)
288 EVT_MENU(Menu_MenuBar_GetLabel
, MyFrame::OnGetLabelMenu
)
290 EVT_MENU(Menu_MenuBar_SetLabel
, MyFrame::OnSetLabelMenu
)
291 EVT_MENU(Menu_MenuBar_FindMenu
, MyFrame::OnFindMenu
)
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
)
298 EVT_MENU(Menu_Menu_DeleteSub
, MyFrame::OnDeleteSubMenu
)
299 EVT_MENU(Menu_Menu_Enable
, MyFrame::OnEnableMenuItem
)
300 EVT_MENU(Menu_Menu_Check
, MyFrame::OnCheckMenuItem
)
301 EVT_MENU(Menu_Menu_GetLabel
, MyFrame::OnGetLabelMenuItem
)
303 EVT_MENU(Menu_Menu_SetLabel
, MyFrame::OnSetLabelMenuItem
)
305 EVT_MENU(Menu_Menu_GetInfo
, MyFrame::OnGetMenuItemInfo
)
307 EVT_MENU(Menu_Menu_FindItem
, MyFrame::OnFindMenuItem
)
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
)
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
)
322 EVT_MENU_RANGE(Menu_Dummy_First
, Menu_Dummy_Last
, MyFrame::OnDummy
)
324 EVT_UPDATE_UI(Menu_Menu_Check
, MyFrame::OnUpdateCheckMenuItemUI
)
327 EVT_CONTEXT_MENU(MyFrame::OnContextMenu
)
329 EVT_RIGHT_UP(MyFrame::OnRightUp
)
332 EVT_MENU_OPEN(MyFrame::OnMenuOpen
)
333 EVT_MENU_CLOSE(MyFrame::OnMenuClose
)
335 EVT_SIZE(MyFrame::OnSize
)
338 BEGIN_EVENT_TABLE(MyEvtHandler
, wxEvtHandler
)
339 EVT_MENU(wxID_ANY
, MyEvtHandler::OnMenuEvent
)
342 // ============================================================================
344 // ============================================================================
346 // ----------------------------------------------------------------------------
348 // ----------------------------------------------------------------------------
352 // The `main program' equivalent, creating the windows and returning the
356 if ( !wxApp::OnInit() )
359 // Create the main frame window
360 MyFrame
* frame
= new MyFrame
;
365 frame
->SetStatusText(wxT("Welcome to wxWidgets menu sample"));
366 #endif // wxUSE_STATUSBAR
373 // ----------------------------------------------------------------------------
375 // ----------------------------------------------------------------------------
377 // Define my frame constructor
379 : wxFrame((wxFrame
*)NULL
, wxID_ANY
, wxT("wxWidgets menu sample"))
381 SetIcon(wxICON(sample
));
392 #endif // wxUSE_STATUSBAR
394 // create the menubar
395 wxMenu
*fileMenu
= new wxMenu
;
397 wxMenu
*stockSubMenu
= new wxMenu
;
398 stockSubMenu
->Append(wxID_ADD
);
399 stockSubMenu
->Append(wxID_APPLY
);
400 stockSubMenu
->Append(wxID_BACKWARD
);
401 stockSubMenu
->Append(wxID_BOLD
);
402 stockSubMenu
->Append(wxID_BOTTOM
);
403 stockSubMenu
->Append(wxID_CANCEL
);
404 stockSubMenu
->Append(wxID_CDROM
);
405 stockSubMenu
->Append(wxID_CLEAR
);
406 stockSubMenu
->Append(wxID_CLOSE
);
407 stockSubMenu
->Append(wxID_CONVERT
);
408 stockSubMenu
->Append(wxID_COPY
);
409 stockSubMenu
->Append(wxID_CUT
);
410 stockSubMenu
->Append(wxID_DELETE
);
411 stockSubMenu
->Append(wxID_DOWN
);
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
);
417 stockSubMenu
->Append(wxID_FORWARD
);
418 stockSubMenu
->Append(wxID_HARDDISK
);
419 stockSubMenu
->Append(wxID_HELP
);
420 stockSubMenu
->Append(wxID_HOME
);
421 stockSubMenu
->Append(wxID_INDENT
);
422 stockSubMenu
->Append(wxID_INDEX
);
423 stockSubMenu
->Append(wxID_INFO
);
424 stockSubMenu
->Append(wxID_ITALIC
);
425 stockSubMenu
->Append(wxID_JUMP_TO
);
426 stockSubMenu
->Append(wxID_JUSTIFY_CENTER
);
427 stockSubMenu
->Append(wxID_JUSTIFY_FILL
);
428 stockSubMenu
->Append(wxID_JUSTIFY_LEFT
);
429 stockSubMenu
->Append(wxID_JUSTIFY_RIGHT
);
430 stockSubMenu
->Append(wxID_LAST
);
431 stockSubMenu
->Append(wxID_NETWORK
);
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
);
438 stockSubMenu
->Append(wxID_PREVIEW
);
439 stockSubMenu
->Append(wxID_PRINT
);
440 stockSubMenu
->Append(wxID_PROPERTIES
);
441 stockSubMenu
->Append(wxID_REDO
);
442 stockSubMenu
->Append(wxID_REFRESH
);
443 stockSubMenu
->Append(wxID_REMOVE
);
444 stockSubMenu
->Append(wxID_REPLACE
);
445 stockSubMenu
->Append(wxID_REVERT_TO_SAVED
);
446 stockSubMenu
->Append(wxID_SAVE
);
447 stockSubMenu
->Append(wxID_SAVEAS
);
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
);
453 stockSubMenu
->Append(wxID_STOP
);
454 stockSubMenu
->Append(wxID_STRIKETHROUGH
);
455 stockSubMenu
->Append(wxID_TOP
);
456 stockSubMenu
->Append(wxID_UNDELETE
);
457 stockSubMenu
->Append(wxID_UNDERLINE
);
458 stockSubMenu
->Append(wxID_UNDO
);
459 stockSubMenu
->Append(wxID_UNINDENT
);
460 stockSubMenu
->Append(wxID_UP
);
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
);
466 fileMenu
->AppendSubMenu(stockSubMenu
, wxT("&Standard items demo"));
469 wxMenuItem
*item
= new wxMenuItem(fileMenu
, Menu_File_ClearLog
,
470 wxT("Clear &log\tCtrl-L"));
471 #if wxUSE_OWNER_DRAWN || defined(__WXGTK__)
472 item
->SetBitmap(copy_xpm
);
474 fileMenu
->Append(item
);
475 fileMenu
->AppendSeparator();
476 #endif // USE_LOG_WINDOW
478 fileMenu
->Append(Menu_File_Quit
, wxT("E&xit\tAlt-X"), wxT("Quit menu sample"));
480 wxMenu
*menubarMenu
= new wxMenu
;
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);
489 menubarMenu
->AppendSeparator();
490 menubarMenu
->Append(Menu_MenuBar_Enable
, wxT("&Enable menu\tCtrl-E"),
491 wxT("Enable or disable the last menu"), true);
492 menubarMenu
->AppendSeparator();
493 menubarMenu
->Append(Menu_MenuBar_GetLabel
, wxT("&Get menu label\tCtrl-G"),
494 wxT("Get the label of the last menu"));
496 menubarMenu
->Append(Menu_MenuBar_SetLabel
, wxT("&Set menu label\tCtrl-S"),
497 wxT("Change the label of the last menu"));
498 menubarMenu
->AppendSeparator();
499 menubarMenu
->Append(Menu_MenuBar_FindMenu
, wxT("&Find menu from label\tCtrl-F"),
500 wxT("Find a menu by searching for its label"));
503 wxMenu
* subMenu
= new wxMenu
;
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"));
510 menubarMenu
->Append(Menu_SubMenu
, wxT("Submenu"), subMenu
);
512 wxMenu
*menuMenu
= new wxMenu
;
513 menuMenu
->Append(Menu_Menu_Append
, wxT("&Append menu item\tAlt-A"),
514 wxT("Append a menu item to the 'Test' menu"));
515 menuMenu
->Append(Menu_Menu_AppendSub
, wxT("&Append sub menu\tAlt-S"),
516 wxT("Append a sub menu to the 'Test' menu"));
517 menuMenu
->Append(Menu_Menu_Insert
, wxT("&Insert menu item\tAlt-I"),
518 wxT("Insert a menu item in head of the 'Test' menu"));
519 menuMenu
->Append(Menu_Menu_Delete
, wxT("&Delete menu item\tAlt-D"),
520 wxT("Delete the last menu item from the 'Test' menu"));
521 menuMenu
->Append(Menu_Menu_DeleteSub
, wxT("Delete last &submenu\tAlt-K"),
522 wxT("Delete the last submenu from the 'Test' menu"));
523 menuMenu
->AppendSeparator();
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);
528 menuMenu
->AppendSeparator();
529 menuMenu
->Append(Menu_Menu_GetInfo
, wxT("Get menu item in&fo\tAlt-F"),
530 wxT("Show the state of the last menu item"));
532 menuMenu
->Append(Menu_Menu_SetLabel
, wxT("Set menu item label\tAlt-L"),
533 wxT("Set the label of a menu item"));
536 menuMenu
->AppendSeparator();
537 menuMenu
->Append(Menu_Menu_FindItem
, wxT("Find menu item from label"),
538 wxT("Find a menu item by searching for its label"));
541 wxMenu
*testMenu
= new wxMenu
;
542 testMenu
->Append(Menu_Test_Normal
, wxT("&Normal item"));
543 testMenu
->AppendSeparator();
544 testMenu
->AppendCheckItem(Menu_Test_Check
, wxT("&Check item"));
545 testMenu
->AppendSeparator();
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"));
550 wxMenu
*helpMenu
= new wxMenu
;
551 helpMenu
->Append(Menu_Help_About
, wxT("&About\tF1"), wxT("About menu sample"));
553 wxMenuBar
* menuBar
= new wxMenuBar( wxMB_DOCKABLE
);
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"));
561 // these items should be initially checked
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);
567 // associate the menu bar with the frame
570 // intercept all menu events and log them in this custom event handler
571 PushEventHandler(new MyEvtHandler(this));
574 // create the log text window
575 m_textctrl
= new wxTextCtrl(this, wxID_ANY
, wxEmptyString
,
576 wxDefaultPosition
, wxDefaultSize
,
578 m_textctrl
->SetEditable(false);
580 wxLog::DisableTimestamp();
581 m_logOld
= wxLog::SetActiveTarget(new wxLogTextCtrl(m_textctrl
));
583 wxLogMessage(wxT("Brief explanations: the commands in the \"Menu\" menu ")
584 wxT("append/insert/delete items to/from the \"Test\" menu.\n")
585 wxT("The commands in the \"Menubar\" menu work with the ")
586 wxT("menubar itself.\n\n")
587 wxT("Right click the band below to test popup menus.\n"));
598 // delete the event handler installed in ctor
599 PopEventHandler(true);
602 // restore old logger
603 delete wxLog::SetActiveTarget(m_logOld
);
607 wxMenu
*MyFrame::CreateDummyMenu(wxString
*title
)
609 wxMenu
*menu
= new wxMenu
;
610 menu
->Append(Menu_Dummy_First
, wxT("&First item\tCtrl-F1"));
611 menu
->AppendSeparator();
612 menu
->AppendCheckItem(Menu_Dummy_Second
, wxT("&Second item\tCtrl-F2"));
616 title
->Printf(wxT("Dummy menu &%u"), (unsigned)++m_countDummy
);
622 wxMenuItem
*MyFrame::GetLastMenuItem() const
624 wxMenuBar
*menubar
= GetMenuBar();
625 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
626 wxCHECK_MSG( menu
, NULL
, wxT("no 'Test' menu?") );
628 wxMenuItemList::compatibility_iterator node
= menu
->GetMenuItems().GetLast();
631 wxLogWarning(wxT("No last item in the 'Test' menu!"));
637 return node
->GetData();
641 void MyFrame::LogMenuEvent(const wxCommandEvent
& event
)
643 int id
= event
.GetId();
645 wxString msg
= wxString::Format(wxT("Menu command %d"), id
);
647 // catch all checkable menubar items and also the check item from the popup
649 wxMenuItem
*item
= GetMenuBar()->FindItem(id
);
650 if ( (item
&& item
->IsCheckable()) || id
== Menu_Popup_ToBeChecked
)
652 msg
+= wxString::Format(wxT(" (the item is currently %schecked)"),
653 event
.IsChecked() ? wxT("") : wxT("not "));
659 // ----------------------------------------------------------------------------
661 // ----------------------------------------------------------------------------
663 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
))
670 void MyFrame::OnClearLog(wxCommandEvent
& WXUNUSED(event
))
675 void MyFrame::OnClearLogUpdateUI(wxUpdateUIEvent
& event
)
677 // if we only enable this item when the log window is empty, we never see
678 // it in the disable state as a message is logged whenever the menu is
679 // opened, so we disable it if there is not "much" text in the window
680 event
.Enable( m_textctrl
->GetNumberOfLines() > 5 );
683 #endif // USE_LOG_WINDOW
685 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
687 (void)wxMessageBox(wxT("wxWidgets menu sample\n(c) 1999-2001 Vadim Zeitlin"),
688 wxT("About wxWidgets menu sample"),
689 wxOK
| wxICON_INFORMATION
);
692 void MyFrame::OnDeleteMenu(wxCommandEvent
& WXUNUSED(event
))
694 wxMenuBar
*mbar
= GetMenuBar();
696 size_t count
= mbar
->GetMenuCount();
699 // don't let delete the first 4 menus
700 wxLogError(wxT("Can't delete any more menus"));
704 delete mbar
->Remove(count
- 1);
708 void MyFrame::OnInsertMenu(wxCommandEvent
& WXUNUSED(event
))
711 wxMenu
*menu
= CreateDummyMenu(&title
);
712 // Insert before the 'Help' menu
713 // Othewise repeated Deletes will remove the 'Test' menu
714 GetMenuBar()->Insert(4, menu
, title
);
717 void MyFrame::OnAppendMenu(wxCommandEvent
& WXUNUSED(event
))
720 wxMenu
*menu
= CreateDummyMenu(&title
);
721 GetMenuBar()->Append(menu
, title
);
724 void MyFrame::OnToggleMenu(wxCommandEvent
& WXUNUSED(event
))
726 wxMenuBar
*mbar
= GetMenuBar();
730 m_menu
= mbar
->Remove(0);
735 mbar
->Insert(0, m_menu
, wxT("&File"));
740 void MyFrame::OnEnableMenu(wxCommandEvent
& event
)
742 wxMenuBar
*mbar
= GetMenuBar();
743 size_t count
= mbar
->GetMenuCount();
745 mbar
->EnableTop(count
- 1, event
.IsChecked());
748 void MyFrame::OnGetLabelMenu(wxCommandEvent
& WXUNUSED(event
))
750 wxMenuBar
*mbar
= GetMenuBar();
751 size_t count
= mbar
->GetMenuCount();
753 wxCHECK_RET( count
, wxT("no last menu?") );
755 wxLogMessage(wxT("The label of the last menu item is '%s'"),
756 mbar
->GetMenuLabel(count
- 1).c_str());
760 void MyFrame::OnSetLabelMenu(wxCommandEvent
& WXUNUSED(event
))
762 wxMenuBar
*mbar
= GetMenuBar();
763 size_t count
= mbar
->GetMenuCount();
765 wxCHECK_RET( count
, wxT("no last menu?") );
767 wxString label
= wxGetTextFromUser
769 wxT("Enter new label: "),
770 wxT("Change last menu text"),
771 mbar
->GetMenuLabel(count
- 1),
775 if ( !label
.empty() )
777 mbar
->SetMenuLabel(count
- 1, label
);
781 void MyFrame::OnFindMenu(wxCommandEvent
& WXUNUSED(event
))
783 wxMenuBar
*mbar
= GetMenuBar();
784 size_t count
= mbar
->GetMenuCount();
786 wxCHECK_RET( count
, wxT("no last menu?") );
788 wxString label
= wxGetTextFromUser
790 wxT("Enter label to search for: "),
796 if ( !label
.empty() )
798 int index
= mbar
->FindMenu(label
);
800 if (index
== wxNOT_FOUND
)
802 wxLogWarning(wxT("No menu with label '%s'"), label
.c_str());
806 wxLogMessage(wxT("Menu %d has label '%s'"), index
, label
.c_str());
812 void MyFrame::OnDummy(wxCommandEvent
& event
)
814 wxLogMessage(wxT("Dummy item #%d"), event
.GetId() - Menu_Dummy_First
+ 1);
817 void MyFrame::OnAppendMenuItem(wxCommandEvent
& WXUNUSED(event
))
819 wxMenuBar
*menubar
= GetMenuBar();
820 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
821 wxCHECK_RET( menu
, wxT("no 'Test' menu?") );
823 menu
->AppendSeparator();
824 menu
->Append(Menu_Dummy_Third
, wxT("&Third dummy item\tCtrl-F3"),
825 wxT("Checkable item"), true);
828 void MyFrame::OnAppendSubMenu(wxCommandEvent
& WXUNUSED(event
))
830 wxMenuBar
*menubar
= GetMenuBar();
831 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
832 wxCHECK_RET( menu
, wxT("no 'Test' menu?") );
834 menu
->Append(Menu_Dummy_Last
, wxT("&Dummy sub menu"),
835 CreateDummyMenu(NULL
), wxT("Dummy sub menu help"));
838 void MyFrame::OnDeleteMenuItem(wxCommandEvent
& WXUNUSED(event
))
840 wxMenuBar
*menubar
= GetMenuBar();
841 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
842 wxCHECK_RET( menu
, wxT("no 'Test' menu?") );
844 size_t count
= menu
->GetMenuItemCount();
847 wxLogWarning(wxT("No items to delete!"));
851 menu
->Destroy(menu
->GetMenuItems().Item(count
- 1)->GetData());
855 void MyFrame::OnDeleteSubMenu(wxCommandEvent
& WXUNUSED(event
))
857 wxMenuBar
*menubar
= GetMenuBar();
858 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
859 wxCHECK_RET( menu
, wxT("no 'Test' menu?") );
861 for ( int n
= menu
->GetMenuItemCount() - 1; n
>=0 ; --n
)
863 wxMenuItem
* item
= menu
->FindItemByPosition(n
);
864 if (item
->IsSubMenu())
871 wxLogWarning(wxT("No submenu to delete!"));
874 void MyFrame::OnInsertMenuItem(wxCommandEvent
& WXUNUSED(event
))
876 wxMenuBar
*menubar
= GetMenuBar();
877 wxMenu
*menu
= menubar
->GetMenu(menubar
->FindMenu("Test"));
878 wxCHECK_RET( menu
, wxT("no 'Test' menu?") );
880 menu
->Insert(0, wxMenuItem::New(menu
, Menu_Dummy_Fourth
,
881 wxT("Fourth dummy item\tCtrl-F4")));
882 menu
->Insert(1, wxMenuItem::New(menu
, wxID_SEPARATOR
));
885 void MyFrame::OnEnableMenuItem(wxCommandEvent
& WXUNUSED(event
))
887 wxMenuItem
*item
= GetLastMenuItem();
891 item
->Enable(!item
->IsEnabled());
895 void MyFrame::OnCheckMenuItem(wxCommandEvent
& WXUNUSED(event
))
897 wxMenuItem
*item
= GetLastMenuItem();
899 if (item
&& item
->IsCheckable())
905 void MyFrame::OnUpdateCheckMenuItemUI(wxUpdateUIEvent
& event
)
909 wxMenuItem
*item
= GetLastMenuItem();
911 event
.Enable(item
&& item
->IsCheckable());
914 void MyFrame::OnGetLabelMenuItem(wxCommandEvent
& WXUNUSED(event
))
916 wxMenuItem
*item
= GetLastMenuItem();
920 wxString label
= item
->GetItemLabel();
921 wxLogMessage(wxT("The label of the last menu item is '%s'"),
927 void MyFrame::OnSetLabelMenuItem(wxCommandEvent
& WXUNUSED(event
))
929 wxMenuItem
*item
= GetLastMenuItem();
933 wxString label
= wxGetTextFromUser
935 wxT("Enter new label: "),
936 wxT("Change last menu item text"),
937 item
->GetItemLabel(),
940 label
.Replace( wxT("\\t"), wxT("\t") );
942 if ( !label
.empty() )
944 item
->SetItemLabel(label
);
950 void MyFrame::OnGetMenuItemInfo(wxCommandEvent
& WXUNUSED(event
))
952 wxMenuItem
*item
= GetLastMenuItem();
957 msg
<< wxT("The item is ") << (item
->IsEnabled() ? wxT("enabled")
961 if ( item
->IsCheckable() )
963 msg
<< wxT("It is checkable and ") << (item
->IsChecked() ? wxT("") : wxT("un"))
968 wxAcceleratorEntry
*accel
= item
->GetAccel();
971 msg
<< wxT("Its accelerator is ");
973 int flags
= accel
->GetFlags();
974 if ( flags
& wxACCEL_ALT
)
976 if ( flags
& wxACCEL_CTRL
)
978 if ( flags
& wxACCEL_SHIFT
)
979 msg
<< wxT("Shift-");
981 int code
= accel
->GetKeyCode();
996 msg
<< wxT('F') << code
- WXK_F1
+ 1;
999 // if there are any other keys wxGetAccelFromString() may return,
1000 // we should process them here
1003 if ( wxIsalnum(code
) )
1005 msg
<< (wxChar
)code
;
1010 wxFAIL_MSG( wxT("unknown keyboard accel") );
1017 msg
<< wxT("It doesn't have an accelerator");
1019 #endif // wxUSE_ACCEL
1026 void MyFrame::OnFindMenuItem(wxCommandEvent
& WXUNUSED(event
))
1028 wxMenuBar
*mbar
= GetMenuBar();
1029 size_t count
= mbar
->GetMenuCount();
1031 wxCHECK_RET( count
, wxT("no last menu?") );
1033 wxString label
= wxGetTextFromUser
1035 wxT("Enter label to search for: "),
1036 wxT("Find menu item"),
1041 if ( !label
.empty() )
1044 int index
= wxNOT_FOUND
;
1046 for (menuindex
= 0; (menuindex
< count
) && (index
== wxNOT_FOUND
); ++menuindex
)
1048 index
= mbar
->FindMenuItem(mbar
->GetMenu(menuindex
)->GetTitle(), label
);
1050 if (index
== wxNOT_FOUND
)
1052 wxLogWarning(wxT("No menu item with label '%s'"), label
.c_str());
1056 wxLogMessage(wxT("Menu item %d in menu %lu has label '%s'"),
1057 index
, (unsigned long)menuindex
, label
.c_str());
1063 void MyFrame::ShowContextMenu(const wxPoint
& pos
)
1067 if ( wxGetKeyState(WXK_SHIFT
) )
1069 // when Shift is pressed, demonstrate the use of a simple function
1070 // returning the id of the item selected in the popup menu
1071 menu
.SetTitle("Choose one of:");
1072 static const char *choices
[] = { "Apple", "Banana", "Cherry" };
1073 for ( size_t n
= 0; n
< WXSIZEOF(choices
); n
++ )
1074 menu
.Append(Menu_PopupChoice
+ n
, choices
[n
]);
1076 const int rc
= GetPopupMenuSelectionFromUser(menu
, pos
);
1077 if ( rc
== wxID_NONE
)
1079 wxLogMessage("No selection");
1083 wxLogMessage("You have selected \"%s\"",
1084 choices
[rc
- Menu_PopupChoice
]);
1087 else // normal case, shift not pressed
1089 menu
.Append(Menu_Help_About
, wxT("&About"));
1090 menu
.Append(Menu_Popup_Submenu
, wxT("&Submenu"), CreateDummyMenu(NULL
));
1091 menu
.Append(Menu_Popup_ToBeDeleted
, wxT("To be &deleted"));
1092 menu
.AppendCheckItem(Menu_Popup_ToBeChecked
, wxT("To be &checked"));
1093 menu
.Append(Menu_Popup_ToBeGreyed
, wxT("To be &greyed"),
1094 wxT("This menu item should be initially greyed out"));
1095 menu
.AppendSeparator();
1096 menu
.Append(Menu_File_Quit
, wxT("E&xit"));
1098 menu
.Delete(Menu_Popup_ToBeDeleted
);
1099 menu
.Check(Menu_Popup_ToBeChecked
, true);
1100 menu
.Enable(Menu_Popup_ToBeGreyed
, false);
1102 PopupMenu(&menu
, pos
);
1104 // test for destroying items in popup menus
1105 #if 0 // doesn't work in wxGTK!
1106 menu
.Destroy(Menu_Popup_Submenu
);
1108 PopupMenu( &menu
, event
.GetX(), event
.GetY() );
1113 void MyFrame::OnTestNormal(wxCommandEvent
& WXUNUSED(event
))
1115 wxLogMessage(wxT("Normal item selected"));
1118 void MyFrame::OnTestCheck(wxCommandEvent
& event
)
1120 wxLogMessage(wxT("Check item %schecked"),
1121 event
.IsChecked() ? wxT("") : wxT("un"));
1124 void MyFrame::OnTestRadio(wxCommandEvent
& event
)
1126 wxLogMessage(wxT("Radio item %d selected"),
1127 event
.GetId() - Menu_Test_Radio1
+ 1);
1131 void MyFrame::LogMenuOpenOrClose(const wxMenuEvent
& event
, const wxChar
*what
)
1135 << ( event
.IsPopup() ? wxT("popup ") : wxT("") )
1136 << wxT("menu has been ")
1140 wxLogStatus(this, msg
.c_str());
1144 void MyFrame::OnUpdateSubMenuNormal(wxUpdateUIEvent
& event
)
1146 event
.Enable(false);
1149 void MyFrame::OnUpdateSubMenuCheck(wxUpdateUIEvent
& event
)
1154 void MyFrame::OnUpdateSubMenuRadio(wxUpdateUIEvent
& event
)
1156 int which
= (event
.GetId() - Menu_SubMenu_Radio1
+ 1);
1163 #if USE_CONTEXT_MENU
1164 void MyFrame::OnContextMenu(wxContextMenuEvent
& event
)
1166 wxPoint point
= event
.GetPosition();
1168 if (point
.x
== -1 && point
.y
== -1) {
1169 wxSize size
= GetSize();
1170 point
.x
= size
.x
/ 2;
1171 point
.y
= size
.y
/ 2;
1173 point
= ScreenToClient(point
);
1175 ShowContextMenu(point
);
1179 void MyFrame::OnSize(wxSizeEvent
& WXUNUSED(event
))
1185 // leave a band below for popup menu testing
1186 wxSize size
= GetClientSize();
1187 m_textctrl
->SetSize(0, 0, size
.x
, (3*size
.y
)/4);
1190 // this is really ugly but we have to do it as we can't just call
1191 // event.Skip() because wxFrameBase would make the text control fill the
1192 // entire frame then
1193 #ifdef __WXUNIVERSAL__
1195 #endif // __WXUNIVERSAL__