]> git.saurik.com Git - wxWidgets.git/blob - src/mac/slider.cpp
backported crash fix for wxFrame::Iconize() from 2.2
[wxWidgets.git] / src / mac / slider.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: slider.cpp
3 // Purpose: wxSlider
4 // Author: AUTHOR
5 // Modified by:
6 // Created: ??/??/98
7 // RCS-ID: $Id$
8 // Copyright: (c) AUTHOR
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "slider.h"
14 #endif
15
16 #include "wx/slider.h"
17 #include "wx/mac/uma.h"
18
19 #if !USE_SHARED_LIBRARY
20 IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
21
22 BEGIN_EVENT_TABLE(wxSlider, wxControl)
23 END_EVENT_TABLE()
24 #endif
25
26
27
28 // Slider
29 wxSlider::wxSlider()
30 {
31 m_pageSize = 1;
32 m_lineSize = 1;
33 m_rangeMax = 0;
34 m_rangeMin = 0;
35 m_tickFreq = 0;
36 }
37
38 extern ControlActionUPP wxMacLiveScrollbarActionUPP ;
39
40 bool wxSlider::Create(wxWindow *parent, wxWindowID id,
41 int value, int minValue, int maxValue,
42 const wxPoint& pos,
43 const wxSize& size, long style,
44 const wxValidator& validator,
45 const wxString& name)
46 {
47 Rect bounds ;
48 Str255 title ;
49 wxSize slsize;
50 int maxtextwidth, textheight;
51
52 // Is control horizontal or vertical (Can be ambigous if user selects
53 // another style without also specifying horz or vert
54 if (!(style & wxSL_HORIZONTAL) && !(style & wxSL_VERTICAL)) {
55 // Default is horizontal so make it so
56 style |= wxSL_HORIZONTAL;
57 }
58 slsize = size;
59 // Check that size corresponds with users selection of vertical or
60 // horizontal slider and insert suitable default values
61 if (style & wxSL_HORIZONTAL)
62 {
63 slsize.y = 15; // Slider width
64 if (slsize.x == -1) {
65 slsize.x = 150; // Slider default length
66 }
67 }
68 else
69 {
70 slsize.x = 15; // Slider width
71 if (slsize.y == -1) {
72 slsize.y = 150; // Slider default length
73 }
74 }
75 /* Set the height and width for the slider control region. The actual
76 * slider is set at 10 pixels across. If the slider has labels then the
77 * control region must be large enough to contain these labels
78 */
79 if (style & wxSL_LABELS)
80 {
81 wxString text;
82 int ht, wd;
83
84 // Get maximum text label width and height
85 text.Printf("%d", minValue);
86 parent->GetTextExtent(text, &maxtextwidth, &textheight);
87 text.Printf("%d", maxValue);
88 parent->GetTextExtent(text, &wd, &ht);
89 if(ht > textheight) {
90 textheight = ht;
91 }
92 if (wd > maxtextwidth) {
93 maxtextwidth = wd;
94 }
95
96 if (style & wxSL_VERTICAL) {
97 slsize.x = (15 + maxtextwidth + 2); // Slider wd plus mac text width
98 }
99 if (style & wxSL_HORIZONTAL) {
100 slsize.y = (15 + textheight); // Slider ht plus text ht.
101 }
102 }
103
104 MacPreControlCreate( parent , id , "" , pos , slsize , style,
105 validator , name , &bounds , title ) ;
106
107 m_macMinimumStatic = NULL ;
108 m_macMaximumStatic = NULL ;
109 m_macValueStatic = NULL ;
110
111 m_lineSize = 1;
112 m_tickFreq = 0;
113
114 m_rangeMax = maxValue;
115 m_rangeMin = minValue;
116
117 m_pageSize = (int)((maxValue-minValue)/10);
118
119 // Must modify bounds to that of the slider dimensions from slider
120 // dimensions plus text labels.
121 if (style & wxSL_LABELS)
122 {
123 if ( style & wxSL_HORIZONTAL )
124 {
125 bounds.bottom = bounds.top + 15;
126 bounds.right -= (5 + maxtextwidth);
127 }
128 else // Vertical slider
129 {
130 bounds.right = bounds.left + 15;
131 bounds.bottom -= (5 + textheight);
132 }
133 }
134
135 m_macControl = UMANewControl( parent->GetMacRootWindow() , &bounds ,
136 title , false , value , minValue , maxValue,
137 kControlSliderProc + kControlSliderLiveFeedback + ( ( style & wxSL_AUTOTICKS ) ? kControlSliderHasTickMarks : 0 ) , (long) this ) ;
138
139 wxASSERT_MSG( m_macControl != NULL , "No valid mac control" ) ;
140
141 ::SetControlAction( m_macControl , wxMacLiveScrollbarActionUPP ) ;
142
143 MacPostControlCreate() ;
144
145 if ( style & wxSL_LABELS )
146 {
147 if ( style & wxSL_HORIZONTAL )
148 {
149 wxPoint leftpos( 0 , 15 ) ;
150 wxPoint rightpos( m_width - (maxtextwidth + 20) , 15 ) ;
151 wxPoint valuepos( m_width - maxtextwidth , 0 ) ;
152 wxString valuestring ;
153
154 valuestring.Printf( "%d" , minValue ) ;
155 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , leftpos ) ;
156
157 valuestring.Printf( "%d" , maxValue ) ;
158 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , rightpos ) ;
159
160 valuestring.Printf( "%d" , value ) ;
161 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ;
162 }
163 else // Vertical slider
164 {
165 wxPoint toppos( 17 , 0 ) ;
166 wxPoint bottompos( 17 , m_height - (textheight + 15) ) ;
167 wxPoint valuepos( 0 , m_height - textheight ) ;
168 wxString valuestring ;
169
170 valuestring.Printf( "%d" , minValue ) ;
171 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , bottompos ) ;
172
173 valuestring.Printf( "%d" , maxValue ) ;
174 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , toppos ) ;
175
176 valuestring.Printf( "%d" , value ) ;
177 m_macMinimumStatic = new wxStaticText( this , -1 , valuestring , valuepos ) ;
178 }
179 }
180
181 return true;
182 }
183
184 wxSlider::~wxSlider()
185 {
186 }
187
188 int wxSlider::GetValue() const
189 {
190 return GetControlValue( m_macControl) ;
191 }
192
193 void wxSlider::SetValue(int value)
194 {
195 wxString valuestring ;
196 valuestring.Printf( "%d" , value ) ;
197 if ( m_macMinimumStatic )
198 m_macMinimumStatic->SetLabel( valuestring ) ;
199 SetControlValue( m_macControl , value ) ;
200 }
201
202 void wxSlider::SetRange(int minValue, int maxValue)
203 {
204 wxString value;
205
206 m_rangeMin = minValue;
207 m_rangeMax = maxValue;
208
209 // TODO
210 SetControlMinimum(m_macControl, m_rangeMin);
211 SetControlMaximum(m_macControl, m_rangeMax);
212
213 if(m_macMinimumStatic) {
214 value.Printf("%d", m_rangeMin);
215 m_macMinimumStatic->SetLabel(value);
216 }
217 if(m_macMaximumStatic) {
218 value.Printf("%d", m_rangeMax);
219 m_macMaximumStatic->SetLabel(value);
220 }
221 SetValue(m_rangeMin);
222 }
223
224 // For trackbars only
225 void wxSlider::SetTickFreq(int n, int pos)
226 {
227 // TODO
228 m_tickFreq = n;
229 }
230
231 void wxSlider::SetPageSize(int pageSize)
232 {
233 // TODO
234 m_pageSize = pageSize;
235 }
236
237 int wxSlider::GetPageSize() const
238 {
239 return m_pageSize;
240 }
241
242 void wxSlider::ClearSel()
243 {
244 // TODO
245 }
246
247 void wxSlider::ClearTicks()
248 {
249 // TODO
250 }
251
252 void wxSlider::SetLineSize(int lineSize)
253 {
254 m_lineSize = lineSize;
255 // TODO
256 }
257
258 int wxSlider::GetLineSize() const
259 {
260 // TODO
261 return 0;
262 }
263
264 int wxSlider::GetSelEnd() const
265 {
266 // TODO
267 return 0;
268 }
269
270 int wxSlider::GetSelStart() const
271 {
272 // TODO
273 return 0;
274 }
275
276 void wxSlider::SetSelection(int minPos, int maxPos)
277 {
278 // TODO
279 }
280
281 void wxSlider::SetThumbLength(int len)
282 {
283 // TODO
284 }
285
286 int wxSlider::GetThumbLength() const
287 {
288 // TODO
289 return 0;
290 }
291
292 void wxSlider::SetTick(int tickPos)
293 {
294 // TODO
295 }
296
297 void wxSlider::Command (wxCommandEvent & event)
298 {
299 SetValue (event.GetInt());
300 ProcessCommand (event);
301 }
302
303 bool wxSlider::Show( bool show )
304 {
305 return wxWindow::Show( show ) ;
306 }
307
308 void wxSlider::MacHandleControlClick( ControlHandle control , SInt16 controlpart )
309 {
310 SInt16 value = ::GetControlValue( m_macControl ) ;
311
312 SetValue( value ) ;
313
314 wxScrollEvent event(wxEVT_SCROLL_THUMBTRACK, m_windowId);
315 event.SetPosition(value);
316 event.SetEventObject( this );
317 GetEventHandler()->ProcessEvent(event);
318
319 wxCommandEvent cevent( wxEVT_COMMAND_SLIDER_UPDATED, m_windowId );
320 cevent.SetInt( value );
321 cevent.SetEventObject( this );
322
323 GetEventHandler()->ProcessEvent( cevent );
324 }