]> git.saurik.com Git - wxWidgets.git/blame - src/os2/slider.cpp
New Refresh()/Update() behaviour. As expected, scrolling
[wxWidgets.git] / src / os2 / slider.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: slider.cpp
3// Purpose: wxSlider
409c9842 4// Author: David Webster
0e320a79 5// Modified by:
409c9842 6// Created: 10/15/99
0e320a79 7// RCS-ID: $Id$
409c9842
DW
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
0e320a79
DW
10/////////////////////////////////////////////////////////////////////////////
11
409c9842
DW
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#ifndef WX_PRECOMP
20#include <stdio.h>
21#include <wx/utils.h>
22#include <wx/brush.h>
a4a16252 23#include <wx/scrolwin.h>
0e320a79
DW
24#endif
25
26#include "wx/slider.h"
409c9842 27#include "wx/os2/private.h"
0e320a79 28
0e320a79
DW
29IMPLEMENT_DYNAMIC_CLASS(wxSlider, wxControl)
30
0e320a79
DW
31wxSlider::wxSlider()
32{
3c299c3a
DW
33 m_hStaticValue = 0L;
34 m_hStaticMin = 0L;
35 m_hStaticMax = 0L;
36 m_nPageSize = 1;
37 m_nLineSize = 1;
38 m_nRangeMax = 0;
39 m_nRangeMin = 0;
40 m_nTickFreq = 0;
41} // end of wxSlider::wxSlider
409c9842 42
0e320a79
DW
43wxSlider::~wxSlider()
44{
3c299c3a
DW
45 if (m_hStaticMin)
46 ::WinDestroyWindow((HWND)m_hStaticMin);
47 if (m_hStaticMax)
48 ::WinDestroyWindow((HWND)m_hStaticMax);
49 if (m_hStaticValue)
50 ::WinDestroyWindow((HWND)m_hStaticValue);
51} // end of wxSlider::~wxSlider
0e320a79 52
d8a3f66c
DW
53void wxSlider::AdjustSubControls(
54 int nX
55, int nY
56, int nWidth
57, int nHeight
58, int nSizeFlags
59)
60{
61 SWP vSwp;
62 int nXOffset = nX;
63 int nYOffset = nY;
64 int nCx; // slider,min,max sizes
65 int nCy;
66 int nCyf;
67 char zBuf[300];
68
69 wxGetCharSize( GetHWND()
70 ,&nCx
71 ,&nCy
72 ,&this->GetFont()
73 );
74
75 if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL)
76 {
77 if (m_windowStyle & wxSL_LABELS )
78 {
79 int nMinLen = 0;
80 int nMaxLen = 0;
81
82 ::WinQueryWindowText((HWND)m_hStaticMin, 300, zBuf);
83 GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &this->GetFont());
84
85 ::WinQueryWindowText((HWND)m_hStaticMax, 300, zBuf);
86 GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &this->GetFont());
87
88 if (m_hStaticValue)
89 {
90 int nNewWidth = wxMax(nMinLen, nMaxLen);
91 int nValueHeight = nCyf;
92
93 ::WinSetWindowPos( (HWND)m_hStaticValue
94 ,HWND_TOP
95 ,(LONG)nXOffset - (nNewWidth + nCx + nMinLen + nCx)
96 ,(LONG)nYOffset
97 ,(LONG)nNewWidth
98 ,(LONG)nValueHeight
99 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
100 );
101 }
102 ::WinSetWindowPos( (HWND)m_hStaticMin
103 ,HWND_TOP
104 ,(LONG)nXOffset - (nMinLen + nCx)
105 ,(LONG)nYOffset
106 ,(LONG)nMinLen
107 ,(LONG)nCy
108 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
109 );
110 nXOffset += nWidth + nCx;
111
112 ::WinSetWindowPos( (HWND)m_hStaticMax
113 ,HWND_TOP
114 ,(LONG)nXOffset
115 ,(LONG)nYOffset
116 ,(LONG)nMaxLen
117 ,(LONG)nCy
118 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
119 );
120 }
121 }
122 //
123 // Now deal with a vertical slider -- OS/2 doesn't have vertical sliders
124 //
125} // end of wxSlider::AdjustSubControls
126
3c299c3a 127void wxSlider::ClearSel()
0e320a79 128{
3c299c3a 129} // end of wxSlider::ClearSel
0e320a79 130
3c299c3a 131void wxSlider::ClearTicks()
0e320a79 132{
3c299c3a 133} // end of wxSlider::ClearTicks
0e320a79 134
3c299c3a
DW
135void wxSlider::Command (
136 wxCommandEvent& rEvent
137)
0e320a79 138{
3c299c3a
DW
139 SetValue(rEvent.GetInt());
140 ProcessCommand(rEvent);
141} // end of wxSlider::Command
0e320a79 142
3c299c3a
DW
143bool wxSlider::ContainsHWND(
144 WXHWND hWnd
145) const
0e320a79 146{
3c299c3a
DW
147 return ( hWnd == GetStaticMin() ||
148 hWnd == GetStaticMax() ||
149 hWnd == GetEditValue()
150 );
151} // end of wxSlider::ContainsHWND
152
153bool wxSlider::Create(
154 wxWindow* pParent
155, wxWindowID vId
156, int nValue
157, int nMinValue
158, int nMaxValue
159, const wxPoint& rPos
160, const wxSize& rSize
161, long lStyle
162#if wxUSE_VALIDATORS
163, const wxValidator& rValidator
164#endif
165, const wxString& rsName
166)
0e320a79 167{
3c299c3a
DW
168 int nX = rPos.x;
169 int nY = rPos.y;
170 int nWidth = rSize.x;
171 int nHeight = rSize.y;
172 long lMsStyle = 0L;
173 long lWstyle = 0L;
174
175 SetName(rsName);
176#if wxUSE_VALIDATORS
177 SetValidator(rValidator);
178#endif
179 if (pParent)
180 pParent->AddChild(this);
181 SetBackgroundColour(pParent->GetBackgroundColour()) ;
182 SetForegroundColour(pParent->GetForegroundColour()) ;
183
184 m_hStaticValue = 0L;
185 m_hStaticMin = 0L;
186 m_hStaticMax = 0L;
187 m_nPageSize = 1;
188 m_nLineSize = 1;
189 m_windowStyle = lStyle;
190 m_nTickFreq = 0;
191
192 if (vId == -1)
193 m_windowId = (int)NewControlId();
194 else
195 m_windowId = vId;
409c9842 196
3c299c3a
DW
197 if (m_windowStyle & wxCLIP_SIBLINGS )
198 lMsStyle |= WS_CLIPSIBLINGS;
409c9842 199
3c299c3a
DW
200 if (m_windowStyle & wxSL_LABELS)
201 {
202 lMsStyle |= WS_VISIBLE | SS_TEXT | DT_VCENTER;
203
5d44b24e
DW
204 //
205 // If the parent is a scrolled window the controls must
206 // have this style or they will overlap the scrollbars
207 //
208 if (pParent)
209 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
210 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
211 lMsStyle |= WS_CLIPSIBLINGS;
212
3c299c3a
DW
213 m_hStaticValue = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
214 ,WC_STATIC // Window class
215 ,(PSZ)NULL // Initial Text
216 ,(ULONG)lMsStyle // Style flags
217 ,0L, 0L, 0L, 0L // Origin -- 0 size
218 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
219 ,HWND_TOP // initial z position
220 ,(ULONG)NewControlId() // Window identifier
221 ,NULL // no control data
222 ,NULL // no Presentation parameters
223 );
224
225 //
226 // Now create min static control
227 //
228 sprintf(wxBuffer, "%d", nMinValue);
229 lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE;
230 if (m_windowStyle & wxCLIP_SIBLINGS)
231 lWstyle |= WS_CLIPSIBLINGS;
5d44b24e
DW
232 //
233 // If the parent is a scrolled window the controls must
234 // have this style or they will overlap the scrollbars
235 //
236 if (pParent)
237 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
238 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
239 lWstyle |= WS_CLIPSIBLINGS;
240
3c299c3a
DW
241 m_hStaticMin = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
242 ,WC_STATIC // Window class
243 ,(PSZ)wxBuffer // Initial Text
244 ,(ULONG)lWstyle // Style flags
245 ,0L, 0L, 0L, 0L // Origin -- 0 size
246 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
247 ,HWND_TOP // initial z position
248 ,(ULONG)NewControlId() // Window identifier
249 ,NULL // no control data
250 ,NULL // no Presentation parameters
251 );
252 }
253 lMsStyle = 0;
409c9842 254
3c299c3a 255 SLDCDATA vSlData;
409c9842 256
3c299c3a
DW
257 vSlData.cbSize = sizeof(SLDCDATA);
258 if (m_windowStyle & wxSL_VERTICAL)
259 lMsStyle = SLS_VERTICAL | WS_VISIBLE | WS_TABSTOP;
260 else
261 lMsStyle = SLS_HORIZONTAL | WS_VISIBLE | WS_TABSTOP;
409c9842 262
3c299c3a
DW
263 if (m_windowStyle & wxCLIP_SIBLINGS)
264 lMsStyle |= WS_CLIPSIBLINGS;
409c9842 265
3c299c3a 266 if (m_windowStyle & wxSL_AUTOTICKS)
409c9842 267 {
3c299c3a
DW
268 vSlData.usScale1Spacing = 0;
269 vSlData.usScale2Spacing = 0;
270 }
409c9842 271
3c299c3a
DW
272 if (m_windowStyle & wxSL_LEFT)
273 lMsStyle |= SLS_PRIMARYSCALE2; // if SLS_VERTICAL then SCALE2 is to the left
274 else if (m_windowStyle & wxSL_RIGHT)
275 lMsStyle |= SLS_PRIMARYSCALE1; // if SLS_VERTICAL then SCALE2 is to the right
276 else if (m_windowStyle & wxSL_TOP)
277 lMsStyle |= SLS_PRIMARYSCALE1; // if SLS_HORIZONTAL then SCALE1 is to the top
278 else if (m_windowStyle & wxSL_BOTTOM )
279 lMsStyle |= SLS_PRIMARYSCALE2; // if SLS_HORIZONTAL then SCALE1 is to the bottom
280 else if ( m_windowStyle & wxSL_BOTH )
281 lMsStyle |= SLS_PRIMARYSCALE1 | SLS_PRIMARYSCALE2;
282 else
283 lMsStyle |= SLS_PRIMARYSCALE2;
284
5d44b24e
DW
285 //
286 // If the parent is a scrolled window the controls must
287 // have this style or they will overlap the scrollbars
288 //
289 if (pParent)
290 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
291 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
292 lMsStyle |= WS_CLIPSIBLINGS;
293
3c299c3a
DW
294 m_nPageSize = ((nMaxValue - nMinValue)/10);
295 vSlData.usScale1Increments = m_nPageSize;
296 vSlData.usScale2Increments = m_nPageSize;
297
298 HWND hScrollBar = ::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
299 ,WC_SLIDER // Window class
300 ,(PSZ)wxBuffer // Initial Text
301 ,(ULONG)lMsStyle // Style flags
302 ,0L, 0L, 0L, 0L // Origin -- 0 size
303 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
304 ,HWND_TOP // initial z position
305 ,(HMENU)m_windowId // Window identifier
306 ,&vSlData // Slider control data
307 ,NULL // no Presentation parameters
308 );
309 m_nRangeMax = nMaxValue;
310 m_nRangeMin = nMinValue;
311
312 //
313 // Set the size of the ticks ... default to 6 pixels
314 //
315 ::WinSendMsg( hScrollBar
316 ,SLM_SETTICKSIZE
317 ,MPFROM2SHORT(SMA_SETALLTICKS, 6)
318 ,NULL
319 );
320 //
321 // Set the position to the initial value
322 //
323 ::WinSendMsg( hScrollBar
324 ,SLM_SETSLIDERINFO
325 ,MPFROM2SHORT(SMA_SLIDERARMPOSITION, SMA_RANGEVALUE)
326 ,(MPARAM)nValue
327 );
328
329 m_hWnd = (WXHWND)hScrollBar;
330 SubclassWin(GetHWND());
331 ::WinSetWindowText((HWND)m_hWnd, "");
e58dab20 332 SetFont(*wxSMALL_FONT);
3c299c3a 333 if (m_windowStyle & wxSL_LABELS)
409c9842 334 {
3c299c3a
DW
335 //
336 // Finally, create max value static item
337 //
338 sprintf(wxBuffer, "%d", nMaxValue);
339 lWstyle = SS_TEXT|DT_LEFT|WS_VISIBLE;
340 if (m_windowStyle & wxCLIP_SIBLINGS)
341 lMsStyle |= WS_CLIPSIBLINGS;
5d44b24e
DW
342 //
343 // If the parent is a scrolled window the controls must
344 // have this style or they will overlap the scrollbars
345 //
346 if (pParent)
347 if (pParent->IsKindOf(CLASSINFO(wxScrolledWindow)) ||
348 pParent->IsKindOf(CLASSINFO(wxGenericScrolledWindow)))
349 lWstyle |= WS_CLIPSIBLINGS;
350
3c299c3a
DW
351 m_hStaticMax = (WXHWND)::WinCreateWindow( (HWND)GetHwndOf(pParent) // Parent window handle
352 ,WC_STATIC // Window class
353 ,(PSZ)wxBuffer // Initial Text
354 ,(ULONG)lWstyle // Style flags
355 ,0L, 0L, 0L, 0L // Origin -- 0 size
356 ,(HWND)GetHwndOf(pParent) // owner window handle (same as parent
357 ,HWND_TOP // initial z position
358 ,(ULONG)NewControlId() // Window identifier
359 ,NULL // no control data
360 ,NULL // no Presentation parameters
361 );
362 if (GetFont().Ok())
363 {
364 if (GetFont().GetResourceHandle())
365 {
366 if (m_hStaticMin)
367 wxOS2SetFont( m_hStaticMin
368 ,GetFont()
369 );
370 if (m_hStaticMax)
371 wxOS2SetFont( m_hStaticMax
372 ,GetFont()
373 );
374 if (m_hStaticValue)
375 wxOS2SetFont( m_hStaticValue
376 ,GetFont()
377 );
378 }
379 }
409c9842
DW
380 }
381
3c299c3a
DW
382 SetSize( nX
383 ,nY
384 ,nWidth
385 ,nHeight
386 );
387 m_nThumbLength = SHORT1FROMMR(::WinSendMsg( GetHwnd()
388 ,SLM_QUERYSLIDERINFO
389 ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
390 ,SMA_RANGEVALUE
391 )
392 ,(MPARAM)0
393 )
394 ) + 4; // for bordersizes
395
396 wxColour vColour;
397
398 vColour.Set(wxString("BLACK"));
399
400 LONG lColor = (LONG)vColour.GetPixel();
401
402 ::WinSetPresParam( m_hStaticMin
403 ,PP_FOREGROUNDCOLOR
404 ,sizeof(LONG)
405 ,(PVOID)&lColor
406 );
407 ::WinSetPresParam( m_hStaticMax
408 ,PP_FOREGROUNDCOLOR
409 ,sizeof(LONG)
410 ,(PVOID)&lColor
411 );
412 ::WinSetPresParam( m_hStaticValue
413 ,PP_FOREGROUNDCOLOR
414 ,sizeof(LONG)
415 ,(PVOID)&lColor
416 );
417 ::WinSetPresParam( m_hWnd
418 ,PP_FOREGROUNDCOLOR
419 ,sizeof(LONG)
420 ,(PVOID)&lColor
421 );
7993e67c
DW
422 lColor = (LONG)m_backgroundColour.GetPixel();
423 ::WinSetPresParam( m_hStaticMin
424 ,PP_BACKGROUNDCOLOR
425 ,sizeof(LONG)
426 ,(PVOID)&lColor
427 );
428 ::WinSetPresParam( m_hStaticMax
429 ,PP_BACKGROUNDCOLOR
430 ,sizeof(LONG)
431 ,(PVOID)&lColor
432 );
433 ::WinSetPresParam( m_hStaticValue
434 ,PP_BACKGROUNDCOLOR
435 ,sizeof(LONG)
436 ,(PVOID)&lColor
437 );
438 ::WinSetPresParam( m_hWnd
439 ,PP_BACKGROUNDCOLOR
440 ,sizeof(LONG)
441 ,(PVOID)&lColor
442 );
3c299c3a
DW
443 SetValue(nValue);
444 return TRUE;
445} // end of wxSlider::Create
446
447void wxSlider::DoSetSize(
448 int nX
449, int nY
450, int nWidth
451, int nHeight
452, int nSizeFlags
453)
454{
455 int nX1 = nX;
456 int nY1 = nY;
457 int nWidth1 = nWidth;
458 int nHeight1 = nHeight;
459 int nXOffset = nX;
460 int nYOffset = nY;
461 int nCx; // slider,min,max sizes
462 int nCy;
463 int nCyf;
464 int nCurrentX;
465 int nCurrentY;
466 char zBuf[300];
467
468 //
469 // Adjust for OS/2's reverse coordinate system
470 //
471 wxWindowOS2* pParent = (wxWindowOS2*)GetParent();
472 int nUsedHeight = 0;
473 int nOS2Height = nHeight;
474
475 if (nOS2Height < 0)
476 nOS2Height = 20;
477
478 if (pParent)
409c9842 479 {
d8a3f66c
DW
480 int nOS2ParentHeight = GetOS2ParentHeight(pParent);
481
482 nYOffset = nOS2ParentHeight - (nYOffset + nOS2Height);
483 if (nY != -1)
484 nY1 = nOS2ParentHeight - (nY1 + nOS2Height);
409c9842 485 }
3c299c3a 486 else
409c9842 487 {
3c299c3a 488 RECTL vRect;
409c9842 489
3c299c3a
DW
490 ::WinQueryWindowRect(HWND_DESKTOP, &vRect);
491 nYOffset = vRect.yTop - (nYOffset + nOS2Height);
492 if (nY != -1)
493 nY1 = vRect.yTop - (nY1 + nOS2Height);
494 }
d8a3f66c 495 m_nSizeFlags = nSizeFlags;
409c9842 496
3c299c3a
DW
497 GetPosition( &nCurrentX
498 ,&nCurrentY
499 );
500 if (nX == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
501 nX1 = nCurrentX;
502 if (nY == -1 && !(nSizeFlags & wxSIZE_ALLOW_MINUS_ONE))
503 nY1 = nCurrentY;
504
505 AdjustForParentClientOrigin( nX1
506 ,nY1
507 ,nSizeFlags
508 );
509 wxGetCharSize( GetHWND()
510 ,&nCx
511 ,&nCy
512 ,&this->GetFont()
513 );
514
515 if ((m_windowStyle & wxSL_VERTICAL) != wxSL_VERTICAL)
409c9842 516 {
3c299c3a
DW
517 if (m_windowStyle & wxSL_LABELS )
518 {
519 int nMinLen = 0;
520 int nMaxLen = 0;
521
522 ::WinQueryWindowText((HWND)m_hStaticMin, 300, zBuf);
523 GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &this->GetFont());
524 ::WinQueryWindowText((HWND)m_hStaticMax, 300, zBuf);
525 GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &this->GetFont());
526
527 if (m_hStaticValue)
528 {
529 int nNewWidth = (wxMax(nMinLen, nMaxLen));
530 int nValueHeight = nCyf;
531
532 ::WinSetWindowPos( (HWND)m_hStaticValue
533 ,HWND_TOP
534 ,(LONG)nXOffset
535 ,(LONG)nYOffset - (nCyf * 1.2)
536 ,(LONG)nNewWidth
537 ,(LONG)nValueHeight
538 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
539 );
540 nXOffset += nNewWidth + nCx;
541 }
542 ::WinSetWindowPos( (HWND)m_hStaticMin
543 ,HWND_TOP
544 ,(LONG)nXOffset
545 ,(LONG)nYOffset - nCyf
546 ,(LONG)nMinLen
547 ,(LONG)nCy
548 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
549 );
550 nXOffset += nMinLen + nCx;
551
552 int nSliderLength = nWidth1 - nXOffset - nMaxLen - nCx;
553 int nSliderHeight = nHeight1;
554
555 if (nSliderHeight < 0)
556 nSliderHeight = 20;
557
558 //
559 // Slider must have a minimum/default length/height
560 //
561 if (nSliderLength < 100)
562 nSliderLength = 100;
563
564 ::WinSetWindowPos( GetHwnd()
565 ,HWND_TOP
566 ,(LONG)nXOffset
567 ,(LONG)nYOffset
568 ,(LONG)nSliderLength
569 ,(LONG)nSliderHeight
570 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
571 );
572 nXOffset += nSliderLength + nCx;
573
574 ::WinSetWindowPos( (HWND)m_hStaticMax
575 ,HWND_TOP
576 ,(LONG)nXOffset
577 ,(LONG)nYOffset - nCyf
578 ,(LONG)nMaxLen
579 ,(LONG)nCy
580 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
581 );
582 }
583 else
584 {
585 //
586 // No labels
587 // If we're prepared to use the existing size, then...
588 //
589 if (nWidth == -1 && nHeight == -1 &&
590 ((nSizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO))
591 {
592 GetSize( &nWidth1
593 ,&nHeight1
594 );
595 }
596 if (nWidth1 < 0)
597 nWidth1 = 200;
598 if (nHeight1 < 0)
599 nHeight1 = 20;
600 ::WinSetWindowPos( GetHwnd()
601 ,HWND_TOP
602 ,(LONG)nX1
603 ,(LONG)nY1
604 ,(LONG)nWidth1
605 ,(LONG)nHeight1
606 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
607 );
608 }
409c9842
DW
609 }
610
3c299c3a
DW
611 //
612 // Now deal with a vertical slider
613 //
409c9842
DW
614 else
615 {
3c299c3a 616 if (m_windowStyle & wxSL_LABELS )
409c9842 617 {
3c299c3a
DW
618 int nMinLen;
619 int nMaxLen;
620
621 ::WinQueryWindowText((HWND)m_hStaticMin, 300, zBuf);
622 GetTextExtent(zBuf, &nMinLen, &nCyf, NULL, NULL, &this->GetFont());
623 ::WinQueryWindowText((HWND)m_hStaticMax, 300, zBuf);
624 GetTextExtent(zBuf, &nMaxLen, &nCyf, NULL, NULL, &this->GetFont());
625 if (m_hStaticValue)
626 {
627 int nNewWidth = wxMax(nMinLen, nMaxLen);
628 int nValueHeight = nCyf;
629
630 nNewWidth += nCx;
631
632 //
633 // The height needs to be a bit bigger under Win95 if using native
634 // 3D effects.
635 //
636 nValueHeight = (int)(nValueHeight * 1.5);
637 ::WinSetWindowPos( (HWND)m_hStaticValue
638 ,HWND_TOP
639 ,(LONG)nXOffset
640 ,(LONG)nYOffset
641 ,(LONG)nNewWidth
642 ,(LONG)nValueHeight
643 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
644 );
645 nYOffset -= nValueHeight;
646 nUsedHeight += nValueHeight;
647 }
648 ::WinSetWindowPos( (HWND)m_hStaticMin
649 ,HWND_TOP
650 ,(LONG)nXOffset
651 ,(LONG)nYOffset
652 ,(LONG)nMinLen
653 ,(LONG)nCy
654 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
655 );
656 nYOffset -= nCy;
657 nUsedHeight += nCy;
658
659 int nSliderLength = nHeight1 - (nUsedHeight + (2 * nCy));
660 int nSliderWidth = nWidth1;
661
662 if (nSliderWidth < 0)
663 nSliderWidth = 20;
664
665 //
666 // Slider must have a minimum/default length
667 //
668 if (nSliderLength < 100)
669 nSliderLength = 100;
670
671 ::WinSetWindowPos( (HWND)m_hStaticMin
672 ,HWND_TOP
673 ,(LONG)nXOffset
674 ,(LONG)nYOffset
675 ,(LONG)nSliderWidth
676 ,(LONG)nSliderLength
677 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
678 );
679 nYOffset -= nSliderLength;
680 nUsedHeight += nSliderLength;
681 ::WinSetWindowPos( (HWND)m_hStaticMax
682 ,HWND_TOP
683 ,(LONG)nXOffset
684 ,(LONG)nYOffset
685 ,(LONG)nMaxLen
686 ,(LONG)nCy
687 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
688 );
689 }
690 else
691 {
692 //
693 // No labels
694 // If we're prepared to use the existing size, then...
695 //
696 if (nWidth == -1 && nHeight == -1 &&
697 ((nSizeFlags & wxSIZE_AUTO) != wxSIZE_AUTO))
698 {
699 GetSize( &nWidth1
700 ,&nHeight1
701 );
702 }
703 if (nWidth1 < 0)
704 nWidth1 = 20;
705 if (nHeight1 < 0)
706 nHeight1 = 200;
707 ::WinSetWindowPos( GetHwnd()
708 ,HWND_TOP
709 ,(LONG)nX1
710 ,(LONG)nY1
711 ,(LONG)nWidth1
712 ,(LONG)nHeight1
713 ,SWP_ZORDER | SWP_SIZE | SWP_MOVE | SWP_SHOW
714 );
409c9842 715 }
409c9842 716 }
3c299c3a 717} // end of void wxSlider::DoSetSize
0e320a79 718
3c299c3a 719int wxSlider::GetLineSize() const
0e320a79 720{
3c299c3a
DW
721 return 1;
722} // end of wxSlider::GetLineSize
0e320a79 723
3c299c3a
DW
724int wxSlider::GetPageSize() const
725{
726 return m_nPageSize;
727} // end of wxSlider::GetPageSize
0e320a79 728
3c299c3a
DW
729void wxSlider::GetPosition(
730 int* pnX
731, int* pnY
732) const
409c9842 733{
3c299c3a
DW
734 wxWindowOS2* pParent = GetParent();
735 RECTL vRect;
736
737 vRect.xLeft = -1;
738 vRect.xRight = -1;
739 vRect.yTop = -1;
740 vRect.yBottom = -1;
741 wxFindMaxSize( GetHWND()
742 ,&vRect
743 );
744
745 if (m_hStaticMin)
746 wxFindMaxSize( m_hStaticMin
747 ,&vRect
748 );
749 if (m_hStaticMax)
750 wxFindMaxSize( m_hStaticMax
751 ,&vRect
752 );
753 if (m_hStaticValue)
754 wxFindMaxSize( m_hStaticValue
755 ,&vRect
756 );
757
758 //
759 // Since we now have the absolute screen coords,
760 // if there's a parent we must subtract its top left corner
761 //
762 POINTL vPoint;
763
764 vPoint.x = vRect.xLeft;
765 vPoint.y = vRect.yTop;
766
767 if (pParent)
768 {
769 SWP vSwp;
409c9842 770
3c299c3a
DW
771 ::WinQueryWindowPos((HWND)pParent->GetHWND(), &vSwp);
772 vPoint.x = vSwp.x;
773 vPoint.y = vSwp.y;
774 }
409c9842 775
3c299c3a
DW
776 //
777 // We may be faking the client origin.
778 // So a window that's really at (0, 30) may appear
779 // (to wxWin apps) to be at (0, 0).
780 //
781 if (GetParent())
782 {
783 wxPoint vPt(GetParent()->GetClientAreaOrigin());
409c9842 784
3c299c3a
DW
785 vPoint.x -= vPt.x;
786 vPoint.y -= vPt.y;
787 }
788 *pnX = vPoint.x;
789 *pnY = vPoint.y;
790} // end of wxSlider::GetPosition
409c9842 791
3c299c3a 792int wxSlider::GetSelEnd() const
0e320a79 793{
3c299c3a
DW
794 return 0;
795} // end of wxSlider::GetSelEnd
0e320a79 796
3c299c3a 797int wxSlider::GetSelStart() const
0e320a79 798{
3c299c3a
DW
799 return 0;
800} // end of wxSlider::GetSelStart
0e320a79 801
3c299c3a
DW
802void wxSlider::GetSize(
803 int* pnWidth
804, int* pnHeight
805) const
0e320a79 806{
3c299c3a
DW
807 RECTL vRect;
808
809 vRect.xLeft = -1;
810 vRect.xRight = -1;
811 vRect.yTop = -1;
812 vRect.yBottom = -1;
813
814 wxFindMaxSize( GetHWND()
815 ,&vRect
816 );
817
818 if (m_hStaticMin)
819 wxFindMaxSize( m_hStaticMin
820 ,&vRect
821 );
822 if (m_hStaticMax)
823 wxFindMaxSize( m_hStaticMax
824 ,&vRect
825 );
826 if (m_hStaticValue)
827 wxFindMaxSize( m_hStaticValue
828 ,&vRect
829 );
830 *pnWidth = vRect.xRight - vRect.xLeft;
831 *pnHeight = vRect.yBottom - vRect.yTop;
832} // end of wxSlider::GetSize
0e320a79 833
3c299c3a 834int wxSlider::GetThumbLength() const
0e320a79 835{
3c299c3a
DW
836 return m_nThumbLength;
837} // end of wxSlider::GetThumbLength
0e320a79 838
3c299c3a 839int wxSlider::GetValue() const
0e320a79 840{
3c299c3a
DW
841 int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
842 ,SLM_QUERYSLIDERINFO
843 ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
844 ,SMA_RANGEVALUE
845 )
846 ,(MPARAM)0
847 )
848 );
849 double dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
850 int nNewPos = 0;
851 int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
852 ,SLM_QUERYSLIDERINFO
853 ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
854 ,SMA_RANGEVALUE
855 )
856 ,(MPARAM)0
857 )
858 );
859 nNewPos = (int)(nPixelPos/dPixelToRange);
860 if (nNewPos > (m_nRangeMax - m_nRangeMin)/2)
861 nNewPos++;
862 return nNewPos;
863} // end of wxSlider::GetValue
864
865WXHBRUSH wxSlider::OnCtlColor(
866 WXHDC hDC
867, WXHWND hWnd
868, WXUINT uCtlColor
869, WXUINT uMessage
870, WXWPARAM wParam
871, WXLPARAM lParam
872)
0e320a79 873{
3c299c3a
DW
874 return (wxControl::OnCtlColor( hDC
875 ,hWnd
876 ,uCtlColor
877 ,uMessage
878 ,wParam
879 ,lParam
880 )
881 );
882} // end of wxSlider::OnCtlColor
883
884bool wxSlider::OS2OnScroll(
885 int WXUNUSED(nOrientation)
886, WXWORD wParam
887, WXWORD wPos
888, WXHWND hControl
889)
0e320a79 890{
3c299c3a 891 wxEventType eScrollEvent = wxEVT_NULL;
0e320a79 892
3c299c3a
DW
893 switch (wParam)
894 {
895 case SLN_CHANGE:
896 if (m_windowStyle & wxSL_TOP)
897 eScrollEvent = wxEVT_SCROLL_TOP;
898 else if (m_windowStyle & wxSL_BOTTOM)
899 eScrollEvent = wxEVT_SCROLL_BOTTOM;
900 break;
0e320a79 901
3c299c3a
DW
902 case SLN_SLIDERTRACK:
903 eScrollEvent = wxEVT_SCROLL_THUMBTRACK;
904 break;
905
906 default:
907 return FALSE;
908 }
909
910 int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
911 ,SLM_QUERYSLIDERINFO
912 ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
913 ,SMA_RANGEVALUE
914 )
915 ,(MPARAM)0
916 )
917 );
918 m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
919 int nNewPos = 0;
920 int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
921 ,SLM_QUERYSLIDERINFO
922 ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
923 ,SMA_RANGEVALUE
924 )
925 ,(MPARAM)0
926 )
927 );
928 nNewPos = (nPixelPos/m_dPixelToRange);
929 if (nNewPos > (m_nRangeMax - m_nRangeMin)/2)
930 nNewPos++;
931 if ((nNewPos < GetMin()) || (nNewPos > GetMax()))
932 {
933 //
934 // Out of range - but we did process it
935 //
936 return TRUE;
937 }
938 SetValue(nNewPos);
939
940 wxScrollEvent vEvent( eScrollEvent
941 ,m_windowId
942 );
943
944 vEvent.SetPosition(nNewPos);
945 vEvent.SetEventObject(this);
946 GetEventHandler()->ProcessEvent(vEvent);
947
948 wxCommandEvent vCevent( wxEVT_COMMAND_SLIDER_UPDATED
949 ,GetId()
950 );
951
952 vCevent.SetInt(nNewPos);
953 vCevent.SetEventObject(this);
954 return (GetEventHandler()->ProcessEvent(vCevent));
955} // end of wxSlider::OS2OnScroll
956
957void wxSlider::SetLineSize(
958 int nLineSize
959)
0e320a79 960{
3c299c3a
DW
961 m_nLineSize = nLineSize;
962} // end of wxSlider::SetLineSize
963
0e320a79 964
3c299c3a
DW
965void wxSlider::SetPageSize(
966 int nPageSize
967)
0e320a79 968{
3c299c3a
DW
969 m_nPageSize = nPageSize;
970} // end of wxSlider::SetPageSize
0e320a79 971
3c299c3a
DW
972void wxSlider::SetRange(
973 int nMinValue
974, int nMaxValue
975)
0e320a79 976{
3c299c3a
DW
977 wxChar zBuf[10];
978
979 m_nRangeMin = nMinValue;
980 m_nRangeMax = nMaxValue;
981
982 int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
983 ,SLM_QUERYSLIDERINFO
984 ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
985 ,SMA_RANGEVALUE
986 )
987 ,(MPARAM)0
988 )
989 );
990 m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
991 if (m_hStaticMin)
992 {
993 wxSprintf(zBuf, wxT("%d"), m_nRangeMin);
994 ::WinSetWindowText((HWND)m_hStaticMin, zBuf);
995 }
0e320a79 996
3c299c3a
DW
997 if (m_hStaticMax)
998 {
999 wxSprintf(zBuf, wxT("%d"), m_nRangeMax);
1000 ::WinSetWindowText((HWND)m_hStaticMax, zBuf);
1001 }
1002} // end of wxSlider::SetRange
1003
1004void wxSlider::SetSelection(
1005 int WXUNUSED(nMinPos)
1006, int WXUNUSED(nMaxPos)
1007)
0e320a79 1008{
3c299c3a 1009} // end of wxSlider::SetSelection
0e320a79 1010
3c299c3a
DW
1011void wxSlider::SetThumbLength(
1012 int nLen
1013)
0e320a79 1014{
3c299c3a
DW
1015 int nBreadth;
1016
1017 m_nThumbLength = SHORT1FROMMR(::WinSendMsg( GetHwnd()
1018 ,SLM_QUERYSLIDERINFO
1019 ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
1020 ,SMA_RANGEVALUE
1021 )
1022 ,(MPARAM)0
1023 )
1024 ) + 4; // for bordersizes
1025 nBreadth = SHORT2FROMMR(::WinSendMsg( GetHwnd()
1026 ,SLM_QUERYSLIDERINFO
1027 ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
1028 ,SMA_RANGEVALUE
1029 )
1030 ,(MPARAM)0
1031 )
1032 );
1033 ::WinSendMsg( GetHwnd()
1034 ,SLM_SETSLIDERINFO
1035 ,MPFROM2SHORT( SMA_SLIDERARMDIMENSIONS
1036 ,SMA_RANGEVALUE
1037 )
1038 ,MPFROM2SHORT(nLen, nBreadth)
1039 );
1040 m_nThumbLength = nLen + 4; // Borders
1041} // end of wxSlider::SetThumbLength
1042
1043void wxSlider::SetTick(
1044 int nTickPos
1045)
1046{
1047 nTickPos *= m_dPixelToRange;
1048 ::WinSendMsg( GetHwnd()
1049 ,SLM_ADDDETENT
1050 ,MPFROMSHORT(nTickPos)
1051 ,NULL
1052 );
1053} // end of wxSlider::SetTick
0e320a79 1054
3c299c3a
DW
1055// For trackbars only
1056void wxSlider::SetTickFreq(
1057 int n
1058, int nPos
1059)
409c9842 1060{
3c299c3a
DW
1061 SLDCDATA vSlData;
1062 WNDPARAMS vWndParams;
1063 int nPixelPos;
1064 int i;
409c9842 1065
3c299c3a
DW
1066 vSlData.cbSize = sizeof(SLDCDATA);
1067 if (m_windowStyle & wxSL_AUTOTICKS)
1068 {
1069 vSlData.usScale1Spacing = 0;
1070 vSlData.usScale2Spacing = 0;
1071 }
1072 vSlData.usScale1Increments = (m_nRangeMax - m_nRangeMin)/n;
1073 vSlData.usScale2Increments = (m_nRangeMax - m_nRangeMin)/n;
1074
1075 vWndParams.fsStatus = WPM_CTLDATA;
1076 vWndParams.cchText = 0L;
1077 vWndParams.pszText = NULL;
1078 vWndParams.cbPresParams = 0L;
1079 vWndParams.pPresParams = NULL;
1080 vWndParams.cbCtlData = vSlData.cbSize;
1081 vWndParams.pCtlData = (PVOID)&vSlData;
1082 ::WinSendMsg(GetHwnd(), WM_SETWINDOWPARAMS, (MPARAM)&vWndParams, (MPARAM)0);
1083 for (i = 1; i < (m_nRangeMax - m_nRangeMin)/n; i++)
1084 {
1085 nPixelPos = i * n * m_dPixelToRange;
1086 ::WinSendMsg( GetHwnd()
1087 ,SLM_ADDDETENT
1088 ,MPFROMSHORT(nPixelPos)
1089 ,NULL
1090 );
1091 }
1092} // end of wxSlider::SetTickFreq
1093
1094void wxSlider::SetValue(
1095 int nValue
1096)
0e320a79 1097{
3c299c3a
DW
1098 int nPixelPos = SHORT1FROMMR(::WinSendMsg( GetHwnd()
1099 ,SLM_QUERYSLIDERINFO
1100 ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
1101 ,SMA_RANGEVALUE
1102 )
1103 ,(MPARAM)0
1104 )
1105 );
1106 int nPixelRange = SHORT1FROMMR(::WinSendMsg( GetHwnd()
1107 ,SLM_QUERYSLIDERINFO
1108 ,MPFROM2SHORT( SMA_SHAFTDIMENSIONS
1109 ,SMA_RANGEVALUE
1110 )
1111 ,(MPARAM)0
1112 )
1113 );
1114 m_dPixelToRange = (double)(nPixelRange - m_nThumbLength)/(double)(m_nRangeMax - m_nRangeMin);
1115 int nNewPos = (int)(nValue * m_dPixelToRange);
1116
1117 ::WinSendMsg( GetHwnd()
1118 ,SLM_SETSLIDERINFO
1119 ,MPFROM2SHORT( SMA_SLIDERARMPOSITION
1120 ,SMA_RANGEVALUE
1121 )
1122 ,(MPARAM)nNewPos
1123 );
1124 if (m_hStaticValue)
1125 {
1126 wxSprintf(wxBuffer, wxT("%d"), nValue);
1127 ::WinSetWindowText((HWND)m_hStaticValue, wxBuffer);
1128 }
1129} // end of wxSlider::SetValue
0e320a79 1130
3c299c3a
DW
1131bool wxSlider::Show(
1132 bool bShow
1133)
0e320a79 1134{
3c299c3a
DW
1135 wxWindowOS2::Show(bShow);
1136 if(m_hStaticValue)
1137 ::WinShowWindow((HWND)m_hStaticValue, bShow);
1138 if(m_hStaticMin)
1139 ::WinShowWindow((HWND)m_hStaticMin, bShow);
1140 if(m_hStaticMax)
1141 ::WinShowWindow((HWND)m_hStaticMax, bShow);
0e320a79 1142 return TRUE;
3c299c3a 1143} // end of wxSlider::Show
0e320a79 1144