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