]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/menu_osx.cpp
Compilation fixes for wx{X11,GTK1,Motif} after making ref data non copyable.
[wxWidgets.git] / src / osx / menu_osx.cpp
index 7b09d6f526c30cb0aef6319ab3cdf877040e126a..9c0d904ae8d5f39815737da4d899bc7b5297a1f0 100644 (file)
@@ -4,7 +4,7 @@
 // Author:      Stefan Csomor
 // Modified by:
 // Created:     1998-01-01
-// RCS-ID:      $Id: menu.cpp 54129 2008-06-11 19:30:52Z SC $
+// RCS-ID:      $Id$
 // Copyright:   (c) Stefan Csomor
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -52,8 +52,6 @@ static const int idMenuTitle = -3;
 // ============================================================================
 // implementation
 // ============================================================================
-static void wxMenubarUnsetInvokingWindow( wxMenu *menu ) ;
-static void wxMenubarSetInvokingWindow( wxMenu *menu, wxWindow *win );
 
 // Menus
 
@@ -266,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);
 
@@ -277,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
@@ -381,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)
@@ -410,13 +389,13 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow
         if (event.GetSetEnabled())
             Enable(id, event.GetEnabled());
     }
-    else 
+    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;
@@ -425,14 +404,14 @@ bool wxMenu::HandleCommandUpdateStatus( wxMenuItem* item, wxWindow* senderWindow
         {
             cmd = kHICommandPreferences;
         }
-        
+
         if ( cmd != 0 )
         {
             if ( !item->IsEnabled() || wxDialog::OSXHasModalDialogsOpen() )
                 DisableMenuCommand( NULL , cmd ) ;
             else
                 EnableMenuCommand( NULL , cmd ) ;
-            
+
         }
 #endif
     }
@@ -461,6 +440,12 @@ bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow )
                 processed = true ;
         }
     }
+
+    if(!processed && item)
+    {
+        processed = item->GetPeer()->DoDefault();  
+    }
+    
     return processed;
 }
 
@@ -493,7 +478,7 @@ bool wxMenu::DoHandleMenuEvent(wxEvent& wxevent)
     }
     else
     {
-        wxWindow *win = GetInvokingWindow();
+        wxWindow *win = GetWindow();
         if (win)
         {
             if ( win->HandleWindowEvent(wxevent) )
@@ -531,17 +516,51 @@ 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..." );
-    m_appleMenu->AppendSeparator();
+
+    // Create standard items unless the application explicitly disabled this by
+    // setting the corresponding ids to wxID_NONE: although this is not
+    // recommended, sometimes these items really don't make sense.
+    if ( wxApp::s_macAboutMenuItemId != wxID_NONE )
+    {
+        wxString aboutLabel(_("About"));
+        if ( wxTheApp )
+            aboutLabel << ' ' << wxTheApp->GetAppDisplayName();
+        else
+            aboutLabel << "...";
+        m_appleMenu->Append( wxApp::s_macAboutMenuItemId, aboutLabel);
+        m_appleMenu->AppendSeparator();
+    }
+
 #if !wxOSX_USE_CARBON
-    m_appleMenu->Append( wxApp::s_macPreferencesMenuItemId, "Preferences..." );
+    if ( wxApp::s_macPreferencesMenuItemId != wxID_NONE )
+    {
+        m_appleMenu->Append( wxApp::s_macPreferencesMenuItemId,
+                             _("Preferences...") + "\tCtrl+," );
+        m_appleMenu->AppendSeparator();
+    }
+
+    // standard menu items, handled in wxMenu::HandleCommandProcess(), see above:
+    wxString hideLabel(_("Hide"));
+    if ( wxTheApp )
+        hideLabel << ' ' << wxTheApp->GetAppDisplayName();
+    hideLabel << "\tCtrl+H";
+    m_appleMenu->Append( wxID_OSX_HIDE, hideLabel );    
+    m_appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" );    
+    m_appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") );    
     m_appleMenu->AppendSeparator();
-    m_appleMenu->Append( wxApp::s_macExitMenuItemId, "Quit\tCtrl+Q" );
-#endif
+    
+    // Do always add "Quit" item unconditionally however, it can't be disabled.
+    wxString quitLabel(_("Quit"));
+    if ( wxTheApp )
+        quitLabel << ' ' << wxTheApp->GetAppDisplayName();
+    quitLabel << "\tCtrl+Q";
+    m_appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel );
+#endif // !wxOSX_USE_CARBON
 
     m_rootMenu->AppendSubMenu(m_appleMenu, "\x14") ;
 }
@@ -865,9 +884,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;
 }
 
@@ -880,9 +896,6 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 
     m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) );
 
-    if (m_invokingWindow)
-        wxMenubarSetInvokingWindow( menu, m_invokingWindow );
-
     return true;
 }
 
@@ -912,79 +925,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() ;