]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/menu_osx.cpp
Support using GetTextExtent() with empty string to get descent in wxOSX.
[wxWidgets.git] / src / osx / menu_osx.cpp
index da7d66545a7e11ca6b1ffaf57ea1c394624109ca..4ad6fa1fdfc2fe77dc739da4e2222684b692e3e6 100644 (file)
@@ -428,8 +428,8 @@ bool wxMenu::HandleCommandProcess( wxMenuItem* item, wxWindow* senderWindow )
     {
         if ( senderWindow != NULL )
         {
     {
         if ( senderWindow != NULL )
         {
-            wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED , menuid);
-            event.SetEventObject(senderWindow);
+            wxCommandEvent event(wxEVT_MENU , menuid);
+            event.SetEventObject(this);
             event.SetInt(item->IsCheckable() ? item->IsChecked() : -1);
 
             if ( senderWindow->HandleWindowEvent(event) )
             event.SetInt(item->IsCheckable() ? item->IsChecked() : -1);
 
             if ( senderWindow->HandleWindowEvent(event) )
@@ -517,10 +517,37 @@ wxMenuBar* wxMenuBar::s_macCommonMenuBar = NULL ;
 bool     wxMenuBar::s_macAutoWindowMenu = true ;
 WXHMENU  wxMenuBar::s_macWindowMenuHandle = NULL ;
 
 bool     wxMenuBar::s_macAutoWindowMenu = true ;
 WXHMENU  wxMenuBar::s_macWindowMenuHandle = NULL ;
 
+
+wxMenu* emptyMenuBar = NULL;
+
 const int firstMenuPos = 1; // to account for the 0th application menu on mac
 
 void wxMenuBar::Init()
 {
 const int firstMenuPos = 1; // to account for the 0th application menu on mac
 
 void wxMenuBar::Init()
 {
+    if ( emptyMenuBar == NULL )
+    {
+        emptyMenuBar = new wxMenu();
+        
+        wxMenu* appleMenu = new wxMenu();
+        appleMenu->SetAllowRearrange(false);
+#if !wxOSX_USE_CARBON
+        // standard menu items, handled in wxMenu::HandleCommandProcess(), see above:
+        wxString hideLabel;
+        hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application"));
+        appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" );
+        appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" );
+        appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") );
+        appleMenu->AppendSeparator();
+        
+        // Do always add "Quit" item unconditionally however, it can't be disabled.
+        wxString quitLabel;
+        quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application"));
+        appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" );
+#endif // !wxOSX_USE_CARBON
+
+        emptyMenuBar->AppendSubMenu(appleMenu, "\x14") ;
+    }
+    
     m_eventHandler = this;
     m_menuBarFrame = NULL;
     m_rootMenu = new wxMenu();
     m_eventHandler = this;
     m_menuBarFrame = NULL;
     m_rootMenu = new wxMenu();
@@ -552,21 +579,17 @@ void wxMenuBar::Init()
     }
 
     // standard menu items, handled in wxMenu::HandleCommandProcess(), see above:
     }
 
     // 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 );    
+    wxString hideLabel;
+    hideLabel = wxString::Format(_("Hide %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application"));
+    m_appleMenu->Append( wxID_OSX_HIDE, hideLabel + "\tCtrl+H" );    
     m_appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" );    
     m_appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") );    
     m_appleMenu->AppendSeparator();
     
     // Do always add "Quit" item unconditionally however, it can't be disabled.
     m_appleMenu->Append( wxID_OSX_HIDEOTHERS, _("Hide Others")+"\tAlt+Ctrl+H" );    
     m_appleMenu->Append( wxID_OSX_SHOWALL, _("Show All") );    
     m_appleMenu->AppendSeparator();
     
     // 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 );
+    wxString quitLabel;
+    quitLabel = wxString::Format(_("Quit %s"), wxTheApp ? wxTheApp->GetAppDisplayName() : _("Application"));
+    m_appleMenu->Append( wxApp::s_macExitMenuItemId, quitLabel + "\tCtrl+Q" );
 #endif // !wxOSX_USE_CARBON
 
     m_rootMenu->AppendSubMenu(m_appleMenu, "\x14") ;
 #endif // !wxOSX_USE_CARBON
 
     m_rootMenu->AppendSubMenu(m_appleMenu, "\x14") ;
@@ -602,8 +625,16 @@ wxMenuBar::~wxMenuBar()
 
     if (s_macInstalledMenuBar == this)
     {
 
     if (s_macInstalledMenuBar == this)
     {
+        emptyMenuBar->GetPeer()->MakeRoot();
         s_macInstalledMenuBar = NULL;
     }
         s_macInstalledMenuBar = NULL;
     }
+    wxDELETE( m_rootMenu );
+    // apple menu is a submenu, therefore we don't have to delete it
+    m_appleMenu = NULL;
+
+    // deleting the root menu also removes all its wxMenu* submenus, therefore
+    // we must avoid double deleting them in the superclass destructor
+    m_menus.clear();
 }
 
 void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(rect))
 }
 
 void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground), const wxRect *WXUNUSED(rect))
@@ -620,11 +651,10 @@ void wxMenuBar::MacInstallMenuBar()
     
     // hide items in the apple menu that don't exist in the wx menubar
     
     
     // hide items in the apple menu that don't exist in the wx menubar
     
-    int menuid = 0;
     wxMenuItem* appleItem = NULL;
     wxMenuItem* wxItem = NULL;
 
     wxMenuItem* appleItem = NULL;
     wxMenuItem* wxItem = NULL;
 
-    menuid = wxApp::s_macAboutMenuItemId;
+    int menuid = wxApp::s_macAboutMenuItemId;
     appleItem = m_appleMenu->FindItem(menuid);
     wxItem = FindItem(menuid);
     if ( appleItem != NULL )
     appleItem = m_appleMenu->FindItem(menuid);
     wxItem = FindItem(menuid);
     if ( appleItem != NULL )
@@ -833,6 +863,17 @@ void wxMenuBar::EnableTop(size_t pos, bool enable)
     Refresh();
 }
 
     Refresh();
 }
 
+bool wxMenuBar::IsEnabledTop(size_t pos) const
+{
+    wxCHECK_MSG( IsAttached(), true,
+                 wxT("doesn't work with unattached menubars") );
+
+    wxMenuItem* const item = m_rootMenu->FindItemByPosition(pos+firstMenuPos);
+    wxCHECK_MSG( item, false, wxT("invalid menu index") );
+
+    return item->IsEnabled();
+}
+
 bool wxMenuBar::Enable(bool enable)
 {
     wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") );
 bool wxMenuBar::Enable(bool enable)
 {
     wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") );
@@ -882,6 +923,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
         return false;
 
     m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) );
         return false;
 
     m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) );
+    menu->SetTitle(title);
 
     return true;
 }
 
     return true;
 }