1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxMenu, wxMenuBar, wxMenuItem 
   4 // Author:      Stefan Csomor 
   8 // Copyright:   (c) Stefan Csomor 
   9 // Licence:       wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "menu.h" 
  14 #pragma implementation "menuitem.h" 
  17 // ============================================================================ 
  18 // headers & declarations 
  19 // ============================================================================ 
  26 #include "wx/menuitem.h" 
  27 #include "wx/window.h" 
  32 #include "wx/mac/uma.h" 
  34 // other standard headers 
  35 // ---------------------- 
  38 #if !USE_SHARED_LIBRARY 
  39 IMPLEMENT_DYNAMIC_CLASS(wxMenu
, wxEvtHandler
) 
  40 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar
, wxEvtHandler
) 
  43 // the (popup) menu title has this special id 
  44 static const int idMenuTitle 
= -2; 
  45 static MenuItemIndex firstUserHelpMenuItem 
= 0 ; 
  47 const short kwxMacMenuBarResource 
= 1 ; 
  48 const short kwxMacAppleMenuId 
= 1 ; 
  50 // ============================================================================ 
  52 // ============================================================================ 
  53 static void wxMenubarUnsetInvokingWindow( wxMenu 
*menu 
) ; 
  54 static void wxMenubarSetInvokingWindow( wxMenu 
*menu
, wxWindow 
*win 
); 
  58 // Construct a menu with optional title (then use append) 
  61 short wxMenu::s_macNextMenuId 
= 3 ; 
  63 short wxMenu::s_macNextMenuId 
= 2 ; 
  69     m_startRadioGroup 
= -1; 
  72     m_macMenuId 
= s_macNextMenuId
++; 
  73     m_hMenu 
= UMANewMenu(m_macMenuId
, m_title
, wxFont::GetDefaultEncoding() ); 
  77         wxLogLastError(wxT("UMANewMenu failed")); 
  80     // if we have a title, insert it in the beginning of the menu 
  83         Append(idMenuTitle
, m_title
) ; 
  90     if (MAC_WXHMENU(m_hMenu
)) 
  91         ::DisposeMenu(MAC_WXHMENU(m_hMenu
)); 
  96     // not available on the mac platform 
  99 void wxMenu::Attach(wxMenuBarBase 
*menubar
) 
 101     wxMenuBase::Attach(menubar
); 
 106 // function appends a new item or submenu to the menu 
 107 // append a new item or submenu to the menu 
 108 bool wxMenu::DoInsertOrAppend(wxMenuItem 
*pItem
, size_t pos
) 
 110     wxASSERT_MSG( pItem 
!= NULL
, wxT("can't append NULL item to the menu") ); 
 112     if ( pItem
->IsSeparator() ) 
 114         if ( pos 
== (size_t)-1 ) 
 115             MacAppendMenu(MAC_WXHMENU(m_hMenu
), "\p-"); 
 117             MacInsertMenuItem(MAC_WXHMENU(m_hMenu
), "\p-" , pos
); 
 121         wxMenu 
*pSubMenu 
= pItem
->GetSubMenu() ; 
 122         if ( pSubMenu 
!= NULL 
) 
 124                wxASSERT_MSG( pSubMenu
->m_hMenu 
!= NULL 
, wxT("invalid submenu added")); 
 125             pSubMenu
->m_menuParent 
= this ; 
 127             if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar
) 
 129                 pSubMenu
->MacBeforeDisplay( true ) ; 
 132             if ( pos 
== (size_t)-1 ) 
 133                 UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu
), pItem
->GetText(), wxFont::GetDefaultEncoding() , pSubMenu
->m_macMenuId
); 
 135                 UMAInsertSubMenuItem(MAC_WXHMENU(m_hMenu
), pItem
->GetText(), wxFont::GetDefaultEncoding()  , pos
, pSubMenu
->m_macMenuId
); 
 136             pItem
->UpdateItemBitmap() ; 
 137             pItem
->UpdateItemStatus() ; 
 141             if ( pos 
== (size_t)-1 ) 
 143                 UMAAppendMenuItem(MAC_WXHMENU(m_hMenu
), wxT("a") , wxFont::GetDefaultEncoding() ); 
 144                 pos 
