1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     GTK toolbar 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #pragma implementation "tbargtk.h" 
  14 #include "wx/toolbar.h" 
  16 //----------------------------------------------------------------------------- 
  18 //----------------------------------------------------------------------------- 
  20 extern bool   g_blockEventsOnDrag
; 
  22 //----------------------------------------------------------------------------- 
  24 //----------------------------------------------------------------------------- 
  26 IMPLEMENT_DYNAMIC_CLASS(wxToolBarTool
,wxObject
) 
  28 wxToolBarTool::wxToolBarTool( wxToolBar 
*owner
, int theIndex
, 
  29                               const wxBitmap
& bitmap1
, const  wxBitmap
& bitmap2
, 
  32                               const wxString
& shortHelpString
, 
  33                               const wxString
& longHelpString
, 
  42   m_toggleState 
= FALSE
; 
  43   m_shortHelpString 
= shortHelpString
; 
  44   m_longHelpString 
= longHelpString
; 
  45   m_isMenuCommand 
= TRUE
; 
  46   m_clientData 
= clientData
; 
  47   m_deleteSecondBitmap 
= FALSE
; 
  51 wxToolBarTool::~wxToolBarTool() 
  55 //----------------------------------------------------------------------------- 
  56 // "clicked" (internal from gtk_toolbar) 
  57 //----------------------------------------------------------------------------- 
  59 static void gtk_toolbar_callback( GtkWidget 
*WXUNUSED(widget
), wxToolBarTool 
*tool 
) 
  61   if (g_blockEventsOnDrag
) return; 
  62   if (!tool
->m_enabled
) return; 
  64   if (tool
->m_isToggle
) tool
->m_toggleState 
= !tool
->m_toggleState
; 
  66   tool
->m_owner
->OnLeftClick( tool
->m_index
, tool
->m_toggleState 
); 
  69 //----------------------------------------------------------------------------- 
  70 // "enter_notify_event" 
  71 //----------------------------------------------------------------------------- 
  73 static gint 
gtk_toolbar_enter_callback( GtkWidget 
*WXUNUSED(widget
),  
  74   GdkEventCrossing 
*WXUNUSED(gdk_event
), wxToolBarTool 
*tool 
) 
  76   if (g_blockEventsOnDrag
) return TRUE
; 
  78   tool
->m_owner
->OnMouseEnter( tool
->m_index 
); 
  83 //----------------------------------------------------------------------------- 
  85 //----------------------------------------------------------------------------- 
  87 IMPLEMENT_DYNAMIC_CLASS(wxToolBar
,wxControl
) 
  89 wxToolBar::wxToolBar() 
  93 wxToolBar::wxToolBar( wxWindow 
*parent
, wxWindowID id
, 
  94   const wxPoint
& pos
, const wxSize
& size
, 
  95   long style
, const wxString
& name 
) 
  97   Create( parent
, id
, pos
, size
, style
, name 
); 
 100 wxToolBar::~wxToolBar() 
 104 bool wxToolBar::Create( wxWindow 
*parent
, wxWindowID id
, 
 105   const wxPoint
& pos
, const wxSize
& size
, 
 106   long style
, const wxString
& name 
) 
 110   PreCreation( parent
, id
, pos
, size
, style
, name 
); 
 112   m_tools
.DeleteContents( TRUE 
); 
 114   m_toolbar 
= GTK_TOOLBAR( gtk_toolbar_new( GTK_ORIENTATION_HORIZONTAL
, 
 115                                             GTK_TOOLBAR_ICONS 
) ); 
 117   m_widget 
= GTK_WIDGET(m_toolbar
);                                          
 119   gtk_toolbar_set_tooltips( GTK_TOOLBAR(m_toolbar
), TRUE 
); 
 124   gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar
) ), &m_fg 
); 
 129   gdk_color_alloc( gtk_widget_get_colormap( GTK_WIDGET(m_toolbar
) ), &m_bg 
); 
 131   gtk_tooltips_set_colors( GTK_TOOLBAR(m_toolbar
)->tooltips
, &m_bg
, &m_fg 
); 
 133   gtk_toolbar_append_space( m_toolbar 
); 
 135   m_parent
->AddChild( this ); 
 137   (m_parent
->m_insertCallback
)( m_parent
, this ); 
 146 bool wxToolBar::OnLeftClick( int toolIndex
, bool toggleDown 
) 
 148   wxCommandEvent 
event( wxEVT_COMMAND_TOOL_CLICKED
, toolIndex 
); 
 149   event
.SetEventObject(this); 
 150   event
.SetInt( toolIndex 
); 
 151   event
.SetExtraLong((long) toggleDown
); 
 153   GetEventHandler()->ProcessEvent(event
); 
 158 void wxToolBar::OnRightClick( int toolIndex
, float WXUNUSED(x
), float WXUNUSED(y
) ) 
 160   wxCommandEvent 
event( wxEVT_COMMAND_TOOL_RCLICKED
, toolIndex 
); 
 161   event
.SetEventObject( this ); 
 162   event
.SetInt( toolIndex 
); 
 164   GetEventHandler()->ProcessEvent(event
); 
 167 void wxToolBar::OnMouseEnter( int toolIndex 
) 
 169   wxCommandEvent 
event( wxEVT_COMMAND_TOOL_ENTER
, GetId() ); 
 170   event
.SetEventObject(this); 
 171   event
.SetInt( toolIndex 
); 
 173   GetEventHandler()->ProcessEvent(event
); 
 176 wxToolBarTool 
