1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxMenu, wxMenuBar, wxMenuItem
8 // Copyright: (c) AUTHOR
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
14 // headers & declarations
15 // ============================================================================
21 #pragma implementation "menu.h"
22 #pragma implementation "menuitem.h"
27 #include "wx/menuitem.h"
28 #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 // ============================================================================
57 // Construct a menu with optional title (then use append)
60 short wxMenu::s_macNextMenuId
= 3 ;
62 short wxMenu::s_macNextMenuId
= 2 ;
71 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, m_title
, false );
72 m_macMenuId
= s_macNextMenuId
++;
73 wxCHECK_RET( s_macNextMenuId
< 236 , "menu ids > 235 cannot be used for submenus on mac" );
74 m_hMenu
= ::NewMenu(m_macMenuId
, label
);
78 wxLogLastError("CreatePopupMenu");
81 // if we have a title, insert it in the beginning of the menu
84 Append(idMenuTitle
, m_title
) ;
91 if (MAC_WXHMENU(m_hMenu
))
92 ::DisposeMenu(MAC_WXHMENU(m_hMenu
));
96 WX_CLEAR_ARRAY(m_accels
);
102 // not available on the mac platform
107 int wxMenu::FindAccel(int id
) const
109 size_t n
, count
= m_accels
.GetCount();
110 for ( n
= 0; n
< count
; n
++ )
112 if ( m_accels
[n
]->m_command
== id
)
119 void wxMenu::UpdateAccel(wxMenuItem
*item
)
121 // find the (new) accel for this item
122 wxAcceleratorEntry
*accel
= wxGetAccelFromString(item
->GetText());
124 accel
->m_command
= item
->GetId();
127 int n
= FindAccel(item
->GetId());
128 if ( n
== wxNOT_FOUND
)
130 // no old, add new if any
134 return; // skipping RebuildAccelTable() below
138 // replace old with new or just remove the old one if no new
143 m_accels
.RemoveAt(n
);
148 m_menuBar
->RebuildAccelTable();
152 #endif // wxUSE_ACCEL
154 // function appends a new item or submenu to the menu
155 // append a new item or submenu to the menu
156 bool wxMenu::DoInsertOrAppend(wxMenuItem
*pItem
, size_t pos
)
158 wxASSERT_MSG( pItem
!= NULL
, "can't append NULL item to the menu" );
161 #endif // wxUSE_ACCEL
163 if ( pItem
->IsSeparator() )
165 if ( pos
== (size_t)-1 )
167 MacAppendMenu(MAC_WXHMENU(m_hMenu
), "\p-");
171 MacInsertMenuItem(MAC_WXHMENU(m_hMenu
), "\p-" , pos
);
176 wxMenu
*pSubMenu
= pItem
->GetSubMenu() ;
177 if ( pSubMenu
!= NULL
)
180 wxASSERT_MSG( pSubMenu
->m_hMenu
!= NULL
, "invalid submenu added");
181 pSubMenu
->m_menuParent
= this ;
182 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, pItem
->GetText() ,false);
184 if (wxMenuBar::MacGetInstalledMenuBar() == m_menuBar
)
186 ::InsertMenu( MAC_WXHMENU( pSubMenu
->m_hMenu
) , -1 ) ;
189 if ( pos
== (size_t)-1 )
191 UMAAppendSubMenuItem(MAC_WXHMENU(m_hMenu
), label
, pSubMenu
->m_macMenuId
);
195 UMAInsertSubMenuItem(MAC_WXHMENU(m_hMenu
), label
, pos
, pSubMenu
->m_macMenuId
);
203 wxMenuItem::MacBuildMenuString( label
, &key
, &modifiers
, pItem
->GetText(), pItem
->GetId() == wxApp::s_macAboutMenuItemId
);
206 // we cannot add empty menus on mac
210 if ( pos
== (size_t)-1 )
212 UMAAppendMenuItem(MAC_WXHMENU(m_hMenu
), label
,key
,modifiers
);
216 UMAInsertMenuItem(MAC_WXHMENU(m_hMenu
), label
, pos
,key
,modifiers
);
218 if ( pItem
->GetId() == idMenuTitle
)
220 if ( pos
== (size_t)-1 )
222 UMADisableMenuItem(MAC_WXHMENU(m_hMenu
) , CountMenuItems(MAC_WXHMENU(m_hMenu
) ) ) ;
226 UMADisableMenuItem(MAC_WXHMENU(m_hMenu
) , pos
+ 1 ) ;
231 // if we're already attached to the menubar, we must update it
234 m_menuBar
->Refresh();
239 bool wxMenu::DoAppend(wxMenuItem
*item
)
241 return wxMenuBase::DoAppend(item
) && DoInsertOrAppend(item
);
244 bool wxMenu::DoInsert(size_t pos
, wxMenuItem
*item
)
246 return wxMenuBase::DoInsert(pos
, item
) && DoInsertOrAppend(item
, pos
);
249 wxMenuItem
*wxMenu::DoRemove(wxMenuItem
*item
)
251 // we need to find the items position in the child list
253 wxMenuItemList::Node
*node
= GetMenuItems().GetFirst();
254 for ( pos
= 0; node
; pos
++ )
256 if ( node
->GetData() == item
)
259 node
= node
->GetNext();
262 // DoRemove() (unlike Remove) can only be called for existing item!
263 wxCHECK_MSG( node
, NULL
, wxT("bug in wxMenu::Remove logic") );
266 // remove the corresponding accel from the accel table
267 int n
= FindAccel(item
->GetId());
268 if ( n
!= wxNOT_FOUND
)
272 m_accels
.RemoveAt(n
);
274 //else: this item doesn't have an accel, nothing to do
275 #endif // wxUSE_ACCEL
277 ::DeleteMenuItem(MAC_WXHMENU(m_hMenu
) , pos
+ 1);
281 // otherwise, the chane won't be visible
282 m_menuBar
->Refresh();
285 // and from internal data structures
286 return wxMenuBase::DoRemove(item
);
289 // ---------------------------------------------------------------------------
290 // accelerator helpers
291 // ---------------------------------------------------------------------------
295 // create the wxAcceleratorEntries for our accels and put them into provided
296 // array - return the number of accels we have
297 size_t wxMenu::CopyAccels(wxAcceleratorEntry
*accels
) const
299 size_t count
= GetAccelCount();
300 for ( size_t n
= 0; n
< count
; n
++ )
302 *accels
++ = *m_accels
[n
];
308 #endif // wxUSE_ACCEL
310 void wxMenu::SetTitle(const wxString
& label
)
314 wxMenuItem::MacBuildMenuString( title
, NULL
, NULL
, label
, false );
315 UMASetMenuTitle(MAC_WXHMENU(m_hMenu
) , title
) ;
317 bool wxMenu::ProcessCommand(wxCommandEvent
& event
)
319 bool processed
= FALSE
;
321 #if WXWIN_COMPATIBILITY
325 (void)(*(m_callback
))(*this, event
);
328 #endif WXWIN_COMPATIBILITY
330 // Try the menu's event handler
331 if ( !processed
&& GetEventHandler())
333 processed
= GetEventHandler()->ProcessEvent(event
);
336 // Try the window the menu was popped up from (and up through the
338 wxWindow
*win
= GetInvokingWindow();
339 if ( !processed
&& win
)
340 processed
= win
->GetEventHandler()->ProcessEvent(event
);
346 // ---------------------------------------------------------------------------
348 // ---------------------------------------------------------------------------
350 wxWindow
*wxMenu::GetWindow() const
352 if ( m_invokingWindow
!= NULL
)
353 return m_invokingWindow
;
354 else if ( m_menuBar
!= NULL
)
355 return (wxWindow
*) m_menuBar
->GetFrame();
360 // helper functions returning the mac menu position for a certain item, note that this is
361 // mac-wise 1 - based, i.e. the first item has index 1 whereas on MSWin it has pos 0
363 int wxMenu::MacGetIndexFromId( int id
)
366 wxMenuItemList::Node
*node
= GetMenuItems().GetFirst();
367 for ( pos
= 0; node
; pos
++ )
369 if ( node
->GetData()->GetId() == id
)
372 node
= node
->GetNext();
381 int wxMenu::MacGetIndexFromItem( wxMenuItem
*pItem
)
384 wxMenuItemList::Node
*node
= GetMenuItems().GetFirst();
385 for ( pos
= 0; node
; pos
++ )
387 if ( node
->GetData() == pItem
)
390 node
= node
->GetNext();
399 void wxMenu::MacEnableMenu( bool bDoEnable
)
402 UMAEnableMenuItem(MAC_WXHMENU(m_hMenu
) , 0 ) ;
404 UMADisableMenuItem(MAC_WXHMENU(m_hMenu
) , 0 ) ;
409 bool wxMenu::MacMenuSelect( wxEvtHandler
* handler
, long when
, int macMenuId
, int macMenuItemNum
)
414 if ( m_macMenuId
== macMenuId
)
416 node
= GetMenuItems().Nth(macMenuItemNum
-1);
419 wxMenuItem
*pItem
= (wxMenuItem
*)node
->Data();
421 if (pItem
->IsCheckable())
422 pItem
->Check(! pItem
->IsChecked());
424 wxCommandEvent
event(wxEVT_COMMAND_MENU_SELECTED
, pItem
->GetId());
425 event
.m_timeStamp
= when
;
426 event
.SetEventObject(handler
);
427 event
.SetInt( pItem
->GetId() );
429 bool processed
= false ;
431 #if WXWIN_COMPATIBILITY
435 (void) (*(m_callback
)) (*this, event
);
439 // Try the menu's event handler
440 if ( !processed
&& handler
)
442 processed
= handler
->ProcessEvent(event
);
445 // Try the window the menu was popped up from (and up
446 // through the hierarchy)
447 if ( !processed
&& GetInvokingWindow())
448 processed
= GetInvokingWindow()->GetEventHandler()->ProcessEvent(event
);
453 else if ( macMenuId
== kHMHelpMenuID
)
455 int menuItem
= firstUserHelpMenuItem
-1 ;
456 for (pos
= 0, node
= GetMenuItems().First(); node
; node
= node
->Next(), pos
++)
458 wxMenuItem
* pItem
= (wxMenuItem
*) node
->Data() ;
460 wxMenu
*pSubMenu
= pItem
->GetSubMenu() ;
461 if ( pSubMenu
!= NULL
)
466 if ( pItem
->GetId() != wxApp::s_macAboutMenuItemId
)
469 if ( menuItem
== macMenuItemNum
)
471 wxCommandEvent
event(wxEVT_COMMAND_MENU_SELECTED
, pItem
->GetId());
472 event
.m_timeStamp
= when
;
473 event
.SetEventObject(handler
);
474 event
.SetInt( pItem
->GetId() );
476 bool processed
= false ;
477 #if WXWIN_COMPATIBILITY
481 (void) (*(m_callback
)) (*this, event
);
485 // Try the menu's event handler
486 if ( !processed
&& handler
)
488 processed
= handler
->ProcessEvent(event
);
491 // Try the window the menu was popped up from (and up
492 // through the hierarchy)
493 if ( !processed
&& GetInvokingWindow())
494 processed
= GetInvokingWindow()->GetEventHandler()->ProcessEvent(event
);
502 for (pos
= 0, node
= GetMenuItems().First(); node
; node
= node
->Next(), pos
++)
504 wxMenuItem
* pItem
= (wxMenuItem
*) node
->Data() ;
506 wxMenu
*pSubMenu
= pItem
->GetSubMenu() ;
507 if ( pSubMenu
!= NULL
)
509 if ( pSubMenu
->MacMenuSelect( handler
, when
, macMenuId
, macMenuItemNum
) )
521 Mac Implementation note :
523 The Mac has only one global menubar, so we attempt to install the currently
524 active menubar from a frame, we currently don't take into account mdi-frames
525 which would ask for menu-merging
527 Secondly there is no mac api for changing a menubar that is not the current
528 menubar, so we have to wait for preparing the actual menubar until the
529 wxMenubar is to be used
531 We can in subsequent versions use MacInstallMenuBar to provide some sort of
532 auto-merge for MDI in case this will be necessary
536 wxMenuBar
* wxMenuBar::s_macInstalledMenuBar
= NULL
;
538 void wxMenuBar::Init()
540 m_eventHandler
= this;
541 m_menuBarFrame
= NULL
;
544 wxMenuBar::wxMenuBar()
549 wxMenuBar::wxMenuBar( long WXUNUSED(style
) )
555 wxMenuBar::wxMenuBar(int count
, wxMenu
*menus
[], const wxString titles
[])
559 m_titles
.Alloc(count
);
561 for ( int i
= 0; i
< count
; i
++ )
563 m_menus
.Append(menus
[i
]);
564 m_titles
.Add(titles
[i
]);
566 menus
[i
]->Attach(this);
570 wxMenuBar::~wxMenuBar()
572 if (s_macInstalledMenuBar
== this)
575 s_macInstalledMenuBar
= NULL
;
580 void wxMenuBar::Refresh(bool WXUNUSED(eraseBackground
), const wxRect
*WXUNUSED(rect
))
582 wxCHECK_RET( IsAttached(), wxT("can't refresh unatteched menubar") );
589 void wxMenuBar::RebuildAccelTable()
591 // merge the accelerators of all menus into one accel table
592 size_t nAccelCount
= 0;
593 size_t i
, count
= GetMenuCount();
594 for ( i
= 0; i
< count
; i
++ )
596 nAccelCount
+= m_menus
[i
]->GetAccelCount();
601 wxAcceleratorEntry
*accelEntries
= new wxAcceleratorEntry
[nAccelCount
];
604 for ( i
= 0; i
< count
; i
++ )
606 nAccelCount
+= m_menus
[i
]->CopyAccels(&accelEntries
[nAccelCount
]);
609 m_accelTable
= wxAcceleratorTable(nAccelCount
, accelEntries
);
611 delete [] accelEntries
;
615 #endif // wxUSE_ACCEL
617 void wxMenuBar::MacInstallMenuBar()
619 if ( s_macInstalledMenuBar
== this )
622 wxStAppResource resload
;
624 Handle menubar
= ::GetNewMBar( kwxMacMenuBarResource
) ;
626 wxCHECK_RET( menubar
!= NULL
, "can't read MBAR resource" );
627 ::SetMenuBar( menubar
) ;
628 #if TARGET_API_MAC_CARBON
629 ::DisposeMenuBar( menubar
) ;
631 ::DisposeHandle( menubar
) ;
634 #if TARGET_API_MAC_OS8
635 MenuHandle menu
= ::GetMenuHandle( kwxMacAppleMenuId
) ;
636 if ( CountMenuItems( menu
) == 2 )
638 ::AppendResMenu(menu
, 'DRVR');
642 for (size_t i
= 0; i
< m_menus
.GetCount(); i
++)
648 wxMenu
* menu
= m_menus
[i
] , *subMenu
= NULL
;
650 if( m_titles
[i
] == "?" || m_titles
[i
] == "&?" || m_titles
[i
] == wxApp::s_macHelpMenuTitleName
)
652 MenuHandle mh
= NULL
;
653 if ( UMAGetHelpMenu( &mh
, &firstUserHelpMenuItem
) != noErr
)
658 for ( int i
= CountMenuItems( mh
) ; i
>= firstUserHelpMenuItem
; --i
)
660 DeleteMenuItem( mh
, i
) ;
663 for (pos
= 0 , node
= menu
->GetMenuItems().First(); node
; node
= node
->Next(), pos
++)
665 item
= (wxMenuItem
*)node
->Data();
666 subMenu
= item
->GetSubMenu() ;
669 // we don't support hierarchical menus in the help menu yet
673 if ( item
->IsSeparator() )
676 MacAppendMenu(mh
, "\p-" );
683 wxMenuItem::MacBuildMenuString( label
, &key
, &modifiers
, item
->GetText(), item
->GetId() != wxApp::s_macAboutMenuItemId
); // no shortcut in about menu
686 // we cannot add empty menus on mac
690 if ( item
->GetId() == wxApp::s_macAboutMenuItemId
)
692 ::SetMenuItemText( GetMenuHandle( kwxMacAppleMenuId
) , 1 , label
);
693 UMAEnableMenuItem( GetMenuHandle( kwxMacAppleMenuId
) , 1 );
698 UMAAppendMenuItem(mh
, label
, key
, modifiers
);
706 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, m_titles
[i
] , false );
707 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , label
) ;
708 wxArrayPtrVoid submenus
;
710 for (pos
= 0, node
= menu
->GetMenuItems().First(); node
; node
= node
->Next(), pos
++)
712 item
= (wxMenuItem
*)node
->Data();
713 subMenu
= item
->GetSubMenu() ;
716 submenus
.Add(subMenu
) ;
719 ::InsertMenu(MAC_WXHMENU(m_menus
[i
]->GetHMenu()), 0);
720 for ( size_t i
= 0 ; i
< submenus
.GetCount() ; ++i
)
722 wxMenu
* submenu
= (wxMenu
*) submenus
[i
] ;
726 for ( subpos
= 0 , subnode
= submenu
->GetMenuItems().First(); subnode
; subnode
= subnode
->Next(), subpos
++)
728 subitem
= (wxMenuItem
*)subnode
->Data();
729 wxMenu
* itsSubMenu
= subitem
->GetSubMenu() ;
732 submenus
.Add(itsSubMenu
) ;
735 ::InsertMenu( MAC_WXHMENU(submenu
->GetHMenu()) , -1 ) ;
740 s_macInstalledMenuBar
= this;
743 void wxMenuBar::EnableTop(size_t pos
, bool enable
)
745 wxCHECK_RET( IsAttached(), wxT("doesn't work with unattached menubars") );
746 m_menus
[pos
]->MacEnableMenu( enable
) ;
750 void wxMenuBar::SetLabelTop(size_t pos
, const wxString
& label
)
752 wxCHECK_RET( pos
< GetMenuCount(), wxT("invalid menu index") );
754 m_titles
[pos
] = label
;
761 m_menus
[pos
]->SetTitle( label
) ;
762 if (wxMenuBar::s_macInstalledMenuBar
== this) // are we currently installed ?
764 ::SetMenuBar( GetMenuBar() ) ;
769 wxString
wxMenuBar::GetLabelTop(size_t pos
) const
771 wxCHECK_MSG( pos
< GetMenuCount(), wxEmptyString
,
772 wxT("invalid menu index in wxMenuBar::GetLabelTop") );
774 return m_titles
[pos
];
777 int wxMenuBar::FindMenu(const wxString
& title
)
779 wxString menuTitle
= wxStripMenuCodes(title
);
781 size_t count
= GetMenuCount();
782 for ( size_t i
= 0; i
< count
; i
++ )
784 wxString title
= wxStripMenuCodes(m_titles
[i
]);
785 if ( menuTitle
== title
)
794 // ---------------------------------------------------------------------------
795 // wxMenuBar construction
796 // ---------------------------------------------------------------------------
798 // ---------------------------------------------------------------------------
799 // wxMenuBar construction
800 // ---------------------------------------------------------------------------
802 wxMenu
*wxMenuBar::Replace(size_t pos
, wxMenu
*menu
, const wxString
& title
)
804 wxMenu
*menuOld
= wxMenuBarBase::Replace(pos
, menu
, title
);
807 m_titles
[pos
] = title
;
811 if (s_macInstalledMenuBar
== this)
813 ::DeleteMenu( menuOld
->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
816 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, title
, false );
817 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , label
) ;
818 if ( pos
== m_menus
.GetCount() - 1)
820 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ;
824 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , m_menus
[pos
+1]->MacGetMenuId() ) ;
831 if ( menuOld
->HasAccels() || menu
->HasAccels() )
833 // need to rebuild accell table
836 #endif // wxUSE_ACCEL
844 bool wxMenuBar::Insert(size_t pos
, wxMenu
*menu
, const wxString
& title
)
846 if ( !wxMenuBarBase::Insert(pos
, menu
, title
) )
849 m_titles
.Insert(title
, pos
);
852 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, title
, false );
853 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , label
) ;
857 if ( pos
== (size_t) -1 || pos
+ 1 == m_menus
.GetCount() )
859 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ;
863 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , m_menus
[pos
+1]->MacGetMenuId() ) ;
867 if ( menu
->HasAccels() )
869 // need to rebuild accell table
872 #endif // wxUSE_ACCEL
880 void wxMenuBar::MacMenuSelect(wxEvtHandler
* handler
, long when
, int macMenuId
, int macMenuItemNum
)
882 // first scan fast for direct commands, i.e. menus which have these commands directly in their own list
884 if ( macMenuId
== kwxMacAppleMenuId
&& macMenuItemNum
== 1 )
886 wxCommandEvent
event(wxEVT_COMMAND_MENU_SELECTED
, wxApp::s_macAboutMenuItemId
);
887 event
.m_timeStamp
= when
;
888 event
.SetEventObject(handler
);
889 event
.SetInt( wxApp::s_macAboutMenuItemId
);
890 handler
->ProcessEvent(event
);
894 for (size_t i
= 0; i
< m_menus
.GetCount() ; i
++)
896 if ( m_menus
[i
]->MacGetMenuId() == macMenuId
|| ( macMenuId
== kHMHelpMenuID
&& ( m_titles
[i
] == "?" || m_titles
[i
] == "&?" || m_titles
[i
] == wxApp::s_macHelpMenuTitleName
) ) )
898 if ( m_menus
[i
]->MacMenuSelect( handler
, when
, macMenuId
, macMenuItemNum
) )
902 //TODO flag this as an error since it must contain the item
908 for (size_t i
= 0; i
< m_menus
.GetCount(); i
++)
910 if ( m_menus
[i
]->MacMenuSelect( handler
, when
, macMenuId
, macMenuItemNum
) )
918 wxMenu
*wxMenuBar::Remove(size_t pos
)
920 wxMenu
*menu
= wxMenuBarBase::Remove(pos
);
926 if (s_macInstalledMenuBar
== this)
928 ::DeleteMenu( menu
->MacGetMenuId() /* m_menus[pos]->MacGetMenuId() */ ) ;
934 if ( menu
->HasAccels() )
936 // need to rebuild accell table
939 #endif // wxUSE_ACCEL
944 m_titles
.Remove(pos
);
949 bool wxMenuBar::Append(wxMenu
*menu
, const wxString
& title
)
951 WXHMENU submenu
= menu
? menu
->GetHMenu() : 0;
952 wxCHECK_MSG( submenu
, FALSE
, wxT("can't append invalid menu to menubar") );
954 if ( !wxMenuBarBase::Append(menu
, title
) )
960 wxMenuItem::MacBuildMenuString( label
, NULL
, NULL
, title
, false );
961 UMASetMenuTitle( MAC_WXHMENU(menu
->GetHMenu()) , label
) ;
965 if (s_macInstalledMenuBar
== this)
967 ::InsertMenu( MAC_WXHMENU(menu
->GetHMenu()) , 0 ) ;
971 if ( menu
->HasAccels() )
973 // need to rebuild accell table
976 #endif // wxUSE_ACCEL
984 void wxMenuBar::Detach()
986 wxMenuBarBase::Detach() ;
989 void wxMenuBar::Attach(wxFrame
*frame
)
991 wxMenuBarBase::Attach( frame
) ;
995 #endif // wxUSE_ACCEL
997 // ---------------------------------------------------------------------------
998 // wxMenuBar searching for menu items
999 // ---------------------------------------------------------------------------
1001 // Find the itemString in menuString, and return the item id or wxNOT_FOUND
1002 int wxMenuBar::FindMenuItem(const wxString
& menuString
,
1003 const wxString
& itemString
) const
1005 wxString menuLabel
= wxStripMenuCodes(menuString
);
1006 size_t count
= GetMenuCount();
1007 for ( size_t i
= 0; i
< count
; i
++ )
1009 wxString title
= wxStripMenuCodes(m_titles
[i
]);
1010 if ( menuString
== title
)
1011 return m_menus
[i
]->FindItem(itemString
);
1017 wxMenuItem
*wxMenuBar::FindItem(int id
, wxMenu
**itemMenu
) const
1022 wxMenuItem
*item
= NULL
;
1023 size_t count
= GetMenuCount();
1024 for ( size_t i
= 0; !item
&& (i
< count
); i
++ )
1026 item
= m_menus
[i
]->FindItem(id
, itemMenu
);