1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Program:     wxWidgets Widgets Sample 
   4 // Purpose:     Part of the widgets sample showing wxSlider 
   5 // Author:      Vadim Zeitlin 
   8 // Copyright:   (c) 2001 Vadim Zeitlin 
   9 // License:     wxWindows license 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // for compilers that support precompilation, includes "wx/wx.h". 
  21 #include "wx/wxprec.h" 
  27 // for all others, include the necessary headers 
  31     #include "wx/bitmap.h" 
  32     #include "wx/button.h" 
  33     #include "wx/checkbox.h" 
  34     #include "wx/radiobox.h" 
  35     #include "wx/slider.h" 
  36     #include "wx/statbox.h" 
  37     #include "wx/textctrl.h" 
  41     #include "wx/tooltip.h" 
  48 #include "icons/slider.xpm" 
  50 // ---------------------------------------------------------------------------- 
  52 // ---------------------------------------------------------------------------- 
  57     SliderPage_Reset 
= wxID_HIGHEST
, 
  60     SliderPage_SetMinAndMax
, 
  61     SliderPage_SetTickFreq
, 
  62     SliderPage_SetThumbLen
, 
  63     SliderPage_CurValueText
, 
  67     SliderPage_TickFreqText
, 
  68     SliderPage_ThumbLenText
, 
  69     SliderPage_RadioSides
, 
  74 // sides radiobox values 
  83 // ---------------------------------------------------------------------------- 
  85 // ---------------------------------------------------------------------------- 
  87 class SliderWidgetsPage 
: public WidgetsPage
 
  90     SliderWidgetsPage(wxNotebook 
*notebook
, wxImageList 
*imaglist
); 
  91     virtual ~SliderWidgetsPage(); 
  95     void OnButtonReset(wxCommandEvent
& event
); 
  96     void OnButtonClear(wxCommandEvent
& event
); 
  97     void OnButtonSetValue(wxCommandEvent
& event
); 
  98     void OnButtonSetMinAndMax(wxCommandEvent
& event
); 
  99     void OnButtonSetTickFreq(wxCommandEvent
& event
); 
 100     void OnButtonSetThumbLen(wxCommandEvent
& event
); 
 102     void OnCheckOrRadioBox(wxCommandEvent
& event
); 
 104     void OnSlider(wxScrollEvent
& event
); 
 106     void OnUpdateUIValueButton(wxUpdateUIEvent
& event
); 
 107     void OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
); 
 108     void OnUpdateUITickFreq(wxUpdateUIEvent
& event
); 
 109     void OnUpdateUIThumbLen(wxUpdateUIEvent
& event
); 
 110     void OnUpdateUIRadioSides(wxUpdateUIEvent
& event
); 
 111     void OnUpdateUIBothSides(wxUpdateUIEvent
& event
); 
 113     void OnUpdateUIResetButton(wxUpdateUIEvent
& event
); 
 115     void OnUpdateUICurValueText(wxUpdateUIEvent
& event
); 
 117     // reset the slider parameters 
 120     // (re)create the slider 
 123     // set the tick frequency from the text field value 
 124     void DoSetTickFreq(); 
 126     // set the thumb len from the text field value 
 127     void DoSetThumbLen(); 
 129     // is this slider value in range? 
 130     bool IsValidValue(int val
) const 
 131         { return (val 
>= m_min
) && (val 
<= m_max
); } 
 139     // the check/radio boxes for styles 
 140     wxCheckBox 
*m_chkLabels
, 
 145     wxRadioBox 
*m_radioSides
; 
 147     // the slider itself and the sizer it is in 
 149     wxSizer 
*m_sizerSlider
; 
 151     // the text entries for set value/range 
 152     wxTextCtrl 