= CountMenuItems(MAC_WXHMENU(m_hMenu
)) ; 
 148                 // MacOS counts menu items from 1 and inserts after, therefore having the 
 149                 // same effect as wx 0 based and inserting before, we must correct pos 
 150                 // after however for updates to be correct 
 151                 UMAInsertMenuItem(MAC_WXHMENU(m_hMenu
), wxT("a"), wxFont::GetDefaultEncoding(), pos
); 
 155             SetMenuItemCommandID( MAC_WXHMENU(m_hMenu
) , pos 
, pItem
->GetId() ) ; 
 156             pItem
->UpdateItemText() ; 
 157             pItem
->UpdateItemBitmap() ; 
 158             pItem
->UpdateItemStatus() ; 
 160               if ( pItem
->GetId() == idMenuTitle 
) 
 162                 UMAEnableMenuItem(MAC_WXHMENU(m_hMenu
) , pos 
, false ) ; 
 166     // if we're already attached to the menubar, we must update it 
 169         m_menuBar
->Refresh(); 
 174 void wxMenu::EndRadioGroup() 
 176     // we're not inside a radio group any longer 
 177     m_startRadioGroup 
= -1; 
 180 wxMenuItem
* wxMenu::DoAppend(wxMenuItem 
*item
) 
 182     wxCHECK_MSG( item
, NULL
, _T("NULL item in wxMenu::DoAppend") ); 
 186     if ( item
->GetKind() == wxITEM_RADIO 
) 
 188         int count 
= GetMenuItemCount(); 
 190         if ( m_startRadioGroup 
== -1 ) 
 192             // start a new radio group 
 193             m_startRadioGroup 
= count
; 
 195             // for now it has just one element 
 196             item
->SetAsRadioGroupStart(); 
 197             item
->SetRadioGroupEnd(m_startRadioGroup
); 
 199             // ensure that we have a checked item in the radio group 
 202         else // extend the current radio group 
 204             // we need to update its end item 
 205             item
->SetRadioGroupStart(m_startRadioGroup
); 
 206             wxMenuItemList::Node 
*node 
= GetMenuItems().Item(m_startRadioGroup
); 
 210                 node
->GetData()->SetRadioGroupEnd(count
); 
 214                 wxFAIL_MSG( _T("where is the radio group start item?") ); 
 218     else // not a radio item 
 223     if ( !wxMenuBase::DoAppend(item
) || !DoInsertOrAppend(item
) ) 
 230         // check the item initially 
 237 wxMenuItem
* wxMenu::DoInsert(size_t pos
, wxMenuItem 
*item
) 
 239     if (wxMenuBase::DoInsert(pos
, item
) && DoInsertOrAppend(item
, pos
)) 
 245 wxMenuItem 
*wxMenu::DoRemove(wxMenuItem 
*item
) 
 247     // we need to find the items position in the child list 
 249     wxMenuItemList::Node 
*node 
= GetMenuItems().GetFirst(); 
 250     for ( pos 
= 0; node
; pos
++ ) 
 252         if ( node
->GetData() == item 
) 
 255         node 
= node
->GetNext(); 
 258     // DoRemove() (unlike Remove) can only be called for existing item! 
 259     wxCHECK_MSG( node
, NULL
, wxT("bug in wxMenu::Remove logic") ); 
 261     ::DeleteMenuItem(MAC_WXHMENU(m_hMenu
) , pos 
+ 1); 
 265         // otherwise, the change won't be visible 
 266         m_menuBar
->Refresh(); 
 269     // and from internal data structures 
 270     return wxMenuBase::DoRemove(item
); 
 273 void wxMenu::SetTitle(const wxString
& label
) 
 276     UMASetMenuTitle(MAC_WXHMENU(m_hMenu
) , label 
, wxFont::GetDefaultEncoding() ) ; 
 278 bool wxMenu::ProcessCommand(wxCommandEvent 
& event
) 
 280     bool processed 
= FALSE
; 
 282     // Try the menu's event handler 
 283     if ( !processed 
&& GetEventHandler()) 
 285         processed 
= GetEventHandler()->ProcessEvent(event
); 
 288     // Try the window the menu was popped up from (and up through the 
 290     wxWindow 
*win 
= GetInvokingWindow(); 
 291     if ( !processed 
&& win 
) 
 292         processed 
= win
->GetEventHandler()->ProcessEvent(event
); 
 298 // --------------------------------------------------------------------------- 
 300 // --------------------------------------------------------------------------- 
 302 wxWindow 
