1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/toolbar.cpp 
   3 // Purpose:     GTK toolbar 
   4 // Author:      Robert Roebling 
   5 // Modified:    13.12.99 by VZ to derive from wxToolBarBase 
   7 // Copyright:   (c) Robert Roebling 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  11 // For compilers that support precompilation, includes "wx.h". 
  12 #include "wx/wxprec.h" 
  14 #if wxUSE_TOOLBAR_NATIVE 
  16 #include "wx/toolbar.h" 
  18 #include "wx/gtk/private.h" 
  20 // ---------------------------------------------------------------------------- 
  22 // ---------------------------------------------------------------------------- 
  25 extern bool       g_blockEventsOnDrag
; 
  26 extern wxCursor   g_globalCursor
; 
  28 // ---------------------------------------------------------------------------- 
  30 // ---------------------------------------------------------------------------- 
  32 class wxToolBarTool 
: public wxToolBarToolBase
 
  35     wxToolBarTool(wxToolBar 
*tbar
, 
  37                   const wxString
& label
, 
  38                   const wxBitmap
& bitmap1
, 
  39                   const wxBitmap
& bitmap2
, 
  42                   const wxString
& shortHelpString
, 
  43                   const wxString
& longHelpString
) 
  44         : wxToolBarToolBase(tbar
, id
, label
, bitmap1
, bitmap2
, kind
, 
  45                             clientData
, shortHelpString
, longHelpString
) 
  50     wxToolBarTool(wxToolBar 
*tbar
, wxControl 
*control
, const wxString
& label
) 
  51         : wxToolBarToolBase(tbar
, control
, label
) 
  57     void CreateDropDown(); 
  58     void ShowDropdown(GtkToggleButton
* button
); 
  63 // ---------------------------------------------------------------------------- 
  65 // ---------------------------------------------------------------------------- 
  67 IMPLEMENT_DYNAMIC_CLASS(wxToolBar
, wxControl
) 
  69 // ============================================================================ 
  71 // ============================================================================ 
  73 //----------------------------------------------------------------------------- 
  74 // "clicked" from m_item 
  75 //----------------------------------------------------------------------------- 
  78 static void item_clicked(GtkToolButton
*, wxToolBarTool
* tool
) 
  80     if (g_blockEventsOnDrag
) return; 
  82     tool
->GetToolBar()->OnLeftClick(tool
->GetId(), false); 
  86 //----------------------------------------------------------------------------- 
  87 // "toggled" from m_item 
  88 //----------------------------------------------------------------------------- 
  91 static void item_toggled(GtkToggleToolButton
* button
, wxToolBarTool
* tool
) 
  93     if (g_blockEventsOnDrag
) return; 
  95     const bool active 
= gtk_toggle_tool_button_get_active(button
) != 0; 
  97     if (!active 
&& tool
->GetKind() == wxITEM_RADIO
) 
 100     if (!tool
->GetToolBar()->OnLeftClick(tool
->GetId(), active
)) 
 108 //----------------------------------------------------------------------------- 
 109 // "button_press_event" from m_item child 
 110 //----------------------------------------------------------------------------- 
 114 button_press_event(GtkWidget
*, GdkEventButton
* event
, wxToolBarTool
* tool
) 
 116     if (event
->button 
!= 3) 
 119     if (g_blockEventsOnDrag
) return TRUE
; 
 121     tool
