1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/palmos/slider.cpp 
   4 // Author:      William Osborne - minimal working wxPalmOS port 
   5 // Modified by: Wlodzimierz ABX Skiba - native implementation 
   8 // Copyright:   (c) William Osborne, Wlodzimierz Skiba 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  21 #include "wx/slider.h" 
  26     #include "wx/toplevel.h" 
  32 #if wxUSE_EXTENDED_RTTI 
  33 WX_DEFINE_FLAGS( wxSliderStyle 
) 
  35 wxBEGIN_FLAGS( wxSliderStyle 
) 
  36     // new style border flags, we put them first to 
  37     // use them for streaming out 
  38     wxFLAGS_MEMBER(wxBORDER_SIMPLE
) 
  39     wxFLAGS_MEMBER(wxBORDER_SUNKEN
) 
  40     wxFLAGS_MEMBER(wxBORDER_DOUBLE
) 
  41     wxFLAGS_MEMBER(wxBORDER_RAISED
) 
  42     wxFLAGS_MEMBER(wxBORDER_STATIC
) 
  43     wxFLAGS_MEMBER(wxBORDER_NONE
) 
  45     // old style border flags 
  46     wxFLAGS_MEMBER(wxSIMPLE_BORDER
) 
  47     wxFLAGS_MEMBER(wxSUNKEN_BORDER
) 
  48     wxFLAGS_MEMBER(wxDOUBLE_BORDER
) 
  49     wxFLAGS_MEMBER(wxRAISED_BORDER
) 
  50     wxFLAGS_MEMBER(wxSTATIC_BORDER
) 
  51     wxFLAGS_MEMBER(wxBORDER
) 
  53     // standard window styles 
  54     wxFLAGS_MEMBER(wxTAB_TRAVERSAL
) 
  55     wxFLAGS_MEMBER(wxCLIP_CHILDREN
) 
  56     wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW
) 
  57     wxFLAGS_MEMBER(wxWANTS_CHARS
) 
  58     wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE
) 
  59     wxFLAGS_MEMBER(wxALWAYS_SHOW_SB 
) 
  60     wxFLAGS_MEMBER(wxVSCROLL
) 
  61     wxFLAGS_MEMBER(wxHSCROLL
) 
  63     wxFLAGS_MEMBER(wxSL_HORIZONTAL
) 
  64     wxFLAGS_MEMBER(wxSL_VERTICAL
) 
  65     wxFLAGS_MEMBER(wxSL_AUTOTICKS
) 
  66     wxFLAGS_MEMBER(wxSL_LABELS
) 
  67     wxFLAGS_MEMBER(wxSL_LEFT
) 
  68     wxFLAGS_MEMBER(wxSL_TOP
) 
  69     wxFLAGS_MEMBER(wxSL_RIGHT
) 
  70     wxFLAGS_MEMBER(wxSL_BOTTOM
) 
  71     wxFLAGS_MEMBER(wxSL_BOTH
) 
  72     wxFLAGS_MEMBER(wxSL_SELRANGE
) 
  74 wxEND_FLAGS( wxSliderStyle 
) 
  76 IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider
, wxControl
,"wx/slider.h") 
  78 wxBEGIN_PROPERTIES_TABLE(wxSlider
) 
  79     wxEVENT_RANGE_PROPERTY( Scroll 
, wxEVT_SCROLL_TOP 
, wxEVT_SCROLL_ENDSCROLL 
, wxScrollEvent 
) 
  80     wxEVENT_PROPERTY( Updated 
, wxEVT_COMMAND_SLIDER_UPDATED 
, wxCommandEvent 
) 
  82     wxPROPERTY( Value 
, int , SetValue
, GetValue 
, 0, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  83     wxPROPERTY( Minimum 
, int , SetMin
, GetMin
, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  84     wxPROPERTY( Maximum 
, int , SetMax
, GetMax
, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  85     wxPROPERTY( PageSize 
, int , SetPageSize
, GetLineSize
, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  86     wxPROPERTY( LineSize 
, int , SetLineSize
, GetLineSize
, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  87     wxPROPERTY( ThumbLength 
, int , SetThumbLength
, GetThumbLength
, 1 , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) 
  88     wxPROPERTY_FLAGS( WindowStyle 
, wxSliderStyle 
, long , SetWindowStyleFlag 
, GetWindowStyleFlag 
, EMPTY_MACROVALUE 
, 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style 
  89 wxEND_PROPERTIES_TABLE() 
  91 wxBEGIN_HANDLERS_TABLE(wxSlider
) 
  92 wxEND_HANDLERS_TABLE() 
  94 wxCONSTRUCTOR_8( wxSlider 
, wxWindow
* , Parent 
, wxWindowID 
, Id 
, int , Value 
, int , Minimum 
, int , Maximum 
, wxPoint 
, Position 
, wxSize 
, Size 
, long , WindowStyle 
) 
  96 IMPLEMENT_DYNAMIC_CLASS(wxSlider
, wxControl
) 
 100 void wxSlider::Init() 
 102     m_oldValue 
= m_oldPos 
= 0; 
 106 bool wxSlider::Create(wxWindow 
*parent
, wxWindowID id
, 
 107            int value
, int minValue
, int maxValue
, 
 109            const wxSize
& size
, long style
, 
 110            const wxValidator
& validator
, 
 111            const wxString
& name
) 
 113     // wxSL_AUTOTICKS is ignored - always on 
 114     // wxSL_LABELS is ignored - always off 
 115     // wxSL_LEFT is ignored - always off 
 116     // wxSL_RIGHT is ignored - always off 
 117     // wxSL_TOP is ignored - always off 
 118     // wxSL_SELRANGE is ignored - always off 
 119     // wxSL_VERTICAL is impossible in native form 
 120     wxCHECK_MSG(!(style 
& wxSL_VERTICAL
), false, _T("non vertical slider on PalmOS")); 
 122     if(!wxControl::Create(parent
, id
, pos
, size
, style
, validator
, name
)) 
 125     FormType
* form 
= (FormType
*)GetParentForm(); 
 129     m_oldValue 
= m_oldPos 
= value
; 
 131     wxCoord x 
= pos
.x 
== wxDefaultCoord 
? 0 : pos
.x
, 
 132             y 
= pos
.y 
== wxDefaultCoord 
? 0 : pos
.y
, 
 133             w 
= size
.x 
== wxDefaultCoord 
? 1 : size
.x
, 
 134             h 
= size
.y 
== wxDefaultCoord 
? 1 : size
.y
; 
 136     AdjustForParentClientOrigin(x
, y
); 
 138     SliderControlType 
*slider 
= CtlNewSliderControl ( 
 158     SetInitialSize(size
); 
 163 wxSlider::~wxSlider() 
 167 int wxSlider::GetMin() const 
 169     ControlType 
*control 
= (ControlType 
*)GetObjectPtr(); 
 173     CtlGetSliderValues(control
, &ret
, NULL
, NULL
, NULL
); 
 177 int wxSlider::GetMax() const 
 179     ControlType 
*control 
= (ControlType 
*)GetObjectPtr(); 
 183     CtlGetSliderValues(control
, NULL
, &ret
, NULL
, NULL
); 
 187 int wxSlider::GetPageSize() const 
 189     ControlType 
*control 
= (ControlType 
*)GetObjectPtr(); 
 193     CtlGetSliderValues(control
, NULL
, NULL
, &ret
, NULL
); 
 197 int wxSlider::GetValue() const 
 199     ControlType 
*control 
= (ControlType 
*)GetObjectPtr(); 
 203     CtlGetSliderValues(control
, NULL
, NULL
, NULL
, &ret
); 
 204     return ValueInvertOrNot(ret
); 
 207 void wxSlider::SetValue(int value
) 
 209     SetIntValue(ValueInvertOrNot(value
)); 
 210     m_oldValue 
= m_oldPos 
= value
; 
 213 wxSize 
wxSlider::DoGetBestSize() const 
 215     // 15 is taken as used in one of official samples 
 216     // 45 is dummy height tripled, any idea what's better ? 
 217     return wxSize(45,15); 
 221 void wxSlider::SetRange(int WXUNUSED(minValue
), int WXUNUSED(maxValue
)) 
 223     // unsupported feature 
 226 void wxSlider::SetTickFreq(int WXUNUSED(n
), int WXUNUSED(pos
)) 
 228     // unsupported feature 
 231 void wxSlider::SetPageSize(int pageSize
) 
 233     ControlType 
*control 
= (ControlType 
*)GetObjectPtr(); 
 236     uint16_t val 
= pageSize
; 
 237     CtlSetSliderValues(control
, NULL
, NULL
, &val
, NULL
); 
 240 void wxSlider::ClearSel() 
 242     // unsupported feature 
 245 void wxSlider::ClearTicks() 
 247     // unsupported feature 
 250 void wxSlider::SetLineSize(int lineSize
) 
 252     m_lineSize 
= lineSize
; 
 255 int wxSlider::GetLineSize() const 
 260 int wxSlider::GetSelEnd() const 
 262     // unsupported feature 
 266 int wxSlider::GetSelStart() const 
 268     // unsupported feature 
 272 void wxSlider::SetSelection(int WXUNUSED(minPos
), int WXUNUSED(maxPos
)) 
 274     // unsupported feature 
 277 void wxSlider::SetThumbLength(int WXUNUSED(len
)) 
 279     // unsupported feature 
 282 int wxSlider::GetThumbLength() const 
 284     // unsupported feature 
 288 int wxSlider::GetTickFreq() const 
 290     // unsupported feature 
 291     return GetPageSize(); 
 294 void wxSlider::SetTick(int WXUNUSED(tickPos
)) 
 296     // unsupported feature 
 299 // ---------------------------------------------------------------------------- 
 301 // ---------------------------------------------------------------------------- 
 303 bool wxSlider::SendUpdatedEvent() 
 305     m_oldPos 
= GetValue(); 
 308     wxScrollEvent 
eventWxTrack(wxEVT_SCROLL_THUMBRELEASE
, GetId()); 
 309     eventWxTrack
.SetPosition(m_oldPos
); 
 310     eventWxTrack
.SetEventObject(this); 
 311     bool handled 
= GetEventHandler()->ProcessEvent(eventWxTrack
); 
 313     // then slider event if position changed 
 314     if( m_oldValue 
!= m_oldPos 
) 
 316         m_oldValue 
= m_oldPos
; 
 317         wxCommandEvent 
event(wxEVT_COMMAND_SLIDER_UPDATED
, GetId()); 
 318         event
.SetEventObject(this); 
 319         event
.SetInt(m_oldPos
); 
 320         return ProcessCommand(event
); 
 326 bool wxSlider::SendScrollEvent(WXEVENTPTR event
) 
 328     const EventType
* palmEvent 
= (EventType
*)event
; 
 329     int newPos 
= ValueInvertOrNot(palmEvent
->data
.ctlRepeat
.value
); 
 330     if ( newPos 
== m_oldPos 
) 
 332         // nothing changed since last event 
 339     wxScrollEvent 
eventWx(wxEVT_SCROLL_THUMBTRACK
, GetId()); 
 340     eventWx
.SetPosition(newPos
); 
 341     eventWx
.SetEventObject(this); 
 342     return GetEventHandler()->ProcessEvent(eventWx
); 
 345 void wxSlider::Command (wxCommandEvent 
& event
) 
 349 #endif // wxUSE_SLIDER