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 
  62 // ---------------------------------------------------------------------------- 
  64 // ---------------------------------------------------------------------------- 
  66 // Define a new application 
  67 class MyApp
: public wxApp
 
  74 class MyFrame
: public wxFrame
 
  81     void LogMenuEvent(const wxCommandEvent
& event
); 
  84     void OnQuit(wxCommandEvent
& event
); 
  86     void OnClearLog(wxCommandEvent
& event
); 
  89     void OnAbout(wxCommandEvent
& event
); 
  91     void OnDummy(wxCommandEvent
& event
); 
  93     void OnAppendMenuItem(wxCommandEvent
& event
); 
  94     void OnAppendSubMenu(wxCommandEvent
& event
); 
  95     void OnDeleteMenuItem(wxCommandEvent
& event
); 
  96     void OnInsertMenuItem(wxCommandEvent
& event
); 
  97     void OnCheckMenuItem(wxCommandEvent
& event
); 
  98     void OnEnableMenuItem(wxCommandEvent
& event
); 
  99     void OnGetLabelMenuItem(wxCommandEvent
& event
); 
 101     void OnSetLabelMenuItem(wxCommandEvent
& event
); 
 103     void OnGetMenuItemInfo(wxCommandEvent
& event
); 
 105     void OnFindMenuItem(wxCommandEvent
& event
); 
 108     void OnAppendMenu(wxCommandEvent
& event
); 
 109     void OnInsertMenu(wxCommandEvent
& event
); 
 110     void OnDeleteMenu(wxCommandEvent
& event
); 
 111     void OnToggleMenu(wxCommandEvent
& event
); 
 112     void OnEnableMenu(wxCommandEvent
& event
); 
 113     void OnGetLabelMenu(wxCommandEvent
& event
); 
 114     void OnSetLabelMenu(wxCommandEvent
& event
); 
 116     void OnFindMenu(wxCommandEvent
& event
); 
 119     void OnTestNormal(wxCommandEvent
& event
); 
 120     void OnTestCheck(wxCommandEvent
& event
); 
 121     void OnTestRadio(wxCommandEvent
& event
); 
 123     void OnUpdateSubMenuNormal(wxUpdateUIEvent
& event
); 
 124     void OnUpdateSubMenuCheck(wxUpdateUIEvent
& event
); 
 125     void OnUpdateSubMenuRadio(wxUpdateUIEvent
& event
); 
 128     void OnContextMenu(wxContextMenuEvent
& event
); 
 130     void OnRightUp(wxMouseEvent
& event
) 
 131         { ShowContextMenu(event
.GetPosition()); } 
 134     void OnMenuOpen(wxMenuEvent
& event
) 
 137             LogMenuOpenOrClose(event
, _T("opened")); event
.Skip(); 
 140     void OnMenuClose(wxMenuEvent
& event
) 
 143           LogMenuOpenOrClose(event
, _T("closed")); event
.Skip(); 
 147     void OnUpdateCheckMenuItemUI(wxUpdateUIEvent
& event
); 
 149     void OnSize(wxSizeEvent
& event
); 
 152     void LogMenuOpenOrClose(const wxMenuEvent
& event
, const wxChar 
*what
); 
 153     void ShowContextMenu(const wxPoint
& pos
); 
 155     wxMenu 
*CreateDummyMenu(wxString 
*title
); 
 157     wxMenuItem 
*GetLastMenuItem() const; 
 159     // the menu previously detached from the menubar (may be NULL) 
 162     // the count of dummy menus already created 
 166     // the control used for logging 
 167     wxTextCtrl 
*m_textctrl
; 
 170     // the previous log target 
 173     DECLARE_EVENT_TABLE() 
 176 // A small helper class which intercepts all menu events and logs them 
 177 class MyEvtHandler 
: public wxEvtHandler
 
 180     MyEvtHandler(MyFrame 
*frame
) { m_frame 
= frame
; } 
 182     void OnMenuEvent(wxCommandEvent
& event
) 
 184         m_frame
->LogMenuEvent(event
); 
 192     DECLARE_EVENT_TABLE() 
 195 // ---------------------------------------------------------------------------- 
 197 // ---------------------------------------------------------------------------- 
 201     Menu_File_Quit 
