]> git.saurik.com Git - wxWidgets.git/blame - src/os2/spinbutt.cpp
Disable any refresh in backing window (set_back_pixmap( None ..) makes it transparent
[wxWidgets.git] / src / os2 / spinbutt.cpp
CommitLineData
0e320a79
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: spinbutt.cpp
3// Purpose: wxSpinButton
409c9842 4// Author: David Webster
0e320a79 5// Modified by:
409c9842 6// Created: 10/15/99
0e320a79 7// RCS-ID: $Id$
409c9842 8// Copyright: (c) David Webster
65571936 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
16#ifndef WX_PRECOMP
17 #include "wx/wx.h"
0e320a79 18#endif
7e99520b 19#if wxUSE_SPINBTN
0e320a79 20
409c9842
DW
21// Can't resolve reference to CreateUpDownControl in
22// TWIN32, but could probably use normal CreateWindow instead.
23
24
0e320a79 25#include "wx/spinbutt.h"
3bfbab1e 26
3c299c3a
DW
27extern void wxAssociateWinWithHandle( HWND hWnd
28 ,wxWindowOS2* pWin
29 );
3c299c3a 30
3bfbab1e
SN
31IMPLEMENT_DYNAMIC_CLASS(wxSpinEvent, wxNotifyEvent)
32
409c9842
DW
33#include "wx/os2/private.h"
34
35// ============================================================================
36// implementation
37// ============================================================================
38
39// ----------------------------------------------------------------------------
40// wxWin macros
41// ----------------------------------------------------------------------------
0e320a79 42
0e320a79 43IMPLEMENT_DYNAMIC_CLASS(wxSpinButton, wxControl)
0e320a79 44
409c9842 45bool wxSpinButton::Create(
3c299c3a
DW
46 wxWindow* pParent
47, wxWindowID vId
48, const wxPoint& rPos
49, const wxSize& rSize
50, long lStyle
51, const wxString& rsName
409c9842 52)
0e320a79 53{
3c299c3a
DW
54 int nX = rPos.x;
55 int nY = rPos.y;
56 int nWidth = rSize.x;
57 int nHeight = rSize.y;
d8a3f66c 58 SWP vSwp;
3c299c3a
DW
59
60 m_min = 0;
61 m_max = 100;
62 if (vId == -1)
63 m_windowId = NewControlId();
64 else
65 m_windowId = vId;
66 m_backgroundColour = pParent->GetBackgroundColour();
67 m_foregroundColour = pParent->GetForegroundColour();
68 SetName(rsName);
69 SetParent(pParent);
70 m_windowStyle = lStyle;
71
72 //
73 // Get the right size for the control
74 //
75 if (nWidth <= 0 || nHeight <= 0 )
76 {
77 wxSize vSize = DoGetBestSize();
0e320a79 78
3c299c3a
DW
79 if (nWidth <= 0 )
80 nWidth = vSize.x;
81 if (nHeight <= 0 )
82 nHeight = vSize.y;
83 }
84 if (nX < 0 )
85 nX = 0;
86 if (nY < 0 )
87 nY = 0;
88
89 long lSstyle = 0L;
90
91 lSstyle = WS_VISIBLE |
92 WS_TABSTOP |
93 SPBS_MASTER | // We use only single field spin buttons
94 SPBS_NUMERICONLY; // We default to numeric data
95
96 if (m_windowStyle & wxCLIP_SIBLINGS )
97 lSstyle |= WS_CLIPSIBLINGS;
98
3c299c3a
DW
99 m_hWnd = (WXHWND)::WinCreateWindow( GetWinHwnd(pParent)
100 ,WC_SPINBUTTON
101 ,(PSZ)NULL
102 ,lSstyle
103 ,0L, 0L, 0L, 0L
104 ,GetWinHwnd(pParent)
105 ,HWND_TOP
106 ,(HMENU)vId
8787320b 107 ,NULL
3c299c3a
DW
108 ,NULL
109 );
110 if (m_hWnd == 0)
111 {
112 return FALSE;
113 }
8787320b 114 SetRange(m_min, m_max);
3c299c3a
DW
115 if(pParent)
116 pParent->AddChild((wxSpinButton *)this);
117
d8a3f66c
DW
118 ::WinQueryWindowPos(m_hWnd, &vSwp);
119 SetXComp(vSwp.x);
22c68581 120 SetYComp(vSwp.y-5); // compensate for the associated TextControl border
61a028dc
SN
121
122 SetFont(*wxSMALL_FONT);
3c299c3a
DW
123 //
124 // For OS/2 we want to hide the text portion so we can substitute an
22c68581
SN
125 // independent text ctrl in its place.
126 // Therefore we must override any user given width with our best guess.
3c299c3a 127 //
22c68581
SN
128 SetSize( nX - GetXComp()
129 ,nY - GetYComp()
130 ,nWidth
3c299c3a
DW
131 ,nHeight
132 );
133 wxAssociateWinWithHandle( m_hWnd
134 ,(wxWindowOS2*)this
135 );
8787320b
SN
136#if 0
137 // FIXME:
138 // Apparently, this does not work, as it crashes in setvalue/setrange calls
139 // What's it supposed to do anyway?
3c299c3a
DW
140 ::WinSetWindowULong(GetHwnd(), QWL_USER, (LONG)this);
141 fnWndProcSpinCtrl = (WXFARPROC)::WinSubclassWindow(m_hWnd, (PFNWP)wxSpinCtrlWndProc);
8787320b 142#endif
3c299c3a
DW
143 return TRUE;
144} // end of wxSpinButton::Create
0e320a79
DW
145
146wxSpinButton::~wxSpinButton()
147{
3c299c3a 148} // end of wxSpinButton::~wxSpinButton
0e320a79 149
409c9842
DW
150// ----------------------------------------------------------------------------
151// size calculation
152// ----------------------------------------------------------------------------
153
e78c4d50 154wxSize wxSpinButton::DoGetBestSize() const
409c9842 155{
3c299c3a 156 //
61a028dc
SN
157 // OS/2 PM does not really have system metrics so we'll just set it to
158 // a square based on its height.
3c299c3a 159 //
61a028dc
SN
160 RECTL vRect;
161 ::WinQueryWindowRect(GetHwnd(),&vRect);
162 return wxSize(vRect.yTop,vRect.yTop);
3c299c3a 163} // end of wxSpinButton::DoGetBestSize
409c9842
DW
164
165// ----------------------------------------------------------------------------
0e320a79 166// Attributes
409c9842 167// ----------------------------------------------------------------------------
0e320a79
DW
168
169int wxSpinButton::GetValue() const
170{
3c299c3a
DW
171 long lVal = 0L;
172 char zVal[10];
173
174 ::WinSendMsg( GetHwnd()
175 ,SPBM_QUERYVALUE
176 ,MPFROMP(zVal)
177 ,MPFROM2SHORT( (USHORT)10
178 ,SPBQ_UPDATEIFVALID
179 )
180 );
181 lVal = atol(zVal);
182 return ((int)lVal);
183} // end of wxSpinButton::GetValue
184
6670f564
WS
185bool wxSpinButton::OS2OnScroll( int WXUNUSED(nOrientation),
186 WXWORD WXUNUSED(wParam),
187 WXWORD wPos,
188 WXHWND hControl )
0e320a79 189{
637b7e4f 190 wxCHECK_MSG(hControl, false, wxT("scrolling what?") );
0e320a79 191
6670f564
WS
192 wxSpinEvent vEvent( wxEVT_SCROLL_THUMBTRACK, m_windowId );
193 int nVal = (int)wPos; // cast is important for negative values!
409c9842 194
3c299c3a
DW
195 vEvent.SetPosition(nVal);
196 vEvent.SetEventObject(this);
937013e0 197 return(HandleWindowEvent(vEvent));
3c299c3a 198} // end of wxSpinButton::OS2OnScroll
409c9842 199
6670f564
WS
200bool wxSpinButton::OS2Command( WXUINT WXUNUSED(uCmd),
201 WXWORD WXUNUSED(wId) )
409c9842 202{
6670f564 203 return false;
3c299c3a 204} // end of wxSpinButton::OS2Command
409c9842 205
3c299c3a
DW
206void wxSpinButton::SetRange(
207 int nMinVal
208, int nMaxVal
209)
0e320a79 210{
3c299c3a
DW
211 m_min = nMinVal;
212 m_max = nMaxVal;
213
214 ::WinSendMsg( GetHwnd()
215 ,SPBM_SETLIMITS
216 ,MPFROMLONG(nMaxVal)
217 ,MPFROMLONG(nMinVal)
218 );
219} // end of wxSpinButton::SetRange
220
221void wxSpinButton::SetValue(
222 int nValue
223)
224{
225 ::WinSendMsg(GetHwnd(), SPBM_SETCURRENTVALUE, MPFROMLONG(nValue), MPARAM(0));
226} // end of wxSpinButton::SetValue
0e320a79 227
7e99520b 228#endif //wxUSE_SPINBTN