*m_textValue
, 
 159     DECLARE_EVENT_TABLE() 
 160     DECLARE_WIDGETS_PAGE(SliderWidgetsPage
) 
 163 // ---------------------------------------------------------------------------- 
 165 // ---------------------------------------------------------------------------- 
 167 BEGIN_EVENT_TABLE(SliderWidgetsPage
, WidgetsPage
) 
 168     EVT_BUTTON(SliderPage_Reset
, SliderWidgetsPage::OnButtonReset
) 
 169     EVT_BUTTON(SliderPage_SetValue
, SliderWidgetsPage::OnButtonSetValue
) 
 170     EVT_BUTTON(SliderPage_SetMinAndMax
, SliderWidgetsPage::OnButtonSetMinAndMax
) 
 171     EVT_BUTTON(SliderPage_SetTickFreq
, SliderWidgetsPage::OnButtonSetTickFreq
) 
 172     EVT_BUTTON(SliderPage_SetThumbLen
, SliderWidgetsPage::OnButtonSetThumbLen
) 
 174     EVT_UPDATE_UI(SliderPage_SetValue
, SliderWidgetsPage::OnUpdateUIValueButton
) 
 175     EVT_UPDATE_UI(SliderPage_SetMinAndMax
, SliderWidgetsPage::OnUpdateUIMinMaxButton
) 
 176     EVT_UPDATE_UI(SliderPage_SetTickFreq
, SliderWidgetsPage::OnUpdateUITickFreq
) 
 177     EVT_UPDATE_UI(SliderPage_SetThumbLen
, SliderWidgetsPage::OnUpdateUIThumbLen
) 
 178     EVT_UPDATE_UI(SliderPage_TickFreqText
, SliderWidgetsPage::OnUpdateUITickFreq
) 
 179     EVT_UPDATE_UI(SliderPage_RadioSides
, SliderWidgetsPage::OnUpdateUIRadioSides
) 
 180     EVT_UPDATE_UI(SliderPage_BothSides
, SliderWidgetsPage::OnUpdateUIBothSides
) 
 182     EVT_UPDATE_UI(SliderPage_Reset
, SliderWidgetsPage::OnUpdateUIResetButton
) 
 184     EVT_UPDATE_UI(SliderPage_CurValueText
, SliderWidgetsPage::OnUpdateUICurValueText
) 
 186     EVT_COMMAND_SCROLL(SliderPage_Slider
, SliderWidgetsPage::OnSlider
) 
 188     EVT_CHECKBOX(wxID_ANY
, SliderWidgetsPage::OnCheckOrRadioBox
) 
 189     EVT_RADIOBOX(wxID_ANY
, SliderWidgetsPage::OnCheckOrRadioBox
) 
 192 // ============================================================================ 
 194 // ============================================================================ 
 196 IMPLEMENT_WIDGETS_PAGE(SliderWidgetsPage
, _T("Slider")); 
 198 SliderWidgetsPage::SliderWidgetsPage(wxNotebook 
*notebook
, 
 199                                        wxImageList 
*imaglist
) 
 200                   : WidgetsPage(notebook
) 
 202     imaglist
->Add(wxBitmap(slider_xpm
)); 
 211     m_chkBothSides 
= (wxCheckBox 
*)NULL
; 
 213     m_radioSides 
= (wxRadioBox 
*)NULL
; 
 215     m_slider 
= (wxSlider 
*)NULL
; 
 216     m_sizerSlider 
= (wxSizer 
*)NULL
; 
 218     wxSizer 
*sizerTop 
= new wxBoxSizer(wxHORIZONTAL
); 
 221     wxStaticBox 
*box 
= new wxStaticBox(this, wxID_ANY
, _T("&Set style")); 
 222     wxSizer 
*sizerLeft 
= new wxStaticBoxSizer(box
, wxVERTICAL
); 
 224     m_chkVert 
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("&Vertical")); 
 225     m_chkTicks 
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("Show &ticks")); 
 226     m_chkLabels 
= CreateCheckBoxAndAddToSizer(sizerLeft
, _T("Show &labels")); 
 227     static const wxString sides
[] = 
 234     m_radioSides 
= new wxRadioBox(this, SliderPage_RadioSides
, _T("&Ticks/Labels"), 
 235                                  wxDefaultPosition
, wxDefaultSize
, 
 236                                  WXSIZEOF(sides
), sides
, 
 237                                  1, wxRA_SPECIFY_COLS
); 
 238     sizerLeft