*wxMenu::GetWindow() const 
 304     if ( m_invokingWindow 
!= NULL 
) 
 305         return m_invokingWindow
; 
 306     else if ( m_menuBar 
!= NULL
) 
 307         return (wxWindow 
*) m_menuBar
->GetFrame(); 
 312 // helper functions returning the mac menu position for a certain item, note that this is 
 313 // mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0 
 315 int wxMenu::MacGetIndexFromId( int id 
) 
 318     wxMenuItemList::Node 
*node 
= GetMenuItems().GetFirst(); 
 319     for ( pos 
= 0; node
; pos
++ ) 
 321         if ( node
->GetData()->GetId() == id 
) 
 324         node 
= node
->GetNext(); 
 333 int wxMenu::MacGetIndexFromItem( wxMenuItem 
*pItem 
) 
 336     wxMenuItemList::Node 
*node 
= GetMenuItems().GetFirst(); 
 337     for ( pos 
= 0; node
; pos
++ ) 
 339         if ( node
->GetData() == pItem 
) 
 342         node 
= node
->GetNext(); 
 351 void wxMenu::MacEnableMenu( bool bDoEnable 
) 
 353     UMAEnableMenuItem(MAC_WXHMENU(m_hMenu
) , 0 , bDoEnable 
) ; 
 358 // MacOS needs to know about submenus somewhere within this menu 
 359 // before it can be displayed , also hide special menu items like preferences 
 360 // that are handled by the OS 
 361 void wxMenu::MacBeforeDisplay( bool isSubMenu 
) 
 363     wxMenuItem
* previousItem 
= NULL 
; 
 365     wxMenuItemList::Node 
*node
; 
 367     for (pos 
= 0, node 
= GetMenuItems().GetFirst(); node
; node 
= node
->GetNext(), pos
++) 
 369         item 
= (wxMenuItem 
*)node
->GetData(); 
 370         wxMenu
* subMenu 
= item
->GetSubMenu() ; 
 373             subMenu
->MacBeforeDisplay( true ) ; 
 378             if ( UMAGetSystemVersion() >= 0x1000 ) 
 380                 if ( item
->GetId() == wxApp::s_macPreferencesMenuItemId 
|| item
->GetId() == wxApp::s_macExitMenuItemId
) 
 382                     ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos 
+ 1, kMenuItemAttrHidden
, 0 ); 
 383                     if ( GetMenuItems().GetCount() == pos 
+ 1 && 
 384                             previousItem 
!= NULL 
&& 
 385                                 previousItem
->IsSeparator() ) 
 387                         ChangeMenuItemAttributes( MAC_WXHMENU( GetHMenu() ) , pos 
, kMenuItemAttrHidden
, 0 ); 
 393         previousItem 
= item 
; 
 397         ::InsertMenu(MAC_WXHMENU( GetHMenu()), -1); 
 400 // undo all changes from the MacBeforeDisplay call 
 401 void wxMenu::MacAfterDisplay( bool isSubMenu 
) 
 404         ::DeleteMenu(MacGetMenuId()); 
 406     wxMenuItem
* previousItem 
= NULL 
; 
 408     wxMenuItemList::Node 
*node
; 
 410     for (pos 
= 0, node 
= GetMenuItems().GetFirst(); node
; node 
= node
->GetNext(), pos
++) 
 412         item 
= (wxMenuItem 
*)node
->GetData(); 
 413         wxMenu
* subMenu 
= item
->GetSubMenu() ; 
 416             subMenu
->MacAfterDisplay( true ) ; 
 420             // no need to undo hidings 
 422         previousItem 
= item 
; 
 430 Mac Implementation note : 
 432 The Mac has only one global menubar, so we attempt to install the currently 
 433 active menubar from a frame, we currently don't take into account mdi-frames 
 434 which would ask for menu-merging 
 436 Secondly there is no mac api for changing a menubar that is not the current 
 437 menubar, so we have to wait for preparing the actual menubar until the 
 438 wxMenubar is to be used 
 440 We can in subsequent versions use MacInstallMenuBar to provide some sort of 
 441 auto-merge for MDI in case this will be necessary 
 445 wxMenuBar
* wxMenuBar::s_macInstalledMenuBar 
= NULL 
; 
 446 wxMenuBar
* wxMenuBar::s_macCommonMenuBar 
= NULL 
; 
 448 void wxMenuBar::Init() 
 450     m_eventHandler 