->GetToolBar()->OnRightClick( 
 122         tool
->GetId(), int(event
->x
), int(event
->y
)); 
 128 //----------------------------------------------------------------------------- 
 129 // "child_detached" from m_widget 
 130 //----------------------------------------------------------------------------- 
 133 static void child_detached(GtkWidget
*, GtkToolbar
* toolbar
, void*) 
 135     // disable showing overflow arrow when toolbar is detached, 
 136     // otherwise toolbar collapses to just an arrow 
 137     gtk_toolbar_set_show_arrow(toolbar
, false); 
 141 //----------------------------------------------------------------------------- 
 142 // "child_attached" from m_widget 
 143 //----------------------------------------------------------------------------- 
 146 static void child_attached(GtkWidget
*, GtkToolbar
* toolbar
, void*) 
 148     gtk_toolbar_set_show_arrow(toolbar
, true); 
 152 //----------------------------------------------------------------------------- 
 153 // "enter_notify_event" / "leave_notify_event" from m_item 
 154 //----------------------------------------------------------------------------- 
 158 enter_notify_event(GtkWidget
*, GdkEventCrossing
* event
, wxToolBarTool
* tool
) 
 160     if (g_blockEventsOnDrag
) return TRUE
; 
 163     if (event
->type 
== GDK_ENTER_NOTIFY
) 
 165     tool
->GetToolBar()->OnMouseEnter(id
); 
 171 //----------------------------------------------------------------------------- 
 172 // "size_request" from m_toolbar 
 173 //----------------------------------------------------------------------------- 
 177 size_request(GtkWidget
*, GtkRequisition
* req
, wxToolBar
* win
) 
 179     const wxSize margins 
= win
->GetMargins(); 
 180     req
->width  
+= margins
.x
; 
 181     req
->height 
+= 2 * margins
.y
; 
 185 //----------------------------------------------------------------------------- 
 186 // "expose_event" from GtkImage inside m_item 
 187 //----------------------------------------------------------------------------- 
 191 image_expose_event(GtkWidget
* widget
, GdkEventExpose
*, wxToolBarTool
* tool
) 
 193     const wxBitmap
& bitmap 
= tool
->GetDisabledBitmap(); 
 194     if (tool
->IsEnabled() || !bitmap
.IsOk()) 
 197     // draw disabled bitmap ourselves, GtkImage has no way to specify it 
 198     const GtkAllocation
& alloc 
= widget
->allocation
; 
 200         widget
->window
, widget
->style
->black_gc
, bitmap
.GetPixbuf(), 
 202         alloc
.x 
+ (alloc
.width 
- widget
->requisition
.width
) / 2, 
 203         alloc
.y 
+ (alloc
.height 
- widget
->requisition
.height
) / 2, 
 204         -1, -1, GDK_RGB_DITHER_NORMAL
, 0, 0); 
 209 //----------------------------------------------------------------------------- 
 210 // "toggled" from dropdown menu button 
 211 //----------------------------------------------------------------------------- 
 214 static void arrow_toggled(GtkToggleButton
* button
, wxToolBarTool
* tool
) 
 216     if (gtk_toggle_button_get_active(button
)) 
 218         tool
->ShowDropdown(button
); 
 219         gtk_toggle_button_set_active(button
, false); 
 224 //----------------------------------------------------------------------------- 
 225 // "button_press_event" from dropdown menu button 
 226 //----------------------------------------------------------------------------- 
 230 arrow_button_press_event(GtkToggleButton
* button
, GdkEventButton
* event
, wxToolBarTool
* tool
) 
 232     if (event
->button 
== 1) 
 234         g_signal_handlers_block_by_func(button
, (void*)arrow_toggled
, tool
); 
 235         gtk_toggle_button_set_active(button
, true); 
 236         tool
->ShowDropdown(button
); 
 237         gtk_toggle_button_set_active(button
, false); 
 238         g_signal_handlers_unblock_by_func(button
, (void*)arrow_toggled
, tool
); 
 245 void wxToolBar::AddChildGTK(wxWindowGTK
* child
) 
 247     GtkWidget
* align 
= gtk_alignment_new(0.5, 0.5, 0, 0); 
 248     gtk_widget_show(align
); 
 249     gtk_container_add(GTK_CONTAINER(align
), child
->m_widget
); 
 250     GtkToolItem
