diff --git a/include/wx/osx/app.h b/include/wx/osx/app.h index cbd13b41a6e1..a16b112f1f32 100644 --- a/include/wx/osx/app.h +++ b/include/wx/osx/app.h @@ -109,6 +109,7 @@ class WXDLLIMPEXP_CORE wxApp: public wxAppBase static long s_macPreferencesMenuItemId ; static long s_macExitMenuItemId ; static wxString s_macHelpMenuTitleName ; + static wxString s_macWindowMenuTitleName ; WXEVENTREF MacGetCurrentEvent() { return m_macCurrentEvent ; } diff --git a/src/osx/carbon/app.cpp b/src/osx/carbon/app.cpp index fec23b953301..52be0397ec26 100644 --- a/src/osx/carbon/app.cpp +++ b/src/osx/carbon/app.cpp @@ -68,6 +68,7 @@ long wxApp::s_macAboutMenuItemId = wxID_ABOUT ; long wxApp::s_macPreferencesMenuItemId = wxID_PREFERENCES ; long wxApp::s_macExitMenuItemId = wxID_EXIT ; wxString wxApp::s_macHelpMenuTitleName = wxT("&Help") ; +wxString wxApp::s_macWindowMenuTitleName = wxT("&Window") ; bool wxApp::sm_isEmbedded = false; // Normally we're not a plugin diff --git a/src/osx/cocoa/menu.mm b/src/osx/cocoa/menu.mm index edccdcdbb8c8..1629cbc27562 100644 --- a/src/osx/cocoa/menu.mm +++ b/src/osx/cocoa/menu.mm @@ -192,14 +192,13 @@ virtual void Remove( wxMenuItem *pItem ) wxOVERRIDE { [m_osxMenu removeItem:(NSMenuItem*) pItem->GetPeer()->GetHMenuItem()]; } - - virtual void MakeRoot() wxOVERRIDE + + virtual void MacSetupAppleMenu() { wxMenu* peer = GetWXPeer(); - [NSApp setMainMenu:m_osxMenu]; [NSApp setAppleMenu:[[m_osxMenu itemAtIndex:0] submenu]]; - + wxMenuItem *services = peer->FindItem(wxID_OSX_SERVICES); if ( services ) [NSApp setServicesMenu:services->GetSubMenu()->GetHMenu()]; @@ -208,6 +207,11 @@ virtual void MakeRoot() wxOVERRIDE else [NSApp setServicesMenu:nil]; #endif + } + + virtual void MacSetupHelpMenu() + { + wxMenu* peer = GetWXPeer(); NSMenu* helpMenu = nil; int helpid = peer->FindItem(wxApp::s_macHelpMenuTitleName); @@ -225,6 +229,79 @@ virtual void MakeRoot() wxOVERRIDE [NSApp setHelpMenu:helpMenu]; } + + virtual NSMenu* MacCreateOrFindWindowMenu() + { + wxMenu* peer = GetWXPeer(); + + NSMenu* windowMenu = nil; + int windowmenuid = peer->FindItem(wxApp::s_macWindowMenuTitleName); + if ( windowmenuid == wxNOT_FOUND ) + windowmenuid = peer->FindItem(_("&Window")); + + if ( windowmenuid != wxNOT_FOUND ) + { + wxMenuItem* windowMenuItem = peer->FindItem(windowmenuid); + + if ( windowMenuItem->IsSubMenu() ) + windowMenu = windowMenuItem->GetSubMenu()->GetHMenu(); + } + + if ( windowMenu == nil ) + { + windowMenu = [[NSMenu alloc] initWithTitle:@"Window"]; + NSMenuItem* windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""]; + [windowMenuItem setSubmenu:windowMenu]; + [windowMenu release]; + [m_osxMenu addItem:windowMenuItem]; + } + return windowMenu; + } + + virtual void MacSetupWindowMenu() + { + if ( GetWXPeer()->GetMenuBar()->GetAutoWindowMenu() ) + { + NSMenu* windowMenu = MacCreateOrFindWindowMenu(); + NSMenuItem* item = nil; + bool menuWasEmpty = [windowMenu numberOfItems] == 0; + if ( !menuWasEmpty ) + item = [windowMenu itemAtIndex:0]; + + if ( item == nil || [item action] != @selector(performMiniaturize:) ) + { + item = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"]; + [windowMenu insertItem:item atIndex:0]; + [item setEnabled:YES]; + [item release]; + + item = [[NSMenuItem alloc] initWithTitle:@"Zoom" action:@selector(performZoom:) keyEquivalent:@""]; + [windowMenu insertItem:item atIndex:1]; + [item release]; + + [windowMenu insertItem:[NSMenuItem separatorItem] atIndex:2]; + + item = [[NSMenuItem alloc] initWithTitle:@"Bring All to Front" action:@selector(arrangeInFront:) keyEquivalent:@""]; + [windowMenu insertItem:item atIndex:3]; + [item release]; + + if ( !menuWasEmpty ) + [windowMenu insertItem:[NSMenuItem separatorItem] atIndex:4]; + } + + [NSApp setWindowsMenu:windowMenu]; + } + } + + virtual void MakeRoot() wxOVERRIDE + { + [NSApp setMainMenu:m_osxMenu]; + + MacSetupAppleMenu(); + MacSetupHelpMenu(); + MacSetupWindowMenu(); + + } virtual void Enable( bool WXUNUSED(enable) ) {