= this; 
 451     m_menuBarFrame 
= NULL
; 
 452     m_invokingWindow 
= (wxWindow
*) NULL
; 
 455 wxMenuBar::wxMenuBar() 
 460 wxMenuBar::wxMenuBar( long WXUNUSED(style
) ) 
 466 wxMenuBar::wxMenuBar(int count
, wxMenu 
*menus
[], const wxString titles
[]) 
 470     m_titles
.Alloc(count
); 
 472     for ( int i 
= 0; i 
< count
; i
++ ) 
 474         m_menus
.Append(menus
[i
]); 
 475         m_titles
.Add(titles
[i
]); 
 477         menus
[i
]->Attach(this); 
 481 wxMenuBar::~wxMenuBar() 
 483     if (s_macCommonMenuBar 
== this) 
 484         s_macCommonMenuBar 
= NULL
; 
 485     if (s_macInstalledMenuBar 
== this) 
 488         s_macInstalledMenuBar 
= NULL
; 
 493 void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground
), const wxRect 
*WXUNUSED(rect
)) 
 495     wxCHECK_RET( IsAttached(), wxT("can't refresh unatteched menubar") ); 
 500 void wxMenuBar::MacInstallMenuBar() 
 502     if ( s_macInstalledMenuBar 
== this ) 
 505     wxStAppResource resload 
; 
 507     Handle menubar 
= ::GetNewMBar( kwxMacMenuBarResource 
) ; 
 509     wxCHECK_RET( menubar 
!= NULL
, wxT("can't read MBAR resource") ); 
 510     ::SetMenuBar( menubar 
) ; 
 511 #if TARGET_API_MAC_CARBON 
 512     ::DisposeMenuBar( menubar 
) ; 
 514     ::DisposeHandle( menubar 
) ; 
 517 #if TARGET_API_MAC_OS8 
 518     MenuHandle menu 
= ::GetMenuHandle( kwxMacAppleMenuId 
) ; 
 519     if ( CountMenuItems( menu 
) == 2 ) 
 521         ::AppendResMenu(menu
, 'DRVR'); 
 525     // clean-up the help menu before adding new items 
 526     MenuHandle mh 
= NULL 
; 
 527     if ( UMAGetHelpMenu( &mh 
, &firstUserHelpMenuItem
) == noErr 
) 
 529         for ( int i 
= CountMenuItems( mh 
) ; i 
>= firstUserHelpMenuItem 
; --i 
) 
 531             DeleteMenuItem( mh 
, i 
) ; 
 539     if ( UMAGetSystemVersion() >= 0x1000 && wxApp::s_macPreferencesMenuItemId
) 
 541         wxMenuItem 
*item 
= FindItem( wxApp::s_macPreferencesMenuItemId 
, NULL 
) ; 
 542         if ( item 
== NULL 
|| !(item
->IsEnabled()) ) 
 543             DisableMenuCommand( NULL 
, kHICommandPreferences 
) ; 
 545             EnableMenuCommand( NULL 
, kHICommandPreferences 
) ; 
 548        for (size_t i 
= 0; i 
< m_menus
.GetCount(); i
++) 
 550         wxMenuItemList::Node 
*node
; 
 553         wxMenu
* menu 
= m_menus
[i
] , *subMenu 
= NULL 
; 
 555         if( m_titles
[i
] == wxT("?") || m_titles
[i
] == wxT("&?")  || m_titles
[i
] == wxApp::s_macHelpMenuTitleName 
) 
 562               for (pos 
= 0 , node 
= menu
->GetMenuItems().GetFirst(); node
; node 
= node
->GetNext(), pos
++) 
 564                  item 
= (wxMenuItem 
*)node
->GetData(); 
 565                  subMenu 
= item
->GetSubMenu() ; 
 568                     // we don't support hierarchical menus in the help menu yet 
 572                     if ( item
->IsSeparator() ) 
 575                             MacAppendMenu(mh
, "\p-" ); 
 579                         wxAcceleratorEntry
