X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/514e7b7bf83236b0af6286d6e1d3d75dce193d24..2b9a7d4cc2f5f55df3d83f7cf2160cf9a509a4f2:/src/cocoa/frame.mm diff --git a/src/cocoa/frame.mm b/src/cocoa/frame.mm index f74bbf4a0a..7c21de34f4 100644 --- a/src/cocoa/frame.mm +++ b/src/cocoa/frame.mm @@ -6,7 +6,7 @@ // Created: 2003/03/16 // RCS-ID: $Id: // Copyright: (c) 2003 David Elliott -// Licence: wxWindows license +// Licence: wxWidgets licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" @@ -25,6 +25,7 @@ #import #import #import +#import // wxFrame @@ -56,16 +57,18 @@ wxFrame::~wxFrame() [m_frameNSView release]; } +// ------------------------------------------------------------------- +// Menubar void wxFrame::AttachMenuBar(wxMenuBar *mbar) { wxFrameBase::AttachMenuBar(mbar); - wxMenuBarManager::GetInstance()->UpdateWindowMenuBar(this); + wxMenuBarManager::GetInstance()->UpdateMenuBar(); } void wxFrame::DetachMenuBar() { wxFrameBase::DetachMenuBar(); - wxMenuBarManager::GetInstance()->UpdateWindowMenuBar(this); + wxMenuBarManager::GetInstance()->UpdateMenuBar(); } void wxFrame::SetMenuBar(wxMenuBar *menubar) @@ -78,9 +81,55 @@ void wxFrame::SetMenuBar(wxMenuBar *menubar) wxFrameBase::DetachMenuBar(); wxFrameBase::AttachMenuBar(menubar); - wxMenuBarManager::GetInstance()->UpdateWindowMenuBar(this); + wxMenuBarManager::GetInstance()->UpdateMenuBar(); } +wxMenuBar* wxFrame::GetAppMenuBar(wxCocoaNSWindow *win) +{ + if(GetMenuBar()) + return GetMenuBar(); + 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); @@ -97,6 +146,7 @@ void wxFrame::CocoaSetWxWindowSize(int width, int height) wxTopLevelWindow::CocoaSetWxWindowSize(width,height); } +// ------------------------------------------------------------------- WX_NSView wxFrame::GetNonClientNSView() { if(m_frameNSView) @@ -131,6 +181,8 @@ void wxFrame::UpdateFrameNSView() NSView *tbarNSView = m_frameToolBar->GetNSViewForSuperview(); if(![tbarNSView superview]) [m_frameNSView addSubview: tbarNSView]; + // Do this after addSubView so that SetSize can work + m_frameToolBar->SetSize(m_frameToolBar->DoGetBestSize()); NSRect tbarRect = [tbarNSView frame]; tbarRect.size.width = frameRect.size.width; tbarRect.origin.x = 0.0; @@ -156,7 +208,7 @@ void wxFrame::UpdateFrameNSView() [sbarNSView setAutoresizingMask: NSViewWidthSizable|NSViewMaxYMargin]; sbarheight = sbarRect.size.height; } - wxLogDebug("frame height=%f, tbar=%f, sbar=%f",frameRect.size.height,tbarheight,sbarheight); + wxLogTrace(wxTRACE_COCOA,wxT("frame height=%f, tbar=%f, sbar=%f"),frameRect.size.height,tbarheight,sbarheight); NSRect innerRect = [m_cocoaNSView frame]; innerRect.size.height = frameRect.size.height - tbarheight - sbarheight; innerRect.origin.y = sbarheight; @@ -191,6 +243,7 @@ wxStatusBar* wxFrame::CreateStatusBar(int number, wxWindowID winid, const wxString& name) { + wxAutoNSAutoreleasePool pool; wxFrameBase::CreateStatusBar(number,style,winid,name); if(m_frameStatusBar) { @@ -205,6 +258,7 @@ void wxFrame::SetToolBar(wxToolBar *toolbar) { if(m_frameToolBar) { + m_frameToolBar->SetOwningFrame(NULL); [m_frameToolBar->GetNSViewForSuperview() removeFromSuperview]; [m_frameToolBar->GetNSViewForSuperview() setAutoresizingMask: NSViewMinYMargin]; if(m_frameToolBar->GetParent()) @@ -214,6 +268,7 @@ void wxFrame::SetToolBar(wxToolBar *toolbar) if(m_frameToolBar) { m_frameToolBar->CocoaRemoveFromParent(); + m_frameToolBar->SetOwningFrame(this); } UpdateFrameNSView(); } @@ -222,10 +277,12 @@ wxToolBar* wxFrame::CreateToolBar(long style, wxWindowID winid, const wxString& name) { + wxAutoNSAutoreleasePool pool; wxFrameBase::CreateToolBar(style,winid,name); if(m_frameToolBar) { m_frameToolBar->CocoaRemoveFromParent(); + m_frameToolBar->SetOwningFrame(this); } UpdateFrameNSView(); return m_frameToolBar;