*wxToolBar::AddTool( int toolIndex
, const wxBitmap
& bitmap
, 
 177   const wxBitmap
& pushedBitmap
, bool toggle
, 
 178   float WXUNUSED(xPos
), float WXUNUSED(yPos
), wxObject 
*clientData
, 
 179   const wxString
& helpString1
, const wxString
& helpString2 
) 
 181   wxCHECK_MSG( bitmap
.Ok(), (wxToolBarTool 
*)NULL
, 
 182                "invalid bitmap for wxToolBar icon" ); 
 184   wxToolBarTool 
*tool 
= new wxToolBarTool( this, toolIndex
, bitmap
, pushedBitmap
, 
 186                                            helpString1
, helpString2 
); 
 188   wxCHECK_MSG( bitmap
.GetBitmap() == NULL
, (wxToolBarTool 
*)NULL
, 
 189                "wxToolBar doesn't support GdkBitmap" ); 
 191   wxCHECK_MSG( bitmap
.GetPixmap() != NULL
, (wxToolBarTool 
*)NULL
, 
 192                "wxToolBar::Add needs a wxBitmap" ); 
 194   GtkWidget 
*tool_pixmap 
= (GtkWidget 
*)NULL
; 
 196   if (TRUE
) // FIXME huh? 
 198     GdkPixmap 
*pixmap 
= bitmap
.GetPixmap(); 
 200     GdkBitmap 
*mask 
= (GdkBitmap 
*)NULL
; 
 201     if ( bitmap
.GetMask() ) 
 202       mask 
= bitmap
.GetMask()->GetBitmap(); 
 204     tool_pixmap 
= gtk_pixmap_new( pixmap
, mask 
); 
 207   gtk_misc_set_alignment( GTK_MISC(tool_pixmap
), 0.5, 0.5 ); 
 209   GtkToolbarChildType ctype 
= toggle 
? GTK_TOOLBAR_CHILD_TOGGLEBUTTON
 
 210                                      : GTK_TOOLBAR_CHILD_BUTTON
; 
 212   GtkWidget 
*item 
= gtk_toolbar_append_element
 
 214                       GTK_TOOLBAR(m_toolbar
), 
 221                       (GtkSignalFunc
)gtk_toolbar_callback
, 
 227   gtk_signal_connect( GTK_OBJECT(tool
->m_item
), 
 228                       "enter_notify_event",  
 229                       GTK_SIGNAL_FUNC(gtk_toolbar_enter_callback
), 
 232   m_tools
.Append( tool 
); 
 237 void wxToolBar::AddSeparator() 
 239   gtk_toolbar_append_space( m_toolbar 
); 
 242 void wxToolBar::ClearTools() 
 244   wxFAIL_MSG( "wxToolBar::ClearTools not implemented" ); 
 247 void wxToolBar::Realize() 
 254   wxNode 
*node 
= m_tools
.First(); 
 257     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 258     if (tool
->m_bitmap1
.Ok()) 
 260       int tool_height 
= tool
->m_bitmap1
.GetHeight(); 
 261       if (tool_height 
> m_height
) m_height 
= tool_height
; 
 270 void wxToolBar::EnableTool(int toolIndex
, bool enable
) 
 272   wxNode 
*node 
= m_tools
.First(); 
 275     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 276     if (tool
->m_index 
== toolIndex
) 
 278       tool
->m_enabled 
= enable
; 
 284   wxFAIL_MSG( "wrong toolbar index" ); 
 287 void wxToolBar::ToggleTool( int toolIndex
, bool toggle 
)  
 289   wxNode 
*node 
= m_tools
.First(); 
 292     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 293     if (tool
->m_index 
== toolIndex
) 
 295       tool
->m_toggleState 
= toggle
; 
 296       if ((tool
->m_item
) && (GTK_IS_TOGGLE_BUTTON(tool
->m_item
))) 
 297         gtk_toggle_button_set_state( GTK_TOGGLE_BUTTON(tool
->m_item
), toggle 
); 
 303   wxFAIL_MSG( "wrong toolbar index" ); 
 306 wxObject 
*wxToolBar::GetToolClientData( int index 
) const 
 308   wxNode 
*node 
= m_tools
.First(); 
 311     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 312     if (tool
->m_index 
== index
) return tool
->m_clientData
;; 
 316   wxFAIL_MSG( "wrong toolbar index" ); 
 318   return (wxObject
*)NULL
; 
 321 bool wxToolBar::GetToolState(int toolIndex
) const 
 323   wxNode 
*node 
= m_tools
.First(); 
 326     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 327     if (tool
->m_index 
== toolIndex
) return tool
->m_toggleState
; 
 331   wxFAIL_MSG( "wrong toolbar index" ); 
 336 bool wxToolBar::GetToolEnabled(int toolIndex
) const 
 338   wxNode 
*node 
= m_tools
.First(); 
 341     wxToolBarTool 
*tool 
= (wxToolBarTool
*)node
->Data(); 
 342     if (tool
->m_index 
== toolIndex
) return tool
->m_enabled
; 
 346   wxFAIL_MSG( "wrong toolbar index" ); 
 351 void wxToolBar::SetMargins( int WXUNUSED(x
), int WXUNUSED(y
) ) 
 353 //  wxFAIL_MSG( "wxToolBar::SetMargins not implemented" ); 
 356 void wxToolBar::SetToolPacking( int WXUNUSED(packing
) ) 
 358   wxFAIL_MSG( "wxToolBar::SetToolPacking not implemented" ); 
 361 void wxToolBar::SetToolSeparation( int separation 
) 
 363   gtk_toolbar_set_space_size( m_toolbar
, separation 
);