1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/menu_osx.cpp
3 // Purpose: wxMenu, wxMenuBar, wxMenuItem
4 // Author: Stefan Csomor
8 // Copyright: (c) Stefan Csomor
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
13 // headers & declarations
14 // ============================================================================
19 #include "wx/wxprec.h"
30 #include "wx/dialog.h"
31 #include "wx/menuitem.h"
34 #include "wx/osx/private.h"
36 // other standard headers
37 // ----------------------
40 IMPLEMENT_ABSTRACT_CLASS( wxMenuImpl
, wxObject
)
42 wxMenuImpl::~wxMenuImpl()
46 // the (popup) menu title has this special menuid
47 static const int idMenuTitle
= -3;
49 // ============================================================================
51 // ============================================================================
55 // Construct a menu with optional title (then use append)
60 m_startRadioGroup
= -1;
61 m_allowRearrange
= true;
62 m_noEventsMode
= false;
64 m_peer
= wxMenuImpl::Create( this, wxStripMenuCodes(m_title
) );
67 // if we have a title, insert it in the beginning of the menu
68 if ( !m_title
.empty() )
70 Append(idMenuTitle
, m_title
) ;
80 WXHMENU
wxMenu::GetHMenu() const
83 return m_peer
->GetHMenu();
89 // not available on the mac platform
92 void wxMenu::Attach(wxMenuBarBase
*menubar
)
94 wxMenuBase::Attach(menubar
);
99 void wxMenu::SetAllowRearrange( bool allow
)
101 m_allowRearrange
= allow
;
104 void wxMenu::SetNoEventsMode( bool noEvents
)
106 m_noEventsMode
= noEvents
;
109 // function appends a new item or submenu to the menu
110 // append a new item or submenu to the menu
111 bool wxMenu::DoInsertOrAppend(wxMenuItem
*pItem
, size_t pos
)
113 wxASSERT_MSG( pItem
!= NULL
, wxT("can't append NULL item to the menu") );
114 GetPeer()->InsertOrAppend( pItem
, pos
);
116 if ( pItem
->IsSeparator() )
118 // nothing to do here
122 wxMenu
*pSubMenu
= pItem
->GetSubMenu() ;
123 if ( pSubMenu
!= NULL
)
125 wxASSERT_MSG( pSubMenu
->GetHMenu() != NULL
, wxT("invalid submenu added"));
126 pSubMenu
->m_menuParent
= this ;
128 pSubMenu
->DoRearrange();
132 if ( pItem
->GetId() == idMenuTitle
)
133 pItem
->GetMenu()->Enable( idMenuTitle
, false );
137 // if we're already attached to the menubar, we must update it
138 if ( IsAttached() && GetMenuBar()->IsAttached() )
139 GetMenuBar()->Refresh();
144 void wxMenu::EndRadioGroup()
146 // we're not inside a radio group any longer
147 m_startRadioGroup
= -1;
150 wxMenuItem
* wxMenu::DoAppend(wxMenuItem
*item
)
152 wxCHECK_MSG( item
, NULL
, wxT("NULL item in wxMenu::DoAppend") );
156 if ( item
->GetKind() == wxITEM_RADIO
)
158 int count
= GetMenuItemCount();
160 if ( m_startRadioGroup
== -1 )
162 // start a new radio group
163 m_startRadioGroup
= count
;
165 // for now it has just one element
166 item
->SetAsRadioGroupStart();
167 item
->SetRadioGroupEnd(m_startRadioGroup
);
169 // ensure that we have a checked item in the radio group
172 else // extend the current radio group
174 // we need to update its end item
175 item
->SetRadioGroupStart(m_startRadioGroup
);
176 wxMenuItemList::compatibility_iterator node
= GetMenuItems().Item(m_startRadioGroup
);
180 node
->GetData()->SetRadioGroupEnd(count
);
184 wxFAIL_MSG( wxT("where is the radio group start item?") );
188 else // not a radio item
193 if ( !wxMenuBase::DoAppend(item
) || !DoInsertOrAppend(item
) )
197 // check the item initially
203 wxMenuItem
* wxMenu::DoInsert(size_t pos
, wxMenuItem
*item
)
205 if (wxMenuBase::DoInsert(pos
, item
) && DoInsertOrAppend(item
, pos
))
211 wxMenuItem
*wxMenu::DoRemove(wxMenuItem
*item
)
213 if ( m_startRadioGroup
!= -1 )
215 // Check if we're removing the item starting the radio group
216 if ( GetMenuItems().Item(m_startRadioGroup
)->GetData() == item
)
218 // Yes, we do, so reset its index as the next item added shouldn't
219 // count as part of the same radio group anyhow.
220 m_startRadioGroup
= -1;
225 // we need to find the items position in the child list
227 wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst();
229 for ( pos = 0; node; pos++ )
231 if ( node->GetData() == item )
234 node = node->GetNext();
237 // DoRemove() (unlike Remove) can only be called for existing item!
238 wxCHECK_MSG( node, NULL, wxT("bug in wxMenu::Remove logic") );
240 wxOSXMenuRemoveItem(m_hMenu , pos );
242 GetPeer()->Remove( item
);
243 // and from internal data structures
244 return wxMenuBase::DoRemove(item
);
247 void wxMenu::SetTitle(const wxString
& label
)
250 GetPeer()->SetTitle( wxStripMenuCodes( label
) );
253 bool wxMenu::ProcessCommand(wxCommandEvent
& event
)
255 bool processed
= false;
257 // Try the menu's event handler
258 if ( /* !processed && */ GetEventHandler())
259 processed
= GetEventHandler()->SafelyProcessEvent(event
);
261 // Try the window the menu was popped up from
262 // (and up through the hierarchy)
263 wxWindow
*win
= GetWindow();
264 if ( !processed
&& win
)
265 processed
= win
->HandleWindowEvent(event
);
270 // ---------------------------------------------------------------------------
272 // ---------------------------------------------------------------------------
274 // MacOS needs to know about submenus somewhere within this menu
275 // before it can be displayed, also hide special menu items
276 // like preferences that are handled by the OS
277 void wxMenu::DoRearrange()
279 if ( !AllowRearrange() )
282 wxMenuItem
* previousItem
= NULL
;
284 wxMenuItemList::compatibility_iterator node
;
287 for (pos
= 0, node
= GetMenuItems().GetFirst(); node
; node
= node
->GetNext(), pos
++)
289 item
= (wxMenuItem
*)node
->GetData();
290 wxMenu
* subMenu
= item
->GetSubMenu() ;
297 // what we do here is to hide the special items which are
298 // shown in the application menu anyhow -- it doesn't make
299 // sense to show them in their normal place as well
300 if ( item
->GetId() == wxApp::s_macAboutMenuItemId
||
301 item
->GetId() == wxApp::s_macPreferencesMenuItemId
||
302 item
->GetId() == wxApp::s_macExitMenuItemId
)
305 item
->GetPeer()->Hide( true );
307 // also check for a separator which was used just to
308 // separate this item from the others, so don't leave
309 // separator at the menu start or end nor 2 consecutive
311 wxMenuItemList::compatibility_iterator nextNode
= node
->GetNext();
312 wxMenuItem
*next
= nextNode
? nextNode
->GetData() : NULL
;
314 wxMenuItem
*sepToHide
= 0;
315 if ( !previousItem
&& next
&& next
->IsSeparator() )
317 // next (i.e. second as we must be first) item is
318 // the separator to hide
319 wxASSERT_MSG( pos
== 0, wxT("should be the menu start") );
322 else if ( GetMenuItems().GetCount() == pos
+ 1 &&
323 previousItem
!= NULL
&&
324 previousItem
->IsSeparator() )
326 // prev item is a trailing separator we want to hide
327 sepToHide
= previousItem
;
329 else if ( previousItem
&& previousItem
->IsSeparator() &&
330 next
&& next
->IsSeparator() )
332 // two consecutive separators, this is one too many
338 // hide the separator as well
339 sepToHide
->GetPeer()->Hide( true );
344 previousItem
= item
;
349 bool wxMenu::HandleCommandUpdateStatus( wxMenuItem
* item
, wxWindow
* senderWindow
)
351 int menuid
= item
? item
->GetId() : 0;
352 wxUpdateUIEvent
event(menuid
);
353 event
.SetEventObject( this );
355 bool processed
= false;
357 // Try the menu's event handler
359 wxEvtHandler
*handler
= GetEventHandler();
361 processed
= handler
->ProcessEvent(event
);
364 // Try the window the menu was popped up from
365 // (and up through the hierarchy)
368 wxWindow
*win
= GetWindow();
370 processed
= win
->HandleWindowEvent(event
);
373 if ( !processed
&& senderWindow
!= NULL
)
375 processed
= senderWindow
->HandleWindowEvent(event
);
380 // if anything changed, update the changed attribute
381 if (event
.GetSetText())
382 SetLabel(menuid
, event
.GetText());
383 if (event
.GetSetChecked())
384 Check(menuid
, event
.GetChecked());
385 if (event
.GetSetEnabled())
386 Enable(menuid
, event
.GetEnabled());
391 // these two items are also managed by the Carbon Menu Manager, therefore we must
392 // always reset them ourselves
395 if ( menuid
== wxApp::s_macExitMenuItemId
)
397 cmd
= kHICommandQuit
;
399 else if (menuid
== wxApp::s_macPreferencesMenuItemId
)
401 cmd
= kHICommandPreferences
;
406 if ( !item
->IsEnabled() || wxDialog::OSXHasModalDialogsOpen() )
407 DisableMenuCommand( NULL
, cmd
) ;
409 EnableMenuCommand( NULL
, cmd
) ;
418 bool wxMenu::HandleCommandProcess( wxMenuItem
* item
, wxWindow
* senderWindow
)
420 int menuid
= item
? item
->GetId() : 0;
421 bool processed
= false;
422 if (item
->IsCheckable())
423 item
->Check( !item
->IsChecked() ) ;
425 if ( SendEvent( menuid
, item
->IsCheckable() ? item
->IsChecked() : -1 ) )
429 if ( senderWindow
!= NULL
)
431 wxCommandEvent
event(wxEVT_COMMAND_MENU_SELECTED
, menuid
);
432 event
.SetEventObject(senderWindow
);
433 event
.SetInt(item
->IsCheckable() ? item
->IsChecked() : -1);
435 if ( senderWindow
->HandleWindowEvent(event
) )
440 if(!processed
&& item
)
442 processed
= item
->GetPeer()->DoDefault();
448 void wxMenu::HandleMenuItemHighlighted( wxMenuItem
* item
)
450 int menuid
= item
? item
->GetId() : 0;
451 wxMenuEvent
wxevent(wxEVT_MENU_HIGHLIGHT
, menuid
, this);
452 DoHandleMenuEvent( wxevent
);
455 void wxMenu::HandleMenuOpened()
457 wxMenuEvent
wxevent(wxEVT_MENU_OPEN
, 0, this);
458 DoHandleMenuEvent( wxevent
);
461 void wxMenu::HandleMenuClosed()
463 wxMenuEvent
wxevent(wxEVT_MENU_CLOSE
, 0, this);
464 DoHandleMenuEvent( wxevent
);
467 bool wxMenu::DoHandleMenuEvent(wxEvent
& wxevent
)
469 wxevent
.SetEventObject(this);
470 wxEvtHandler
* handler
= GetEventHandler();
471 if (handler
&& handler
->ProcessEvent(wxevent
))
477 wxWindow
*win
= GetWindow();
480 if ( win
->HandleWindowEvent(wxevent
) )
491 Mac Implementation note :
493 The Mac has only one global menubar, so we attempt to install the currently
494 active menubar from a frame, we currently don't take into account mdi-frames
495 which would ask for menu-merging
497 Secondly there is no mac api for changing a menubar that is not the current
498 menubar, so we have to wait for preparing the actual menubar until the
499 wxMenubar is to be used
501 We can in subsequent versions use MacInstallMenuBar to provide some sort of
502 auto-merge for MDI in case this will be necessary
506 wxMenuBar
* wxMenuBar::s_macInstalledMenuBar
= NULL
;
507 wxMenuBar
* wxMenuBar::s_macCommonMenuBar
= NULL
;
508 bool wxMenuBar::s_macAutoWindowMenu
= true ;
509 WXHMENU
wxMenuBar::s_macWindowMenuHandle
= NULL
;
511 const int firstMenuPos
= 1; // to account for the 0th application menu on mac
513 void wxMenuBar::Init()
515 m_eventHandler
= this;
516 m_menuBarFrame
= NULL
;
517 m_rootMenu
= new wxMenu();
518 m_rootMenu
->Attach(this);
520 m_appleMenu
= new wxMenu();
521 m_appleMenu
->SetAllowRearrange(false);
523 // Create standard items unless the application explicitly disabled this by
524 // setting the corresponding ids to wxID_NONE: although this is not
525 // recommended, sometimes these items really don't make sense.
526 if ( wxApp::s_macAboutMenuItemId
!= wxID_NONE
)
528 wxString
aboutLabel(_("About"));
530 aboutLabel
<< ' ' << wxTheApp
->GetAppDisplayName();
533 m_appleMenu
->Append( wxApp::s_macAboutMenuItemId
, aboutLabel
);
534 m_appleMenu
->AppendSeparator();
537 #if !wxOSX_USE_CARBON
538 if ( wxApp::s_macPreferencesMenuItemId
!= wxID_NONE
)
540 m_appleMenu
->Append( wxApp::s_macPreferencesMenuItemId
,
541 _("Preferences...") + "\tCtrl+," );
542 m_appleMenu
->AppendSeparator();
545 // standard menu items, handled in wxMenu::HandleCommandProcess(), see above:
546 wxString
hideLabel(_("Hide"));
548 hideLabel
<< ' ' << wxTheApp
->GetAppDisplayName();
549 hideLabel
<< "\tCtrl+H";
550 m_appleMenu
->Append( wxID_OSX_HIDE
, hideLabel
);
551 m_appleMenu
->Append( wxID_OSX_HIDEOTHERS
, _("Hide Others")+"\tAlt+Ctrl+H" );
552 m_appleMenu
->Append( wxID_OSX_SHOWALL
, _("Show All") );
553 m_appleMenu
->AppendSeparator();
555 // Do always add "Quit" item unconditionally however, it can't be disabled.
556 wxString
quitLabel(_("Quit"));
558 quitLabel
<< ' ' << wxTheApp
->GetAppDisplayName();
559 quitLabel
<< "\tCtrl+Q";
560 m_appleMenu
->Append( wxApp::s_macExitMenuItemId
, quitLabel
);
561 #endif // !wxOSX_USE_CARBON
563 m_rootMenu
->AppendSubMenu(m_appleMenu
, "\x14") ;
566 wxMenuBar::wxMenuBar()
571 wxMenuBar::wxMenuBar( long WXUNUSED(style
) )
576 wxMenuBar::wxMenuBar(size_t count
, wxMenu
*menus
[], const wxString titles
[], long WXUNUSED(style
))
580 for ( size_t i
= 0; i
< count
; i
++ )
582 m_menus
.Append(menus
[i
]);
584 menus
[i
]->Attach(this);
585 Append( menus
[i
], titles
[i
] );
589 wxMenuBar::~wxMenuBar()
591 if (s_macCommonMenuBar
== this)
592 s_macCommonMenuBar
= NULL
;
594 if (s_macInstalledMenuBar
== this)
596 s_macInstalledMenuBar
= NULL
;
600 void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground
), const wxRect
*WXUNUSED(rect
))
602 wxCHECK_RET( IsAttached(), wxT("can't refresh unatteched menubar") );
605 void wxMenuBar::MacInstallMenuBar()
607 if ( s_macInstalledMenuBar
== this )
610 m_rootMenu
->GetPeer()->MakeRoot();
612 // hide items in the apple menu that don't exist in the wx menubar
615 wxMenuItem
* appleItem
= NULL
;
616 wxMenuItem
* wxItem
= NULL
;
618 menuid
= wxApp::s_macAboutMenuItemId
;
619 appleItem
= m_appleMenu
->FindItem(menuid
);
620 wxItem
= FindItem(menuid
);
621 if ( appleItem
!= NULL
)
623 if ( wxItem
== NULL
)
624 appleItem
->GetPeer()->Hide();
626 appleItem
->SetItemLabel(wxItem
->GetItemLabel());
629 menuid
= wxApp::s_macPreferencesMenuItemId
;
630 appleItem
= m_appleMenu
->FindItem(menuid
);
631 wxItem
= FindItem(menuid
);
632 if ( appleItem
!= NULL
)
634 if ( wxItem
== NULL
)
635 appleItem
->GetPeer()->Hide();
637 appleItem
->SetItemLabel(wxItem
->GetItemLabel());
643 // if we have a mac help menu, clean it up before adding new items
644 MenuHandle helpMenuHandle
;
645 MenuItemIndex firstUserHelpMenuItem
;
647 if ( UMAGetHelpMenuDontCreate( &helpMenuHandle
, &firstUserHelpMenuItem
) == noErr
)
649 for ( int i
= CountMenuItems( helpMenuHandle
) ; i
>= firstUserHelpMenuItem
; --i
)
650 DeleteMenuItem( helpMenuHandle
, i
) ;
654 helpMenuHandle
= NULL
;
657 if ( wxApp::s_macPreferencesMenuItemId
)
659 wxMenuItem
*item
= FindItem( wxApp::s_macPreferencesMenuItemId
, NULL
) ;
660 if ( item
== NULL
|| !(item
->IsEnabled()) )
661 DisableMenuCommand( NULL
, kHICommandPreferences
) ;
663 EnableMenuCommand( NULL
, kHICommandPreferences
) ;
666 // Unlike preferences which may or may not exist, the Quit item should be always
667 // enabled unless it is added by the application and then disabled, otherwise
668 // a program would be required to add an item with wxID_EXIT in order to get the
669 // Quit menu item to be enabled, which seems a bit burdensome.
670 if ( wxApp::s_macExitMenuItemId
)
672 wxMenuItem
*item
= FindItem( wxApp::s_macExitMenuItemId
, NULL
) ;
673 if ( item
!= NULL
&& !(item
->IsEnabled()) )
674 DisableMenuCommand( NULL
, kHICommandQuit
) ;
676 EnableMenuCommand( NULL
, kHICommandQuit
) ;
679 wxString strippedHelpMenuTitle
= wxStripMenuCodes( wxApp::s_macHelpMenuTitleName
) ;
680 wxString strippedTranslatedHelpMenuTitle
= wxStripMenuCodes( wxString( _("&Help") ) ) ;
681 wxMenuList::compatibility_iterator menuIter
= m_menus
.GetFirst();
682 for (size_t i
= 0; i
< m_menus
.GetCount(); i
++, menuIter
= menuIter
->GetNext())
684 wxMenuItemList::compatibility_iterator node
;
686 wxMenu
* menu
= menuIter
->GetData() , *subMenu
= NULL
;
687 wxString strippedMenuTitle
= wxStripMenuCodes(m_titles
[i
]);
689 if ( strippedMenuTitle
== wxT("?") || strippedMenuTitle
== strippedHelpMenuTitle
|| strippedMenuTitle
== strippedTranslatedHelpMenuTitle
)
691 for (node
= menu
->GetMenuItems().GetFirst(); node
; node
= node
->GetNext())
693 item
= (wxMenuItem
*)node
->GetData();
694 subMenu
= item
->GetSubMenu() ;
697 UMAAppendMenuItem(mh
, wxStripMenuCodes(item
->GetText()) , wxFont::GetDefaultEncoding() );
698 MenuItemIndex position
= CountMenuItems(mh
);
699 ::SetMenuItemHierarchicalMenu(mh
, position
, MAC_WXHMENU(subMenu
->GetHMenu()));
703 if ( item
->GetId() != wxApp::s_macAboutMenuItemId
)
705 // we have found a user help menu and an item other than the about item,
706 // so we can create the mac help menu now, if we haven't created it yet
707 if ( helpMenuHandle
== NULL
)
709 if ( UMAGetHelpMenu( &helpMenuHandle
, &firstUserHelpMenuItem
) != noErr
)
711 helpMenuHandle
= NULL
;
717 if ( item
->IsSeparator() )
719 if ( helpMenuHandle
)
720 AppendMenuItemTextWithCFString( helpMenuHandle
,
721 CFSTR(""), kMenuItemAttrSeparator
, 0,NULL
);
726 entry
= wxAcceleratorEntry::Create( item
->GetItemLabel() ) ;
728 if ( item
->GetId() == wxApp::s_macAboutMenuItemId
)
730 // this will be taken care of below
734 if ( helpMenuHandle
)
736 UMAAppendMenuItem(helpMenuHandle
, wxStripMenuCodes(item
->GetItemLabel()) , wxFont::GetDefaultEncoding(), entry
);
737 SetMenuItemCommandID( helpMenuHandle
, CountMenuItems(helpMenuHandle
) , wxIdToMacCommand ( item
->GetId() ) ) ;
738 SetMenuItemRefCon( helpMenuHandle
, CountMenuItems(helpMenuHandle
) , (URefCon
) item
) ;
748 else if ( ( m_titles
[i
] == wxT("Window") || m_titles
[i
] == wxT("&Window") )
749 && GetAutoWindowMenu() )
751 if ( MacGetWindowMenuHMenu() == NULL
)
753 CreateStandardWindowMenu( 0 , (MenuHandle
*) &s_macWindowMenuHandle
) ;
756 MenuRef wm
= (MenuRef
)MacGetWindowMenuHMenu();
760 // get the insertion point in the standard menu
761 MenuItemIndex winListStart
;
762 GetIndMenuItemWithCommandID(wm
,
763 kHICommandWindowListSeparator
, 1, NULL
, &winListStart
);
765 // add a separator so that the standard items and the custom items
766 // aren't mixed together, but only if this is the first run
767 OSStatus err
= GetIndMenuItemWithCommandID(wm
,
768 'WXWM', 1, NULL
, NULL
);
770 if ( err
== menuItemNotFoundErr
)
772 InsertMenuItemTextWithCFString( wm
,
773 CFSTR(""), winListStart
-1, kMenuItemAttrSeparator
, 'WXWM');
776 wxInsertMenuItemsInMenu(menu
, wm
, winListStart
);
780 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , m_titles
[i
], GetFont().GetEncoding() ) ;
781 menu
->MacBeforeDisplay(false) ;
783 ::InsertMenu(MAC_WXHMENU(GetMenu(i
)->GetHMenu()), 0);
787 // take care of the about menu item wherever it is
790 wxMenuItem
*aboutMenuItem
= FindItem(wxApp::s_macAboutMenuItemId
, &aboutMenu
) ;
794 entry
= wxAcceleratorEntry::Create( aboutMenuItem
->GetItemLabel() ) ;
795 UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId
) , 1 , wxStripMenuCodes ( aboutMenuItem
->GetItemLabel() ) , wxFont::GetDefaultEncoding() );
796 UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId
) , 1 , true );
797 SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId
) , 1 , kHICommandAbout
) ;
798 SetMenuItemRefCon(GetMenuHandle( kwxMacAppleMenuId
) , 1 , (URefCon
)aboutMenuItem
) ;
799 UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId
) , 1 , entry
) ;
804 if ( GetAutoWindowMenu() )
806 if ( MacGetWindowMenuHMenu() == NULL
)
807 CreateStandardWindowMenu( 0 , (MenuHandle
*) &s_macWindowMenuHandle
) ;
809 InsertMenu( (MenuHandle
) MacGetWindowMenuHMenu() , 0 ) ;
815 s_macInstalledMenuBar
= this;
818 void wxMenuBar::EnableTop(size_t pos
, bool enable
)
820 wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
822 m_rootMenu
->FindItemByPosition(pos
+firstMenuPos
)->Enable(enable
);
827 bool wxMenuBar::Enable(bool enable
)
829 wxCHECK_MSG( IsAttached(), false, wxT("doesn't work with unattached menubars") );
832 for (i
= 0; i
< GetMenuCount(); i
++)
833 EnableTop(i
, enable
);
838 void wxMenuBar::SetMenuLabel(size_t pos
, const wxString
& label
)
840 wxCHECK_RET( pos
< GetMenuCount(), wxT("invalid menu index") );
842 GetMenu(pos
)->SetTitle( label
) ;
845 wxString
wxMenuBar::GetMenuLabel(size_t pos
) const
847 wxCHECK_MSG( pos
< GetMenuCount(), wxEmptyString
,
848 wxT("invalid menu index in wxMenuBar::GetMenuLabel") );
850 return GetMenu(pos
)->GetTitle();
853 // ---------------------------------------------------------------------------
854 // wxMenuBar construction
855 // ---------------------------------------------------------------------------
857 wxMenu
*wxMenuBar::Replace(size_t pos
, wxMenu
*menu
, const wxString
& title
)
859 wxMenu
*menuOld
= wxMenuBarBase::Replace(pos
, menu
, title
);
863 wxMenuItem
* item
= m_rootMenu
->FindItemByPosition(pos
+firstMenuPos
);
864 m_rootMenu
->Remove(item
);
865 m_rootMenu
->Insert( pos
+firstMenuPos
, wxMenuItem::New( m_rootMenu
, wxID_ANY
, title
, "", wxITEM_NORMAL
, menu
) );
870 bool wxMenuBar::Insert(size_t pos
, wxMenu
*menu
, const wxString
& title
)
872 if ( !wxMenuBarBase::Insert(pos
, menu
, title
) )
875 m_rootMenu
->Insert( pos
+firstMenuPos
, wxMenuItem::New( m_rootMenu
, wxID_ANY
, title
, "", wxITEM_NORMAL
, menu
) );
880 wxMenu
*wxMenuBar::Remove(size_t pos
)
882 wxMenu
*menu
= wxMenuBarBase::Remove(pos
);
886 wxMenuItem
* item
= m_rootMenu
->FindItemByPosition(pos
+firstMenuPos
);
887 m_rootMenu
->Remove(item
);
892 bool wxMenuBar::Append(wxMenu
*menu
, const wxString
& title
)
894 WXHMENU submenu
= menu
? menu
->GetHMenu() : 0;
895 wxCHECK_MSG( submenu
, false, wxT("can't append invalid menu to menubar") );
897 if ( !wxMenuBarBase::Append(menu
, title
) )
900 m_rootMenu
->AppendSubMenu(menu
, title
);
901 menu
->SetTitle(title
);
906 void wxMenuBar::Detach()
908 wxMenuBarBase::Detach() ;
911 void wxMenuBar::Attach(wxFrame
*frame
)
913 wxMenuBarBase::Attach( frame
) ;
916 #endif // wxUSE_MENUS