= wxID_EXIT
, 
 206     Menu_MenuBar_Toggle 
= 200, 
 211     Menu_MenuBar_GetLabel
, 
 213     Menu_MenuBar_SetLabel
, 
 214     Menu_MenuBar_FindMenu
, 
 217     Menu_Menu_Append 
= 300, 
 232     Menu_Test_Normal 
= 400, 
 245     Menu_Dummy_First 
= 500, 
 251     Menu_Help_About 
= wxID_ABOUT
, 
 253     Menu_Popup_ToBeDeleted 
= 2000, 
 254     Menu_Popup_ToBeGreyed
, 
 255     Menu_Popup_ToBeChecked
, 
 261 // ---------------------------------------------------------------------------- 
 263 // ---------------------------------------------------------------------------- 
 265 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
) 
 266     EVT_MENU(Menu_File_Quit
,     MyFrame::OnQuit
) 
 268     EVT_MENU(Menu_File_ClearLog
, MyFrame::OnClearLog
) 
 271     EVT_MENU(Menu_Help_About
, MyFrame::OnAbout
) 
 273     EVT_MENU(Menu_MenuBar_Toggle
,   MyFrame::OnToggleMenu
) 
 274     EVT_MENU(Menu_MenuBar_Append
,   MyFrame::OnAppendMenu
) 
 275     EVT_MENU(Menu_MenuBar_Insert
,   MyFrame::OnInsertMenu
) 
 276     EVT_MENU(Menu_MenuBar_Delete
,   MyFrame::OnDeleteMenu
) 
 277     EVT_MENU(Menu_MenuBar_Enable
,   MyFrame::OnEnableMenu
) 
 278     EVT_MENU(Menu_MenuBar_GetLabel
, MyFrame::OnGetLabelMenu
) 
 280     EVT_MENU(Menu_MenuBar_SetLabel
, MyFrame::OnSetLabelMenu
) 
 281     EVT_MENU(Menu_MenuBar_FindMenu
, MyFrame::OnFindMenu
) 
 284     EVT_MENU(Menu_Menu_Append
,    MyFrame::OnAppendMenuItem
) 
 285     EVT_MENU(Menu_Menu_AppendSub
, MyFrame::OnAppendSubMenu
) 
 286     EVT_MENU(Menu_Menu_Insert
,    MyFrame::OnInsertMenuItem
) 
 287     EVT_MENU(Menu_Menu_Delete
,    MyFrame::OnDeleteMenuItem
) 
 288     EVT_MENU(Menu_Menu_Enable
,    MyFrame::OnEnableMenuItem
) 
 289     EVT_MENU(Menu_Menu_Check
,     MyFrame::OnCheckMenuItem
) 
 290     EVT_MENU(Menu_Menu_GetLabel
,  MyFrame::OnGetLabelMenuItem
) 
 292     EVT_MENU(Menu_Menu_SetLabel
,  MyFrame::OnSetLabelMenuItem
) 
 294     EVT_MENU(Menu_Menu_GetInfo
,   MyFrame::OnGetMenuItemInfo
) 
 296     EVT_MENU(Menu_Menu_FindItem
,  MyFrame::OnFindMenuItem
) 
 299     EVT_MENU(Menu_Test_Normal
,    MyFrame::OnTestNormal
) 
 300     EVT_MENU(Menu_Test_Check
,     MyFrame::OnTestCheck
) 
 301     EVT_MENU(Menu_Test_Radio1
,    MyFrame::OnTestRadio
) 
 302     EVT_MENU(Menu_Test_Radio2
,    MyFrame::OnTestRadio
) 
 303     EVT_MENU(Menu_Test_Radio3
,    MyFrame::OnTestRadio
) 
 305     EVT_UPDATE_UI(Menu_SubMenu_Normal
,    MyFrame::OnUpdateSubMenuNormal
) 
 306     EVT_UPDATE_UI(Menu_SubMenu_Check
,     MyFrame::OnUpdateSubMenuCheck
) 
 307     EVT_UPDATE_UI(Menu_SubMenu_Radio1
,    MyFrame::OnUpdateSubMenuRadio
) 
 308     EVT_UPDATE_UI(Menu_SubMenu_Radio2
,    MyFrame::OnUpdateSubMenuRadio
) 
 309     EVT_UPDATE_UI(Menu_SubMenu_Radio3
,    MyFrame::OnUpdateSubMenuRadio
) 
 311     EVT_MENU_RANGE(Menu_Dummy_First
, Menu_Dummy_Last
, MyFrame::OnDummy
) 
 313     EVT_UPDATE_UI(Menu_Menu_Check
, MyFrame::OnUpdateCheckMenuItemUI
) 
 316     EVT_CONTEXT_MENU(MyFrame::OnContextMenu
) 
 318     EVT_RIGHT_UP(MyFrame::OnRightUp
) 
 321     EVT_MENU_OPEN(MyFrame::OnMenuOpen
) 
 322     EVT_MENU_CLOSE(MyFrame::OnMenuClose
) 
 324     EVT_SIZE(MyFrame::OnSize
) 
 327 BEGIN_EVENT_TABLE(MyEvtHandler
, wxEvtHandler
) 
 328     EVT_MENU(wxID_ANY
, MyEvtHandler::OnMenuEvent
) 
 331 // ============================================================================ 
 333 // ============================================================================ 
 335 // ---------------------------------------------------------------------------- 
 337 // ---------------------------------------------------------------------------- 
 341 // The `main program' equivalent, creating the windows and returning the 
 345     // Create the main frame window 
 346     MyFrame
