1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk1/bmpbuttn.cpp 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling 
   7 // Licence:     wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  10 // For compilers that support precompilation, includes "wx.h". 
  11 #include "wx/wxprec.h" 
  15 #include "wx/bmpbuttn.h" 
  17 #include "wx/gtk1/private.h" 
  19 //----------------------------------------------------------------------------- 
  21 //----------------------------------------------------------------------------- 
  25 //----------------------------------------------------------------------------- 
  27 //----------------------------------------------------------------------------- 
  29 extern void wxapp_install_idle_handler(); 
  32 //----------------------------------------------------------------------------- 
  34 //----------------------------------------------------------------------------- 
  36 extern bool   g_blockEventsOnDrag
; 
  38 //----------------------------------------------------------------------------- 
  40 //----------------------------------------------------------------------------- 
  43 static void gtk_bmpbutton_clicked_callback( GtkWidget 
*WXUNUSED(widget
), wxBitmapButton 
*button 
) 
  46         wxapp_install_idle_handler(); 
  48     if (!button
->m_hasVMT
) return; 
  49     if (g_blockEventsOnDrag
) return; 
  51     wxCommandEvent 
event(wxEVT_COMMAND_BUTTON_CLICKED
, button
->GetId()); 
  52     event
.SetEventObject(button
); 
  53     button
->HandleWindowEvent(event
); 
  57 //----------------------------------------------------------------------------- 
  59 //----------------------------------------------------------------------------- 
  62 static void gtk_bmpbutton_enter_callback( GtkWidget 
*WXUNUSED(widget
), wxBitmapButton 
*button 
) 
  64     if (!button
->m_hasVMT
) return; 
  65     if (g_blockEventsOnDrag
) return; 
  67     button
->GTKSetHasFocus(); 
  71 //----------------------------------------------------------------------------- 
  73 //----------------------------------------------------------------------------- 
  76 static void gtk_bmpbutton_leave_callback( GtkWidget 
*WXUNUSED(widget
), wxBitmapButton 
*button 
) 
  78     if (!button
->m_hasVMT
) return; 
  79     if (g_blockEventsOnDrag
) return; 
  81     button
->GTKSetNotFocus(); 
  85 //----------------------------------------------------------------------------- 
  87 //----------------------------------------------------------------------------- 
  90 static void gtk_bmpbutton_press_callback( GtkWidget 
*WXUNUSED(widget
), wxBitmapButton 
*button 
) 
  92     if (!button
->m_hasVMT
) return; 
  93     if (g_blockEventsOnDrag
) return; 
  95     button
->StartSelect(); 
  99 //----------------------------------------------------------------------------- 
 101 //----------------------------------------------------------------------------- 
 104 static void gtk_bmpbutton_release_callback( GtkWidget 
*WXUNUSED(widget
), wxBitmapButton 
*button 
) 
 106     if (!button
->m_hasVMT
) return; 
 107     if (g_blockEventsOnDrag
) return; 
 113 //----------------------------------------------------------------------------- 
 115 //----------------------------------------------------------------------------- 
 117 void wxBitmapButton::Init() 
 120     m_isSelected 
= false; 
 123 bool wxBitmapButton::Create( wxWindow 
*parent
, 
 125                              const wxBitmap
& bitmap
, 
 129                              const wxValidator
& validator
, 
 130                              const wxString 
&name 
) 
 133     m_acceptsFocus 
= true; 
 135     if (!PreCreation( parent
, pos
, size 
) || 
 136         !CreateBase( parent
, id
, pos
, size
, style
, validator
, name 
)) 
 138         wxFAIL_MSG( wxT("wxBitmapButton creation failed") ); 
 142     m_bitmaps
[State_Normal
] = bitmap
; 
 144     m_widget 
= gtk_button_new(); 
 146     if (style 
& wxNO_BORDER
) 
 147        gtk_button_set_relief( GTK_BUTTON(m_widget
), GTK_RELIEF_NONE 
); 
 154     gtk_signal_connect_after( GTK_OBJECT(m_widget
), "clicked", 
 155       GTK_SIGNAL_FUNC(gtk_bmpbutton_clicked_callback
), (gpointer
*)this ); 
 157     gtk_signal_connect( GTK_OBJECT(m_widget
), "enter", 
 158       GTK_SIGNAL_FUNC(gtk_bmpbutton_enter_callback
), (gpointer
*)this ); 
 159     gtk_signal_connect( GTK_OBJECT(m_widget
), "leave", 
 160       GTK_SIGNAL_FUNC(gtk_bmpbutton_leave_callback
), (gpointer
*)this ); 
 161     gtk_signal_connect( GTK_OBJECT(m_widget
), "pressed", 
 162       GTK_SIGNAL_FUNC(gtk_bmpbutton_press_callback
), (gpointer
*)this ); 
 163     gtk_signal_connect( GTK_OBJECT(m_widget
), "released", 
 164       GTK_SIGNAL_FUNC(gtk_bmpbutton_release_callback
), (gpointer
*)this ); 
 166     m_parent
->DoAddChild( this ); 
 173 void wxBitmapButton::SetLabel( const wxString 
&label 
) 
 175     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid button") ); 
 177     wxControl::SetLabel( label 
); 
 180 void wxBitmapButton::DoApplyWidgetStyle(GtkRcStyle 
*style
) 
 182     if ( !BUTTON_CHILD(m_widget
) ) 
 185     wxButton::DoApplyWidgetStyle(style
); 
 188 void wxBitmapButton::OnSetBitmap() 
 190     wxCHECK_RET( m_widget 
!= NULL
, wxT("invalid bitmap button") ); 
 192     InvalidateBestSize(); 
 195     if (!IsThisEnabled()) 
 196         the_one 
= GetBitmapDisabled(); 
 197    else if (m_isSelected
) 
 198      the_one 
= GetBitmapPressed(); 
 200      the_one 
= GetBitmapFocus(); 
 204          the_one 
= GetBitmapLabel(); 
 209     GdkBitmap 
*mask 
= NULL
; 
 210     if (the_one
.GetMask()) mask 
= the_one
.GetMask()->GetBitmap(); 
 212     GtkWidget 
*child 
= BUTTON_CHILD(m_widget
); 
 217         pixmap 
= gtk_pixmap_new(the_one
.GetPixmap(), mask
); 
 218         gtk_widget_show(pixmap
); 
 219         gtk_container_add(GTK_CONTAINER(m_widget
), pixmap
); 
 222     {   // subsequent bitmaps 
 223         GtkPixmap 
*pixmap 
= GTK_PIXMAP(child
); 
 224         gtk_pixmap_set(pixmap
, the_one
.GetPixmap(), mask
); 
 228 wxSize 
wxBitmapButton::DoGetBestSize() const 
 230     return wxControl::DoGetBestSize(); 
 233 bool wxBitmapButton::Enable( bool enable 
) 
 235     if ( !wxWindow::Enable(enable
) ) 
 243 void wxBitmapButton::GTKSetHasFocus() 
 249 void wxBitmapButton::GTKSetNotFocus() 
 255 void wxBitmapButton::StartSelect() 
 261 void wxBitmapButton::EndSelect() 
 263     m_isSelected 
= false; 
 267 #endif // wxUSE_BMPBUTTON