X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f03ec224dcde69ee0b30f5baecc4b5e5466b02c1..191ebf4d459ca672c8d7678293c0ab3b05ba95d2:/samples/menu/menu.cpp diff --git a/samples/menu/menu.cpp b/samples/menu/menu.cpp index 26cb1baeac..3346cf7424 100644 --- a/samples/menu/menu.cpp +++ b/samples/menu/menu.cpp @@ -26,10 +26,11 @@ #ifndef WX_PRECOMP #include - #include #endif +#include "copy.xpm" + // ---------------------------------------------------------------------------- // classes // ---------------------------------------------------------------------------- @@ -47,7 +48,9 @@ class MyFrame: public wxFrame public: MyFrame(); - virtual ~MyFrame() { delete m_menu; } + virtual ~MyFrame(); + + void LogMenuEvent(const wxCommandEvent& event); void OnQuit(wxCommandEvent& event); void OnAbout(wxCommandEvent& event); @@ -88,6 +91,25 @@ private: DECLARE_EVENT_TABLE() }; +// A small helper class which intercepts all menu events and logs them +class MyEvtHandler : public wxEvtHandler +{ +public: + MyEvtHandler(MyFrame *frame) { m_frame = frame; } + + void OnMenuEvent(wxCommandEvent& event) + { + m_frame->LogMenuEvent(event); + + event.Skip(); + } + +private: + MyFrame *m_frame; + + DECLARE_EVENT_TABLE() +}; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -164,6 +186,10 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_RIGHT_DOWN(MyFrame::OnRightDown) END_EVENT_TABLE() +BEGIN_EVENT_TABLE(MyEvtHandler, wxEvtHandler) + EVT_MENU(-1, MyEvtHandler::OnMenuEvent) +END_EVENT_TABLE() + // ============================================================================ // implementation // ============================================================================ @@ -202,11 +228,15 @@ MyFrame::MyFrame() m_menu = NULL; m_countDummy = 0; - CreateStatusBar(); + CreateStatusBar(2); // create the menubar wxMenu *fileMenu = new wxMenu; fileMenu->Append(Menu_File_Quit, "E&xit\tAlt-X", "Quit toolbar sample" ); + + wxMenuItem *bitmap_menu_item = new wxMenuItem( fileMenu, Menu_File_Quit, "Quit with &bitmap" ); + bitmap_menu_item->SetBitmap( wxBitmap( copy_xpm ) ); + fileMenu->Append( bitmap_menu_item ); wxMenu *menubarMenu = new wxMenu; menubarMenu->Append(Menu_MenuBar_Append, "&Append menu\tCtrl-A", @@ -267,6 +297,17 @@ MyFrame::MyFrame() // associate the menu bar with the frame SetMenuBar(menuBar); + + // intercept all menu events and log them in this custom event handler + PushEventHandler(new MyEvtHandler(this)); +} + +MyFrame::~MyFrame() +{ + delete m_menu; + + // delete the event handler installed in ctor + PopEventHandler(TRUE); } wxMenu *MyFrame::CreateDummyMenu(wxString *title) @@ -302,6 +343,23 @@ wxMenuItem *MyFrame::GetLastMenuItem() const } } +void MyFrame::LogMenuEvent(const wxCommandEvent& event) +{ + int id = event.GetId(); + wxString msg = wxString::Format("Menu command %d", id); + if ( GetMenuBar()->FindItem(id)->IsCheckable() ) + { + msg += wxString::Format(" (the item is currently %schecked)", + event.IsChecked() ? "" : "not "); + } + + SetStatusText(msg, 1); +} + +// ---------------------------------------------------------------------------- +// menu callbacks +// ---------------------------------------------------------------------------- + void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(TRUE); @@ -408,11 +466,11 @@ void MyFrame::OnAppendMenuItem(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnAppendSubMenu(wxCommandEvent& WXUNUSED(event)) { wxMenuBar *menubar = GetMenuBar(); - + wxMenu *menu = menubar->GetMenu(menubar->GetMenuCount() - 1); - - menu->Append(Menu_Dummy_Last, "Dummy sub menu\tCtrl-F2", - CreateDummyMenu(NULL)); + + menu->Append(Menu_Dummy_Last, "Dummy sub menu", + CreateDummyMenu(NULL), "Dummy sub menu help"); } void MyFrame::OnDeleteMenuItem(wxCommandEvent& WXUNUSED(event)) @@ -460,6 +518,8 @@ void MyFrame::OnCheckMenuItem(wxCommandEvent& WXUNUSED(event)) void MyFrame::OnUpdateCheckMenuItemUI(wxUpdateUIEvent& event) { + wxLogNull nolog; + wxMenuItem *item = GetLastMenuItem(); event.Enable(item && item->IsCheckable()); @@ -496,7 +556,7 @@ void MyFrame::OnGetMenuItemInfo(wxCommandEvent& WXUNUSED(event)) msg << "The item is " << (item->IsEnabled() ? "enabled" : "disabled") << '\n'; - + if ( item->IsCheckable() ) { msg << "It is checkable and " << (item->IsChecked() ? "" : "un") @@ -573,9 +633,16 @@ void MyFrame::OnRightDown(wxMouseEvent &event ) menu.AppendSeparator(); menu.Append(Menu_File_Quit, "E&xit"); - //menu.Delete(Menu_Popup_ToBeDeleted); + menu.Delete(Menu_Popup_ToBeDeleted); menu.Check(Menu_Popup_ToBeChecked, TRUE); menu.Enable(Menu_Popup_ToBeGreyed, FALSE); PopupMenu( &menu, event.GetX(), event.GetY() ); + + // test for destroying items in popup menus +#if 0 + menu.Destroy(Menu_Popup_Submenu); + + PopupMenu( &menu, event.GetX(), event.GetY() ); +#endif // 0 }