X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1ea5ef0190b1b2f4d248af6b06d718a9adef2d41..f675b4f521c6696648674d8901e2d6162ab5e2fb:/src/osx/menu_osx.cpp diff --git a/src/osx/menu_osx.cpp b/src/osx/menu_osx.cpp index 91f2de1798..e251fa461d 100644 --- a/src/osx/menu_osx.cpp +++ b/src/osx/menu_osx.cpp @@ -18,6 +18,8 @@ #include "wx/wxprec.h" +#if wxUSE_MENUS + #include "wx/menu.h" #ifndef WX_PRECOMP @@ -25,6 +27,7 @@ #include "wx/app.h" #include "wx/utils.h" #include "wx/frame.h" + #include "wx/dialog.h" #include "wx/menuitem.h" #endif @@ -49,8 +52,6 @@ static const int idMenuTitle = -3; // ============================================================================ // implementation // ============================================================================ -static void wxMenubarUnsetInvokingWindow( wxMenu *menu ) ; -static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win ); // Menus @@ -74,7 +75,7 @@ void wxMenu::Init() m_startRadioGroup = -1; m_allowRearrange = true; m_noEventsMode = false; - + m_peer = wxMenuImpl::Create( this, wxStripMenuCodes(m_title) ); @@ -142,7 +143,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) pSubMenu->DoRearrange(); } else - { + { if ( pItem->GetId() == idMenuTitle ) pItem->GetMenu()->Enable( idMenuTitle, false ); } @@ -163,7 +164,7 @@ void wxMenu::EndRadioGroup() wxMenuItem* wxMenu::DoAppend(wxMenuItem *item) { - wxCHECK_MSG( item, NULL, _T("NULL item in wxMenu::DoAppend") ); + wxCHECK_MSG( item, NULL, wxT("NULL item in wxMenu::DoAppend") ); bool check = false; @@ -195,7 +196,7 @@ wxMenuItem* wxMenu::DoAppend(wxMenuItem *item) } else { - wxFAIL_MSG( _T("where is the radio group start item?") ); + wxFAIL_MSG( wxT("where is the radio group start item?") ); } } } @@ -263,7 +264,7 @@ bool wxMenu::ProcessCommand(wxCommandEvent & event) // Try the window the menu was popped up from // (and up through the hierarchy) - wxWindow *win = GetInvokingWindow(); + wxWindow *win = GetWindow(); if ( !processed && win ) processed = win->HandleWindowEvent(event); @@ -274,16 +275,6 @@ bool wxMenu::ProcessCommand(wxCommandEvent & event) // other // --------------------------------------------------------------------------- -wxWindow *wxMenu::GetWindow() const -{ - if ( m_invokingWindow != NULL ) - return m_invokingWindow; - else if ( GetMenuBar() != NULL) - return (wxWindow *) GetMenuBar()->GetFrame(); - - return NULL; -} - // MacOS needs to know about submenus somewhere within this menu // before it can be displayed, also hide special menu items // like preferences that are handled by the OS @@ -291,7 +282,7 @@ void wxMenu::DoRearrange() { if ( !AllowRearrange() ) return; - + wxMenuItem* previousItem = NULL ; size_t pos ; wxMenuItemList::compatibility_iterator node; @@ -329,7 +320,7 @@ void wxMenu::DoRearrange() { // next (i.e. second as we must be first) item is // the separator to hide - wxASSERT_MSG( pos == 0, _T("should be the menu start") ); + wxASSERT_MSG( pos == 0, wxT("should be the menu start") ); sepToHide = next; } else if ( GetMenuItems().GetCount() == pos + 1 && @@ -378,18 +369,9 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow // (and up through the hierarchy) if ( !processed ) { - const wxMenuBase *menu = this; - while ( menu ) - { - wxWindow *win = menu->GetInvokingWindow(); - if ( win ) - { - processed = win->HandleWindowEvent(event); - break; - } - - menu = menu->GetParent(); - } + wxWindow *win = GetWindow(); + if ( win ) + processed = win->HandleWindowEvent(event); } if ( !processed && senderWindow != NULL) @@ -407,6 +389,33 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow if (event.GetSetEnabled()) Enable(id, event.GetEnabled()); } + else + { +#if wxOSX_USE_CARBON + // these two items are also managed by the Carbon Menu Manager, therefore we must + // always reset them ourselves + UInt32 cmd = 0; + + if ( id == wxApp::s_macExitMenuItemId ) + { + cmd = kHICommandQuit; + } + else if (id == wxApp::s_macPreferencesMenuItemId ) + { + cmd = kHICommandPreferences; + } + + if ( cmd != 0 ) + { + if ( !item->IsEnabled() || wxDialog::OSXHasModalDialogsOpen() ) + DisableMenuCommand( NULL , cmd ) ; + else + EnableMenuCommand( NULL , cmd ) ; + + } +#endif + } + return processed; } @@ -463,7 +472,7 @@ bool wxMenu::DoHandleMenuEvent(wxEvent& wxevent) } else { - wxWindow *win = GetInvokingWindow(); + wxWindow *win = GetWindow(); if (win) { if ( win->HandleWindowEvent(wxevent) ) @@ -501,8 +510,9 @@ void wxMenuBar::Init() { m_eventHandler = this; m_menuBarFrame = NULL; - m_invokingWindow = NULL; m_rootMenu = new wxMenu(); + m_rootMenu->Attach(this); + m_appleMenu = new wxMenu(); m_appleMenu->SetAllowRearrange(false); m_appleMenu->Append( wxApp::s_macAboutMenuItemId, "About..." ); @@ -562,9 +572,9 @@ void wxMenuBar::MacInstallMenuBar() { if ( s_macInstalledMenuBar == this ) return ; - + m_rootMenu->GetPeer()->MakeRoot(); - // DisableMenuCommand( NULL , kHICommandPreferences ) ; + #if 0 MenuBarHandle menubar = NULL ; @@ -641,7 +651,9 @@ void wxMenuBar::MacInstallMenuBar() subMenu = item->GetSubMenu() ; if (subMenu) { - // we don't support hierarchical menus in the help menu yet + UMAAppendMenuItem(mh, wxStripMenuCodes(item->GetText()) , wxFont::GetDefaultEncoding() ); + MenuItemIndex position = CountMenuItems(mh); + ::SetMenuItemHierarchicalMenu(mh, position, MAC_WXHMENU(subMenu->GetHMenu())); } else { @@ -763,7 +775,7 @@ void wxMenuBar::MacInstallMenuBar() void wxMenuBar::EnableTop(size_t pos, bool enable) { wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") ); - + m_rootMenu->FindItemByPosition( pos )->Enable(enable); Refresh(); @@ -833,9 +845,6 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title) m_rootMenu->Remove(item); m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) ); - if (m_invokingWindow) - wxMenubarSetInvokingWindow( menu, m_invokingWindow ); - return menuOld; } @@ -845,11 +854,8 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title) return false; m_titles.Insert(title, pos); - - m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) ); - if (m_invokingWindow) - wxMenubarSetInvokingWindow( menu, m_invokingWindow ); + m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) ); return true; } @@ -880,79 +886,9 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title) m_rootMenu->AppendSubMenu(menu, title); - // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables - // adding menu later on. - if (m_invokingWindow) - wxMenubarSetInvokingWindow( menu, m_invokingWindow ); - return true; } -static void wxMenubarUnsetInvokingWindow( wxMenu *menu ) -{ - menu->SetInvokingWindow( NULL ); - wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); - - while (node) - { - wxMenuItem *menuitem = node->GetData(); - if (menuitem->IsSubMenu()) - wxMenubarUnsetInvokingWindow( menuitem->GetSubMenu() ); - - node = node->GetNext(); - } -} - -static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win ) -{ - menu->SetInvokingWindow( win ); - wxMenuItem *menuitem; - wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst(); - - while (node) - { - menuitem = node->GetData(); - if (menuitem->IsSubMenu()) - wxMenubarSetInvokingWindow( menuitem->GetSubMenu() , win ); - - node = node->GetNext(); - } -} - -void wxMenuBar::UnsetInvokingWindow() -{ - m_invokingWindow = NULL; - wxMenubarUnsetInvokingWindow(m_appleMenu); - - wxMenu *menu; - wxMenuList::compatibility_iterator node = m_menus.GetFirst(); - - while (node) - { - menu = node->GetData(); - wxMenubarUnsetInvokingWindow( menu ); - - node = node->GetNext(); - } -} - -void wxMenuBar::SetInvokingWindow(wxFrame *frame) -{ - m_invokingWindow = frame; - wxMenubarSetInvokingWindow(m_appleMenu, frame); - - wxMenu *menu; - wxMenuList::compatibility_iterator node = m_menus.GetFirst(); - - while (node) - { - menu = node->GetData(); - wxMenubarSetInvokingWindow( menu, frame ); - - node = node->GetNext(); - } -} - void wxMenuBar::Detach() { wxMenuBarBase::Detach() ; @@ -995,3 +931,5 @@ wxMenuItem *wxMenuBar::FindItem(int id, wxMenu **itemMenu) const return item; } + +#endif