* item 
= gtk_tool_item_new(); 
 251     gtk_container_add(GTK_CONTAINER(item
), align
); 
 252     // position will be corrected in DoInsertTool if necessary 
 253     gtk_toolbar_insert(GTK_TOOLBAR(GTK_BIN(m_widget
)->child
), item
, -1); 
 256 // ---------------------------------------------------------------------------- 
 258 // ---------------------------------------------------------------------------- 
 260 void wxToolBarTool::SetImage() 
 262     const wxBitmap
& bitmap 
= GetNormalBitmap(); 
 263     wxCHECK_RET(bitmap
.IsOk(), "invalid bitmap for wxToolBar icon"); 
 265     GtkWidget
* image 
= gtk_tool_button_get_icon_widget(GTK_TOOL_BUTTON(m_item
)); 
 266     // always use pixbuf, because pixmap mask does not 
 267     // work with disabled images in some themes 
 268     gtk_image_set_from_pixbuf(GTK_IMAGE(image
), bitmap
.GetPixbuf()); 
 271 // helper to create a dropdown menu item 
 272 void wxToolBarTool::CreateDropDown() 
 274     gtk_tool_item_set_homogeneous(m_item
, false); 
 277     if (GetToolBar()->HasFlag(wxTB_LEFT 
| wxTB_RIGHT
)) 
 279         box 
= gtk_vbox_new(false, 0); 
 280         arrow 
= gtk_arrow_new(GTK_ARROW_RIGHT
, GTK_SHADOW_NONE
); 
 284         box 
= gtk_hbox_new(false, 0); 
 285         arrow 
= gtk_arrow_new(GTK_ARROW_DOWN
, GTK_SHADOW_NONE
); 
 287     GtkWidget
* tool_button 
= GTK_BIN(m_item
)->child
; 
 288     gtk_widget_reparent(tool_button
, box
); 
 289     GtkWidget
* arrow_button 
= gtk_toggle_button_new(); 
 290     gtk_button_set_relief(GTK_BUTTON(arrow_button
), 
 291         gtk_tool_item_get_relief_style(GTK_TOOL_ITEM(m_item
))); 
 292     gtk_container_add(GTK_CONTAINER(arrow_button
), arrow
); 
 293     gtk_container_add(GTK_CONTAINER(box
), arrow_button
); 
 294     gtk_widget_show_all(box
); 
 295     gtk_container_add(GTK_CONTAINER(m_item
), box
); 
 297     g_signal_connect(arrow_button
, "toggled", G_CALLBACK(arrow_toggled
), this); 
 298     g_signal_connect(arrow_button
, "button_press_event", 
 299         G_CALLBACK(arrow_button_press_event
), this); 
 302 void wxToolBarTool::ShowDropdown(GtkToggleButton
* button
) 
 304     wxToolBarBase
* toolbar 
= GetToolBar(); 
 305     wxCommandEvent 
event(wxEVT_COMMAND_TOOL_DROPDOWN_CLICKED
, GetId()); 
 306     if (!toolbar
->HandleWindowEvent(event
)) 
 308         wxMenu
* menu 
= GetDropdownMenu(); 
 311             const GtkAllocation
& alloc 
= GTK_WIDGET(button
)->allocation
; 
 314             if (toolbar
->HasFlag(wxTB_LEFT 
| wxTB_RIGHT
)) 
 318             toolbar
->PopupMenu(menu
, x
, y
); 
 323 wxToolBarToolBase 
