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