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