*wxToolBar::CreateTool(int id
, 
 324                                          const wxString
& text
, 
 325                                          const wxBitmap
& bitmap1
, 
 326                                          const wxBitmap
& bitmap2
, 
 328                                          wxObject 
*clientData
, 
 329                                          const wxString
& shortHelpString
, 
 330                                          const wxString
& longHelpString
) 
 332     return new wxToolBarTool(this, id
, text
, bitmap1
, bitmap2
, kind
, 
 333                              clientData
, shortHelpString
, longHelpString
); 
 337 wxToolBar::CreateTool(wxControl 
*control
, const wxString
& label
) 
 339     return new wxToolBarTool(this, control
, label
); 
 342 //----------------------------------------------------------------------------- 
 343 // wxToolBar construction 
 344 //----------------------------------------------------------------------------- 
 346 void wxToolBar::Init() 
 352 wxToolBar::~wxToolBar() 
 356         gtk_object_destroy(GTK_OBJECT(m_tooltips
)); 
 357         g_object_unref(m_tooltips
); 
 361 bool wxToolBar::Create( wxWindow 
*parent
, 
 366                         const wxString
& name 
) 
 368     if ( !PreCreation( parent
, pos
, size 
) || 
 369          !CreateBase( parent
, id
, pos
, size
, style
, wxDefaultValidator
, name 
)) 
 371         wxFAIL_MSG( wxT("wxToolBar creation failed") ); 
 378     m_toolbar 
= GTK_TOOLBAR( gtk_toolbar_new() ); 
 379     m_tooltips 
= gtk_tooltips_new(); 
 380     g_object_ref(m_tooltips
); 
 381     gtk_object_sink(GTK_OBJECT(m_tooltips
)); 
 384     if (style 
& wxTB_DOCKABLE
) 
 386         m_widget 
= gtk_handle_box_new(); 
 388         g_signal_connect(m_widget
, "child_detached", 
 389             G_CALLBACK(child_detached
), NULL
); 
 390         g_signal_connect(m_widget
, "child_attached", 
 391             G_CALLBACK(child_attached
), NULL
); 
 393         if (style 
& wxTB_FLAT
) 
 394             gtk_handle_box_set_shadow_type( GTK_HANDLE_BOX(m_widget
), GTK_SHADOW_NONE 
); 
 398         m_widget 
= gtk_event_box_new(); 
 399         ConnectWidget( m_widget 
); 
 401     g_object_ref(m_widget
); 
 402     gtk_container_add(GTK_CONTAINER(m_widget
), GTK_WIDGET(m_toolbar
)); 
 403     gtk_widget_show(GTK_WIDGET(m_toolbar
)); 
 405     m_parent
->DoAddChild( this ); 
 409     g_signal_connect_after(m_toolbar
, "size_request", 
 410         G_CALLBACK(size_request
), this); 
 415 GdkWindow 
*wxToolBar::GTKGetWindow(wxArrayGdkWindows
& WXUNUSED(windows
)) const 
 417     return GTK_WIDGET(m_toolbar
)->window
; 
 420 void wxToolBar::GtkSetStyle() 
 422     GtkOrientation orient 
= GTK_ORIENTATION_HORIZONTAL
; 
 423     if (HasFlag(wxTB_LEFT 
| wxTB_RIGHT
)) 
 424         orient 
= GTK_ORIENTATION_VERTICAL
; 
 426     GtkToolbarStyle style 
= GTK_TOOLBAR_ICONS
; 
 427     if (HasFlag(wxTB_NOICONS
)) 
 428         style 
= GTK_TOOLBAR_TEXT
; 
 429     else if (HasFlag(wxTB_TEXT
)) 
 431         style 
= GTK_TOOLBAR_BOTH
; 
 432         if (HasFlag(wxTB_HORZ_LAYOUT
)) 
 433             style 
= GTK_TOOLBAR_BOTH_HORIZ
; 
 436     gtk_toolbar_set_orientation(m_toolbar
, orient
); 
 437     gtk_toolbar_set_style(m_toolbar
, style
); 
 440 void wxToolBar::SetWindowStyleFlag( long style 
) 
 442     wxToolBarBase::SetWindowStyleFlag(style
); 
 448 bool wxToolBar::DoInsertTool(size_t pos
, wxToolBarToolBase 
*toolBase
) 
 450     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(toolBase
); 
 453     switch ( tool
->GetStyle() ) 
 455         case wxTOOL_STYLE_BUTTON
: 
 456             switch (tool
->GetKind()) 
 459                     tool
