1. Assorted Motif fixes
[wxWidgets.git] / include / wx / motif / menu.h
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: menu.h
3 // Purpose: wxMenu, wxMenuBar classes
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 17/09/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef _WX_MENU_H_
13 #define _WX_MENU_H_
14
15 #ifdef __GNUG__
16 #pragma interface "menu.h"
17 #endif
18
19 #include "wx/defs.h"
20 #include "wx/event.h"
21 #include "wx/font.h"
22 #include "wx/gdicmn.h"
23
24 class WXDLLEXPORT wxMenuItem;
25 class WXDLLEXPORT wxMenuBar;
26 class WXDLLEXPORT wxMenu;
27
28 WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
29
30 // ----------------------------------------------------------------------------
31 // Menu
32 // ----------------------------------------------------------------------------
33 class WXDLLEXPORT wxMenu: public wxEvtHandler
34 {
35 DECLARE_DYNAMIC_CLASS(wxMenu)
36
37 public:
38 // ctor & dtor
39 #ifdef WXWIN_COMPATIBILITY
40 wxMenu( const wxString& title, const wxFunction func)
41 {
42 Init(title, 0, func);
43 }
44 #endif // WXWIN_COMPATIBILITY
45 wxMenu( const wxString& title = wxEmptyString, long style = 0 )
46 {
47 Init(title, style);
48 }
49 virtual ~wxMenu();
50
51 // construct menu
52 // append items to the menu
53 // separator line
54 void AppendSeparator();
55 // normal item
56 void Append(int id, const wxString& Label, const wxString& helpString = wxEmptyString,
57 bool checkable = FALSE);
58 // a submenu
59 void Append(int id, const wxString& Label, wxMenu *SubMenu,
60 const wxString& helpString = wxEmptyString);
61 // the most generic form (create wxMenuItem first and use it's functions)
62 void Append(wxMenuItem *pItem);
63 // insert a break in the menu
64 void Break();
65 // delete an item
66 void Delete(int id);
67
68 // menu item control
69 void Enable(int id, bool Flag);
70 bool Enabled(int id) const;
71 bool IsEnabled(int id) const { return Enabled(id); };
72 void Check(int id, bool Flag);
73 bool Checked(int id) const;
74 bool IsChecked(int id) const { return IsChecked(id); };
75
76 // Client data
77 void SetClientData(void* clientData) { m_clientData = clientData; }
78 void* GetClientData() const { return m_clientData; }
79
80 // item properties
81 // title
82 void SetTitle(const wxString& label);
83 const wxString GetTitle() const;
84 // label
85 void SetLabel(int id, const wxString& label);
86 wxString GetLabel(int id) const;
87 // help string
88 virtual void SetHelpString(int id, const wxString& helpString);
89 virtual wxString GetHelpString(int id) const ;
90
91 // find item
92 // Finds the item id matching the given string, -1 if not found.
93 virtual int FindItem(const wxString& itemString) const ;
94 // Find wxMenuItem by ID, and item's menu too if itemMenu is !NULL.
95 wxMenuItem *FindItemForId(int itemId, wxMenu **itemMenu = NULL) const;
96
97 // Updates the UI for a menu and all submenus recursively.
98 // source is the object that has the update event handlers
99 // defined for it. If NULL, the menu or associated window
100 // will be used.
101 void UpdateUI(wxEvtHandler* source = (wxEvtHandler*) NULL);
102
103 void ProcessCommand(wxCommandEvent& event);
104
105 #ifdef WXWIN_COMPATIBILITY
106 void Callback(const wxFunction func) { m_callback = func; }
107 #endif // WXWIN_COMPATIBILITY
108
109 virtual void SetParent(wxEvtHandler *parent) { m_parent = parent; }
110 void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; }
111 wxEvtHandler *GetEventHandler() { return m_eventHandler; }
112
113 wxList& GetItems() const { return (wxList&) m_menuItems; }
114
115 void SetInvokingWindow(wxWindow *pWin) { m_pInvokingWindow = pWin; }
116 wxWindow *GetInvokingWindow() const { return m_pInvokingWindow; }
117
118 //// Motif-specific
119 WXWidget GetButtonWidget() const { return m_buttonWidget; }
120 void SetButtonWidget(WXWidget buttonWidget) { m_buttonWidget = buttonWidget; }
121 WXWidget GetMainWidget() const { return m_menuWidget; }
122 wxMenu* GetParent() const { return m_menuParent; }
123 int GetId() const { return m_menuId; }
124 void SetId(int id) { m_menuId = id; }
125 void SetMenuBar(wxMenuBar* menuBar) { m_menuBar = menuBar; }
126 wxMenuBar* GetMenuBar() const { return m_menuBar; }
127
128 void CreatePopup (WXWidget logicalParent, int x, int y);
129 void DestroyPopup (void);
130 void ShowPopup (int x, int y);
131 void HidePopup (void);
132
133 WXWidget CreateMenu(wxMenuBar *menuBar, WXWidget parent, wxMenu *topMenu,
134 const wxString& title = "", bool isPulldown = FALSE);
135
136 // For popups, need to destroy, then recreate menu for a different (or
137 // possibly same) window, since the parent may change.
138 void DestroyMenu(bool full);
139 WXWidget FindMenuItem(int id, wxMenuItem **it = NULL) const;
140
141 const wxColour& GetBackgroundColour() const { return m_backgroundColour; }
142 const wxColour& GetForegroundColour() const { return m_foregroundColour; }
143 const wxFont& GetFont() const { return m_font; }
144
145 void SetBackgroundColour(const wxColour& colour);
146 void SetForegroundColour(const wxColour& colour);
147 void SetFont(const wxFont& colour);
148 void ChangeFont(bool keepOriginalSize = FALSE);
149
150 // implementation from now on
151 WXWidget GetHandle() const { return m_menuWidget; }
152 bool IsTearOff() const { return (m_style & wxMENU_TEAROFF) != 0; }
153
154 public:
155 #ifdef WXWIN_COMPATIBILITY
156 wxFunction m_callback;
157 #endif // WXWIN_COMPATIBILITY
158
159 int m_noItems;
160 wxString m_title;
161 wxMenuBar * m_menuBar;
162 wxList m_menuItems;
163 wxEvtHandler * m_parent;
164 wxEvtHandler * m_eventHandler;
165 void* m_clientData;
166 wxWindow* m_pInvokingWindow;
167
168 long m_style;
169
170 //// Motif-specific
171 int m_numColumns;
172 WXWidget m_menuWidget;
173 WXWidget m_popupShell; // For holding the popup shell widget
174 WXWidget m_buttonWidget; // The actual string, so we can grey it etc.
175 int m_menuId;
176 wxMenu* m_topLevelMenu ;
177 wxMenu* m_menuParent;
178 bool m_ownedByMenuBar;
179 wxColour m_foregroundColour;
180 wxColour m_backgroundColour;
181 wxFont m_font;
182
183 private:
184 // common code for both constructors:
185 void Init( const wxString& title,
186 long style
187 #ifdef WXWIN_COMPATIBILITY
188 , const wxFunction func = (wxFunction) NULL
189 #endif
190 );
191 };
192
193 // ----------------------------------------------------------------------------
194 // Menu Bar (a la Windows)
195 // ----------------------------------------------------------------------------
196
197 class WXDLLEXPORT wxFrame;
198 class WXDLLEXPORT wxMenuBar : public wxEvtHandler
199 {
200 DECLARE_DYNAMIC_CLASS(wxMenuBar)
201
202 public:
203 wxMenuBar( long style );
204 wxMenuBar();
205 wxMenuBar(int n, wxMenu *menus[], const wxString titles[]);
206 ~wxMenuBar();
207
208 void Append(wxMenu *menu, const wxString& title);
209 // Must only be used AFTER menu has been attached to frame,
210 // otherwise use individual menus to enable/disable items
211 void Enable(int Id, bool Flag);
212 bool Enabled(int Id) const ;
213 bool IsEnabled(int Id) const { return Enabled(Id); };
214 void EnableTop(int pos, bool Flag);
215 void Check(int id, bool Flag);
216 bool Checked(int id) const ;
217 bool IsChecked(int Id) const { return Checked(Id); };
218 void SetLabel(int id, const wxString& label) ;
219 wxString GetLabel(int id) const ;
220 void SetLabelTop(int pos, const wxString& label) ;
221 wxString GetLabelTop(int pos) const ;
222 virtual void Delete(wxMenu *menu, int index = 0); /* Menu not destroyed */
223 virtual bool OnAppend(wxMenu *menu, const char *title);
224 virtual bool OnDelete(wxMenu *menu, int index);
225
226 virtual void SetHelpString(int Id, const wxString& helpString);
227 virtual wxString GetHelpString(int Id) const ;
228
229 virtual int FindMenuItem(const wxString& menuString, const wxString& itemString) const ;
230
231 // Find wxMenuItem for item ID, and return item's
232 // menu too if itemMenu is non-NULL.
233 wxMenuItem *FindItemForId(int itemId, wxMenu **menuForItem = NULL) const ;
234
235 void SetEventHandler(wxEvtHandler *handler) { m_eventHandler = handler; }
236 wxEvtHandler *GetEventHandler() { return m_eventHandler; }
237
238 int GetMenuCount() const { return m_menuCount; }
239 wxMenu* GetMenu(int i) const { return m_menus[i]; }
240
241 //// Motif-specific
242 wxFrame* GetMenuBarFrame() const { return m_menuBarFrame; }
243 void SetMenuBarFrame(wxFrame* frame) { m_menuBarFrame = frame; }
244 WXWidget GetMainWidget() const { return m_mainWidget; }
245 void SetMainWidget(WXWidget widget) { m_mainWidget = widget; }
246
247 // Create menubar
248 bool CreateMenuBar(wxFrame* frame);
249
250 // Destroy menubar, but keep data structures intact so we can recreate it.
251 bool DestroyMenuBar();
252
253 const wxColour& GetBackgroundColour() const { return m_backgroundColour; }
254 const wxColour& GetForegroundColour() const { return m_foregroundColour; }
255 const wxFont& GetFont() const { return m_font; }
256
257 void SetBackgroundColour(const wxColour& colour);
258 void SetForegroundColour(const wxColour& colour);
259 void SetFont(const wxFont& colour);
260 void ChangeFont(bool keepOriginalSize = FALSE);
261
262 public:
263 wxEvtHandler * m_eventHandler;
264 int m_menuCount;
265 wxMenu ** m_menus;
266 wxString * m_titles;
267 wxFrame * m_menuBarFrame;
268
269 //// Motif-specific
270 WXWidget m_mainWidget;
271
272 wxColour m_foregroundColour;
273 wxColour m_backgroundColour;
274 wxFont m_font;
275 };
276
277 #endif // _WX_MENU_H_