]> git.saurik.com Git - wxWidgets.git/blame - src/gtk1/menu.cpp
Added wxString version of wxStripExtension; changed OnClose to return TRUE;
[wxWidgets.git] / src / gtk1 / menu.cpp
CommitLineData
c801d85f
KB
1/////////////////////////////////////////////////////////////////////////////
2// Name: menu.cpp
3// Purpose:
4// Author: Robert Roebling
5// Created: 01/02/97
6// Id:
7// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
8// Licence: wxWindows licence
9/////////////////////////////////////////////////////////////////////////////
10
11
12#ifdef __GNUG__
13#pragma implementation "menu.h"
14#endif
15
16#include "wx/menu.h"
17
18//-----------------------------------------------------------------------------
19// wxMenuBar
20//-----------------------------------------------------------------------------
21
22IMPLEMENT_DYNAMIC_CLASS(wxMenuBar,wxWindow)
23
24wxMenuBar::wxMenuBar(void)
25{
26 m_needParent = FALSE; // hmmm
27
28 PreCreation( NULL, -1, wxDefaultPosition, wxDefaultSize, 0, "menu" );
29
30 m_menus.DeleteContents( TRUE );
31
32 m_widget = gtk_handle_box_new();
33
34 m_menubar = gtk_menu_bar_new();
35
36 gtk_container_add( GTK_CONTAINER(m_widget), m_menubar );
37
38 gtk_widget_show( m_menubar );
39
40 PostCreation();
41
42 Show( TRUE );
43};
44
45void wxMenuBar::Append( wxMenu *menu, const wxString &title )
46{
47 m_menus.Append( menu );
48 menu->m_title = title; // ??????
49
50 size_t pos;
51 do {
52 pos = menu->m_title.First( '&' );
53 if (pos != wxString::npos) menu->m_title.Remove( pos, 1 );
54 } while (pos != wxString::npos);
55
56 GtkWidget *root_menu;
57 root_menu = gtk_menu_item_new_with_label( WXSTRINGCAST(menu->m_title) );
58 gtk_widget_show( root_menu );
59 gtk_menu_item_set_submenu( GTK_MENU_ITEM(root_menu), menu->m_menu );
60
61 gtk_menu_bar_append( GTK_MENU_BAR(m_menubar), root_menu );
62};
63
64int FindMenuItemRecursive( const wxMenu *menu, const wxString &menuString, const wxString &itemString )
65{
66 if (menu->m_title == menuString)
67 {
68 int res = menu->FindItem( itemString );
69 if (res != -1) return res;
70 };
71 wxNode *node = menu->m_items.First();
72 while (node)
73 {
74 wxMenuItem *item = (wxMenuItem*)node->Data();
75 if (item->m_subMenu) return FindMenuItemRecursive( item->m_subMenu, menuString, itemString );
76 node = node->Next();
77 };
78 return -1;
79};
80
81int wxMenuBar::FindMenuItem( const wxString &menuString, const wxString &itemString ) const
82{
83 wxNode *node = m_menus.First();
84 while (node)
85 {
86 wxMenu *menu = (wxMenu*)node->Data();
87 int res = FindMenuItemRecursive( menu, menuString, itemString);
88 if (res != -1) return res;
89 node = node->Next();
90 };
91 return -1;
92};
93
94
95//-----------------------------------------------------------------------------
96// wxMenu
97//-----------------------------------------------------------------------------
98
99void gtk_menu_clicked_callback( GtkWidget *widget, gpointer data )
100{
101 wxMenu *menu = (wxMenu*)data;
102 int id = menu->FindMenuIdByMenuItem(widget);
103
104 if (!menu->Enabled(id)) return;
105
106 wxCommandEvent event( wxEVENT_TYPE_MENU_COMMAND, id );
107 event.SetEventObject( menu );
108 event.SetInt(id );
109 wxWindow *win = menu->GetInvokingWindow();
110 if (win) win->ProcessEvent( event );
111};
112
113IMPLEMENT_DYNAMIC_CLASS(wxMenuItem,wxObject)
114
115wxMenuItem::wxMenuItem(void)
116{
117 m_id = 0;
118 m_text = "";
119 m_isCheckMenu = FALSE;
120 m_checked = FALSE;
121 m_isSubMenu = FALSE;
122 m_subMenu = NULL;
123 m_helpStr = "";
124 m_menuItem = NULL;
125};
126
127IMPLEMENT_DYNAMIC_CLASS(wxMenu,wxEvtHandler)
128
129wxMenu::wxMenu( const wxString &title )
130{
131 m_title = title;
132 m_items.DeleteContents( TRUE );
133 m_invokingWindow = NULL;
134 m_menu = gtk_menu_new(); // Do not show!
135};
136
137void wxMenu::AppendSeparator(void)
138{
139 wxMenuItem *mitem = new wxMenuItem();
e2414cbe 140 mitem->m_id = ID_SEPARATOR;
c801d85f
KB
141 mitem->m_text = "";
142 mitem->m_helpStr = "";
143 mitem->m_isCheckMenu = FALSE;
144 mitem->m_isEnabled = TRUE;
145 mitem->m_menuItem = gtk_menu_item_new();
146 gtk_menu_append( GTK_MENU(m_menu), mitem->m_menuItem );
147 gtk_widget_show( mitem->m_menuItem );
148 m_items.Append( mitem );
149};
150
debe6624 151void wxMenu::Append( int id, const wxString &item, const wxString &helpStr, bool checkable )
c801d85f
KB
152{
153 wxMenuItem *mitem = new wxMenuItem();
154 mitem->m_id = id;
155
156 mitem->m_text = item;
157 size_t pos;
158 do {
159 pos = mitem->m_text.First( '&' );
160 if (pos != wxString::npos) mitem->m_text.Remove( pos, 1 );
161 } while (pos != wxString::npos);
162
163 mitem->m_helpStr = helpStr;
164 mitem->m_isCheckMenu = checkable;
165 mitem->m_isEnabled = TRUE;
166 if (checkable)
167 mitem->m_menuItem = gtk_check_menu_item_new_with_label( WXSTRINGCAST(mitem->m_text) );
168 else
169 mitem->m_menuItem = gtk_menu_item_new_with_label( WXSTRINGCAST(mitem->m_text) );
170
171 gtk_signal_connect( GTK_OBJECT(mitem->m_menuItem), "activate",
172 GTK_SIGNAL_FUNC(gtk_menu_clicked_callback), (gpointer*)this );
173
174 gtk_menu_append( GTK_MENU(m_menu), mitem->m_menuItem );
175 gtk_widget_show( mitem->m_menuItem );
176 m_items.Append( mitem );
177};
178
debe6624 179void wxMenu::Append( int id, const wxString &item, wxMenu *subMenu, const wxString &helpStr )
c801d85f
KB
180{
181 wxMenuItem *mitem = new wxMenuItem();
182 mitem->m_id = id;
183 mitem->m_text = item;
184 mitem->m_isEnabled = TRUE;
185
186 size_t pos;
187 do {
188 pos = mitem->m_text.First( '&' );
189 if (pos != wxString::npos) mitem->m_text.Remove( pos, 1 );
190 } while (pos != wxString::npos);
191
192 mitem->m_helpStr = helpStr;
193 mitem->m_menuItem = gtk_menu_item_new_with_label( WXSTRINGCAST(mitem->m_text) );
194
195 mitem->m_subMenu = subMenu;
196 gtk_menu_item_set_submenu( GTK_MENU_ITEM(mitem->m_menuItem), subMenu->m_menu );
197 gtk_menu_append( GTK_MENU(m_menu), mitem->m_menuItem );
198 gtk_widget_show( mitem->m_menuItem );
199 m_items.Append( mitem );
200};
201
202int wxMenu::FindItem( const wxString itemString ) const
203{
204 wxString s( itemString );
205
206 size_t pos;
207 do {
208 pos = s.First( '&' );
209 if (pos != wxString::npos) s.Remove( pos, 1 );
210 } while (pos != wxString::npos);
211
212 wxNode *node = m_items.First();
213 while (node)
214 {
215 wxMenuItem *item = (wxMenuItem*)node->Data();
216 if (item->m_text == s) return item->m_id;
217 node = node->Next();
218 };
219 return -1;
220};
221
e2414cbe
RR
222void wxMenu::Check( int WXUNUSED(id), bool WXUNUSED(Flag) )
223{
224 // I'm just too lazy
225};
226
debe6624 227void wxMenu::Enable( int id, bool enable )
c801d85f
KB
228{
229 wxNode *node = m_items.First();
230 while (node)
231 {
232 wxMenuItem *item = (wxMenuItem*)node->Data();
233 if (item->m_id == id)
234 {
235 item->m_isEnabled = enable;
236 return;
237 };
238 node = node->Next();
239 };
240};
241
debe6624 242bool wxMenu::Enabled( int id ) const
c801d85f
KB
243{
244 wxNode *node = m_items.First();
245 while (node)
246 {
247 wxMenuItem *item = (wxMenuItem*)node->Data();
248 if (item->m_id == id) return item->m_isEnabled;
249 node = node->Next();
250 };
251 return FALSE;
252};
253
debe6624 254void wxMenu::SetLabel( int id, const wxString &label )
c801d85f
KB
255{
256 wxString s( label );
257 size_t pos;
258 do {
259 pos = s.First( '&' );
260 if (pos != wxString::npos) s.Remove( pos, 1 );
261 } while (pos != wxString::npos);
262
263 wxNode *node = m_items.First();
264 while (node)
265 {
266 wxMenuItem *item = (wxMenuItem*)node->Data();
267 item->m_text = s;
268 if (item->m_id == id)
269 {
270 gtk_label_set( GTK_LABEL( GTK_BIN(item->m_menuItem)->child ), WXSTRINGCAST(s) );
271 };
272 node = node->Next();
273 };
274};
275
276int wxMenu::FindMenuIdByMenuItem( GtkWidget *menuItem ) const
277{
278 wxNode *node = m_items.First();
279 while (node)
280 {
281 wxMenuItem *item = (wxMenuItem*)node->Data();
282 if (item->m_menuItem == menuItem) return item->m_id;
283 node = node->Next();
284 };
285 return -1;
286};
287
288void wxMenu::SetInvokingWindow( wxWindow *win )
289{
290 m_invokingWindow = win;
291};
292
293wxWindow *wxMenu::GetInvokingWindow(void)
294{
295 return m_invokingWindow;
296};
297
298