void NotifyWindowOnEnableChange(bool enabled);
#if wxUSE_MENUS
- // temporary event handler used by GetPopupMenuSelectionFromUser()
+ // temporary event handlers used by GetPopupMenuSelectionFromUser()
void InternalOnPopupMenu(wxCommandEvent& event);
+ void InternalOnPopupMenuUpdate(wxUpdateUIEvent& event);
// implementation of the public GetPopupMenuSelectionFromUser() method
int DoGetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y);
*/
wxWindow* GetParent() const;
+ //@{
/**
This function shows a popup menu at the given position in this window and
- returns the selected id. It can be more convenient than the general purpose
- PopupMenu() function for simple menus proposing a choice in a list of
- strings to the user.
+ returns the selected id.
+
+ It can be more convenient than the general purpose PopupMenu() function
+ for simple menus proposing a choice in a list of strings to the user.
+
+ Notice that to avoid unexpected conflicts between the (usually
+ consecutive range of) ids used by the menu passed to this function and
+ the existing EVT_UPDATE_UI() handlers, this function temporarily
+ disables UI updates for the window, so you need to manually disable
+ (or toggle or ...) any items which should be disabled in the menu
+ before showing it.
@param menu
- The menu to show
+ The menu to show.
@param pos
- The position at which to show the menu in client coordinates
+ The position at which to show the menu in client coordinates.
- @return The selected menu item id or wxID_NONE if none selected or an
- error occurred.
- */
- int GetPopupMenuSelectionFromUser(wxMenu& menu, const wxPoint& pos);
+ @return
+ The selected menu item id or @c wxID_NONE if none selected or an
+ error occurred.
- /**
- See the GetPopupMenuSelectionFromUser(wxMenu&, const wxPoint&) overload.
- This overload differs only because it takes two integers for the
- menu position instead of a wxPoint.
+ @since 2.9.0
*/
+ int GetPopupMenuSelectionFromUser(wxMenu& menu, const wxPoint& pos);
int GetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y);
+ //@}
/**
This gets the position of the window in pixels, relative to the parent window
gs_popupMenuSelection = event.GetId();
}
+void wxWindowBase::InternalOnPopupMenuUpdate(wxUpdateUIEvent& WXUNUSED(event))
+{
+ // nothing to do but do not skip it
+}
+
int
wxWindowBase::DoGetPopupMenuSelectionFromUser(wxMenu& menu, int x, int y)
{
NULL,
this);
+ // it is common to construct the menu passed to this function dynamically
+ // using some fixed range of ids which could clash with the ids used
+ // elsewhere in the program, which could result in some menu items being
+ // unintentionally disabled or otherwise modified by update UI handlers
+ // elsewhere in the program code and this is difficult to avoid in the
+ // program itself, so instead we just temporarily suspend UI updating while
+ // this menu is shown
+ Connect(wxEVT_UPDATE_UI,
+ wxUpdateUIEventHandler(wxWindowBase::InternalOnPopupMenuUpdate),
+ NULL,
+ this);
+
PopupMenu(&menu, x, y);
+ Disconnect(wxEVT_UPDATE_UI,
+ wxUpdateUIEventHandler(wxWindowBase::InternalOnPopupMenuUpdate),
+ NULL,
+ this);
Disconnect(wxEVT_COMMAND_MENU_SELECTED,
wxCommandEventHandler(wxWindowBase::InternalOnPopupMenu),
NULL,