* frame 
= new MyFrame
; 
 351     frame
->SetStatusText(_T("Welcome to wxWidgets menu sample")); 
 352 #endif // wxUSE_STATUSBAR 
 359 // ---------------------------------------------------------------------------- 
 361 // ---------------------------------------------------------------------------- 
 363 // Define my frame constructor 
 365        : wxFrame((wxFrame 
*)NULL
, wxID_ANY
, _T("wxWidgets menu sample")) 
 376 #endif // wxUSE_STATUSBAR 
 378     // create the menubar 
 379     wxMenu 
*fileMenu 
= new wxMenu
; 
 382     wxMenuItem 
*item 
= new wxMenuItem(fileMenu
, Menu_File_ClearLog
, 
 383                                       _T("Clear &log\tCtrl-L")); 
 384 #if wxUSE_OWNER_DRAWN 
 385     item
->SetBitmap(copy_xpm
); 
 387     fileMenu
->Append(item
); 
 388     fileMenu
->AppendSeparator(); 
 390     fileMenu
->Append(Menu_File_Quit
, _T("E&xit\tAlt-X"), _T("Quit menu sample")); 
 392     wxMenu 
*menubarMenu 
= new wxMenu
; 
 393     menubarMenu
->Append(Menu_MenuBar_Append
, _T("&Append menu\tCtrl-A"), 
 394                         _T("Append a menu to the menubar")); 
 395     menubarMenu
->Append(Menu_MenuBar_Insert
, _T("&Insert menu\tCtrl-I"), 
 396                         _T("Insert a menu into the menubar")); 
 397     menubarMenu
->Append(Menu_MenuBar_Delete
, _T("&Delete menu\tCtrl-D"), 
 398                         _T("Delete the last menu from the menubar")); 
 399     menubarMenu
->Append(Menu_MenuBar_Toggle
, _T("&Toggle menu\tCtrl-T"), 
 400                         _T("Toggle the first menu in the menubar"), true); 
 401     menubarMenu
->AppendSeparator(); 
 402     menubarMenu
->Append(Menu_MenuBar_Enable
, _T("&Enable menu\tCtrl-E"), 
 403                         _T("Enable or disable the last menu"), true); 
 404     menubarMenu
->AppendSeparator(); 
 405     menubarMenu
->Append(Menu_MenuBar_GetLabel
, _T("&Get menu label\tCtrl-G"), 
 406                         _T("Get the label of the last menu")); 
 408     menubarMenu
->Append(Menu_MenuBar_SetLabel
, _T("&Set menu label\tCtrl-S"), 
 409                         _T("Change the label of the last menu")); 
 410     menubarMenu
->AppendSeparator(); 
 411     menubarMenu