->m_item 
= gtk_toggle_tool_button_new(); 
 460                     g_signal_connect(tool
->m_item
, "toggled", 
 461                         G_CALLBACK(item_toggled
), tool
); 
 464                     radioGroup 
= GetRadioGroup(pos
); 
 467                         // this is the first button in the radio button group, 
 468                         // it will be toggled automatically by GTK so bring the 
 469                         // internal flag in sync 
 472                     tool
->m_item 
= gtk_radio_tool_button_new(radioGroup
); 
 473                     g_signal_connect(tool
->m_item
, "toggled", 
 474                         G_CALLBACK(item_toggled
), tool
); 
 477                     wxFAIL_MSG("unknown toolbar child type"); 
 479                 case wxITEM_DROPDOWN
: 
 481                     tool
->m_item 
= gtk_tool_button_new(NULL
, ""); 
 482                     g_signal_connect(tool
->m_item
, "clicked", 
 483                         G_CALLBACK(item_clicked
), tool
); 
 486             if (!HasFlag(wxTB_NOICONS
)) 
 488                 GtkWidget
* image 
= gtk_image_new(); 
 489                 gtk_tool_button_set_icon_widget( 
 490                     GTK_TOOL_BUTTON(tool
->m_item
), image
); 
 492                 gtk_widget_show(image
); 
 493                 g_signal_connect(image
, "expose_event", 
 494                     G_CALLBACK(image_expose_event
), tool
); 
 496             if (!tool
->GetLabel().empty()) 
 498                 gtk_tool_button_set_label( 
 499                     GTK_TOOL_BUTTON(tool
->m_item
), wxGTK_CONV(tool
->GetLabel())); 
 500                 // needed for labels in horizontal toolbar with wxTB_HORZ_LAYOUT 
 501                 gtk_tool_item_set_is_important(tool
->m_item
, true); 
 503             if (!HasFlag(wxTB_NO_TOOLTIPS
) && !tool
->GetShortHelp().empty()) 
 505                 gtk_tool_item_set_tooltip(tool
->m_item
, 
 506                     m_tooltips
, wxGTK_CONV(tool
->GetShortHelp()), ""); 
 508             g_signal_connect(GTK_BIN(tool
->m_item
)->child
, "button_press_event", 
 509                 G_CALLBACK(button_press_event
), tool
); 
 510             g_signal_connect(tool
->m_item
, "enter_notify_event", 
 511                 G_CALLBACK(enter_notify_event
), tool
); 
 512             g_signal_connect(tool
->m_item
, "leave_notify_event", 
 513                 G_CALLBACK(enter_notify_event
), tool
); 
 515             if (tool
->GetKind() == wxITEM_DROPDOWN
) 
 516                 tool
->CreateDropDown(); 
 517             gtk_toolbar_insert(m_toolbar
, tool
->m_item
, int(pos
)); 
 520         case wxTOOL_STYLE_SEPARATOR
: 
 521             tool
->m_item 
= gtk_separator_tool_item_new(); 
 522             if ( tool
->IsStretchable() ) 
 524                 gtk_separator_tool_item_set_draw
 
 526                     GTK_SEPARATOR_TOOL_ITEM(tool
->m_item
), 
 529                 gtk_tool_item_set_expand(tool
->m_item
, TRUE
); 
 531             gtk_toolbar_insert(m_toolbar
, tool
->m_item
, int(pos
)); 
 534         case wxTOOL_STYLE_CONTROL
: 
 535             wxWindow
* control 
= tool
->GetControl(); 
 536             if (control
->m_widget
->parent 
== NULL
) 
 537                 AddChildGTK(control
); 
 538             tool
