]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/gtk/tbargtk.cpp
Added distribution script
[wxWidgets.git] / src / gtk / tbargtk.cpp
... / ...
CommitLineData
1/////////////////////////////////////////////////////////////////////////////
2// Name: tbargtk.cpp
3// Purpose: GTK toolbar
4// Author: Robert Roebling
5// RCS-ID: $Id$
6// Copyright: (c) Robert Roebling
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
10#ifdef __GNUG__
11#pragma implementation "tbargtk.h"
12#endif
13
14#include "wx/toolbar.h"
15
16#include "glib.h"
17#include "gdk/gdk.h"
18#include "gtk/gtk.h"
19
20//-----------------------------------------------------------------------------
21// data
22//-----------------------------------------------------------------------------
23
24extern bool g_blockEventsOnDrag;
25
26//-----------------------------------------------------------------------------
27// wxToolBarTool
28//-----------------------------------------------------------------------------
29
30IMPLEMENT_DYNAMIC_CLASS(wxToolBarTool,wxObject)
31
32wxToolBarTool::wxToolBarTool( wxToolBar *owner, int theIndex,
33 const wxBitmap& bitmap1, const wxBitmap& bitmap2,
34 bool toggle,
35 wxObject *clientData,
36 const wxString& shortHelpString,
37 const wxString& longHelpString,
38 GtkWidget *item )
39{
40 m_owner = owner;
41 m_index = theIndex;
42 m_bitmap1 = bitmap1;
43 m_bitmap2 = bitmap2;
44 m_isToggle = toggle;
45 m_enabled = TRUE;
46 m_toggleState = FALSE;
47 m_shortHelpString = shortHelpString;
48 m_longHelpString = longHelpString;
49 m_isMenuCommand = TRUE;
50 m_clientData = clientData;
51 m_deleteSecondBitmap = FALSE;
52 m_item = item;
53}
54
55wxToolBarTool::~wxToolBarTool()
56{
57}
58
59//-----------------------------------------------------------------------------
60// "clicked" (internal from gtk_toolbar)
61//-----------------------------------------------------------------------------
62
63static void gtk_toolbar_callback( GtkWidget *WXUNUSED(widget), wxToolBarTool *tool )
64{
65 if (g_blockEventsOnDrag) return;
66 if (!tool->m_enabled) return;
67
68 if (tool->m_isToggle) tool->m_toggleState = !tool->m_toggleState;
69
70 tool->m_owner->OnLeftClick( tool->m_index, tool->m_toggleState );
71}
72
73//-----------------------------------------------------------------------------
74// "enter_notify_event"
75//-----------------------------------------------------------------------------
76
77static gint gtk_toolbar_enter_callback( GtkWidget *WXUNUSED(widget),
78 GdkEventCrossing *WXUNUSED(gdk_event), wxToolBarTool *tool )
79{
80 if (g_blockEventsOnDrag) return TRUE;
81
82 tool->m_owner->OnMouseEnter( tool->m_index );
83
84 return FALSE;
85}
86
87//-----------------------------------------------------------------------------
88// wxToolBar
89//-----------------------------------------------------------------------------
90
91IMPLEMENT_DYNAMIC_CLASS(wxToolBar,wxControl)
92
93wxToolBar::wxToolBar()
94{
95}
96
97wxToolBar::wxToolBar( wxWindow *parent, wxWindowID id,
98 const wxPoint& pos, const wxSize& size,
99 long style, const wxString& name )
100{
101 Create( parent, id, pos, size, style, name );
102}
103
104wxToolBar::~wxToolBar()
105{
106 delete m_fg;
107 delete m_bg;
108}
109
110bool wxToolBar::Create( wxWindow *parent, wxWindowID id,
111 const wxPoint& pos, const wxSize& size,
112 long style, const wxString& name )
113{
114 m_needParent = TRUE;
115
116 PreCreation( parent, id, pos, size, style, name );
117
118 m_tools.DeleteContents( TRUE );
119
120 m_toolbar = GTK_TOOLBAR( gtk_toolbar_new( GTK_ORIENTATION_HORIZONTAL,
121 GTK_TOOLBAR_ICONS ) );
122
123 m_separation = 5;
124 gtk_toolbar_set_space_size( m_toolbar, m_separation );
125 m_hasToolAlready = FALSE;
126
127 m_widget = GTK_WIDGET(m_toolbar);
128
129 gtk_toolbar_set_tooltips( GTK_TOOLBAR(m_toolbar), TRUE );
130
131 m_fg = new GdkColor;
132 m_fg->red = 0;
133 m_fg->green = 0;
134 m_fg->blue = 0;
135 gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ), m_fg );
136
137 m_bg = new GdkColor;
138 m_bg->red = 65535;
139 m_bg->green = 65535;
140 m_bg->blue = 50000;
141 gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar) ), m_bg );
142
143 gtk_tooltips_set_colors( GTK_TOOLBAR(m_toolbar)->tooltips, m_bg, m_fg );
144
145 m_xMargin = 0;
146 m_yMargin = 0;
147
148 m_parent->AddChild( this );
149
150 (m_parent->m_insertCallback)( m_parent, this );
151
152 PostCreation();
153
154 Show( TRUE );
155
156 return TRUE;
157}
158
159bool wxToolBar::OnLeftClick( int toolIndex, bool toggleDown )
160{
161 wxCommandEvent event( wxEVT_COMMAND_TOOL_CLICKED, toolIndex );
162 event.SetEventObject(this);
163 event.SetInt( toolIndex );
164 event.SetExtraLong((long) toggleDown);
165
166 GetEventHandler()->ProcessEvent(event);
167
168 return TRUE;
169}
170
171void wxToolBar::OnRightClick( int toolIndex, float WXUNUSED(x), float WXUNUSED(y) )
172{
173 wxCommandEvent event( wxEVT_COMMAND_TOOL_RCLICKED, toolIndex );
174 event.SetEventObject( this );
175 event.SetInt( toolIndex );
176
177 GetEventHandler()->ProcessEvent(event);
178}
179
180void wxToolBar::OnMouseEnter( int toolIndex )
181{
182 wxCommandEvent event( wxEVT_COMMAND_TOOL_ENTER, GetId() );
183 event.SetEventObject(this);
184 event.SetInt( toolIndex );
185
186 GetEventHandler()->ProcessEvent(event);
187}
188
189wxToolBarTool *wxToolBar::AddTool( int toolIndex, const wxBitmap& bitmap,
190 const wxBitmap& pushedBitmap, bool toggle,
191 float WXUNUSED(xPos), float WXUNUSED(yPos), wxObject *clientData,
192 const wxString& helpString1, const wxString& helpString2 )
193{
194 m_hasToolAlready = TRUE;
195
196 wxCHECK_MSG( bitmap.Ok(), (wxToolBarTool *)NULL,
197 "invalid bitmap for wxToolBar icon" );
198
199 wxCHECK_MSG( bitmap.GetBitmap() == NULL, (wxToolBarTool *)NULL,
200 "wxToolBar doesn't support GdkBitmap" );
201
202 wxCHECK_MSG( bitmap.GetPixmap() != NULL, (wxToolBarTool *)NULL,
203 "wxToolBar::Add needs a wxBitmap" );
204
205 GtkWidget *tool_pixmap = (GtkWidget *)NULL;
206
207 GdkPixmap *pixmap = bitmap.GetPixmap();
208
209 GdkBitmap *mask = (GdkBitmap *)NULL;
210 if ( bitmap.GetMask() )
211 mask = bitmap.GetMask()->GetBitmap();
212
213 tool_pixmap = gtk_pixmap_new( pixmap, mask );
214
215 gtk_misc_set_alignment( GTK_MISC(tool_pixmap), 0.5, 0.5 );
216
217 wxToolBarTool *tool = new wxToolBarTool( this, toolIndex, bitmap, pushedBitmap,
218 toggle, clientData,
219 helpString1, helpString2,
220 tool_pixmap );
221
222 GtkToolbarChildType ctype = toggle ? GTK_TOOLBAR_CHILD_TOGGLEBUTTON
223 : GTK_TOOLBAR_CHILD_BUTTON;
224
225 GtkWidget *item = gtk_toolbar_append_element
226 (
227 GTK_TOOLBAR(m_toolbar),
228 ctype,
229 (GtkWidget *)NULL,
230 (const char *)NULL,
231 helpString1,
232 "",
233 tool_pixmap,
234 (GtkSignalFunc)gtk_toolbar_callback,
235 (gpointer)tool
236 );
237
238 tool->m_item = item;
239
240 gtk_signal_connect( GTK_OBJECT(tool->m_item),
241 "enter_notify_event",
242 GTK_SIGNAL_FUNC(gtk_toolbar_enter_callback),
243 (gpointer)tool );
244
245 m_tools.Append( tool );
246
247 return tool;
248}
249
250void wxToolBar::AddSeparator()
251{
252 gtk_toolbar_append_space( m_toolbar );
253}
254
255void wxToolBar::ClearTools()
256{
257 wxFAIL_MSG( "wxToolBar::ClearTools not implemented" );
258}
259
260bool wxToolBar::Realize()
261{
262 m_x = 0;
263 m_y = 0;
264 m_width = 100;
265 m_height = 0;
266
267 wxNode *node = m_tools.First();
268 while (node)
269 {
270 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
271 if (tool->m_bitmap1.Ok())
272 {
273 int tool_height = tool->m_bitmap1.GetHeight();
274 if (tool_height > m_height) m_height = tool_height;
275 }
276
277 node = node->Next();
278 }
279
280 m_height += 5 + 2*m_yMargin;
281
282 return TRUE;
283}
284
285void wxToolBar::EnableTool(int toolIndex, bool enable)
286{
287 wxNode *node = m_tools.First();
288 while (node)
289 {
290 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
291 if (tool->m_index == toolIndex)
292 {
293 tool->m_enabled = enable;
294
295 if (tool->m_item)
296 gtk_widget_set_sensitive( tool->m_item, enable );
297
298 return;
299 }
300 node = node->Next();
301 }
302
303 wxFAIL_MSG( "wrong toolbar index" );
304}
305
306void wxToolBar::ToggleTool( int toolIndex, bool toggle )
307{
308 wxNode *node = m_tools.First();
309 while (node)
310 {
311 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
312 if (tool->m_index == toolIndex)
313 {
314 tool->m_toggleState = toggle;
315 if ((tool->m_item) && (GTK_IS_TOGGLE_BUTTON(tool->m_item)))
316 gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(tool->m_item), toggle );
317 return;
318 }
319 node = node->Next();
320 }
321
322 wxFAIL_MSG( "wrong toolbar index" );
323}
324
325wxObject *wxToolBar::GetToolClientData( int index ) const
326{
327 wxNode *node = m_tools.First();
328 while (node)
329 {
330 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
331 if (tool->m_index == index) return tool->m_clientData;;
332 node = node->Next();
333 }
334
335 wxFAIL_MSG( "wrong toolbar index" );
336
337 return (wxObject*)NULL;
338}
339
340bool wxToolBar::GetToolState(int toolIndex) const
341{
342 wxNode *node = m_tools.First();
343 while (node)
344 {
345 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
346 if (tool->m_index == toolIndex) return tool->m_toggleState;
347 node = node->Next();
348 }
349
350 wxFAIL_MSG( "wrong toolbar index" );
351
352 return FALSE;
353}
354
355bool wxToolBar::GetToolEnabled(int toolIndex) const
356{
357 wxNode *node = m_tools.First();
358 while (node)
359 {
360 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
361 if (tool->m_index == toolIndex) return tool->m_enabled;
362 node = node->Next();
363 }
364
365 wxFAIL_MSG( "wrong toolbar index" );
366
367 return FALSE;
368}
369
370void wxToolBar::SetMargins( int x, int y )
371{
372 wxCHECK_RET( !m_hasToolAlready, "wxToolBar::SetMargins must be called before adding tool." );
373
374 if (x > 2) gtk_toolbar_append_space( m_toolbar ); // oh well
375
376 m_xMargin = x;
377 m_yMargin = y;
378}
379
380void wxToolBar::SetToolPacking( int WXUNUSED(packing) )
381{
382 wxFAIL_MSG( "wxToolBar::SetToolPacking not implemented" );
383}
384
385void wxToolBar::SetToolSeparation( int separation )
386{
387 gtk_toolbar_set_space_size( m_toolbar, separation );
388 m_separation = separation;
389}
390
391int wxToolBar::GetToolPacking()
392{
393 return 0;
394}
395
396int wxToolBar::GetToolSeparation()
397{
398 return m_separation;
399}
400
401wxString wxToolBar::GetToolLongHelp(int toolIndex)
402{
403 wxNode *node = m_tools.First();
404 while (node)
405 {
406 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
407 if (tool->m_index == toolIndex)
408 {
409 return tool->m_longHelpString;
410 }
411 node = node->Next();
412 }
413
414 wxFAIL_MSG( "wrong toolbar index" );
415
416 return "";
417}
418
419wxString wxToolBar::GetToolShortHelp(int toolIndex)
420{
421 wxNode *node = m_tools.First();
422 while (node)
423 {
424 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
425 if (tool->m_index == toolIndex)
426 {
427 return tool->m_shortHelpString;
428 }
429 node = node->Next();
430 }
431
432 wxFAIL_MSG( "wrong toolbar index" );
433
434 return "";
435}
436
437void wxToolBar::SetToolLongHelp(int toolIndex, const wxString& helpString)
438{
439 wxNode *node = m_tools.First();
440 while (node)
441 {
442 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
443 if (tool->m_index == toolIndex)
444 {
445 tool->m_longHelpString = helpString;
446 return;
447 }
448 node = node->Next();
449 }
450
451 wxFAIL_MSG( "wrong toolbar index" );
452
453 return;
454}
455
456void wxToolBar::SetToolShortHelp(int toolIndex, const wxString& helpString)
457{
458 wxNode *node = m_tools.First();
459 while (node)
460 {
461 wxToolBarTool *tool = (wxToolBarTool*)node->Data();
462 if (tool->m_index == toolIndex)
463 {
464 tool->m_shortHelpString = helpString;
465 return;
466 }
467 node = node->Next();
468 }
469
470 wxFAIL_MSG( "wrong toolbar index" );
471
472 return;
473}
474
475