->Append(Menu_MenuBar_FindMenu
, _T("&Find menu from label\tCtrl-F"), 
 412                         _T("Find a menu by searching for its label")); 
 415     wxMenu
* subMenu 
= new wxMenu
; 
 416     subMenu
->Append(Menu_SubMenu_Normal
, _T("&Normal submenu item"), _T("Disabled submenu item")); 
 417     subMenu
->AppendCheckItem(Menu_SubMenu_Check
, _T("&Unchecked submenu item"), _T("Unchecked submenu item")); 
 418     subMenu
->AppendRadioItem(Menu_SubMenu_Radio1
, _T("Radio item &1"), _T("Radio item")); 
 419     subMenu
->AppendRadioItem(Menu_SubMenu_Radio2
, _T("Radio item &2"), _T("Radio item")); 
 420     subMenu
->AppendRadioItem(Menu_SubMenu_Radio3
, _T("Radio item &3"), _T("Radio item")); 
 422     menubarMenu
->Append(Menu_SubMenu
, _T("Submenu"), subMenu
); 
 424     wxMenu 
*menuMenu 
= new wxMenu
; 
 425     menuMenu
->Append(Menu_Menu_Append
, _T("&Append menu item\tAlt-A"), 
 426                      _T("Append a menu item to the last menu")); 
 427     menuMenu
->Append(Menu_Menu_AppendSub
, _T("&Append sub menu\tAlt-S"), 
 428                      _T("Append a sub menu to the last menu")); 
 429     menuMenu
->Append(Menu_Menu_Insert
, _T("&Insert menu item\tAlt-I"), 
 430                      _T("Insert a menu item in head of the last menu")); 
 431     menuMenu
->Append(Menu_Menu_Delete
, _T("&Delete menu item\tAlt-D"), 
 432                      _T("Delete the last menu item from the last menu")); 
 433     menuMenu
->AppendSeparator(); 
 434     menuMenu
->Append(Menu_Menu_Enable
, _T("&Enable menu item\tAlt-E"), 
 435                      _T("Enable or disable the last menu item"), true); 
 436     menuMenu
->Append(Menu_Menu_Check
, _T("&Check menu item\tAlt-C"), 
 437                      _T("Check or uncheck the last menu item"), true); 
 438     menuMenu
->AppendSeparator(); 
 439     menuMenu
->Append(Menu_Menu_GetInfo
, _T("Get menu item in&fo\tAlt-F"), 
 440                      _T("Show the state of the last menu item")); 
 441     menuMenu
->Append(Menu_Menu_SetLabel
, _T("Set menu item label\tAlt-L"), 
 442                      _T("Set the label of a menu item")); 
 444     menuMenu
->AppendSeparator(); 
 445     menuMenu
->Append(Menu_Menu_FindItem
, _T("Find menu item from label"), 
 446                      _T("Find a menu item by searching for its label")); 
 449     wxMenu 
*testMenu 
= new wxMenu
; 
 450     testMenu
->Append(Menu_Test_Normal
, _T("&Normal item")); 
 451     testMenu
->AppendSeparator(); 
 452     testMenu
->AppendCheckItem(Menu_Test_Check
, _T("&Check item")); 
 453     testMenu
->AppendSeparator(); 
 454     testMenu
->AppendRadioItem(Menu_Test_Radio1
, _T("Radio item &1")); 
 455     testMenu
->AppendRadioItem(Menu_Test_Radio2
, _T("Radio item &2")); 
 456     testMenu
->AppendRadioItem(Menu_Test_Radio3
, _T("Radio item &3")); 
 458     wxMenu 
*helpMenu 
= new wxMenu
; 
 459     helpMenu
->Append(Menu_Help_About
, _T("&About\tF1"), _T("About menu sample")); 
 461     wxMenuBar
* menuBar 
= new wxMenuBar( wxMB_DOCKABLE 
); 
 463     menuBar
->Append(fileMenu
, _T("&File")); 
 464     menuBar
->Append(menubarMenu
, _T("Menu&bar")); 
 465     menuBar
->Append(menuMenu
, _T("&Menu")); 
 466     menuBar
->Append(testMenu
, _T("&Test")); 
 467     menuBar
->Append(helpMenu
, _T("&Help")); 
 469     // these items should be initially checked 
 470     menuBar