->m_item 
= GTK_TOOL_ITEM(control
->m_widget
->parent
->parent
); 
 539             if (gtk_toolbar_get_item_index(m_toolbar
, tool
->m_item
) != int(pos
)) 
 541                 g_object_ref(tool
->m_item
); 
 542                 gtk_container_remove( 
 543                     GTK_CONTAINER(m_toolbar
), GTK_WIDGET(tool
->m_item
)); 
 544                 gtk_toolbar_insert(m_toolbar
, tool
->m_item
, int(pos
)); 
 545                 g_object_unref(tool
->m_item
); 
 547             // Inserted items "slide" into place using an animated effect that 
 548             // causes multiple size events on the item. Must set size request 
 549             // to keep item size from getting permanently set too small by the 
 550             // first of these size events. 
 551             const wxSize size 
= control
->GetSize(); 
 552             gtk_widget_set_size_request(control
->m_widget
, size
.x
, size
.y
); 
 555     gtk_widget_show(GTK_WIDGET(tool
->m_item
)); 
 557     InvalidateBestSize(); 
 562 bool wxToolBar::DoDeleteTool(size_t /* pos */, wxToolBarToolBase
* toolBase
) 
 564     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(toolBase
); 
 566     if (tool
->GetStyle() == wxTOOL_STYLE_CONTROL
) 
 568         // don't destroy the control here as we can be called from 
 569         // RemoveTool() and then we need to keep the control alive; 
 570         // while if we're called from DeleteTool() the control will 
 571         // be destroyed when wxToolBarToolBase itself is deleted 
 572         GtkWidget
* widget 
= tool
->GetControl()->m_widget
; 
 573         gtk_container_remove(GTK_CONTAINER(widget
->parent
), widget
); 
 575     gtk_object_destroy(GTK_OBJECT(tool
->m_item
)); 
 578     InvalidateBestSize(); 
 582 GSList
* wxToolBar::GetRadioGroup(size_t pos
) 
 584     GSList
* radioGroup 
= NULL
; 
 585     GtkToolItem
* item 
= NULL
; 
 588         item 
= gtk_toolbar_get_nth_item(m_toolbar
, int(pos
) - 1); 
 589         if (!GTK_IS_RADIO_TOOL_BUTTON(item
)) 
 592     if (item 
== NULL 
&& pos 
< m_tools
.size()) 
 594         item 
= gtk_toolbar_get_nth_item(m_toolbar
, int(pos
)); 
 595         if (!GTK_IS_RADIO_TOOL_BUTTON(item
)) 
 599         radioGroup 
= gtk_radio_tool_button_get_group((GtkRadioToolButton
*)item
); 
 603 // ---------------------------------------------------------------------------- 
 604 // wxToolBar tools state 
 605 // ---------------------------------------------------------------------------- 
 607 void wxToolBar::DoEnableTool(wxToolBarToolBase 
*toolBase
, bool enable
) 
 609     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(toolBase
); 
 612         gtk_widget_set_sensitive(GTK_WIDGET(tool
->m_item
), enable
); 
 615 void wxToolBar::DoToggleTool( wxToolBarToolBase 
*toolBase
, bool toggle 
) 
 617     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(toolBase
); 
 621         g_signal_handlers_block_by_func(tool
->m_item
, (void*)item_toggled
, tool
); 
 623         gtk_toggle_tool_button_set_active( 
 624             GTK_TOGGLE_TOOL_BUTTON(tool
->m_item
), toggle
); 
 626         g_signal_handlers_unblock_by_func(tool
->m_item
, (void*)item_toggled
, tool
); 
 630 void wxToolBar::DoSetToggle(wxToolBarToolBase 
* WXUNUSED(tool
), 
 631                             bool WXUNUSED(toggle
)) 
 633     // VZ: absolutely no idea about how to do it 
 634     wxFAIL_MSG( wxT("not implemented") ); 
 637 // ---------------------------------------------------------------------------- 
 638 // wxToolBar geometry 
 639 // ---------------------------------------------------------------------------- 
 641 wxSize 
wxToolBar::DoGetBestSize() const 
 643     // Unfortunately, if overflow arrow is enabled GtkToolbar only reports size 
 644     // of arrow. To get the real size, the arrow is temporarily disabled here. 
 645     // This is gross, since it will cause a queue_resize, and could potentially 
 646     // lead to an infinite loop. But there seems to be no alternative, short of 
 647     // disabling the arrow entirely. 
 648     gtk_toolbar_set_show_arrow(m_toolbar
, false); 
 649     const wxSize size 