* entry 
= wxGetAccelFromString( item
->GetText() ) ; 
 581                         if ( item
->GetId() == wxApp::s_macAboutMenuItemId 
) 
 583                                 UMASetMenuItemText( GetMenuHandle( kwxMacAppleMenuId 
) , 1 , item
->GetText() , wxFont::GetDefaultEncoding() ); 
 584                                 UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId 
) , 1 , true ); 
 585                                 SetMenuItemCommandID( GetMenuHandle( kwxMacAppleMenuId 
) , 1 , item
->GetId() ) ; 
 586                                 UMASetMenuItemShortcut( GetMenuHandle( kwxMacAppleMenuId 
) , 1 , entry 
) ; 
 592                                 UMAAppendMenuItem(mh
, item
->GetText()  , wxFont::GetDefaultEncoding(), entry
); 
 593                                 SetMenuItemCommandID( mh 
, CountMenuItems(mh
) , item
->GetId() ) ; 
 604             UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , m_titles
[i
], m_font
.GetEncoding()  ) ; 
 605             m_menus
[i
]->MacBeforeDisplay(false) ; 
 606             ::InsertMenu(MAC_WXHMENU(m_menus
[i
]->GetHMenu()), 0); 
 610     s_macInstalledMenuBar 
= this; 
 613 void wxMenuBar::EnableTop(size_t pos
, bool enable
) 
 615     wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") ); 
 616     m_menus
[pos
]->MacEnableMenu( enable 
) ; 
 620 void wxMenuBar::SetLabelTop(size_t pos
, const wxString
& label
) 
 622     wxCHECK_RET( pos 
< GetMenuCount(), wxT("invalid menu index") ); 
 624     m_titles
[pos
] = label
; 
 631     m_menus
[pos
]->SetTitle( label 
) ; 
 632     if (wxMenuBar::s_macInstalledMenuBar 
== this) // are we currently installed ? 
 634         ::SetMenuBar( GetMenuBar() ) ; 
 639 wxString 
wxMenuBar::GetLabelTop(size_t pos
) const 
 641     wxCHECK_MSG( pos 
< GetMenuCount(), wxEmptyString
, 
 642                  wxT("invalid menu index in wxMenuBar::GetLabelTop") ); 
 644     return m_titles
[pos
]; 
 647 int wxMenuBar::FindMenu(const wxString
& title
) 
 649     wxString menuTitle 
= wxStripMenuCodes(title
); 
 651     size_t count 
= GetMenuCount(); 
 652     for ( size_t i 
= 0; i 
< count
; i
++ ) 
 654         wxString title 
= wxStripMenuCodes(m_titles
[i
]); 
 655         if ( menuTitle 
== title 
) 
 664 // --------------------------------------------------------------------------- 
 665 // wxMenuBar construction 
 666 // --------------------------------------------------------------------------- 
 668 // --------------------------------------------------------------------------- 
 669 // wxMenuBar construction 
 670 // --------------------------------------------------------------------------- 
 672 wxMenu 
*wxMenuBar::Replace(size_t pos
, wxMenu 
*menu
, const wxString
& title
) 
 674     wxMenu 
*menuOld 
= wxMenuBarBase::Replace(pos
, menu
, title
); 
 677     m_titles
[pos
] = title
; 
 681         if (s_macInstalledMenuBar 
== this) 
 683             menuOld
->MacAfterDisplay( false ) ; 
 684             ::DeleteMenu( menuOld
->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ; 
 686                 menu
->MacBeforeDisplay( false ) ; 
 687                 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , title 
, m_font
.GetEncoding() ) ; 
 688                 if ( pos 
== m_menus
.GetCount() - 1) 
 690                     ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ; 
 694                     ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , m_menus
[pos
+1]->MacGetMenuId() ) ; 
 705 bool wxMenuBar::Insert(size_t pos
, wxMenu 
*menu
, const wxString
& title
) 
 707     if ( !wxMenuBarBase::Insert(pos
, menu
, title
) ) 
 710     m_titles
.Insert(title
, pos
); 
 712     UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , title 
, m_font
.GetEncoding() ) ; 
 714     if ( IsAttached() && s_macInstalledMenuBar 
== this ) 
 716         if (s_macInstalledMenuBar 
== this) 
 718             menu
->MacBeforeDisplay( false ) ; 
 719             if ( pos 
== (size_t) -1  || pos 
+ 1 == m_menus
.GetCount() ) 
 721                 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ; 
 725                 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , m_menus
[pos
+1]->MacGetMenuId() ) ; 
 734 wxMenu 
*wxMenuBar::Remove(size_t pos
) 
 736     wxMenu 
