+bool wxMenuBase::SendEvent(int id, int checked)
+{
+ wxCommandEvent event(wxEVT_COMMAND_MENU_SELECTED, id);
+ event.SetEventObject(this);
+ event.SetInt(checked);
+
+ bool processed = false;
+
+ // Try the menu's event handler first
+ wxEvtHandler *handler = GetEventHandler();
+ if ( handler )
+ processed = handler->SafelyProcessEvent(event);
+
+ // Try the window the menu was popped up from or its menu bar belongs to
+ if ( !processed )
+ {
+ wxWindow * const win = GetWindow();
+ if ( win )
+ processed = win->HandleWindowEvent(event);
+ }
+
+ return processed;
+}
+
+// ----------------------------------------------------------------------------
+// wxMenu attaching/detaching to/from menu bar
+// ----------------------------------------------------------------------------
+
+wxMenuBar* wxMenuBase::GetMenuBar() const
+{
+ if(GetParent())
+ return GetParent()->GetMenuBar();
+ return m_menuBar;
+}
+
+void wxMenuBase::Attach(wxMenuBarBase *menubar)
+{
+ // use Detach() instead!
+ wxASSERT_MSG( menubar, wxT("menu can't be attached to NULL menubar") );
+
+ // use IsAttached() to prevent this from happening
+ wxASSERT_MSG( !m_menuBar, wxT("attaching menu twice?") );
+
+ m_menuBar = (wxMenuBar *)menubar;
+}
+
+void wxMenuBase::Detach()
+{
+ // use IsAttached() to prevent this from happening
+ wxASSERT_MSG( m_menuBar, wxT("detaching unattached menu?") );
+
+ m_menuBar = NULL;
+}
+
+// ----------------------------------------------------------------------------
+// wxMenu invoking window handling
+// ----------------------------------------------------------------------------
+
+void wxMenuBase::SetInvokingWindow(wxWindow *win)
+{
+ wxASSERT_MSG( !GetParent(),
+ "should only be called for top level popup menus" );
+ wxASSERT_MSG( !IsAttached(),
+ "menus attached to menu bar can't have invoking window" );
+
+ m_invokingWindow = win;
+}
+
+wxWindow *wxMenuBase::GetWindow() const
+{
+ // 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();
+ }
+
+ return menu->GetMenuBar() ? menu->GetMenuBar()->GetFrame()
+ : menu->GetInvokingWindow();
+}
+