wxMenuItem *wxMenu::DoRemove(wxMenuItem *item)
{
+ if ( m_startRadioGroup != -1 )
+ {
+ // Check if we're removing the item starting the radio group
+ if ( GetMenuItems().Item(m_startRadioGroup)->GetData() == item )
+ {
+ // Yes, we do, so reset its index as the next item added shouldn't
+ // count as part of the same radio group anyhow.
+ m_startRadioGroup = -1;
+ }
+ }
+
/*
// we need to find the items position in the child list
size_t pos;
{
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) )
DoHandleMenuEvent( wxevent );
}
-void wxMenu::HandleMenuOpened()
+void wxMenu::DoHandleMenuOpenedOrClosed(wxEventType evtType)
{
- wxMenuEvent wxevent(wxEVT_MENU_OPEN, 0, this);
+ // Popup menu being currently shown or NULL, defined in wincmn.cpp.
+ extern wxMenu *wxCurrentPopupMenu;
+
+ // Set the id to allow wxMenuEvent::IsPopup() to work correctly.
+ int menuid = this == wxCurrentPopupMenu ? wxID_ANY : 0;
+ wxMenuEvent wxevent(evtType, menuid, this);
DoHandleMenuEvent( wxevent );
}
+void wxMenu::HandleMenuOpened()
+{
+ DoHandleMenuOpenedOrClosed(wxEVT_MENU_OPEN);
+}
+
void wxMenu::HandleMenuClosed()
{
- wxMenuEvent wxevent(wxEVT_MENU_CLOSE, 0, this);
- DoHandleMenuEvent( wxevent );
+ DoHandleMenuOpenedOrClosed(wxEVT_MENU_CLOSE);
}
bool wxMenu::DoHandleMenuEvent(wxEvent& wxevent)
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()
{
+ 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();
}
// 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.
- 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") ;
if (s_macInstalledMenuBar == this)
{
+ emptyMenuBar->GetPeer()->MakeRoot();
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))
// hide items in the apple menu that don't exist in the wx menubar
- int menuid = 0;
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 )
{
wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
- m_rootMenu->FindItemByPosition( pos )->Enable(enable);
+ m_rootMenu->FindItemByPosition(pos+firstMenuPos)->Enable(enable);
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") );
// wxMenuBar construction
// ---------------------------------------------------------------------------
-const int firstMenuPos = 1; // to account for the 0th application menu on mac
-
wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
{
wxMenu *menuOld = wxMenuBarBase::Replace(pos, menu, title);
return false;
m_rootMenu->Insert( pos+firstMenuPos, wxMenuItem::New( m_rootMenu, wxID_ANY, title, "", wxITEM_NORMAL, menu ) );
+ menu->SetTitle(title);
return true;
}