]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/spinbutt.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     wxSpinButton 
   7 // Copyright:   (c) Robert Roebling 
   8 // Licence:     wxWindows licence 
   9 ///////////////////////////////////////////////////////////////////////////// 
  12     #pragma implementation "spinbutt.h" 
  13     #pragma implementation "spinbutbase.h" 
  16 #include "wx/spinbutt.h" 
  27 //----------------------------------------------------------------------------- 
  29 //----------------------------------------------------------------------------- 
  31 extern void wxapp_install_idle_handler(); 
  34 //----------------------------------------------------------------------------- 
  36 //----------------------------------------------------------------------------- 
  38 extern bool   g_blockEventsOnDrag
; 
  40 static const float sensitivity 
= 0.02; 
  42 //----------------------------------------------------------------------------- 
  44 //----------------------------------------------------------------------------- 
  46 static void gtk_spinbutt_callback( GtkWidget 
*WXUNUSED(widget
), wxSpinButton 
*win 
) 
  48     if (g_isIdle
) wxapp_install_idle_handler(); 
  50     if (!win
->m_hasVMT
) return; 
  51     if (g_blockEventsOnDrag
) return; 
  53     float diff 
= win
->m_adjust
->value 
- win
->m_oldPos
; 
  54     if (fabs(diff
) < sensitivity
) return; 
  56     wxEventType command 
= wxEVT_NULL
; 
  58     float line_step 
= win
->m_adjust
->step_increment
; 
  60     if (fabs(diff
-line_step
) < sensitivity
) command 
= wxEVT_SCROLL_LINEUP
; 
  61     else if (fabs(diff
+line_step
) < sensitivity
) command 
= wxEVT_SCROLL_LINEDOWN
; 
  62     else command 
= wxEVT_SCROLL_THUMBTRACK
; 
  64     int value 
= (int)ceil(win
->m_adjust
->value
); 
  66     wxSpinEvent 
event( command
, win
->GetId()); 
  67     event
.SetPosition( value 
); 
  68     event
.SetEventObject( win 
); 
  70     if ((win
->GetEventHandler()->ProcessEvent( event 
)) && 
  73         /* program has vetoed */ 
  74         win
->m_adjust
->value 
= win
->m_oldPos
; 
  76         gtk_signal_disconnect_by_func( GTK_OBJECT (win
->m_adjust
), 
  77                         (GtkSignalFunc
) gtk_spinbutt_callback
, 
  80         gtk_signal_emit_by_name( GTK_OBJECT(win
->m_adjust
), "value_changed" ); 
  82         gtk_signal_connect( GTK_OBJECT (win
->m_adjust
), 
  84                         (GtkSignalFunc
) gtk_spinbutt_callback
, 
  89     win
->m_oldPos 
= win
->m_adjust
->value
; 
  91     /* always send a thumbtrack event */ 
  92     if (command 
!= wxEVT_SCROLL_THUMBTRACK
) 
  94         command 
= wxEVT_SCROLL_THUMBTRACK
; 
  95         wxSpinEvent 
event2( command
, win
->GetId()); 
  96         event2
.SetPosition( value 
); 
  97         event2
.SetEventObject( win 
); 
  98         win
->GetEventHandler()->ProcessEvent( event2 
); 
 102 //----------------------------------------------------------------------------- 
 104 //----------------------------------------------------------------------------- 
 106 IMPLEMENT_DYNAMIC_CLASS(wxSpinButton
,wxControl
) 
 107 IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent
, wxNotifyEvent
) 
 109 BEGIN_EVENT_TABLE(wxSpinButton
, wxControl
) 
 110     EVT_SIZE(wxSpinButton::OnSize
) 
 113 bool wxSpinButton::Create(wxWindow 
*parent
, 
 118                           const wxString
& name
) 
 122     wxSize new_size 
= size
, 
 123            sizeBest 
= DoGetBestSize(); 
 124     new_size
.x 
= sizeBest
.x
;            // override width always 
 125     if (new_size
.y 
== -1) 
 126         new_size
.y 
= sizeBest
.y
; 
 128     if (!PreCreation( parent
, pos
, new_size 
) || 
 129         !CreateBase( parent
, id
, pos
, new_size
, style
, wxDefaultValidator
, name 
)) 
 131         wxFAIL_MSG( wxT("wxXX creation failed") ); 
 137     m_adjust 
= (GtkAdjustment
*) gtk_adjustment_new( 0.0, 0.0, 100.0, 1.0, 5.0, 0.0); 
 139     m_widget 
= gtk_spin_button_new( m_adjust
, 0, 0 ); 
 141     gtk_spin_button_set_wrap( GTK_SPIN_BUTTON(m_widget
), 
 142                               (int)(m_windowStyle 
& wxSP_WRAP
) ); 
 144     gtk_signal_connect( GTK_OBJECT (m_adjust
), 
 146                         (GtkSignalFunc
) gtk_spinbutt_callback
, 
 149     m_parent
->DoAddChild( this ); 
 153     SetBackgroundColour( parent
->GetBackgroundColour() ); 
 160 int wxSpinButton::GetMin() const 
 162     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 164     return (int)ceil(m_adjust
->lower
); 
 167 int wxSpinButton::GetMax() const 
 169     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 171     return (int)ceil(m_adjust
->upper
); 
 174 int wxSpinButton::GetValue() const 
 176     wxCHECK_MSG( (m_widget 
!= NULL
), 0, wxT("invalid spin button") ); 
 178     return (int)ceil(m_adjust
->value
); 
 181 void wxSpinButton::SetValue( int value 
) 
 183     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 185     float fpos 
= (float)value
; 
 187     if (fabs(fpos
-m_adjust
->value
) < sensitivity
) return; 
 189     m_adjust
->value 
= fpos
; 
 191     gtk_signal_emit_by_name( GTK_OBJECT(m_adjust
), "value_changed" ); 
 194 void wxSpinButton::SetRange(int minVal
, int maxVal
) 
 196     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 198     float fmin 
= (float)minVal
; 
 199     float fmax 
= (float)maxVal
; 
 201     if ((fabs(fmin
-m_adjust
->lower
) < sensitivity
) && 
 202         (fabs(fmax
-m_adjust
->upper
) < sensitivity
)) 
 207     m_adjust
->lower 
= fmin
; 
 208     m_adjust
->upper 
= fmax
; 
 210     gtk_signal_emit_by_name( GTK_OBJECT(m_adjust
), "changed" ); 
 212     // these two calls are required due to some bug in GTK 
 217 void wxSpinButton::OnSize( wxSizeEvent 
&WXUNUSED(event
) ) 
 219     wxCHECK_RET( (m_widget 
!= NULL
), wxT("invalid spin button") ); 
 221     m_width 
= DoGetBestSize().x
; 
 222     gtk_widget_set_usize( m_widget
, m_width
, m_height 
); 
 225 bool wxSpinButton::IsOwnGtkWindow( GdkWindow 
*window 
) 
 227     return GTK_SPIN_BUTTON(m_widget
)->panel 
== window
; 
 230 void wxSpinButton::ApplyWidgetStyle() 
 233     gtk_widget_set_style( m_widget
, m_widgetStyle 
); 
 236 wxSize 
wxSpinButton::DoGetBestSize() const 
 238     return wxSize(15, 26);