1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: wxMenu, wxMenuBar, wxMenuItem
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
13 // ============================================================================
14 // headers & declarations
15 // ============================================================================
21 #pragma implementation "menu.h"
22 #pragma implementation "menuitem.h"
26 #include "wx/menuitem.h"
31 #include "wx/settings.h"
34 #include <Xm/LabelG.h>
35 #include <Xm/CascadeBG.h>
36 #include <Xm/CascadeB.h>
37 #include <Xm/SeparatoG.h>
38 #include <Xm/PushBG.h>
39 #include <Xm/ToggleB.h>
40 #include <Xm/ToggleBG.h>
41 #include <Xm/RowColumn.h>
43 #include "wx/motif/private.h"
45 // other standard headers
46 // ----------------------
49 #if !USE_SHARED_LIBRARY
50 IMPLEMENT_DYNAMIC_CLASS(wxMenu
, wxEvtHandler
)
51 IMPLEMENT_DYNAMIC_CLASS(wxMenuBar
, wxEvtHandler
)
54 // ============================================================================
56 // ============================================================================
60 // Construct a menu with optional title (then use append)
61 wxMenu::wxMenu(const wxString
& title
, const wxFunction func
)
64 m_parent
= (wxEvtHandler
*) NULL
;
65 m_eventHandler
= this;
68 m_pInvokingWindow
= NULL
;
70 //// Motif-specific members
72 m_menuWidget
= (WXWidget
) NULL
;
73 m_popupShell
= (WXWidget
) NULL
;
74 m_buttonWidget
= (WXWidget
) NULL
;
76 m_topLevelMenu
= (wxMenu
*) NULL
;
77 m_ownedByMenuBar
= FALSE
;
78 m_menuParent
= (wxMenu
*) NULL
;
79 m_clientData
= (void*) NULL
;
83 Append(ID_SEPARATOR
, m_title
) ;
86 m_backgroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU
);
87 m_foregroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT
);
88 m_font
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
);
93 // The wxWindow destructor will take care of deleting the submenus.
104 // Not sure if this is right
105 if (m_menuParent
&& m_menuBar
)
111 wxNode
*node
= m_menuItems
.First();
114 wxMenuItem
*item
= (wxMenuItem
*)node
->Data();
117 if (item->GetSubMenu())
118 item->DeleteSubMenu();
121 wxNode
*next
= node
->Next();
133 // function appends a new item or submenu to the menu
134 void wxMenu::Append(wxMenuItem
*pItem
)
136 wxCHECK_RET( pItem
!= NULL
, "can't append NULL item to the menu" );
138 m_menuItems
.Append(pItem
);
141 pItem
->CreateItem (m_menuWidget
, m_menuBar
, m_topLevelMenu
); // this is a dynamic Append
146 void wxMenu::AppendSeparator()
148 Append(new wxMenuItem(this, ID_SEPARATOR
));
152 // N.B.: difference between old and new code.
153 // Old code stores subMenu in 'children' for later deletion,
154 // as well as in m_menuItems, whereas we only store it in
155 // m_menuItems here. What implications does this have?
157 void wxMenu::Append(int id
, const wxString
& label
, wxMenu
*subMenu
,
158 const wxString
& helpString
)
160 Append(new wxMenuItem(this, id
, label
, helpString
, FALSE
, subMenu
));
162 subMenu
->m_topLevelMenu
= m_topLevelMenu
;
165 // Ordinary menu item
166 void wxMenu::Append(int id
, const wxString
& label
,
167 const wxString
& helpString
, bool checkable
)
169 // 'checkable' parameter is useless for Windows.
170 Append(new wxMenuItem(this, id
, label
, helpString
, checkable
));
173 void wxMenu::Delete(int id
)
179 for (pos
= 0, node
= m_menuItems
.First(); node
; node
= node
->Next(), pos
++)
181 item
= (wxMenuItem
*)node
->Data();
182 if (item
->GetId() == id
)
189 item
->DestroyItem(TRUE
);
191 // See also old code - don't know if this is needed (seems redundant).
193 if (item->GetSubMenu()) {
194 item->subMenu->top_level_menu = item->GetSubMenu();
195 item->subMenu->window_parent = NULL;
196 children->DeleteObject(item->GetSubMenu());
200 m_menuItems
.DeleteNode(node
);
204 void wxMenu::Enable(int id
, bool flag
)
206 wxMenuItem
*item
= FindItemForId(id
);
207 wxCHECK_RET( item
!= NULL
, "can't enable non-existing menu item" );
212 bool wxMenu::Enabled(int Id
) const
214 wxMenuItem
*item
= FindItemForId(Id
);
215 wxCHECK( item
!= NULL
, FALSE
);
217 return item
->IsEnabled();
220 void wxMenu::Check(int Id
, bool Flag
)
222 wxMenuItem
*item
= FindItemForId(Id
);
223 wxCHECK_RET( item
!= NULL
, "can't get status of non-existing menu item" );
228 bool wxMenu::Checked(int id
) const
230 wxMenuItem
*item
= FindItemForId(id
);
231 wxCHECK( item
!= NULL
, FALSE
);
233 return item
->IsChecked();
236 void wxMenu::SetTitle(const wxString
& label
)
240 wxNode
*node
= m_menuItems
.First ();
244 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
245 Widget widget
= (Widget
) item
->GetButtonWidget();
249 XmString title_str
= XmStringCreateSimple ((char*) (const char*) label
);
250 XtVaSetValues (widget
,
251 XmNlabelString
, title_str
,
253 // TODO: should we delete title_str now?
256 const wxString
wxMenu::GetTitle() const
261 void wxMenu::SetLabel(int id
, const wxString
& label
)
263 wxMenuItem
*item
= FindItemForId(id
);
264 if (item
== (wxMenuItem
*) NULL
)
267 item
->SetLabel(label
);
270 wxString
wxMenu::GetLabel(int id
) const
272 wxMenuItem
*it
= NULL
;
273 WXWidget w
= FindMenuItem (id
, &it
);
278 XtVaGetValues ((Widget
) w
,
279 XmNlabelString
, &text
,
282 if (XmStringGetLtoR (text
, XmSTRING_DEFAULT_CHARSET
, &s
))
291 return wxEmptyString
;
295 return wxEmptyString
;
298 // Finds the item id matching the given string, -1 if not found.
299 int wxMenu::FindItem (const wxString
& itemString
) const
303 wxStripMenuCodes ((char *)(const char *)itemString
, buf1
);
305 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
307 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
308 if (item
->GetSubMenu())
310 int ans
= item
->GetSubMenu()->FindItem(itemString
);
314 if ( !item
->IsSeparator() )
316 wxStripMenuCodes((char *)item
->GetName().c_str(), buf2
);
317 if (strcmp(buf1
, buf2
) == 0)
318 return item
->GetId();
325 wxMenuItem
*wxMenu::FindItemForId(int itemId
, wxMenu
** itemMenu
) const
329 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
331 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
333 if (item
->GetId() == itemId
)
336 *itemMenu
= (wxMenu
*) this;
340 if (item
->GetSubMenu())
342 wxMenuItem
*ans
= item
->GetSubMenu()->FindItemForId (itemId
, itemMenu
);
353 void wxMenu::SetHelpString(int itemId
, const wxString
& helpString
)
355 wxMenuItem
*item
= FindItemForId (itemId
);
357 item
->SetHelp(helpString
);
360 wxString
wxMenu::GetHelpString (int itemId
) const
362 wxMenuItem
*item
= FindItemForId (itemId
);
364 return (item
== NULL
) ? str
: item
->GetHelp();
367 void wxMenu::ProcessCommand(wxCommandEvent
& event
)
369 bool processed
= FALSE
;
374 (void) (*(m_callback
)) (*this, event
);
378 // Try the menu's event handler
379 if ( !processed
&& GetEventHandler())
381 processed
= GetEventHandler()->ProcessEvent(event
);
383 // Try the window the menu was popped up from (and up
384 // through the hierarchy)
385 if ( !processed
&& GetInvokingWindow())
386 processed
= GetInvokingWindow()->ProcessEvent(event
);
389 // Update a menu and all submenus recursively.
390 // source is the object that has the update event handlers
391 // defined for it. If NULL, the menu or associated window
393 void wxMenu::UpdateUI(wxEvtHandler
* source
)
395 if (!source
&& GetInvokingWindow())
396 source
= GetInvokingWindow()->GetEventHandler();
398 source
= GetEventHandler();
402 wxNode
* node
= GetItems().First();
405 wxMenuItem
* item
= (wxMenuItem
*) node
->Data();
406 if ( !item
->IsSeparator() )
408 wxWindowID id
= item
->GetId();
409 wxUpdateUIEvent
event(id
);
410 event
.SetEventObject( source
);
412 if (source
->ProcessEvent(event
))
414 if (event
.GetSetText())
415 SetLabel(id
, event
.GetText());
416 if (event
.GetSetChecked())
417 Check(id
, event
.GetChecked());
418 if (event
.GetSetEnabled())
419 Enable(id
, event
.GetEnabled());
422 if (item
->GetSubMenu())
423 item
->GetSubMenu()->UpdateUI(source
);
429 bool wxWindow::PopupMenu(wxMenu
*menu
, int x
, int y
)
431 Widget widget
= (Widget
) GetMainWidget();
433 /* The menuId field seems to be usused, so we'll use it to
434 indicate whether a menu is popped up or not:
435 0: Not currently created as a popup
436 -1: Created as a popup, but not active
440 if (menu
->GetParent() && (menu
->GetId() != -1))
443 if (menu
->GetMainWidget()) {
444 menu
->DestroyMenu(TRUE
);
447 wxWindow
*parent
= this;
449 menu
->SetId(1); /* Mark as popped-up */
450 menu
->CreateMenu(NULL
, widget
, menu
);
451 menu
->SetInvokingWindow(this);
455 // menu->SetParent(parent);
456 // parent->children->Append(menu); // Store menu for later deletion
458 Widget menuWidget
= (Widget
) menu
->GetMainWidget();
466 if (this->IsKindOf(CLASSINFO(wxCanvas)))
468 wxCanvas *canvas = (wxCanvas *) this;
469 deviceX = canvas->GetDC ()->LogicalToDeviceX (x);
470 deviceY = canvas->GetDC ()->LogicalToDeviceY (y);
474 Display
*display
= XtDisplay (widget
);
475 Window rootWindow
= RootWindowOfScreen (XtScreen((Widget
)widget
));
476 Window thisWindow
= XtWindow (widget
);
478 XTranslateCoordinates (display
, thisWindow
, rootWindow
, (int) deviceX
, (int) deviceY
,
479 &rootX
, &rootY
, &childWindow
);
481 XButtonPressedEvent event
;
482 event
.type
= ButtonPress
;
488 event
.x_root
= rootX
;
489 event
.y_root
= rootY
;
491 XmMenuPosition (menuWidget
, &event
);
492 XtManageChild (menuWidget
);
498 wxMenuBar::wxMenuBar()
500 m_eventHandler
= this;
504 m_menuBarFrame
= NULL
;
505 m_mainWidget
= (WXWidget
) NULL
;
506 m_backgroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU
);
507 m_foregroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT
);
508 m_font
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
);
511 wxMenuBar::wxMenuBar(int n
, wxMenu
*menus
[], const wxString titles
[])
513 m_eventHandler
= this;
516 m_titles
= new wxString
[n
];
518 for ( i
= 0; i
< n
; i
++ )
519 m_titles
[i
] = titles
[i
];
520 m_menuBarFrame
= NULL
;
521 m_backgroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENU
);
522 m_foregroundColour
= wxSystemSettings::GetSystemColour(wxSYS_COLOUR_MENUTEXT
);
523 m_font
= wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
);
526 wxMenuBar::~wxMenuBar()
529 for (i
= 0; i
< m_menuCount
; i
++)
537 // Must only be used AFTER menu has been attached to frame,
538 // otherwise use individual menus to enable/disable items
539 void wxMenuBar::Enable(int id
, bool flag
)
541 wxMenu
*itemMenu
= NULL
;
542 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
548 void wxMenuBar::EnableTop(int pos
, bool flag
)
553 // Must only be used AFTER menu has been attached to frame,
554 // otherwise use individual menus
555 void wxMenuBar::Check(int id
, bool flag
)
557 wxMenu
*itemMenu
= NULL
;
558 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
562 if (!item
->IsCheckable())
568 bool wxMenuBar::Checked(int id
) const
570 wxMenu
*itemMenu
= NULL
;
571 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
575 return item
->IsChecked();
578 bool wxMenuBar::Enabled(int id
) const
580 wxMenu
*itemMenu
= NULL
;
581 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
585 return item
->IsEnabled();
588 void wxMenuBar::SetLabel(int id
, const wxString
& label
)
590 wxMenu
*itemMenu
= NULL
;
591 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
596 item
->SetLabel(label
);
599 wxString
wxMenuBar::GetLabel(int id
) const
601 wxMenu
*itemMenu
= NULL
;
602 wxMenuItem
*item
= FindItemForId(id
, &itemMenu
) ;
607 return item
->GetLabel();
610 void wxMenuBar::SetLabelTop(int pos
, const wxString
& label
)
612 wxASSERT( (pos
< m_menuCount
) );
614 Widget w
= (Widget
) m_menus
[pos
]->GetButtonWidget();
617 XmString label_str
= XmStringCreateSimple ((char*) (const char*) label
);
619 XmNlabelString
, label_str
,
621 XmStringFree (label_str
);
625 wxString
wxMenuBar::GetLabelTop(int pos
) const
627 wxASSERT( (pos
< m_menuCount
) );
629 Widget w
= (Widget
) m_menus
[pos
]->GetButtonWidget();
635 XmNlabelString
, &text
,
638 if (XmStringGetLtoR (text
, XmSTRING_DEFAULT_CHARSET
, &s
))
646 return wxEmptyString
;
650 return wxEmptyString
;
654 bool wxMenuBar::OnDelete(wxMenu
*menu
, int pos
)
656 // Only applies to dynamic deletion (when set in frame)
660 menu
->DestroyMenu(TRUE
);
664 bool wxMenuBar::OnAppend(wxMenu
*menu
, const char *title
)
666 // Only applies to dynamic append (when set in frame)
670 // Probably should be an assert here
671 if (menu
->GetParent())
674 // Has already been appended
675 if (menu
->GetButtonWidget())
678 WXWidget w
= menu
->CreateMenu(this, GetMainWidget(), menu
, title
, TRUE
);
679 menu
->SetButtonWidget(w
);
684 void wxMenuBar::Append (wxMenu
* menu
, const wxString
& title
)
686 if (!OnAppend(menu
, title
))
690 wxMenu
**new_menus
= new wxMenu
*[m_menuCount
];
691 wxString
*new_titles
= new wxString
[m_menuCount
];
694 for (i
= 0; i
< m_menuCount
- 1; i
++)
696 new_menus
[i
] = m_menus
[i
];
698 new_titles
[i
] = m_titles
[i
];
707 m_titles
= new_titles
;
709 m_menus
[m_menuCount
- 1] = (wxMenu
*)menu
;
710 m_titles
[m_menuCount
- 1] = title
;
712 menu
->SetMenuBar(this);
713 menu
->SetParent(this);
716 void wxMenuBar::Delete(wxMenu
* menu
, int i
)
723 for (ii
= 0; ii
< m_menuCount
; ii
++)
725 if (m_menus
[ii
] == menu
)
728 if (ii
>= m_menuCount
)
732 if (ii
< 0 || ii
>= m_menuCount
)
737 if (!OnDelete(menu
, ii
))
740 menu
->SetParent((wxEvtHandler
*) NULL
);
743 for (j
= ii
; j
< m_menuCount
; j
++)
745 m_menus
[j
] = m_menus
[j
+ 1];
746 m_titles
[j
] = m_titles
[j
+ 1];
750 // Find the menu menuString, item itemString, and return the item id.
751 // Returns -1 if none found.
752 int wxMenuBar::FindMenuItem (const wxString
& menuString
, const wxString
& itemString
) const
756 wxStripMenuCodes ((char *)(const char *)menuString
, buf1
);
758 for (i
= 0; i
< m_menuCount
; i
++)
760 wxStripMenuCodes ((char *)(const char *)m_titles
[i
], buf2
);
761 if (strcmp (buf1
, buf2
) == 0)
762 return m_menus
[i
]->FindItem (itemString
);
767 wxMenuItem
*wxMenuBar::FindItemForId (int id
, wxMenu
** itemMenu
) const
772 wxMenuItem
*item
= NULL
;
774 for (i
= 0; i
< m_menuCount
; i
++)
775 if ((item
= m_menus
[i
]->FindItemForId (id
, itemMenu
)))
780 void wxMenuBar::SetHelpString (int id
, const wxString
& helpString
)
783 for (i
= 0; i
< m_menuCount
; i
++)
785 if (m_menus
[i
]->FindItemForId (id
))
787 m_menus
[i
]->SetHelpString (id
, helpString
);
793 wxString
wxMenuBar::GetHelpString (int id
) const
796 for (i
= 0; i
< m_menuCount
; i
++)
798 if (m_menus
[i
]->FindItemForId (id
))
799 return wxString(m_menus
[i
]->GetHelpString (id
));
805 bool wxMenuBar::CreateMenuBar(wxFrame
* parent
)
809 XtVaSetValues((Widget
) parent
->GetMainWindowWidget(), XmNmenuBar
, (Widget
) m_mainWidget
, NULL
);
811 if (!XtIsManaged((Widget) m_mainWidget))
812 XtManageChild((Widget) m_mainWidget);
814 XtMapWidget((Widget
) m_mainWidget
);
818 Widget menuBarW
= XmCreateMenuBar ((Widget
) parent
->GetMainWindowWidget(), "MenuBar", NULL
, 0);
819 m_mainWidget
= (WXWidget
) menuBarW
;
822 for (i
= 0; i
< GetMenuCount(); i
++)
824 wxMenu
*menu
= GetMenu(i
);
825 wxString
title(m_titles
[i
]);
826 menu
->SetButtonWidget(menu
->CreateMenu (this, menuBarW
, menu
, title
, TRUE
));
829 * COMMENT THIS OUT IF YOU DON'T LIKE A RIGHT-JUSTIFIED HELP MENU
831 wxStripMenuCodes ((char*) (const char*) title
, wxBuffer
);
833 if (strcmp (wxBuffer
, "Help") == 0)
834 XtVaSetValues ((Widget
) menuBarW
, XmNmenuHelpWidget
, (Widget
) menu
->GetButtonWidget(), NULL
);
837 SetBackgroundColour(m_backgroundColour
);
838 SetForegroundColour(m_foregroundColour
);
841 XtVaSetValues((Widget
) parent
->GetMainWindowWidget(), XmNmenuBar
, (Widget
) m_mainWidget
, NULL
);
842 XtRealizeWidget ((Widget
) menuBarW
);
843 XtManageChild ((Widget
) menuBarW
);
844 SetMenuBarFrame(parent
);
849 // Destroy menubar, but keep data structures intact so we can recreate it.
850 bool wxMenuBar::DestroyMenuBar()
854 SetMenuBarFrame((wxFrame
*) NULL
);
858 XtUnmanageChild ((Widget
) m_mainWidget
);
859 XtUnrealizeWidget ((Widget
) m_mainWidget
);
862 for (i
= 0; i
< GetMenuCount(); i
++)
864 wxMenu
*menu
= GetMenu(i
);
865 menu
->DestroyMenu(TRUE
);
868 XtDestroyWidget((Widget
) m_mainWidget
);
869 m_mainWidget
= (WXWidget
) 0;
871 SetMenuBarFrame((wxFrame
*) NULL
);
878 extern wxApp
*wxTheApp
;
879 static XtWorkProcId WorkProcMenuId
;
881 /* Since PopupMenu under Motif stills grab right mouse button events
882 * after it was closed, we need to delete the associated widgets to
883 * allow next PopUpMenu to appear...
886 int PostDeletionOfMenu( XtPointer
* clientData
)
888 XtRemoveWorkProc(WorkProcMenuId
);
889 wxMenu
*menu
= (wxMenu
*)clientData
;
891 if (menu
->GetMainWidget()) {
892 if (menu
->GetParent())
894 wxList
& list
= menu
->GetParent()->GetItems();
895 list
.DeleteObject(menu
);
897 menu
->DestroyMenu(TRUE
);
899 /* Mark as no longer popped up */
905 wxMenuPopdownCallback(Widget w
, XtPointer clientData
,
908 wxMenu
*menu
= (wxMenu
*)clientData
;
910 // Added by JOREL Jean-Charles <jjorel@silr.ireste.fr>
911 /* Since Callbacks of MenuItems are not yet processed, we put a
912 * background job which will be done when system will be idle.
913 * What awful hack!! :(
916 WorkProcMenuId
= XtAppAddWorkProc(
917 (XtAppContext
) wxTheApp
->GetAppContext(),
918 (XtWorkProc
) PostDeletionOfMenu
,
920 // Apparently not found in Motif headers
921 // XtVaSetValues( w, XmNpopupEnabled, XmPOPUP_DISABLED, NULL );
925 * Create a popup or pulldown menu.
926 * Submenus of a popup will be pulldown.
930 WXWidget
wxMenu::CreateMenu (wxMenuBar
* menuBar
, WXWidget parent
, wxMenu
* topMenu
, const wxString
& title
, bool pullDown
)
932 Widget menu
= (Widget
) 0;
933 Widget buttonWidget
= (Widget
) 0;
935 XtSetArg (args
[0], XmNnumColumns
, m_numColumns
);
936 XtSetArg (args
[1], XmNpacking
, XmPACK_COLUMN
);
940 menu
= XmCreatePopupMenu ((Widget
) parent
, "popup", args
, 2);
943 (XtCallbackProc
)wxMenuPopdownCallback
,
948 char mnem
= wxFindMnemonic (title
);
949 wxStripMenuCodes ((char*) (const char*) title
, wxBuffer
);
951 menu
= XmCreatePulldownMenu ((Widget
) parent
, "pulldown", args
, 2);
953 XmString label_str
= XmStringCreateSimple (wxBuffer
);
954 buttonWidget
= XtVaCreateManagedWidget (wxBuffer
,
956 xmCascadeButtonGadgetClass
, (Widget
) parent
,
958 xmCascadeButtonWidgetClass
, (Widget
) parent
,
960 XmNlabelString
, label_str
,
965 XtVaSetValues (buttonWidget
, XmNmnemonic
, mnem
, NULL
);
967 XmStringFree (label_str
);
970 m_menuWidget
= (WXWidget
) menu
;
973 m_topLevelMenu
= topMenu
;
975 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
977 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
978 item
->CreateItem (menu
, menuBar
, topMenu
);
981 SetBackgroundColour(m_backgroundColour
);
982 SetForegroundColour(m_foregroundColour
);
988 // Destroys the Motif implementation of the menu,
989 // but maintains the wxWindows data structures so we can
990 // do a CreateMenu again.
991 void wxMenu::DestroyMenu (bool full
)
993 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
995 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
996 item
->SetMenuBar((wxMenuBar
*) NULL
);
998 item
->DestroyItem(full
);
1005 XtVaSetValues((Widget
) m_buttonWidget
, XmNsubMenuId
, NULL
, NULL
);
1006 XtDestroyWidget ((Widget
) m_buttonWidget
);
1007 m_buttonWidget
= (WXWidget
) 0;
1010 if (m_menuWidget
&& full
)
1012 XtDestroyWidget((Widget
) m_menuWidget
);
1013 m_menuWidget
= (WXWidget
) NULL
;
1017 WXWidget
wxMenu::FindMenuItem (int id
, wxMenuItem
** it
) const
1022 *it
= (wxMenuItem
*) NULL
;
1023 return m_buttonWidget
;
1026 for (wxNode
* node
= m_menuItems
.First (); node
; node
= node
->Next ())
1028 wxMenuItem
*item
= (wxMenuItem
*) node
->Data ();
1029 if (item
->GetId() == id
)
1033 return item
->GetButtonWidget();
1036 if (item
->GetSubMenu())
1038 WXWidget w
= item
->GetSubMenu()->FindMenuItem (id
, it
);
1047 *it
= (wxMenuItem
*) NULL
;
1048 return (WXWidget
) NULL
;
1051 void wxMenu::SetBackgroundColour(const wxColour
& col
)
1053 m_backgroundColour
= col
;
1055 wxDoChangeBackgroundColour(m_menuWidget
, (wxColour
&) col
);
1057 wxDoChangeBackgroundColour(m_buttonWidget
, (wxColour
&) col
, TRUE
);
1059 wxNode
* node
= m_menuItems
.First();
1062 wxMenuItem
* item
= (wxMenuItem
*) node
->Data();
1063 if (item
->GetButtonWidget())
1065 // This crashes because it uses gadgets
1066 // wxDoChangeBackgroundColour(item->GetButtonWidget(), (wxColour&) col, TRUE);
1068 if (item
->GetSubMenu())
1069 item
->GetSubMenu()->SetBackgroundColour((wxColour
&) col
);
1070 node
= node
->Next();
1074 void wxMenu::SetForegroundColour(const wxColour
& col
)
1076 m_foregroundColour
= col
;
1078 wxDoChangeForegroundColour(m_menuWidget
, (wxColour
&) col
);
1080 wxDoChangeForegroundColour(m_buttonWidget
, (wxColour
&) col
);
1082 wxNode
* node
= m_menuItems
.First();
1085 wxMenuItem
* item
= (wxMenuItem
*) node
->Data();
1086 if (item
->GetButtonWidget())
1088 // This crashes because it uses gadgets
1089 // wxDoChangeForegroundColour(item->GetButtonWidget(), (wxColour&) col);
1091 if (item
->GetSubMenu())
1092 item
->GetSubMenu()->SetForegroundColour((wxColour
&) col
);
1093 node
= node
->Next();
1097 void wxMenu::ChangeFont(bool keepOriginalSize
)
1099 // lesstif 0.87 hangs when setting XmNfontList
1100 #ifndef LESSTIF_VERSION
1101 if (!m_font
.Ok() || !m_menuWidget
)
1104 XmFontList fontList
= (XmFontList
) m_font
.GetFontList(1.0, XtDisplay((Widget
) m_menuWidget
));
1106 XtVaSetValues ((Widget
) m_menuWidget
,
1107 XmNfontList
, fontList
,
1111 XtVaSetValues ((Widget
) m_buttonWidget
,
1112 XmNfontList
, fontList
,
1115 wxNode
* node
= m_menuItems
.First();
1118 wxMenuItem
* item
= (wxMenuItem
*) node
->Data();
1119 if (m_menuWidget
&& item
->GetButtonWidget() && m_font
.Ok())
1121 XtVaSetValues ((Widget
) item
->GetButtonWidget(),
1122 XmNfontList
, fontList
,
1125 if (item
->GetSubMenu())
1126 item
->GetSubMenu()->ChangeFont(keepOriginalSize
);
1127 node
= node
->Next();
1132 void wxMenu::SetFont(const wxFont
& font
)
1138 void wxMenuBar::SetBackgroundColour(const wxColour
& col
)
1141 m_backgroundColour
= col
;
1143 wxDoChangeBackgroundColour(m_mainWidget
, (wxColour
&) col
);
1145 for (i
= 0; i
< m_menuCount
; i
++)
1146 m_menus
[i
]->SetBackgroundColour((wxColour
&) col
);
1149 void wxMenuBar::SetForegroundColour(const wxColour
& col
)
1151 m_foregroundColour
= col
;
1153 wxDoChangeForegroundColour(m_mainWidget
, (wxColour
&) col
);
1156 for (i
= 0; i
< m_menuCount
; i
++)
1157 m_menus
[i
]->SetForegroundColour((wxColour
&) col
);
1160 void wxMenuBar::ChangeFont(bool keepOriginalSize
)
1162 // Nothing to do for menubar, fonts are kept in wxMenus
1165 void wxMenuBar::SetFont(const wxFont
& font
)
1171 for (i
= 0; i
< m_menuCount
; i
++)
1172 m_menus
[i
]->SetFont(font
);