]> git.saurik.com Git - wxWidgets.git/blame - src/palmos/slider.cpp
correct GetBestSize() to return correct best size, i.e. the same size as AutoSize...
[wxWidgets.git] / src / palmos / slider.cpp
CommitLineData
ffecfa5a 1/////////////////////////////////////////////////////////////////////////////
e2731512 2// Name: src/palmos/slider.cpp
ffecfa5a 3// Purpose: wxSlider
e2731512 4// Author: William Osborne - minimal working wxPalmOS port
bdb54365 5// Modified by: Wlodzimierz ABX Skiba - native implementation
ffecfa5a 6// Created: 10/13/04
e2731512 7// RCS-ID: $Id$
bdb54365 8// Copyright: (c) William Osborne, Wlodzimierz Skiba
ffecfa5a
JS
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
ffecfa5a
JS
12// For compilers that support precompilation, includes "wx.h".
13#include "wx/wxprec.h"
14
15#ifdef __BORLANDC__
16#pragma hdrstop
17#endif
18
19#if wxUSE_SLIDER
20
ffecfa5a 21#include "wx/slider.h"
f4da9a94
WS
22
23#ifndef WX_PRECOMP
24 #include "wx/utils.h"
25 #include "wx/brush.h"
1832043f 26 #include "wx/toplevel.h"
ffecfa5a
JS
27#endif
28
20bc5ad8
WS
29#include <Form.h>
30#include <Control.h>
31
ffecfa5a
JS
32#if wxUSE_EXTENDED_RTTI
33WX_DEFINE_FLAGS( wxSliderStyle )
34
35wxBEGIN_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)
e2731512 44
ffecfa5a
JS
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)
52
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)
62
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)
73
74wxEND_FLAGS( wxSliderStyle )
75
851dee09 76IMPLEMENT_DYNAMIC_CLASS_XTI(wxSlider, wxControl,"wx/slider.h")
ffecfa5a
JS
77
78wxBEGIN_PROPERTIES_TABLE(wxSlider)
79 wxEVENT_RANGE_PROPERTY( Scroll , wxEVT_SCROLL_TOP , wxEVT_SCROLL_ENDSCROLL , wxScrollEvent )
80 wxEVENT_PROPERTY( Updated , wxEVT_COMMAND_SLIDER_UPDATED , wxCommandEvent )
81
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
89wxEND_PROPERTIES_TABLE()
90
91wxBEGIN_HANDLERS_TABLE(wxSlider)
92wxEND_HANDLERS_TABLE()
93
94wxCONSTRUCTOR_8( wxSlider , wxWindow* , Parent , wxWindowID , Id , int , Value , int , Minimum , int , Maximum , wxPoint , Position , wxSize , Size , long , WindowStyle )
95#else
96IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
97#endif
98
99// Slider
721a9626 100void wxSlider::Init()
ffecfa5a 101{
8be10866 102 m_oldValue = m_oldPos = 0;
721a9626 103 m_lineSize = 1;
ffecfa5a
JS
104}
105
106bool wxSlider::Create(wxWindow *parent, wxWindowID id,
107 int value, int minValue, int maxValue,
108 const wxPoint& pos,
109 const wxSize& size, long style,
110 const wxValidator& validator,
111 const wxString& name)
112{
721a9626
WS
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
721a9626
WS
119 // wxSL_VERTICAL is impossible in native form
120 wxCHECK_MSG(!(style & wxSL_VERTICAL), false, _T("non vertical slider on PalmOS"));
8be10866 121
a152561c
WS
122 if(!wxControl::Create(parent, id, pos, size, style, validator, name))
123 return false;
124
20bc5ad8 125 FormType* form = (FormType*)GetParentForm();
ba889513
WS
126 if(form==NULL)
127 return false;
bdb54365 128
8be10866 129 m_oldValue = m_oldPos = value;
721a9626 130
be4e4e27
WS
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;
135
136 AdjustForParentClientOrigin(x, y);
137
bdb54365
WS
138 SliderControlType *slider = CtlNewSliderControl (
139 (void **)&form,
ba889513 140 GetId(),
bdb54365
WS
141 feedbackSliderCtl,
142 NULL,
143 0,
144 0,
be4e4e27
WS
145 x,
146 y,
147 w,
148 h,
bdb54365
WS
149 minValue,
150 maxValue,
151 1,
152 value
153 );
154
ba889513 155 if(slider==NULL)
bdb54365
WS
156 return false;
157
170acdc9 158 SetInitialSize(size);
bdb54365
WS
159 Show();
160 return true;
ffecfa5a
JS
161}
162
bdb54365 163wxSlider::~wxSlider()
ffecfa5a 164{
ffecfa5a
JS
165}
166
bdb54365
WS
167int wxSlider::GetMin() const
168{
a152561c
WS
169 ControlType *control = (ControlType *)GetObjectPtr();
170 if(control==NULL)
171 return 0;
bdb54365 172 uint16_t ret;
a152561c 173 CtlGetSliderValues(control, &ret, NULL, NULL, NULL);
bdb54365
WS
174 return ret;
175}
176
177int wxSlider::GetMax() const
178{
a152561c
WS
179 ControlType *control = (ControlType *)GetObjectPtr();
180 if(control==NULL)
181 return 0;
bdb54365 182 uint16_t ret;
a152561c 183 CtlGetSliderValues(control, NULL, &ret, NULL, NULL);
bdb54365
WS
184 return ret;
185}
186
187int wxSlider::GetPageSize() const
ffecfa5a 188{
a152561c
WS
189 ControlType *control = (ControlType *)GetObjectPtr();
190 if(control==NULL)
191 return 0;
bdb54365 192 uint16_t ret;
a152561c 193 CtlGetSliderValues(control, NULL, NULL, &ret, NULL);
bdb54365 194 return ret;
ffecfa5a
JS
195}
196
197int wxSlider::GetValue() const
198{
a152561c
WS
199 ControlType *control = (ControlType *)GetObjectPtr();
200 if(control==NULL)
201 return 0;
bdb54365 202 uint16_t ret;
a152561c 203 CtlGetSliderValues(control, NULL, NULL, NULL, &ret);
01526d4f 204 return ValueInvertOrNot(ret);
ffecfa5a
JS
205}
206
207void wxSlider::SetValue(int value)
208{
01526d4f 209 SetIntValue(ValueInvertOrNot(value));
8be10866 210 m_oldValue = m_oldPos = value;
ffecfa5a
JS
211}
212
ffecfa5a
JS
213wxSize wxSlider::DoGetBestSize() const
214{
721a9626
WS
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);
ffecfa5a
JS
218}
219
220
721a9626 221void wxSlider::SetRange(int WXUNUSED(minValue), int WXUNUSED(maxValue))
ffecfa5a 222{
721a9626 223 // unsupported feature
ffecfa5a
JS
224}
225
721a9626 226void wxSlider::SetTickFreq(int WXUNUSED(n), int WXUNUSED(pos))
ffecfa5a 227{
721a9626 228 // unsupported feature
ffecfa5a
JS
229}
230
231void wxSlider::SetPageSize(int pageSize)
232{
721a9626
WS
233 ControlType *control = (ControlType *)GetObjectPtr();
234 if(control==NULL)
235 return;
236 uint16_t val = pageSize;
237 CtlSetSliderValues(control, NULL, NULL, &val, NULL);
ffecfa5a
JS
238}
239
ffecfa5a
JS
240void wxSlider::ClearSel()
241{
721a9626 242 // unsupported feature
ffecfa5a
JS
243}
244
245void wxSlider::ClearTicks()
246{
721a9626 247 // unsupported feature
ffecfa5a
JS
248}
249
250void wxSlider::SetLineSize(int lineSize)
251{
721a9626 252 m_lineSize = lineSize;
ffecfa5a
JS
253}
254
255int wxSlider::GetLineSize() const
256{
721a9626 257 return m_lineSize;
ffecfa5a
JS
258}
259
260int wxSlider::GetSelEnd() const
261{
721a9626
WS
262 // unsupported feature
263 return GetValue();
ffecfa5a
JS
264}
265
266int wxSlider::GetSelStart() const
267{
721a9626
WS
268 // unsupported feature
269 return GetValue();
ffecfa5a
JS
270}
271
721a9626 272void wxSlider::SetSelection(int WXUNUSED(minPos), int WXUNUSED(maxPos))
ffecfa5a 273{
721a9626 274 // unsupported feature
ffecfa5a
JS
275}
276
721a9626 277void wxSlider::SetThumbLength(int WXUNUSED(len))
ffecfa5a 278{
721a9626 279 // unsupported feature
ffecfa5a
JS
280}
281
282int wxSlider::GetThumbLength() const
283{
721a9626 284 // unsupported feature
ffecfa5a
JS
285 return 0;
286}
287
721a9626
WS
288int wxSlider::GetTickFreq() const
289{
290 // unsupported feature
291 return GetPageSize();
292}
293
294void wxSlider::SetTick(int WXUNUSED(tickPos))
ffecfa5a 295{
721a9626 296 // unsupported feature
ffecfa5a
JS
297}
298
9a727a3b
WS
299// ----------------------------------------------------------------------------
300// helpers
301// ----------------------------------------------------------------------------
302
303bool wxSlider::SendUpdatedEvent()
304{
721a9626
WS
305 m_oldPos = GetValue();
306
8be10866 307 // first thumb event
721a9626
WS
308 wxScrollEvent eventWxTrack(wxEVT_SCROLL_THUMBRELEASE, GetId());
309 eventWxTrack.SetPosition(m_oldPos);
310 eventWxTrack.SetEventObject(this);
8be10866
WS
311 bool handled = GetEventHandler()->ProcessEvent(eventWxTrack);
312
313 // then slider event if position changed
314 if( m_oldValue != m_oldPos )
315 {
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);
321 }
721a9626 322
8be10866 323 return handled;
9a727a3b
WS
324}
325
20bc5ad8 326bool wxSlider::SendScrollEvent(WXEVENTPTR event)
721a9626 327{
20bc5ad8
WS
328 const EventType* palmEvent = (EventType*)event;
329 int newPos = ValueInvertOrNot(palmEvent->data.ctlRepeat.value);
8be10866 330 if ( newPos == m_oldPos )
721a9626 331 {
8be10866 332 // nothing changed since last event
721a9626
WS
333 return false;
334 }
335
336 m_oldPos = newPos;
337
338 // first track event
8be10866
WS
339 wxScrollEvent eventWx(wxEVT_SCROLL_THUMBTRACK, GetId());
340 eventWx.SetPosition(newPos);
341 eventWx.SetEventObject(this);
342 return GetEventHandler()->ProcessEvent(eventWx);
721a9626
WS
343}
344
ffecfa5a
JS
345void wxSlider::Command (wxCommandEvent & event)
346{
347}
348
ffecfa5a 349#endif // wxUSE_SLIDER