]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/spinbutt.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/spinbutt.cpp 
   3 // Purpose:     wxSpinButton 
   7 // Copyright:   (c) Robert Roebling 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  11 // For compilers that support precompilation, includes "wx.h". 
  12 #include "wx/wxprec.h" 
  16 #include "wx/spinbutt.h" 
  24 //----------------------------------------------------------------------------- 
  26 //----------------------------------------------------------------------------- 
  28 extern bool   g_blockEventsOnDrag
; 
  30 //----------------------------------------------------------------------------- 
  32 //----------------------------------------------------------------------------- 
  36 gtk_value_changed(GtkSpinButton
* spinbutton
, wxSpinButton
* win
) 
  38     const double value 
= gtk_spin_button_get_value(spinbutton
); 
  39     const int pos 
= int(value
); 
  40     const int oldPos 
= win
->m_pos
; 
  41     if (!win
->m_hasVMT 
|| g_blockEventsOnDrag 
|| pos 
== oldPos
) 
  47     wxSpinEvent 
event(pos 
> oldPos 
? wxEVT_SCROLL_LINEUP 
: wxEVT_SCROLL_LINEDOWN
, win
->GetId()); 
  48     event
.SetPosition(pos
); 
  49     event
.SetEventObject(win
); 
  51     if ((win
->HandleWindowEvent( event 
)) && 
  54         /* program has vetoed */ 
  55         // this will cause another "value_changed" signal, 
  56         // but because pos == oldPos nothing will happen 
  57         gtk_spin_button_set_value(spinbutton
, oldPos
); 
  63     /* always send a thumbtrack event */ 
  64     wxSpinEvent 
event2(wxEVT_SCROLL_THUMBTRACK
, win
->GetId()); 
  65     event2
.SetPosition(pos
); 
  66     event2
.SetEventObject(win
); 
  67     win
->HandleWindowEvent(event2
); 
  71 //----------------------------------------------------------------------------- 
  73 //----------------------------------------------------------------------------- 
  75 IMPLEMENT_DYNAMIC_CLASS(wxSpinButton
,wxControl
) 
  76 IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent
, wxNotifyEvent
) 
  78 BEGIN_EVENT_TABLE(wxSpinButton
, wxControl
) 
  79     EVT_SIZE(wxSpinButton::OnSize
) 
  82 wxSpinButton::wxSpinButton() 
  87 bool wxSpinButton::Create(wxWindow 
*parent
, 
  94     wxSize new_size 
= size
, 
  95            sizeBest 
= DoGetBestSize(); 
  96     new_size
.x 
= sizeBest
.x
;            // override width always 
  98         new_size
.y 
= sizeBest
.y
; 
 100     if (!PreCreation( parent
, pos
, new_size 
) || 
 101         !CreateBase( parent
, id
, pos
, new_size
, style
, wxDefaultValidator
, name 
)) 
 103         wxFAIL_MSG( wxT("wxSpinButton creation failed") ); 
 109     m_widget 
= gtk_spin_button_new_with_range(0, 100, 1); 
 110     g_object_ref(m_widget
); 
 112     gtk_spin_button_set_wrap( GTK_SPIN_BUTTON(m_widget
), 
 113                               (int)(m_windowStyle 
& wxSP_WRAP
) ); 
 115     g_signal_connect_after( 
 116         m_widget
, "value_changed", G_CALLBACK(gtk_value_changed
), this); 
 118     m_parent
->DoAddChild( this ); 
 120     PostCreation(new_size
); 
 125 int wxSpinButton::GetMin() const 
 127     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 130     gtk_spin_button_get_range((GtkSpinButton
*)m_widget
, &min
, NULL
); 
 134 int wxSpinButton::GetMax() const 
 136     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 139     gtk_spin_button_get_range((GtkSpinButton
*)m_widget
, NULL
, &max
); 
 143 int wxSpinButton::GetValue() const 
 145     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 150 void wxSpinButton::SetValue( int value 
) 
 152     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 155     gtk_spin_button_set_value((GtkSpinButton
*)m_widget
, value
); 
 156     m_pos 
= int(gtk_spin_button_get_value((GtkSpinButton
*)m_widget
)); 
 160 void wxSpinButton::SetRange(int minVal
, int maxVal
) 
 162     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 165     gtk_spin_button_set_range((GtkSpinButton
*)m_widget
, minVal
, maxVal
); 
 166     m_pos 
= int(gtk_spin_button_get_value((GtkSpinButton
*)m_widget
)); 
 170 void wxSpinButton::OnSize( wxSizeEvent 
&WXUNUSED(event
) ) 
 172     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 174     m_width 
= DoGetBestSize().x
; 
 175     gtk_widget_set_size_request( m_widget
, m_width
, m_height 
); 
 178 bool wxSpinButton::Enable( bool enable 
) 
 180     if (!base_type::Enable(enable
)) 
 183     // Work around lack of visual update when enabling 
 185         GTKFixSensitivity(false /* fix even if not under mouse */); 
 190 void wxSpinButton::GtkDisableEvents() const 
 192     g_signal_handlers_block_by_func(m_widget
, 
 193         (gpointer
)gtk_value_changed
, (void*) this); 
 196 void wxSpinButton::GtkEnableEvents() const 
 198     g_signal_handlers_unblock_by_func(m_widget
, 
 199         (gpointer
)gtk_value_changed
, (void*) this); 
 202 GdkWindow 
*wxSpinButton::GTKGetWindow(wxArrayGdkWindows
& WXUNUSED(windows
)) const 
 204     return GTK_SPIN_BUTTON(m_widget
)->panel
; 
 207 wxSize 
wxSpinButton::DoGetBestSize() const 
 209     wxSize 
best(15, 26); // FIXME 
 216 wxSpinButton::GetClassDefaultAttributes(wxWindowVariant 
WXUNUSED(variant
)) 
 218     // TODO: overload to accept functions like gtk_spin_button_new? 
 219     // Until then use a similar type 
 220     return GetDefaultAttributesFromGTKWidget(gtk_button_new
);