]> git.saurik.com Git - wxWidgets.git/blame - src/os2/spinctrl.cpp
Added chapter on collection and container classes to contents
[wxWidgets.git] / src / os2 / spinctrl.cpp
CommitLineData
409c9842
DW
1/////////////////////////////////////////////////////////////////////////////
2// Name: msw/spinctrl.cpp
3// Purpose: wxSpinCtrl class implementation for Win32
4// Author: David Webster
5// Modified by:
6// Created: 10/15/99
7// RCS-ID: $Id$
8// Copyright: (c) David Webster
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12// ============================================================================
13// declarations
14// ============================================================================
15
16
1c85008f
SN
17#ifdef __GNUG__
18 #pragma implementation "spinctrlbase.h"
19 #pragma implementation "spinctrl.h"
20#endif
21
409c9842
DW
22// ----------------------------------------------------------------------------
23// headers
24// ----------------------------------------------------------------------------
25
26// for compilers that support precompilation, includes "wx.h".
27#include "wx/wxprec.h"
28
29
30#ifndef WX_PRECOMP
31 #include "wx/wx.h"
32#endif
33
34#include "wx/spinctrl.h"
35#include "wx/os2/private.h"
36
37// ----------------------------------------------------------------------------
38// macros
39// ----------------------------------------------------------------------------
40
3d62dcb6 41IMPLEMENT_DYNAMIC_CLASS(wxSpinCtrl, wxControl)
409c9842 42
3d62dcb6
DW
43BEGIN_EVENT_TABLE(wxSpinCtrl, wxSpinButton)
44 EVT_SPIN(-1, wxSpinCtrl::OnSpinChange)
45END_EVENT_TABLE()
409c9842
DW
46// ----------------------------------------------------------------------------
47// constants
48// ----------------------------------------------------------------------------
49
50// the margin between the up-down control and its buddy
51static const int MARGIN_BETWEEN = 5;
52
53// ============================================================================
54// implementation
55// ============================================================================
56
57// ----------------------------------------------------------------------------
58// construction
59// ----------------------------------------------------------------------------
60
61bool wxSpinCtrl::Create(wxWindow *parent,
62 wxWindowID id,
3e7fb41b 63 const wxString& value,
409c9842
DW
64 const wxPoint& pos,
65 const wxSize& size,
66 long style,
67 int min, int max, int initial,
68 const wxString& name)
69{
70 // TODO:
71/*
72 // before using DoGetBestSize(), have to set style to let the base class
73 // know whether this is a horizontal or vertical control (we're always
74 // vertical)
3d62dcb6
DW
75 style |= wxSP_VERTICAL;
76 SetWindowStyle(style);
409c9842
DW
77
78 // calculate the sizes: the size given is the toal size for both controls
79 // and we need to fit them both in the given width (height is the same)
80 wxSize sizeText(size), sizeBtn(size);
81 sizeBtn.x = wxSpinButton::DoGetBestSize().x;
3d62dcb6
DW
82 if ( sizeText.x <= 0 )
83 {
84 // DEFAULT_ITEM_WIDTH is the default width for the text control
85 sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x;
86 }
87
409c9842
DW
88 sizeText.x -= sizeBtn.x + MARGIN_BETWEEN;
89 if ( sizeText.x <= 0 )
90 {
91 wxLogDebug(_T("not enough space for wxSpinCtrl!"));
92 }
93
94 wxPoint posBtn(pos);
95 posBtn.x += sizeText.x + MARGIN_BETWEEN;
96
97 // create the spin button
98 if ( !wxSpinButton::Create(parent, id, posBtn, sizeBtn, style, name) )
99 {
100 return FALSE;
101 }
102
103 SetRange(min, max);
104 SetValue(initial);
105
106 // create the text window
409c9842
DW
107 m_hwndBuddy = (WXHWND)::CreateWindowEx
108 (
3d62dcb6
DW
109 WS_EX_CLIENTEDGE, // sunken border
110 _T("EDIT"), // window class
111 NULL, // no window title
112 WS_CHILD | WS_BORDER, // style (will be shown later)
113 pos.x, pos.y, // position
114 0, 0, // size (will be set later)
115 GetHwndOf(parent), // parent
116 (HMENU)-1, // control id
117 wxGetInstance(), // app instance
118 NULL // unused client data
409c9842
DW
119 );
120
121 if ( !m_hwndBuddy )
122 {
123 wxLogLastError("CreateWindow(buddy text window)");
124
125 return FALSE;
126 }
127
128 // should have the same font as the other controls
3d62dcb6
DW
129 SetFont(GetParent()->GetFont());
130
131 // set the size of the text window - can do it only now, because we
132 // couldn't call DoGetBestSize() before as font wasn't set
133 if ( sizeText.y <= 0 )
134 {
135 int cx, cy;
136 wxGetCharSize(GetHWND(), &cx, &cy, &GetFont());
137
138 sizeText.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy);
139 }
140
141 DoMoveWindow(pos.x, pos.y,
142 sizeText.x + sizeBtn.x + MARGIN_BETWEEN, sizeText.y);
143
144 (void)::ShowWindow((HWND)m_hwndBuddy, SW_SHOW);
409c9842
DW
145
146 // associate the text window with the spin button
3d62dcb6
DW
147 (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0);
148
149 if ( !value.IsEmpty() )
150 {
151 SetValue(value);
152 }
409c9842
DW
153*/
154 return FALSE;
155}
156
3d62dcb6
DW
157// ----------------------------------------------------------------------------
158// wxTextCtrl-like methods
159// ----------------------------------------------------------------------------
160
161void wxSpinCtrl::SetValue(const wxString& text)
162{
163 // TODO:
164 /*
165 if ( !::SetWindowText((HWND)m_hwndBuddy, text.c_str()) )
166 {
167 wxLogLastError("SetWindowText(buddy)");
168 }
169 */
170}
171
172int wxSpinCtrl::GetValue() const
173{
174 wxString val = wxGetWindowText(m_hwndBuddy);
175
176 long n;
177 if ( (wxSscanf(val, wxT("%lu"), &n) != 1) )
178 n = INT_MIN;
179
180 return n;
181}
182
183// ----------------------------------------------------------------------------
184// forward some methods to subcontrols
185// ----------------------------------------------------------------------------
186
187bool wxSpinCtrl::SetFont(const wxFont& font)
188{
189 if ( !wxWindowBase::SetFont(font) )
190 {
191 // nothing to do
192 return FALSE;
193 }
194
195 WXHANDLE hFont = GetFont().GetResourceHandle();
196 // TODO:
197 /*
198 (void)::SendMessage((HWND)m_hwndBuddy, WM_SETFONT, (WPARAM)hFont, TRUE);
199 */
200 return TRUE;
201}
202
203bool wxSpinCtrl::Show(bool show)
204{
205 if ( !wxControl::Show(show) )
206 {
207 return FALSE;
208 }
209
210 // TODO:
211 /*
212 ::ShowWindow((HWND)m_hwndBuddy, show ? SW_SHOW : SW_HIDE);
213 */
214 return TRUE;
215}
216
217bool wxSpinCtrl::Enable(bool enable)
218{
219 if ( !wxControl::Enable(enable) )
220 {
221 return FALSE;
222 }
223
224 // TODO:
225 /*
226 ::EnableWindow((HWND)m_hwndBuddy, enable);
227 */
228 return TRUE;
229}
230
231// ----------------------------------------------------------------------------
232// event processing
233// ----------------------------------------------------------------------------
234
235void wxSpinCtrl::OnSpinChange(wxSpinEvent& eventSpin)
236{
237 wxCommandEvent event(wxEVT_COMMAND_SPINCTRL_UPDATED, GetId());
238 event.SetEventObject(this);
239 event.SetInt(eventSpin.GetPosition());
240
241 (void)GetEventHandler()->ProcessEvent(event);
242
243 if ( eventSpin.GetSkipped() )
244 {
245 event.Skip();
246 }
247}
248
409c9842
DW
249// ----------------------------------------------------------------------------
250// size calculations
251// ----------------------------------------------------------------------------
252
3d62dcb6
DW
253wxSize wxSpinCtrl::DoGetBestSize() const
254{
255 wxSize sizeBtn = wxSpinButton::DoGetBestSize();
256 // TODO:
257 /*
258 sizeBtn.x += DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN;
259
260 int y;
261 wxGetCharSize(GetHWND(), NULL, &y, &GetFont());
262 y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(y);
263
264 if ( sizeBtn.y < y )
265 {
266 // make the text tall enough
267 sizeBtn.y = y;
268 }
269 */
270 return sizeBtn;
271}
272
409c9842
DW
273void wxSpinCtrl::DoMoveWindow(int x, int y, int width, int height)
274{
275 int widthBtn = DoGetBestSize().x;
276 int widthText = width - widthBtn - MARGIN_BETWEEN;
277 if ( widthText <= 0 )
278 {
279 wxLogDebug(_T("not enough space for wxSpinCtrl!"));
280 }
281// TODO:
282/*
283 if ( !::MoveWindow((HWND)m_hwndBuddy, x, y, widthText, height, TRUE) )
284 {
285 wxLogLastError("MoveWindow(buddy)");
286 }
287
288 x += widthText + MARGIN_BETWEEN;
289 if ( !::MoveWindow(GetHwnd(), x, y, widthBtn, height, TRUE) )
290 {
291 wxLogLastError("MoveWindow");
292 }
293*/
294}