1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxMenu, wxMenuBar, wxMenuItem
4 // Author: Julian Smart
5 // Modified by: Vadim Zeitlin
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
12 // ===========================================================================
14 // ===========================================================================
16 // ---------------------------------------------------------------------------
18 // ---------------------------------------------------------------------------
21 #pragma implementation "menu.h"
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
38 #include "wx/ownerdrw.h"
41 #include "wx/msw/private.h"
42 #include "wx/msw/menu.h"
43 #include "wx/menuitem.h"
46 // other standard headers
49 // ----------------------------------------------------------------------------
51 // ----------------------------------------------------------------------------
53 extern wxMenu
*wxCurrentPopupMenu
;
55 // ----------------------------------------------------------------------------
57 // ----------------------------------------------------------------------------
59 // the (popup) menu title has this special id
60 static const int idMenuTitle
= -2;
62 // ----------------------------------------------------------------------------
64 // ----------------------------------------------------------------------------
66 #if !USE_SHARED_LIBRARY
67 IMPLEMENT_DYNAMIC_CLASS(wxMenu
, wxEvtHandler
)
68 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar
, wxEvtHandler
)
72 #define GetHMENU() ((HMENU)GetHMenu())
73 #define GetHMenuOf(menu) ((HMENU)menu->GetHMenu())
75 // ============================================================================
77 // ============================================================================
79 // ---------------------------------------------------------------------------
80 // wxMenu construction, adding and removing menu items
81 // ---------------------------------------------------------------------------
83 // Construct a menu with optional title (then use append)
84 wxMenu::wxMenu(const wxString
& title
, const wxFunction func
)
88 m_eventHandler
= this;
89 m_pInvokingWindow
= NULL
;
93 m_hMenu
= (WXHMENU
) CreatePopupMenu();
95 m_topLevelMenu
= this;
96 m_clientData
= (void*) NULL
;
100 Append(idMenuTitle
, m_title
) ;
104 #if WXWIN_COMPATIBILITY
109 // The wxWindow destructor will take care of deleting the submenus.
112 // free Windows resources
115 ::DestroyMenu((HMENU
)m_hMenu
);
120 wxNode
*node
= m_menuItems
.First();
123 wxMenuItem
*item
= (wxMenuItem
*)node
->Data();
125 // Delete child menus.
126 // Beware: they must not be appended to children list!!!
127 // (because order of delete is significant)
128 if ( item
->IsSubMenu() )
129 item
->DeleteSubMenu();
131 wxNode
*next
= node
->Next();
143 // function appends a new item or submenu to the menu
144 void wxMenu::Append(wxMenuItem
*pItem
)
146 wxCHECK_RET( pItem
!= NULL
, "can't append NULL item to the menu" );
150 // if "Break" has just been called, insert a menu break before this item
151 // (and don't forget to reset the flag)
153 flags
|= MF_MENUBREAK
;
157 if ( pItem
->IsSeparator() ) {
158 flags
|= MF_SEPARATOR
;
161 // id is the numeric id for normal menu items and HMENU for submenus as
162 // required by ::AppendMenu() API
164 wxMenu
*submenu
= pItem
->GetSubMenu();
165 if ( submenu
!= NULL
) {
166 wxASSERT( submenu
->GetHMenu() != (WXHMENU
) NULL
);
168 id
= (UINT
)submenu
->GetHMenu();
169 submenu
->m_topLevelMenu
= m_topLevelMenu
;
170 submenu
->m_parent
= this;
171 submenu
->m_savehMenu
= (WXHMENU
)id
;
172 submenu
->m_hMenu
= 0;
182 #if wxUSE_OWNER_DRAWN
183 if ( pItem
->IsOwnerDrawn() ) { // want to get {Measure|Draw}Item messages?
184 // item draws itself, pass pointer to it in data parameter
185 flags
|= MF_OWNERDRAW
;
186 pData
= (LPCSTR
)pItem
;
191 // menu is just a normal string (passed in data parameter)
193 pData
= pItem
->GetName();
196 // visually select the menu title
197 if ( id
== idMenuTitle
)
199 // TODO use SetMenuItemInfo(MFS_DEFAULT) to put it in bold face
202 if ( !::AppendMenu(GetHMENU(), flags
, id
, pData
) )
204 wxLogLastError("AppendMenu");
208 m_menuItems
.Append(pItem
);
213 void wxMenu::AppendSeparator()
215 Append(new wxMenuItem(this, ID_SEPARATOR
));
219 void wxMenu::Append(int id
,
220 const wxString
& label
,
222 const wxString
& helpString
)
224 Append(new wxMenuItem(this, id
, label
, helpString
, FALSE
, SubMenu
));
227 // Ordinary menu item
228 void wxMenu::Append(int id
,
229 const wxString
& label
,
230 const wxString
& helpString
,
233 // 'checkable' parameter is useless for Windows.
234 Append(new wxMenuItem(this, id
, label
, helpString
, checkable
));
238 void wxMenu::Delete(int id
)
240 wxMenuItem
*item
= NULL
;
243 for (pos
= 0, node
= m_menuItems
.First(); node
; node
= node
->Next(), pos
++)
245 item
= (wxMenuItem
*)node
->Data();
246 if ( item
->GetId() == id
)
250 wxCHECK_RET( node
, "wxMenu::Delete(): item doesn't exist" );
252 HMENU menu
= GetHMENU();
254 wxMenu
*pSubMenu
= item
->GetSubMenu();
255 if ( pSubMenu
!= NULL
) {
256 RemoveMenu(menu
, (UINT
)pos
, MF_BYPOSITION
);
257 pSubMenu
->m_hMenu
= pSubMenu
->m_savehMenu
;
258 pSubMenu
->m_savehMenu
= 0;
259 pSubMenu
->m_parent
= NULL
;
260 // RemoveChild(item->subMenu);
261 pSubMenu
->m_topLevelMenu
= NULL
;
262 // TODO: Why isn't subMenu deleted here???
263 // Will put this in for now. Assuming this is supposed
264 // to delete the menu, not just remove it.
265 item
->DeleteSubMenu();
268 DeleteMenu(menu
, (UINT
)pos
, MF_BYPOSITION
);
271 m_menuItems
.DeleteNode(node
);
275 // ---------------------------------------------------------------------------
276 // wxMenu functions implemented in wxMenuItem
277 // ---------------------------------------------------------------------------
279 void wxMenu::Enable(int id
, bool Flag
)
281 wxMenuItem
*item
= FindItemForId(id
);
282 wxCHECK_RET( item
!= NULL
, "can't enable non-existing menu item" );
287 bool wxMenu::IsEnabled(int id
) const
289 wxMenuItem
*item
= FindItemForId(id
);
290 wxCHECK_MSG( item
!= NULL
, FALSE
, "invalid item id" );
292 return item
->IsEnabled();
295 void wxMenu::Check(int id
, bool Flag
)
297 wxMenuItem
*item
= FindItemForId(id
);
298 wxCHECK_RET( item
!= NULL
, "can't get status of non-existing menu item" );
303 bool wxMenu::IsChecked(int id
) const
305 wxMenuItem
*item
= FindItemForId(id
);
306 wxCHECK_MSG( item
!= NULL
, FALSE
, "invalid item id" );
308 return item
->IsChecked();
311 void wxMenu::SetLabel(int id
, const wxString
& label
)
313 wxMenuItem
*item
= FindItemForId(id
) ;
314 wxCHECK_RET( item
, "wxMenu::SetLabel: no such item" );
316 item
->SetName(label
);
319 wxString
wxMenu::GetLabel(int id
) const
322 wxMenuItem
*pItem
= FindItemForId(id
) ;
324 label
= pItem
->GetName() ;
326 wxFAIL_MSG("wxMenu::GetLabel: item doesn't exist");
331 void wxMenu::SetHelpString(int itemId
, const wxString
& helpString
)
333 wxMenuItem
*item
= FindItemForId (itemId
);
335 item
->SetHelp(helpString
);
337 wxFAIL_MSG("wxMenu::SetHelpString: item doesn't exist");
340 wxString
wxMenu::GetHelpString (int itemId
) const
343 wxMenuItem
*item
= FindItemForId (itemId
);
345 help
= item
->GetHelp();
347 wxFAIL_MSG("wxMenu::GetHelpString: item doesn't exist");
352 // ---------------------------------------------------------------------------
354 // ---------------------------------------------------------------------------
356 void wxMenu::SetTitle(const wxString
& label
)
358 bool hasNoTitle
= m_title
.IsEmpty();
361 HMENU hMenu
= GetHMENU();
365 if ( !label
.IsEmpty() )
367 if ( !InsertMenu(hMenu
, 0u, MF_BYPOSITION
| MF_STRING
,
368 (unsigned)idMenuTitle
, m_title
) ||
369 !InsertMenu(hMenu
, 1u, MF_BYPOSITION
, (unsigned)-1, NULL
) )
371 wxLogLastError("InsertMenu");
377 if ( label
.IsEmpty() )
379 // remove the title and the separator after it
380 if ( !RemoveMenu(hMenu
, 0, MF_BYPOSITION
) ||
381 !RemoveMenu(hMenu
, 0, MF_BYPOSITION
) )
383 wxLogLastError("RemoveMenu");
389 if ( !ModifyMenu(hMenu
, 0u,
390 MF_BYPOSITION
| MF_STRING
,
391 (unsigned)idMenuTitle
, m_title
) )
393 wxLogLastError("ModifyMenu");
399 // put the title string in bold face
400 if ( !m_title
.IsEmpty() )
403 mii
.cbSize
= sizeof(mii
);
404 mii
.fMask
= MIIM_STATE
;
405 mii
.fState
= MFS_DEFAULT
;
407 if ( !SetMenuItemInfo(hMenu
, (unsigned)idMenuTitle
, FALSE
, &mii
) )
409 wxLogLastError("SetMenuItemInfo");
415 const wxString
wxMenu::GetTitle() const
420 // ---------------------------------------------------------------------------
422 // ---------------------------------------------------------------------------
424 bool wxMenu::MSWCommand(WXUINT
WXUNUSED(param
), WXWORD id
)
426 // ignore commands from the menu title
428 // NB: VC++ generates wrong assembler for `if ( id != idMenuTitle )'!!
429 if ( id
!= (WXWORD
)idMenuTitle
)
431 wxCommandEvent
event(wxEVT_COMMAND_MENU_SELECTED
);
432 event
.SetEventObject( this );
435 ProcessCommand(event
);
441 void wxMenu::ProcessCommand(wxCommandEvent
& event
)
443 bool processed
= FALSE
;
445 #if WXWIN_COMPATIBILITY
449 (void)(*(m_callback
))(*this, event
);
452 #endif // WXWIN_COMPATIBILITY
454 // Try the menu's event handler
455 if ( !processed
&& GetEventHandler())
457 processed
= GetEventHandler()->ProcessEvent(event
);
460 // Try the window the menu was popped up from (and up through the
462 wxWindow
*win
= GetInvokingWindow();
463 if ( !processed
&& win
)
464 processed
= win
->GetEventHandler()->ProcessEvent(event
);
467 // ---------------------------------------------------------------------------
469 // ---------------------------------------------------------------------------
471 // Finds the item id matching the given string, -1 if not found.
472 int wxMenu::FindItem (const wxString
& itemString
) const
474 wxString itemLabel
= wxStripMenuCodes(itemString
);
475 for ( wxNode
*node
= m_menuItems
.First(); node
; node
= node
->Next() )
477 wxMenuItem
*item
= (wxMenuItem
*)node
->Data();
478 if ( item
->IsSubMenu() )
480 int ans
= item
->GetSubMenu()->FindItem(itemString
);
481 if ( ans
!= wxNOT_FOUND
)
484 else if ( !item
->IsSeparator() )
486 wxString label
= wxStripMenuCodes(item
->GetName());
487 if ( itemLabel
== label
)
488 return item
->GetId();
495 wxMenuItem
*wxMenu::FindItemForId(int itemId
, wxMenu
** itemMenu
) const
500 wxMenuItem
*item
= NULL
;
501 for ( wxNode
*node
= m_menuItems
.First(); node
&& !item
; node
= node
->Next() )
503 item
= (wxMenuItem
*)node
->Data();
505 if ( item
->GetId() == itemId
)
508 *itemMenu
= (wxMenu
*)this;
510 else if ( item
->IsSubMenu() )
512 item
= item
->GetSubMenu()->FindItemForId(itemId
, itemMenu
);
516 // don't exit the loop
524 // ---------------------------------------------------------------------------
526 // ---------------------------------------------------------------------------
528 bool wxWindow::PopupMenu(wxMenu
*menu
, int x
, int y
)
530 menu
->SetInvokingWindow(this);
533 HWND hWnd
= (HWND
) GetHWND();
534 HMENU hMenu
= (HMENU
)menu
->GetHMenu();
538 ::ClientToScreen(hWnd
, &point
);
539 wxCurrentPopupMenu
= menu
;
540 ::TrackPopupMenu(hMenu
, TPM_RIGHTBUTTON
, point
.x
, point
.y
, 0, hWnd
, NULL
);
542 wxCurrentPopupMenu
= NULL
;
544 menu
->SetInvokingWindow(NULL
);
549 void wxMenu::Attach(wxMenuBar
*menubar
)
551 // menu can be in at most one menubar because otherwise they would both
552 // delete the menu pointer
553 wxASSERT_MSG( !m_menuBar
, "menu belongs to 2 menubars, expect a crash" );
556 m_savehMenu
= m_hMenu
;
560 void wxMenu::Detach()
562 wxASSERT_MSG( m_menuBar
, "can't detach menu if it's not attached" );
564 m_hMenu
= m_savehMenu
;
568 // ---------------------------------------------------------------------------
570 // ---------------------------------------------------------------------------
572 void wxMenuBar::Init()
574 m_eventHandler
= this;
578 m_menuBarFrame
= NULL
;
582 wxMenuBar::wxMenuBar()
587 wxMenuBar::wxMenuBar( long WXUNUSED(style
) )
592 wxMenuBar::wxMenuBar(int count
, wxMenu
*menus
[], const wxString titles
[])
598 m_titles
= new wxString
[count
];
601 for ( i
= 0; i
< count
; i
++ )
602 m_titles
[i
] = titles
[i
];
604 for ( i
= 0; i
< count
; i
++ )
605 m_menus
[i
]->Attach(this);
608 wxMenuBar::~wxMenuBar()
610 for ( int i
= 0; i
< m_menuCount
; i
++ )
619 // ---------------------------------------------------------------------------
621 // ---------------------------------------------------------------------------
623 void wxMenuBar::Refresh()
625 wxCHECK_RET( m_menuBarFrame
, "can't refresh a menubar withotu a frame" );
627 DrawMenuBar((HWND
)m_menuBarFrame
->GetHWND()) ;
630 WXHMENU
wxMenuBar::Create()
632 wxCHECK_MSG( !m_hMenu
, TRUE
, "menubar already created" );
634 m_hMenu
= (WXHMENU
)::CreateMenu();
638 wxLogLastError("CreateMenu");
642 for ( int i
= 0; i
< m_menuCount
; i
++ )
644 if ( !::AppendMenu((HMENU
)m_hMenu
, MF_POPUP
| MF_STRING
,
645 (UINT
)m_menus
[i
]->GetHMenu(),
648 wxLogLastError("AppendMenu");
656 // ---------------------------------------------------------------------------
657 // wxMenuBar functions forwarded to wxMenuItem
658 // ---------------------------------------------------------------------------
660 // Must only be used AFTER menu has been attached to frame,
661 // otherwise use individual menus to enable/disable items
662 void wxMenuBar::Enable(int id
, bool enable
)
664 wxMenu
*itemMenu
= NULL
;
665 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
667 wxCHECK_RET( item
, "attempt to enable an item which doesn't exist" );
669 item
->Enable(enable
);
672 void wxMenuBar::EnableTop(int pos
, bool enable
)
674 int flag
= enable
? MF_ENABLED
: MF_GRAYED
;;
676 EnableMenuItem((HMENU
)m_hMenu
, pos
, MF_BYPOSITION
| flag
);
679 // Must only be used AFTER menu has been attached to frame,
680 // otherwise use individual menus
681 void wxMenuBar::Check(int id
, bool check
)
683 wxMenu
*itemMenu
= NULL
;
684 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
686 wxCHECK_RET( item
, "attempt to check an item which doesn't exist" );
687 wxCHECK_RET( item
->IsCheckable(), "attempt to check an uncheckable item" );
692 bool wxMenuBar::IsChecked(int id
) const
694 wxMenu
*itemMenu
= NULL
;
695 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
697 wxCHECK_MSG( item
, FALSE
, "wxMenuBar::IsChecked(): no such item" );
699 int flag
= ::GetMenuState(GetHMenuOf(itemMenu
), id
, MF_BYCOMMAND
);
701 return (flag
& MF_CHECKED
) != 0;
704 bool wxMenuBar::IsEnabled(int id
) const
706 wxMenu
*itemMenu
= NULL
;
707 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
709 wxCHECK_MSG( item
, FALSE
, "wxMenuBar::IsEnabled(): no such item" );
711 int flag
= ::GetMenuState(GetHMenuOf(itemMenu
), id
, MF_BYCOMMAND
) ;
713 return (flag
& MF_ENABLED
) != 0;
716 void wxMenuBar::SetLabel(int id
, const wxString
& label
)
718 wxMenu
*itemMenu
= NULL
;
719 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
721 wxCHECK_RET( item
, "wxMenuBar::SetLabel(): no such item" );
723 item
->SetName(label
);
726 wxString
wxMenuBar::GetLabel(int id
) const
728 wxMenu
*itemMenu
= NULL
;
729 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
731 wxCHECK_MSG( item
, "", "wxMenuBar::GetLabel(): no such item" );
733 return item
->GetName();
736 void wxMenuBar::SetHelpString (int id
, const wxString
& helpString
)
738 wxMenu
*itemMenu
= NULL
;
739 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
741 wxCHECK_RET( item
, "wxMenuBar::SetHelpString(): no such item" );
743 item
->SetHelp(helpString
);
746 wxString
wxMenuBar::GetHelpString (int id
) const
748 wxMenu
*itemMenu
= NULL
;
749 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
751 wxCHECK_MSG( item
, "", "wxMenuBar::GetHelpString(): no such item" );
753 return item
->GetHelp();
756 // ---------------------------------------------------------------------------
757 // wxMenuBar functions to work with the top level submenus
758 // ---------------------------------------------------------------------------
760 // NB: we don't support owner drawn top level items for now, if we do these
761 // functions would have to be changed to use wxMenuItem as well
763 void wxMenuBar::SetLabelTop(int pos
, const wxString
& label
)
766 UINT flagsOld
= ::GetMenuState((HMENU
)m_hMenu
, pos
, MF_BYPOSITION
);
767 if ( flagsOld
== 0xFFFFFFFF )
769 wxLogLastError("GetMenuState");
774 if ( flagsOld
& MF_POPUP
)
776 // HIBYTE contains the number of items in the submenu in this case
778 id
= (UINT
)::GetSubMenu((HMENU
)m_hMenu
, pos
) ;
785 if ( ::ModifyMenu(GetHMENU(), pos
, MF_BYPOSITION
| MF_STRING
| flagsOld
,
786 id
, label
) == 0xFFFFFFFF )
788 wxLogLastError("ModifyMenu");
792 wxString
wxMenuBar::GetLabelTop(int pos
) const
794 int len
= ::GetMenuString((HMENU
)m_hMenu
, pos
, NULL
, 0, MF_BYCOMMAND
);
796 len
++; // for the NUL character
798 ::GetMenuString(GetHMENU(), pos
, label
.GetWriteBuf(len
), len
, MF_BYCOMMAND
);
799 label
.UngetWriteBuf();
804 // ---------------------------------------------------------------------------
805 // wxMenuBar notifications
806 // ---------------------------------------------------------------------------
808 bool wxMenuBar::OnDelete(wxMenu
*a_menu
, int pos
)
810 if ( !m_menuBarFrame
)
813 if ( ::RemoveMenu((HMENU
)m_hMenu
, (UINT
)pos
, MF_BYPOSITION
) )
815 // VZ: I'm not sure about what's going on here, so I leave an assert
816 wxASSERT_MSG( m_menus
[pos
] == a_menu
, "what is this parameter for??" );
820 if ( m_menuBarFrame
)
827 wxLogLastError("RemoveMenu");
833 bool wxMenuBar::OnAppend(wxMenu
*a_menu
, const char *title
)
835 WXHMENU submenu
= a_menu
->GetHMenu();
839 if ( !m_menuBarFrame
)
842 a_menu
->Attach(this);
844 if ( !::AppendMenu(GetHMENU(), MF_POPUP
| MF_STRING
,
845 (UINT
)submenu
, title
) )
847 wxLogLastError("AppendMenu");
855 // ---------------------------------------------------------------------------
856 // wxMenuBar construction
857 // ---------------------------------------------------------------------------
859 void wxMenuBar::Append (wxMenu
* menu
, const wxString
& title
)
861 if (!OnAppend(menu
, title
))
865 wxMenu
**new_menus
= new wxMenu
*[m_menuCount
];
866 wxString
*new_titles
= new wxString
[m_menuCount
];
869 for (i
= 0; i
< m_menuCount
- 1; i
++)
871 new_menus
[i
] = m_menus
[i
];
873 new_titles
[i
] = m_titles
[i
];
882 m_titles
= new_titles
;
884 m_menus
[m_menuCount
- 1] = (wxMenu
*)menu
;
885 m_titles
[m_menuCount
- 1] = title
;
887 menu
->SetParent(this);
890 void wxMenuBar::Delete(wxMenu
* menu
, int i
)
896 for (ii
= 0; ii
< m_menuCount
; ii
++) {
897 if (m_menus
[ii
] == menu
)
900 if (ii
>= m_menuCount
)
903 if (ii
< 0 || ii
>= m_menuCount
)
908 if (!OnDelete(menu
, ii
))
911 menu
->SetParent(NULL
);
914 for (j
= ii
; j
< m_menuCount
; j
++) {
915 m_menus
[j
] = m_menus
[j
+ 1];
916 m_titles
[j
] = m_titles
[j
+ 1];
920 // ---------------------------------------------------------------------------
921 // wxMenuBar searching for menu items
922 // ---------------------------------------------------------------------------
924 // Find the itemString in menuString, and return the item id or wxNOT_FOUND
925 int wxMenuBar::FindMenuItem(const wxString
& menuString
,
926 const wxString
& itemString
) const
928 wxString menuLabel
= wxStripMenuCodes(menuString
);
929 for ( int i
= 0; i
< m_menuCount
; i
++ )
931 wxString title
= wxStripMenuCodes(m_titles
[i
]);
932 if ( menuString
== title
)
933 return m_menus
[i
]->FindItem(itemString
);
939 wxMenuItem
*wxMenuBar::FindItemForId (int id
, wxMenu
**itemMenu
) const
944 wxMenuItem
*item
= NULL
;
945 for ( int i
= 0; !item
&& (i
< m_menuCount
); i
++ )
947 item
= m_menus
[i
]->FindItemForId(id
, itemMenu
);
954 // ----------------------------------------------------------------------------
956 // ----------------------------------------------------------------------------
958 wxWindow
*wxMenu::GetWindow() const
960 if ( m_pInvokingWindow
!= NULL
)
961 return m_pInvokingWindow
;
962 else if ( m_menuBar
!= NULL
)
963 return m_menuBar
->GetFrame();
968 WXHMENU
wxMenu::GetHMenu() const
972 else if ( m_savehMenu
!= 0 )
975 wxFAIL_MSG("wxMenu without HMENU");
980 // Update a menu and all submenus recursively. source is the object that has
981 // the update event handlers defined for it. If NULL, the menu or associated
982 // window will be used.
983 void wxMenu::UpdateUI(wxEvtHandler
* source
)
985 if (!source
&& GetInvokingWindow())
986 source
= GetInvokingWindow()->GetEventHandler();
988 source
= GetEventHandler();
992 wxNode
* node
= GetItems().First();
995 wxMenuItem
* item
= (wxMenuItem
*) node
->Data();
996 if ( !item
->IsSeparator() )
998 wxWindowID id
= item
->GetId();
999 wxUpdateUIEvent
event(id
);
1000 event
.SetEventObject( source
);
1002 if (source
->ProcessEvent(event
))
1004 if (event
.GetSetText())
1005 SetLabel(id
, event
.GetText());
1006 if (event
.GetSetChecked())
1007 Check(id
, event
.GetChecked());
1008 if (event
.GetSetEnabled())
1009 Enable(id
, event
.GetEnabled());
1012 if (item
->GetSubMenu())
1013 item
->GetSubMenu()->UpdateUI(source
);
1015 node
= node
->Next();