= wxToolBarBase::DoGetBestSize(); 
 650     gtk_toolbar_set_show_arrow(m_toolbar
, true); 
 654 wxToolBarToolBase 
*wxToolBar::FindToolForPosition(wxCoord 
WXUNUSED(x
), 
 655                                                   wxCoord 
WXUNUSED(y
)) const 
 657     // VZ: GTK+ doesn't seem to have such thing 
 658     wxFAIL_MSG( wxT("wxToolBar::FindToolForPosition() not implemented") ); 
 663 void wxToolBar::SetToolShortHelp( int id
, const wxString
& helpString 
) 
 665     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(FindById(id
)); 
 669         (void)tool
->SetShortHelp(helpString
); 
 672             gtk_tool_item_set_tooltip(tool
->m_item
, 
 673                 m_tooltips
, wxGTK_CONV(helpString
), ""); 
 678 void wxToolBar::SetToolNormalBitmap( int id
, const wxBitmap
& bitmap 
) 
 680     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(FindById(id
)); 
 683         wxCHECK_RET( tool
->IsButton(), wxT("Can only set bitmap on button tools.")); 
 685         tool
->SetNormalBitmap(bitmap
); 
 690 void wxToolBar::SetToolDisabledBitmap( int id
, const wxBitmap
& bitmap 
) 
 692     wxToolBarTool
* tool 
= static_cast<wxToolBarTool
*>(FindById(id
)); 
 695         wxCHECK_RET( tool
->IsButton(), wxT("Can only set bitmap on button tools.")); 
 697         tool
->SetDisabledBitmap(bitmap
); 
 701 // ---------------------------------------------------------------------------- 
 702 // wxToolBar idle handling 
 703 // ---------------------------------------------------------------------------- 
 705 void wxToolBar::OnInternalIdle() 
 707     // Check if we have to show window now 
 708     if (GTKShowFromOnIdle()) return; 
 710     wxCursor cursor 
= m_cursor
; 
 711     if (g_globalCursor
.Ok()) cursor 
= g_globalCursor
; 
 715         /* I now set the cursor the anew in every OnInternalIdle call 
 716            as setting the cursor in a parent window also effects the 
 717            windows above so that checking for the current cursor is 
 720         if (HasFlag(wxTB_DOCKABLE
) && (m_widget
->window
)) 
 722             /* if the toolbar is dockable, then m_widget stands for the 
 723                GtkHandleBox widget, which uses its own window so that we 
 724                can set the cursor for it. if the toolbar is not dockable, 
 725                m_widget comes from m_toolbar which uses its parent's 
 726                window ("windowless windows") and thus we cannot set the 
 728             gdk_window_set_cursor( m_widget
->window
, cursor
.GetCursor() ); 
 731         wxToolBarToolsList::compatibility_iterator node 
= m_tools
.GetFirst(); 
 734             wxToolBarTool 
*tool 
= (wxToolBarTool 
*)node
->GetData(); 
 735             node 
= node
->GetNext(); 
 739                 GdkWindow
* window 
= GTK_WIDGET(tool
->m_item
)->window
; 
 743                     gdk_window_set_cursor( window
, cursor
.GetCursor() ); 
 749     if (wxUpdateUIEvent::CanUpdate(this) && IsShownOnScreen()) 
 750         UpdateWindowUI(wxUPDATE_UI_FROMIDLE
); 
 754 // ---------------------------------------------------------------------------- 
 758 wxToolBar::GetClassDefaultAttributes(wxWindowVariant 
WXUNUSED(variant
)) 
 760     return GetDefaultAttributesFromGTKWidget(gtk_toolbar_new
); 
 763 #endif // wxUSE_TOOLBAR_NATIVE