-// 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 wxMenu::UpdateUI(wxEvtHandler* source)
-{
- if (!source && GetInvokingWindow())
- source = GetInvokingWindow()->GetEventHandler();
- if (!source)
- source = GetEventHandler();
- if (!source)
- source = this;
-
- wxNode* node = GetItems().First();
- while (node)
- {
- wxMenuItem* item = (wxMenuItem*) node->Data();
- if ( !item->IsSeparator() )
- {
- wxWindowID id = item->GetId();
- wxUpdateUIEvent event(id);
- event.SetEventObject( source );
-
- if (source->ProcessEvent(event))
- {
- if (event.GetSetText())
- SetLabel(id, event.GetText());
- if (event.GetSetChecked())
- Check(id, event.GetChecked());
- if (event.GetSetEnabled())
- Enable(id, event.GetEnabled());
- }
-
- if (item->GetSubMenu())
- item->GetSubMenu()->UpdateUI(source);
- }
- node = node->Next();
- }
-}
-
-bool wxWindow::PopupMenu(wxMenu *menu, int x, int y)
-{
- Widget widget = (Widget) GetMainWidget();
-
- /* The menuId field seems to be usused, so we'll use it to
- indicate whether a menu is popped up or not:
- 0: Not currently created as a popup
- -1: Created as a popup, but not active
- 1: Active popup.
- */
-
- if (menu->GetParent() && (menu->GetId() != -1))
- return FALSE;
-
- if (menu->GetMainWidget()) {
- menu->DestroyMenu(TRUE);
- }
-
- wxWindow *parent = this;
-
- menu->SetId(1); /* Mark as popped-up */
- menu->CreateMenu(NULL, widget, menu);
- menu->SetInvokingWindow(this);
-
- menu->UpdateUI();
-
- // menu->SetParent(parent);
- // parent->children->Append(menu); // Store menu for later deletion
-
- Widget menuWidget = (Widget) menu->GetMainWidget();
-
- int rootX = 0;
- int rootY = 0;
-
- int deviceX = x;
- int deviceY = y;
- /*
- if (this->IsKindOf(CLASSINFO(wxCanvas)))
- {
- wxCanvas *canvas = (wxCanvas *) this;
- deviceX = canvas->GetDC ()->LogicalToDeviceX (x);
- deviceY = canvas->GetDC ()->LogicalToDeviceY (y);
- }
- */
-
- Display *display = XtDisplay (widget);
- Window rootWindow = RootWindowOfScreen (XtScreen((Widget)widget));
- Window thisWindow = XtWindow (widget);
- Window childWindow;
- XTranslateCoordinates (display, thisWindow, rootWindow, (int) deviceX, (int) deviceY,
- &rootX, &rootY, &childWindow);
-
- XButtonPressedEvent event;
- event.type = ButtonPress;
- event.button = 1;
-
- event.x = deviceX;
- event.y = deviceY;
-
- event.x_root = rootX;
- event.y_root = rootY;
-
- XmMenuPosition (menuWidget, &event);
- XtManageChild (menuWidget);
-
- return TRUE;