->Check(Menu_MenuBar_Toggle
, true); 
 471     menuBar
->Check(Menu_MenuBar_Enable
, true); 
 472     menuBar
->Check(Menu_Menu_Enable
, true); 
 473     menuBar
->Check(Menu_Menu_Check
, false); 
 475     // associate the menu bar with the frame 
 478     // intercept all menu events and log them in this custom event handler 
 479     PushEventHandler(new MyEvtHandler(this)); 
 482     // create the log text window 
 483     m_textctrl 
= new wxTextCtrl(this, wxID_ANY
, _T(""), 
 484                                 wxDefaultPosition
, wxDefaultSize
, 
 486     m_textctrl
->SetEditable(false); 
 488     wxLog::SetTimestamp(NULL
); 
 489     m_logOld 
= wxLog::SetActiveTarget(new wxLogTextCtrl(m_textctrl
)); 
 491     wxLogMessage(_T("Brief explanations: the commands or the \"Menu\" menu ") 
 492                  _T("append/insert/delete items to/from the last menu.\n") 
 493                  _T("The commands from \"Menubar\" menu work with the ") 
 494                  _T("menubar itself.\n\n") 
 495                  _T("Right click the band below to test popup menus.\n")); 
 503     // delete the event handler installed in ctor 
 504     PopEventHandler(true); 
 507     // restore old logger 
 508     delete wxLog::SetActiveTarget(m_logOld
); 
 512 wxMenu 
*MyFrame::CreateDummyMenu(wxString 
*title
) 
 514     wxMenu 
*menu 
= new wxMenu
; 
 515     menu
->Append(Menu_Dummy_First
, _T("&First item\tCtrl-F1")); 
 516     menu
->AppendSeparator(); 
 517     menu
->AppendCheckItem(Menu_Dummy_Second
, _T("&Second item\tCtrl-F2")); 
 521         title
->Printf(_T("Dummy menu &%u"), (unsigned)++m_countDummy
); 
 527 wxMenuItem 
*MyFrame::GetLastMenuItem() const 
 529     wxMenuBar 
*menubar 
= GetMenuBar(); 
 530     wxMenu 
*menu 
= menubar
->GetMenu(menubar
->GetMenuCount() - 1); 
 532     wxMenuItemList::compatibility_iterator node 
= menu
->GetMenuItems().GetLast(); 
 535         wxLogWarning(_T("No last item in the last menu!")); 
 541         return node
->GetData(); 
 545 void MyFrame::LogMenuEvent(const wxCommandEvent
& event
) 
 547     int id 
= event
.GetId(); 
 548     if ( !GetMenuBar()->FindItem(id
) ) 
 551     wxString msg 
= wxString::Format(_T("Menu command %d"), id
); 
 552     if ( GetMenuBar()->FindItem(id
)->IsCheckable() ) 
 554         msg 
+= wxString::Format(_T(" (the item is currently %schecked)"), 
 555                                 event
.IsChecked() ? _T("") : _T("not ")); 
 561 // ---------------------------------------------------------------------------- 
 563 // ---------------------------------------------------------------------------- 
 565 void MyFrame::OnQuit(wxCommandEvent
& WXUNUSED(event
)) 
 571 void MyFrame::OnClearLog(wxCommandEvent
& WXUNUSED(event
)) 
 577 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
)) 
 579     (void)wxMessageBox(_T("wxWidgets menu sample\n(c) 1999-2001 Vadim Zeitlin"), 
 580                        _T("About wxWidgets menu sample"), 
 584 void MyFrame::OnDeleteMenu(wxCommandEvent
& WXUNUSED(event
)) 
 586     wxMenuBar 
*mbar 
= GetMenuBar(); 
 588     size_t count 
= mbar
->GetMenuCount(); 
 591         // don't let delete the first 2 menus 
 592         wxLogError(_T("Can't delete any more menus")); 
 596         delete mbar
->Remove(count 
- 1); 
 600 void MyFrame::OnInsertMenu(wxCommandEvent
& WXUNUSED(event
)) 
 603     wxMenu 
*menu 
= CreateDummyMenu(&title
); 
 604     GetMenuBar()->Insert(0, menu
, title
); 
 607 void MyFrame::OnAppendMenu(wxCommandEvent
& WXUNUSED(event
)) 
 610     wxMenu 
*menu 
= CreateDummyMenu(&title
); 
 611     GetMenuBar()->Append(menu
, title
); 
 614 void MyFrame::OnToggleMenu(wxCommandEvent
& WXUNUSED(event
)) 
 616     wxMenuBar 
*mbar 
= GetMenuBar(); 
 620         m_menu 
= mbar
->Remove(0); 
 625         mbar
->Insert(0, m_menu
, _T("&File")); 
 630 void MyFrame::OnEnableMenu(wxCommandEvent
& event
) 
 632     wxMenuBar 
*mbar 
= GetMenuBar(); 
 633     size_t count 
= mbar
->GetMenuCount(); 
 635     mbar
->EnableTop(count 
- 1, event
.IsChecked()); 
 638 void MyFrame::OnGetLabelMenu(wxCommandEvent
& WXUNUSED(event
)) 
 640     wxMenuBar 
*mbar 
= GetMenuBar(); 
 641     size_t count 
= mbar
->GetMenuCount(); 
 643     wxCHECK_RET( count
, _T("no last menu?") ); 
 645     wxLogMessage(_T("The label of the last menu item is '%s'"), 
 646                  mbar
->GetLabelTop(count 
- 1).c_str()); 
 650 void MyFrame::OnSetLabelMenu(wxCommandEvent
& WXUNUSED(event
)) 
 652     wxMenuBar 
*mbar 
= GetMenuBar(); 
 653     size_t count 
= mbar
->GetMenuCount(); 
 655     wxCHECK_RET( count
, _T("no last menu?") ); 
 657     wxString label 
= wxGetTextFromUser
 
 659                         _T("Enter new label: "), 
 660                         _T("Change last menu text"), 
 661                         mbar
->GetLabelTop(count 
- 1), 
 665     if ( !label
.empty() ) 
 667         mbar
->SetLabelTop(count 
- 1, label
); 
 671 void MyFrame::OnFindMenu(wxCommandEvent
& WXUNUSED(event
)) 
 673     wxMenuBar 
*mbar 
= GetMenuBar(); 
 674     size_t count 
= mbar
->GetMenuCount(); 
 676     wxCHECK_RET( count
, _T("no last menu?") ); 
 678     wxString label 
= wxGetTextFromUser
 
 680                         _T("Enter label to search for: "), 
 686     if ( !label
.empty() ) 
 688         int index 
= mbar
->FindMenu(label
); 
 690         if (index 
== wxNOT_FOUND
) 
 692             wxLogWarning(_T("No menu with label '%s'"), label
.c_str()); 
 696             wxLogMessage(_T("Menu %d has label '%s'"), index
, label
.c_str()); 
 702 void MyFrame::OnDummy(wxCommandEvent
& event
) 
 704     wxLogMessage(_T("Dummy item #%d"), event
.GetId() - Menu_Dummy_First 
+ 1); 
 707 void MyFrame::OnAppendMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 709     wxMenuBar 
*menubar 
= GetMenuBar(); 
 710     wxMenu 
*menu 
= menubar
->GetMenu(menubar
->GetMenuCount() - 1); 
 712     menu
->AppendSeparator(); 
 713     menu
->Append(Menu_Dummy_Third
, _T("&Third dummy item\tCtrl-F3"), 
 714                  _T("Checkable item"), true); 
 717 void MyFrame::OnAppendSubMenu(wxCommandEvent
& WXUNUSED(event
)) 
 719     wxMenuBar 
*menubar 
= GetMenuBar(); 
 721     wxMenu 
*menu 
= menubar
->GetMenu(menubar
->GetMenuCount() - 2); 
 723     menu
->Append(Menu_Dummy_Last
, _T("&Dummy sub menu"), 
 724                  CreateDummyMenu(NULL
), _T("Dummy sub menu help")); 
 727 void MyFrame::OnDeleteMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 729     wxMenuBar 
*menubar 
= GetMenuBar(); 
 730     wxMenu 
*menu 
= menubar
->GetMenu(menubar
->GetMenuCount() - 1); 
 732     size_t count 
= menu
->GetMenuItemCount(); 
 735         wxLogWarning(_T("No items to delete!")); 
 739         menu
->Destroy(menu
->GetMenuItems().Item(count 
- 1)->GetData()); 
 743 void MyFrame::OnInsertMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 745     wxMenuBar 
*menubar 
= GetMenuBar(); 
 746     wxMenu 
*menu 
= menubar
->GetMenu(menubar
->GetMenuCount() - 1); 
 748     menu
->Insert(0, wxMenuItem::New(menu
, Menu_Dummy_Fourth
, 
 749                                     _T("Fourth dummy item\tCtrl-F4"))); 
 750     menu
->Insert(1, wxMenuItem::New(menu
, wxID_SEPARATOR
, _T(""))); 
 753 void MyFrame::OnEnableMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 755     wxMenuItem 
*item 
= GetLastMenuItem(); 
 759         item
->Enable(!item
->IsEnabled()); 
 763 void MyFrame::OnCheckMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 765     wxMenuItem 
*item 
= GetLastMenuItem(); 
 770 void MyFrame::OnUpdateCheckMenuItemUI(wxUpdateUIEvent
& event
) 
 774     wxMenuItem 
*item 
= GetLastMenuItem(); 
 776     event
.Enable(item 
&& item
->IsCheckable()); 
 779 void MyFrame::OnGetLabelMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 781     wxMenuItem 
*item 
= GetLastMenuItem(); 
 785         wxLogMessage(_T("The label of the last menu item is '%s'"), 
 786                      item
->GetLabel().c_str()); 
 791 void MyFrame::OnSetLabelMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 793     wxMenuItem 
*item 
= GetLastMenuItem(); 
 797         wxString label 
= wxGetTextFromUser
 
 799                             _T("Enter new label: "), 
 800                             _T("Change last menu item text"), 
 804         label
.Replace( _T("\\t"), _T("\t") ); 
 806         if ( !label
.empty() ) 
 808             item
->SetText(label
); 
 814 void MyFrame::OnGetMenuItemInfo(wxCommandEvent
& WXUNUSED(event
)) 
 816     wxMenuItem 
*item 
= GetLastMenuItem(); 
 821         msg 
<< _T("The item is ") << (item
->IsEnabled() ? _T("enabled") 
 825         if ( item
->IsCheckable() ) 
 827             msg 
<< _T("It is checkable and ") << (item
->IsChecked() ? _T("") : _T("un")) 
 832         wxAcceleratorEntry 
*accel 
= item
->GetAccel(); 
 835             msg 
<< _T("Its accelerator is "); 
 837             int flags 
= accel
->GetFlags(); 
 838             if ( flags 
& wxACCEL_ALT 
) 
 840             if ( flags 
& wxACCEL_CTRL 
) 
 842             if ( flags 
& wxACCEL_SHIFT 
) 
 845             int code 
= accel
->GetKeyCode(); 
 860                     msg 
<< _T('F') << code 
- WXK_F1 
+ 1; 
 863                 // if there are any other keys wxGetAccelFromString() may return, 
 864                 // we should process them here 
 867                     if ( wxIsalnum(code
) ) 
 874                     wxFAIL_MSG( _T("unknown keyboard accel") ); 
 881             msg 
<< _T("It doesn't have an accelerator"); 
 883 #endif // wxUSE_ACCEL 
 890 void MyFrame::OnFindMenuItem(wxCommandEvent
& WXUNUSED(event
)) 
 892     wxMenuBar 
*mbar 
= GetMenuBar(); 
 893     size_t count 
= mbar
->GetMenuCount(); 
 895     wxCHECK_RET( count
, _T("no last menu?") ); 
 897     wxString label 
= wxGetTextFromUser
 
 899                         _T("Enter label to search for: "), 
 900                         _T("Find menu item"), 
 905     if ( !label
.empty() ) 
 908         int index 
= wxNOT_FOUND
; 
 910         for (menuindex 
= 0; (menuindex 
< count
) && (index 
== wxNOT_FOUND
); ++menuindex
) 
 912             index 
= mbar
->FindMenuItem(mbar
->GetMenu(menuindex
)->GetTitle(), label
); 
 914         if (index 
== wxNOT_FOUND
) 
 916             wxLogWarning(_T("No menu item with label '%s'"), label
.c_str()); 
 920             wxLogMessage(_T("Menu item %d in menu %lu has label '%s'"), 
 921                          index
, (unsigned long)menuindex
, label
.c_str()); 
 927 void MyFrame::ShowContextMenu(const wxPoint
& pos
) 
 929     wxMenu 
menu(_T("Test popup")); 
 931     menu
.Append(Menu_Help_About
, _T("&About")); 
 932     menu
.Append(Menu_Popup_Submenu
, _T("&Submenu"), CreateDummyMenu(NULL
)); 
 933     menu
.Append(Menu_Popup_ToBeDeleted
, _T("To be &deleted")); 
 934     menu
.AppendCheckItem(Menu_Popup_ToBeChecked
, _T("To be &checked")); 
 935     menu
.Append(Menu_Popup_ToBeGreyed
, _T("To be &greyed"), 
 936                 _T("This menu item should be initially greyed out")); 
 937     menu
.AppendSeparator(); 
 938     menu
.Append(Menu_File_Quit
, _T("E&xit")); 
 940     menu
.Delete(Menu_Popup_ToBeDeleted
); 
 941     menu
.Check(Menu_Popup_ToBeChecked
, true); 
 942     menu
.Enable(Menu_Popup_ToBeGreyed
, false); 
 944     PopupMenu(&menu
, pos
.x
, pos
.y
); 
 946     // test for destroying items in popup menus 
 947 #if 0 // doesn't work in wxGTK! 
 948     menu
.Destroy(Menu_Popup_Submenu
); 
 950     PopupMenu( &menu
, event
.GetX(), event
.GetY() ); 
 954 void MyFrame::OnTestNormal(wxCommandEvent
& WXUNUSED(event
)) 
 956     wxLogMessage(_T("Normal item selected")); 
 959 void MyFrame::OnTestCheck(wxCommandEvent
& event
) 
 961     wxLogMessage(_T("Check item %schecked"), 
 962                  event
.IsChecked() ? _T("") : _T("un")); 
 965 void MyFrame::OnTestRadio(wxCommandEvent
& event
) 
 967     wxLogMessage(_T("Radio item %d selected"), 
 968                  event
.GetId() - Menu_Test_Radio1 
+ 1); 
 972 void MyFrame::LogMenuOpenOrClose(const wxMenuEvent
& event
, const wxChar 
*what
) 
 976         << ( event
.IsPopup() ? _T("popup ") : _T("") ) 
 977         << _T("menu has been ") 
 981     wxLogStatus(this, msg
.c_str()); 
 985 void MyFrame::OnUpdateSubMenuNormal(wxUpdateUIEvent
& event
) 
 990 void MyFrame::OnUpdateSubMenuCheck(wxUpdateUIEvent
& event
) 
 996 void MyFrame::OnUpdateSubMenuRadio(wxUpdateUIEvent
& event
) 
 998     int which 
= (event
.GetId() - Menu_SubMenu_Radio1 
+ 1); 
1005 #if USE_CONTEXT_MENU 
1006 void MyFrame::OnContextMenu(wxContextMenuEvent
& event
) 
1008     wxPoint point 
= event
.GetPosition(); 
1010     if (point
.x 
== -1 && point
.y 
== -1) { 
1011         wxSize size 
= GetSize(); 
1012         point
.x 
= size
.x 
/ 2; 
1013         point
.y 
= size
.y 
/ 2; 
1015         point 
= ScreenToClient(point
); 
1017     ShowContextMenu(point
); 
1021 void MyFrame::OnSize(wxSizeEvent
& WXUNUSED(event
)) 
1027     // leave a band below for popup menu testing 
1028     wxSize size 
= GetClientSize(); 
1029     m_textctrl
->SetSize(0, 0, size
.x
, (3*size
.y
)/4); 
1032     // this is really ugly but we have to do it as we can't just call 
1033     // event.Skip() because wxFrameBase would make the text control fill the 
1034     // entire frame then 
1035 #ifdef __WXUNIVERSAL__ 
1037 #endif // __WXUNIVERSAL__