X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9a4a0807113308761fb01007c05f5b023a5ba0f2..9572bf1d442006beba3528dc00c3fc05eb523c24:/src/common/menucmn.cpp diff --git a/src/common/menucmn.cpp b/src/common/menucmn.cpp index dc9db4f268..4c7abae78d 100644 --- a/src/common/menucmn.cpp +++ b/src/common/menucmn.cpp @@ -30,6 +30,7 @@ #include "wx/intl.h" #include "wx/log.h" #include "wx/menu.h" + #include "wx/frame.h" #endif #include "wx/stockitem.h" @@ -58,6 +59,39 @@ wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu, wxItemKind kind, wxMenu *subMenu) { + switch ( id ) + { + case wxID_ANY: + m_id = wxWindow::NewControlId(); + break; + + case wxID_SEPARATOR: + m_id = wxID_SEPARATOR; + + // there is a lot of existing code just doing Append(wxID_SEPARATOR) + // and it makes sense to omit the following optional parameters, + // including the kind one which doesn't default to wxITEM_SEPARATOR, + // of course, so override it here + kind = wxITEM_SEPARATOR; + break; + + case wxID_NONE: + // (popup) menu titles in wxMSW use this ID to indicate that + // it's not a real menu item, so we don't want the check below to + // apply to it + m_id = id; + break; + + default: + // ids are limited to 16 bits under MSW so portable code shouldn't + // use ids outside of this range (negative ids generated by wx are + // fine though) + wxASSERT_MSG( (id >= 0 && id < SHRT_MAX) || + (id >= wxID_AUTO_LOWEST && id <= wxID_AUTO_HIGHEST), + wxS("invalid id value") ); + m_id = id; + } + // notice that parentMenu can be NULL: the item can be attached to the menu // later with SetMenu() @@ -65,12 +99,7 @@ wxMenuItemBase::wxMenuItemBase(wxMenu *parentMenu, m_subMenu = subMenu; m_isEnabled = true; m_isChecked = false; - m_id = id; m_kind = kind; - if (m_id == wxID_ANY) - m_id = wxWindow::NewControlId(); - if (m_id == wxID_SEPARATOR) - m_kind = wxITEM_SEPARATOR; SetItemLabel(text); SetHelp(help); @@ -513,23 +542,18 @@ void wxMenuBase::SetInvokingWindow(wxWindow *win) m_invokingWindow = win; } -wxWindow *wxMenuBase::GetInvokingWindow() const +wxWindow *wxMenuBase::GetWindow() const { - // only the popup menu itself has a non-NULL invoking window so recurse - // upwards until we find it + // only the top level menus have non-NULL invoking window or a pointer to + // the menu bar so recurse upwards until we find it const wxMenuBase *menu = this; while ( menu->GetParent() ) { menu = menu->GetParent(); } - // menu is a top level menu here - return menu->m_invokingWindow; -} - -wxWindow *wxMenuBase::GetWindow() const -{ - return GetMenuBar() ? (wxWindow*)GetMenuBar()->GetFrame() : GetInvokingWindow(); + return menu->GetMenuBar() ? menu->GetMenuBar()->GetFrame() + : menu->GetInvokingWindow(); } // ----------------------------------------------------------------------------