From: David Elliott Date: Tue, 2 Mar 2004 13:58:54 +0000 (+0000) Subject: Implement wxMenuItemAction and validateMenuItem delegate virtuals X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/205fef01e0fe2d7d277111bb1d7267d7d4900056?ds=inline Implement wxMenuItemAction and validateMenuItem delegate virtuals git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26028 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/cocoa/frame.h b/include/wx/cocoa/frame.h index d5aa49436c..5c479efc91 100644 --- a/include/wx/cocoa/frame.h +++ b/include/wx/cocoa/frame.h @@ -58,6 +58,9 @@ public: // Helper function to position status/tool bars // Also called by native toolbar to force a size update void UpdateFrameNSView(); + + virtual void CocoaDelegate_wxMenuItemAction(WX_NSMenuItem menuItem); + virtual bool CocoaDelegate_validateMenuItem(WX_NSMenuItem menuItem); protected: virtual void CocoaSetWxWindowSize(int width, int height); diff --git a/src/cocoa/frame.mm b/src/cocoa/frame.mm index 7ed2c50c8f..9277c357f6 100644 --- a/src/cocoa/frame.mm +++ b/src/cocoa/frame.mm @@ -25,6 +25,7 @@ #import #import #import +#import // wxFrame @@ -56,6 +57,8 @@ wxFrame::~wxFrame() [m_frameNSView release]; } +// ------------------------------------------------------------------- +// Menubar void wxFrame::AttachMenuBar(wxMenuBar *mbar) { wxFrameBase::AttachMenuBar(mbar); @@ -88,6 +91,45 @@ wxMenuBar* wxFrame::GetAppMenuBar(wxCocoaNSWindow *win) return wxFrameBase::GetAppMenuBar(win); } +void wxFrame::CocoaDelegate_wxMenuItemAction(WX_NSMenuItem menuItem) +{ + wxLogTrace(wxTRACE_COCOA,wxT("wxFrame::wxMenuItemAction")); + wxMenuItem *item = wxMenuItem::GetFromCocoa(menuItem); + wxCHECK_RET(item,wxT("wxMenuItemAction received but no wxMenuItem exists!")); + + wxMenu *menu = item->GetMenu(); + wxCHECK_RET(menu,wxT("wxMenuItemAction received but wxMenuItem is not in a wxMenu!")); + + // Since we're handling the delegate messages there's a very good chance + // we'll receive a menu action from an item with a nil target. + wxMenuBar *menubar = menu->GetMenuBar(); + if(menubar) + { + wxFrame *frame = menubar->GetFrame(); + wxASSERT_MSG(frame==this, wxT("Received wxMenuItemAction in NSWindow delegate from a menu item attached to a different frame.")); + frame->ProcessCommand(item->GetId()); + } + else + wxLogDebug(wxT("Received wxMenuItemAction in NSWindow delegate from an unknown menu item.")); +} + +bool wxFrame::CocoaDelegate_validateMenuItem(WX_NSMenuItem menuItem) +{ + SEL itemAction = [menuItem action]; + if(itemAction == @selector(wxMenuItemAction:)) + { + wxMenuItem *item = wxMenuItem::GetFromCocoa(menuItem); + wxCHECK_MSG(item,false,wxT("validateMenuItem received but no wxMenuItem exists!")); + // TODO: do more sanity checking + return item->IsEnabled(); + } + // TODO: else if cut/copy/paste + wxLogDebug(wxT("Asked to validate an unknown menu item")); + return false; +} + +// ------------------------------------------------------------------- +// Origin/Size wxPoint wxFrame::GetClientAreaOrigin() const { return wxPoint(0,0); @@ -104,6 +146,7 @@ void wxFrame::CocoaSetWxWindowSize(int width, int height) wxTopLevelWindow::CocoaSetWxWindowSize(width,height); } +// ------------------------------------------------------------------- WX_NSView wxFrame::GetNonClientNSView() { if(m_frameNSView)