*menu 
= wxMenuBarBase::Remove(pos
); 
 742         if (s_macInstalledMenuBar 
== this) 
 744             ::DeleteMenu( menu
->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ; 
 750     m_titles
.RemoveAt(pos
); 
 755 bool wxMenuBar::Append(wxMenu 
*menu
, const wxString
& title
) 
 757     WXHMENU submenu 
= menu 
? menu
->GetHMenu() : 0; 
 758     wxCHECK_MSG( submenu
, FALSE
, wxT("can't append invalid menu to menubar") ); 
 760     if ( !wxMenuBarBase::Append(menu
, title
) ) 
 765     UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , title 
, m_font
.GetEncoding() ) ; 
 769         if (s_macInstalledMenuBar 
== this) 
 771             ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ; 
 777    // m_invokingWindow is set after wxFrame::SetMenuBar(). This call enables 
 778     // adding menu later on. 
 779     if (m_invokingWindow
) 
 780         wxMenubarSetInvokingWindow( menu
, m_invokingWindow 
); 
 785 static void wxMenubarUnsetInvokingWindow( wxMenu 
*menu 
) 
 787     menu
->SetInvokingWindow( (wxWindow
*) NULL 
); 
 789     wxMenuItemList::Node 
*node 
= menu
->GetMenuItems().GetFirst(); 
 792         wxMenuItem 
*menuitem 
= node
->GetData(); 
 793         if (menuitem
->IsSubMenu()) 
 794             wxMenubarUnsetInvokingWindow( menuitem
->GetSubMenu() ); 
 795         node 
= node
->GetNext(); 
 799 static void wxMenubarSetInvokingWindow( wxMenu 
*menu
, wxWindow 
*win 
) 
 801     menu
->SetInvokingWindow( win 
); 
 803     wxMenuItemList::Node 
*node 
= menu
->GetMenuItems().GetFirst(); 
 806         wxMenuItem 
*menuitem 
= node
->GetData(); 
 807         if (menuitem
->IsSubMenu()) 
 808             wxMenubarSetInvokingWindow( menuitem
->GetSubMenu() , win 
); 
 809         node 
= node
->GetNext(); 
 813 void wxMenuBar::UnsetInvokingWindow() 
 815     m_invokingWindow 
= (wxWindow
*) NULL
; 
 816     wxMenuList::Node 
*node 
= m_menus
.GetFirst(); 
 819         wxMenu 
*menu 
= node
->GetData(); 
 820         wxMenubarUnsetInvokingWindow( menu 
); 
 821         node 
= node
->GetNext(); 
 825 void wxMenuBar::SetInvokingWindow(wxFrame 
*frame
) 
 827     m_invokingWindow 
= frame
; 
 828     wxMenuList::Node 
*node 
= m_menus
.GetFirst(); 
 831         wxMenu 
*menu 
= node
->GetData(); 
 832         wxMenubarSetInvokingWindow( menu
, frame 
); 
 833         node 
= node
->GetNext(); 
 837 void wxMenuBar::Detach() 
 839     wxMenuBarBase::Detach() ; 
 842 void wxMenuBar::Attach(wxFrame 
*frame
) 
 844     wxMenuBarBase::Attach( frame 
) ; 
 846 // --------------------------------------------------------------------------- 
 847 // wxMenuBar searching for menu items 
 848 // --------------------------------------------------------------------------- 
 850 // Find the itemString in menuString, and return the item id or wxNOT_FOUND 
 851 int wxMenuBar::FindMenuItem(const wxString
& menuString
, 
 852                             const wxString
& itemString
) const 
 854     wxString menuLabel 
= wxStripMenuCodes(menuString
); 
 855     size_t count 
= GetMenuCount(); 
 856     for ( size_t i 
= 0; i 
< count
; i
++ ) 
 858         wxString title 
= wxStripMenuCodes(m_titles
[i
]); 
 859         if ( menuString 
== title 
) 
 860             return m_menus
[i
]->FindItem(itemString
); 
 866 wxMenuItem 
*wxMenuBar::FindItem(int id
, wxMenu 
**itemMenu
) const 
 871     wxMenuItem 
*item 
= NULL
; 
 872     size_t count 
= GetMenuCount(); 
 873     for ( size_t i 
= 0; !item 
&& (i 
< count
); i
++ ) 
 875         item 
= m_menus
[i
]->FindItem(id
, itemMenu
);