->Add(m_radioSides
, 0, wxGROW 
| wxALL
, 5); 
 239     m_chkBothSides 
= CreateCheckBoxAndAddToSizer
 
 240                      (sizerLeft
, _T("&Both sides"), SliderPage_BothSides
); 
 242     m_chkBothSides
->SetToolTip( _T("\"Both sides\" is only supported \nin Win95 and Universal") ); 
 243 #endif // wxUSE_TOOLTIPS 
 245     sizerLeft
->Add(5, 5, 0, wxGROW 
| wxALL
, 5); // spacer 
 247     wxButton 
*btn 
= new wxButton(this, SliderPage_Reset
, _T("&Reset")); 
 248     sizerLeft
->Add(btn
, 0, wxALIGN_CENTRE_HORIZONTAL 
| wxALL
, 15); 
 251     wxStaticBox 
*box2 
= new wxStaticBox(this, wxID_ANY
, _T("&Change slider value")); 
 252     wxSizer 
*sizerMiddle 
= new wxStaticBoxSizer(box2
, wxVERTICAL
); 
 255     wxSizer 
*sizerRow 
= CreateSizerWithTextAndLabel(_T("Current value"), 
 256                                                     SliderPage_CurValueText
, 
 258     text
->SetEditable(false); 
 260     sizerMiddle
->Add(sizerRow
, 0, wxALL 
| wxGROW
, 5); 
 262     sizerRow 
= CreateSizerWithTextAndButton(SliderPage_SetValue
, 
 264                                             SliderPage_ValueText
, 
 266     sizerMiddle
->Add(sizerRow
, 0, wxALL 
| wxGROW
, 5); 
 268     sizerRow 
= CreateSizerWithTextAndButton(SliderPage_SetMinAndMax
, 
 273     m_textMax 
= new wxTextCtrl(this, SliderPage_MaxText
, wxEmptyString
); 
 274     sizerRow
->Add(m_textMax
, 1, wxLEFT 
| wxALIGN_CENTRE_VERTICAL
, 5); 
 276     m_textMin
->SetValue( wxString::Format(_T("%d"), m_min
) ); 
 277     m_textMax
->SetValue( wxString::Format(_T("%d"), m_max
) ); 
 279     sizerMiddle
->Add(sizerRow
, 0, wxALL 
| wxGROW
, 5); 
 281     sizerRow 
= CreateSizerWithTextAndButton(SliderPage_SetTickFreq
, 
 282                                             _T("Tick &frequency"), 
 283                                             SliderPage_TickFreqText
, 
 286     m_textTickFreq
->SetValue(_T("10")); 
 288     sizerMiddle
->Add(sizerRow
, 0, wxALL 
| wxGROW
, 5); 
 290     sizerRow 
= CreateSizerWithTextAndButton(SliderPage_SetThumbLen
, 
 292                                             SliderPage_ThumbLenText
, 
 295     sizerMiddle
->Add(sizerRow
, 0, wxALL 
| wxGROW
, 5); 
 298     wxSizer 
*sizerRight 
= new wxBoxSizer(wxHORIZONTAL
); 
 299     sizerRight
->SetMinSize(150, 40); 
 300     m_sizerSlider 
= sizerRight
; // save it to modify it later 
 305     // the 3 panes panes compose the window 
 306     sizerTop
->Add(sizerLeft
, 0, wxGROW 
| (wxALL 
& ~wxLEFT
), 10); 
 307     sizerTop
->Add(sizerMiddle
, 0, wxGROW 
| wxALL
, 10); 
 308     sizerTop
->Add(sizerRight
, 1, wxGROW 
| (wxALL 
& ~wxRIGHT
), 10); 
 310     // final initializations 
 316 SliderWidgetsPage::~SliderWidgetsPage() 
 320 // ---------------------------------------------------------------------------- 
 322 // ---------------------------------------------------------------------------- 
 324 void SliderWidgetsPage::Reset() 
 326     m_chkVert
->SetValue(false); 
 327     m_chkTicks
->SetValue(true); 
 328     m_chkLabels
->SetValue(true); 
 329     m_chkBothSides
->SetValue(false); 
 331     m_radioSides
->SetSelection(StaticSides_Top
); 
 334 void SliderWidgetsPage::CreateSlider() 
 338     bool isVert 
= m_chkVert
->GetValue(); 
 340         flags 
|= wxSL_VERTICAL
; 
 342         flags 
|= wxSL_HORIZONTAL
; 
 344     if ( m_chkLabels
->GetValue() ) 
 346         flags 
|= wxSL_LABELS
; 
 349     if ( m_chkTicks
->GetValue() ) 
 351         flags 
|= wxSL_AUTOTICKS
; 
 354     switch ( m_radioSides
->GetSelection() ) 
 356         case StaticSides_Top
: 
 359         case StaticSides_Left
: 
 362         case StaticSides_Bottom
: 
 363             flags 
|= wxSL_BOTTOM
; 
 365         case StaticSides_Right
: 
 369             wxFAIL_MSG(_T("unexpected radiobox selection")); 
 373     if ( m_chkBothSides
->GetValue() ) 
 381         int valOld 
= m_slider
->GetValue(); 
 382         if ( !IsValidValue(valOld
) ) 
 387         m_sizerSlider
->Detach( m_slider 
); 
 389         if ( m_sizerSlider
->GetChildren().GetCount() ) 
 391             // we have 2 spacers, remove them too 
 392             m_sizerSlider
->Remove( 0 ); 
 393             m_sizerSlider
->Remove( 0 ); 
 399     m_slider 
= new wxSlider(this, SliderPage_Slider
, 
 401                             wxDefaultPosition
, wxDefaultSize
, 
 406         m_sizerSlider
->Add(0, 0, 1); 
 407         m_sizerSlider
->Add(m_slider
, 0, wxGROW 
| wxALL
, 5); 
 408         m_sizerSlider
->Add(0, 0, 1); 
 412         m_sizerSlider
->Add(m_slider
, 1, wxCENTRE 
| wxALL
, 5); 
 415     if ( m_chkTicks
->GetValue() ) 
 420     m_sizerSlider
->Layout(); 
 423 void SliderWidgetsPage::DoSetTickFreq() 
 426     if ( !m_textTickFreq
->GetValue().ToLong(&freq
) ) 
 428         wxLogWarning(_T("Invalid slider tick frequency")); 
 433     m_slider
->SetTickFreq(freq
, 0 /* unused */); 
 436 void SliderWidgetsPage::DoSetThumbLen() 
 439     if ( !m_textThumbLen
->GetValue().ToLong(&len
) ) 
 441         wxLogWarning(_T("Invalid slider thumb length")); 
 446     m_slider
->SetThumbLength(len
); 
 449 // ---------------------------------------------------------------------------- 
 451 // ---------------------------------------------------------------------------- 
 453 void SliderWidgetsPage::OnButtonReset(wxCommandEvent
& WXUNUSED(event
)) 
 460 void SliderWidgetsPage::OnButtonSetTickFreq(wxCommandEvent
& WXUNUSED(event
)) 
 465 void SliderWidgetsPage::OnButtonSetThumbLen(wxCommandEvent
& WXUNUSED(event
)) 
 470 void SliderWidgetsPage::OnButtonSetMinAndMax(wxCommandEvent
& WXUNUSED(event
)) 
 473          maxNew 
= 0; // init to suppress compiler warning 
 474     if ( !m_textMin
->GetValue().ToLong(&minNew
) || 
 475          !m_textMax
->GetValue().ToLong(&maxNew
) || 
 478         wxLogWarning(_T("Invalid min/max values for the slider.")); 
 486     m_slider
->SetRange(minNew
, maxNew
); 
 489 void SliderWidgetsPage::OnButtonSetValue(wxCommandEvent
& WXUNUSED(event
)) 
 492     if ( !m_textValue
->GetValue().ToLong(&val
) || !IsValidValue(val
) ) 
 494         wxLogWarning(_T("Invalid slider value.")); 
 499     m_slider
->SetValue(val
); 
 502 void SliderWidgetsPage::OnUpdateUIValueButton(wxUpdateUIEvent
& event
) 
 505     event
.Enable( m_textValue
->GetValue().ToLong(&val
) && IsValidValue(val
) ); 
 508 void SliderWidgetsPage::OnUpdateUITickFreq(wxUpdateUIEvent
& event
) 
 511     event
.Enable( m_chkTicks
->GetValue() && 
 512                   m_textTickFreq
->GetValue().ToLong(&freq
) && 
 513                   (freq 
> 0) && (freq 
<= m_max 
- m_min
) ); 
 516 void SliderWidgetsPage::OnUpdateUIThumbLen(wxUpdateUIEvent
& event
) 
 519     event
.Enable( m_textThumbLen
->GetValue().ToLong(&val
)); 
 522 void SliderWidgetsPage::OnUpdateUIMinMaxButton(wxUpdateUIEvent
& event
) 
 525     event
.Enable( m_textMin
->GetValue().ToLong(&mn
) && 
 526                   m_textMax
->GetValue().ToLong(&mx
) && 
 530 void SliderWidgetsPage::OnUpdateUIResetButton(wxUpdateUIEvent
& event
) 
 532     event
.Enable( m_chkVert
->GetValue() || 
 533                   !m_chkTicks
->GetValue() || 
 534                   !m_chkLabels
->GetValue() || 
 535                   m_chkBothSides
->GetValue() ); 
 538 void SliderWidgetsPage::OnCheckOrRadioBox(wxCommandEvent
& WXUNUSED(event
)) 
 543 void SliderWidgetsPage::OnUpdateUICurValueText(wxUpdateUIEvent
& event
) 
 545     event
.SetText( wxString::Format(_T("%d"), m_slider
->GetValue()) ); 
 548 void SliderWidgetsPage::OnUpdateUIRadioSides(wxUpdateUIEvent
& event
) 
 550     event
.Enable( m_chkLabels
->GetValue() || m_chkTicks
->GetValue() ); 
 553 void SliderWidgetsPage::OnUpdateUIBothSides(wxUpdateUIEvent
& event
) 
 555 #if defined(__WIN95__) || defined(__WXUNIVERSAL__) 
 556     event
.Enable( m_chkTicks
->GetValue() ); 
 558     event
.Enable( false ); 
 559 #endif // defined(__WIN95__) || defined(__WXUNIVERSAL__) 
 562 void SliderWidgetsPage::OnSlider(wxScrollEvent
& event
) 
 564     wxASSERT_MSG( event
.GetInt() == m_slider
->GetValue(), 
 565                   wxT("slider value should be the same") ); 
 567     wxEventType eventType 
= event
.GetEventType(); 
 570         This array takes the EXACT order of the declarations in 
 572         (section "wxScrollBar and wxSlider event identifiers") 
 574     static const wxChar 
*eventNames
[] = 
 576         wxT("wxEVT_SCROLL_TOP"), 
 577         wxT("wxEVT_SCROLL_BOTTOM"), 
 578         wxT("wxEVT_SCROLL_LINEUP"), 
 579         wxT("wxEVT_SCROLL_LINEDOWN"), 
 580         wxT("wxEVT_SCROLL_PAGEUP"), 
 581         wxT("wxEVT_SCROLL_PAGEDOWN"), 
 582         wxT("wxEVT_SCROLL_THUMBTRACK"), 
 583         wxT("wxEVT_SCROLL_THUMBRELEASE"), 
 584         wxT("wxEVT_SCROLL_ENDSCROLL") 
 587     int index 
= eventType 
- wxEVT_SCROLL_TOP
; 
 590         If this assert is triggered, there is an unknown slider event which 
 591         should be added to the above eventNames array. 
 593     wxASSERT_MSG(index 
>= 0 && (size_t)index 
< WXSIZEOF(eventNames
), 
 594                  wxT("Unknown slider event") ); 
 597     static int s_numSliderEvents 
= 0; 
 599     wxLogMessage(wxT("Slider event #%d: %s (pos = %d)"), 
 602                  event
.GetPosition());