bool wxMenu::ProcessCommand(wxCommandEvent & event) { // Try the menu's event handler first wxEvtHandler * const handler = GetEventHandler(); bool processed = handler ? handler->SafelyProcessEvent(event) : false; // Try the window the menu was popped up from (and up // through the hierarchy) if ( !processed && GetInvokingWindow()) processed = GetInvokingWindow()->HandleWindowEvent(event); return processed; }
// Update a menu and all submenus recursively. source is the object that has // the update event handlers defined for it. If NULL, the menu or associated // window will be used. void wxMenuBase::UpdateUI(wxEvtHandler* source) { if (GetInvokingWindow()) { // Don't update menus if the parent // frame is about to get deleted wxWindow *tlw = wxGetTopLevelParent( GetInvokingWindow() ); if (tlw && wxPendingDelete.Member(tlw)) return; } if ( !source && GetInvokingWindow() ) source = GetInvokingWindow()->GetEventHandler(); if ( !source ) source = GetEventHandler(); if ( !source ) source = this; wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst(); while ( node ) { wxMenuItem* item = node->GetData(); if ( !item->IsSeparator() ) { wxWindowID id = item->GetId(); wxUpdateUIEvent event(id); event.SetEventObject( source ); if ( source->ProcessEvent(event) ) { // if anything changed, update the changed attribute if (event.GetSetText()) SetLabel(id, event.GetText()); if (event.GetSetChecked()) Check(id, event.GetChecked()); if (event.GetSetEnabled()) Enable(id, event.GetEnabled()); } // recurse to the submenus if ( item->GetSubMenu() ) item->GetSubMenu()->UpdateUI(source); } //else: item is a separator (which doesn't process update UI events) node = node->GetNext(); } }
bool wxMenu::ProcessCommand(wxCommandEvent & event) { bool processed = false; // Try the menu's event handler if ( !processed && GetEventHandler()) { processed = GetEventHandler()->ProcessEvent(event); } // Try the window the menu was popped up from (and up // through the hierarchy) if ( !processed && GetInvokingWindow()) processed = GetInvokingWindow()->ProcessEvent(event); return processed; }
bool wxMenu::ProcessCommand(wxCommandEvent & event) { bool processed = false; // Try the menu's event handler if ( /* !processed && */ GetEventHandler()) processed = GetEventHandler()->ProcessEvent(event); // Try the window the menu was popped up from // (and up through the hierarchy) wxWindow *win = GetInvokingWindow(); if ( !processed && win ) processed = win->GetEventHandler()->ProcessEvent(event); return processed; }
WXWidget wxMenu::CreateMenu (wxMenuBar * menuBar, WXWidget parent, wxMenu * topMenu, size_t menuIndex, const wxString& title, bool pullDown) { Widget menu = (Widget) 0; Widget buttonWidget = (Widget) 0; Display* dpy = XtDisplay((Widget)parent); Arg args[5]; XtSetArg (args[0], XmNnumColumns, m_numColumns); XtSetArg (args[1], XmNpacking, (m_numColumns > 1) ? XmPACK_COLUMN : XmPACK_TIGHT); if ( !m_font.IsOk() ) { if ( menuBar ) m_font = menuBar->GetFont(); else if ( GetInvokingWindow() ) m_font = GetInvokingWindow()->GetFont(); } XtSetArg (args[2], (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy) ); if (!pullDown) { menu = XmCreatePopupMenu ((Widget) parent, wxMOTIF_STR("popup"), args, 3); #if 0 XtAddCallback(menu, XmNunmapCallback, (XtCallbackProc)wxMenuPopdownCallback, (XtPointer)this); #endif } else { char mnem = wxFindMnemonic (title); menu = XmCreatePulldownMenu ((Widget) parent, wxMOTIF_STR("pulldown"), args, 3); wxString title2(wxStripMenuCodes(title)); wxXmString label_str(title2); buttonWidget = XtVaCreateManagedWidget(title2, #if wxUSE_GADGETS xmCascadeButtonGadgetClass, (Widget) parent, #else xmCascadeButtonWidgetClass, (Widget) parent, #endif XmNlabelString, label_str(), XmNsubMenuId, menu, (String)wxFont::GetFontTag(), m_font.GetFontTypeC(dpy), XmNpositionIndex, menuIndex, NULL); if (mnem != 0) XtVaSetValues (buttonWidget, XmNmnemonic, mnem, NULL); } m_menuWidget = (WXWidget) menu; m_topLevelMenu = topMenu; size_t i = 0; for ( wxMenuItemList::compatibility_iterator node = GetMenuItems().GetFirst(); node; node = node->GetNext(), ++i ) { wxMenuItem *item = node->GetData(); item->CreateItem(menu, menuBar, topMenu, i); } ChangeFont(); return buttonWidget; }