]> git.saurik.com Git - wxWidgets.git/blame - include/wx/generic/spinctlg.h
implement wxBitmapButton as just a wrapper for wxButton under MSW
[wxWidgets.git] / include / wx / generic / spinctlg.h
CommitLineData
669a6e11
VZ
1/////////////////////////////////////////////////////////////////////////////
2// Name: wx/generic/spinctlg.h
3// Purpose: generic wxSpinCtrl class
4// Author: Vadim Zeitlin
5// Modified by:
6// Created: 28.10.99
7// RCS-ID: $Id$
8// Copyright: (c) Vadim Zeitlin
65571936 9// Licence: wxWindows licence
669a6e11
VZ
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_GENERIC_SPINCTRL_H_
13#define _WX_GENERIC_SPINCTRL_H_
14
1e6feb95
VZ
15// ----------------------------------------------------------------------------
16// wxSpinCtrl is a combination of wxSpinButton and wxTextCtrl, so if
17// wxSpinButton is available, this is what we do - but if it isn't, we still
18// define wxSpinCtrl class which then has the same appearance as wxTextCtrl but
19// the different interface. This allows to write programs using wxSpinCtrl
20// without tons of #ifdefs.
21// ----------------------------------------------------------------------------
22
739555e3 23#if wxUSE_SPINBTN
1e6feb95 24
b5dbe15d
VS
25class WXDLLIMPEXP_FWD_CORE wxSpinButton;
26class WXDLLIMPEXP_FWD_CORE wxTextCtrl;
1e6feb95 27
405f0fef 28class wxSpinCtrlTextGeneric; // wxTextCtrl used for the wxSpinCtrlGenericBase
8cd6a9ad
VZ
29
30// The !wxUSE_SPINBTN version's GetValue() function conflicts with the
31// wxTextCtrl's GetValue() and so you have to input a dummy int value.
32#define wxSPINCTRL_GETVALUE_FIX
33
1e6feb95 34// ----------------------------------------------------------------------------
8cd6a9ad
VZ
35// wxSpinCtrlGeneric is a combination of wxTextCtrl and wxSpinButton
36//
37// This class manages a double valued generic spinctrl through the DoGet/SetXXX
38// functions that are made public as Get/SetXXX functions for int or double
39// for the wxSpinCtrl and wxSpinCtrlDouble classes respectively to avoid
40// function ambiguity.
1e6feb95
VZ
41// ----------------------------------------------------------------------------
42
53a2db12 43class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase : public wxSpinCtrlBase
1e6feb95
VZ
44{
45public:
8cd6a9ad 46 wxSpinCtrlGenericBase() { Init(); }
1e6feb95
VZ
47
48 bool Create(wxWindow *parent,
ca65c044 49 wxWindowID id = wxID_ANY,
1e6feb95
VZ
50 const wxString& value = wxEmptyString,
51 const wxPoint& pos = wxDefaultPosition,
52 const wxSize& size = wxDefaultSize,
f1ddb476 53 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c218ccee
VZ
54 double min = 0, double max = 100, double initial = 0,
55 double inc = 1,
1e6feb95
VZ
56 const wxString& name = _T("wxSpinCtrl"));
57
8cd6a9ad
VZ
58 virtual ~wxSpinCtrlGenericBase();
59
60 // accessors
61 // T GetValue() const
62 // T GetMin() const
63 // T GetMax() const
64 // T GetIncrement() const
65 virtual bool GetSnapToTicks() const { return m_snap_to_ticks; }
66 // unsigned GetDigits() const - wxSpinCtrlDouble only
1e6feb95
VZ
67
68 // operations
8cd6a9ad
VZ
69 virtual void SetValue(const wxString& text);
70 // void SetValue(T val)
71 // void SetRange(T minVal, T maxVal)
72 // void SetIncrement(T inc)
73 virtual void SetSnapToTicks(bool snap_to_ticks);
74 // void SetDigits(unsigned digits) - wxSpinCtrlDouble only
75
76 // Select text in the textctrl
739555e3 77 void SetSelection(long from, long to);
1e6feb95 78
1e6feb95
VZ
79 // implementation from now on
80
81 // forward these functions to all subcontrols
ca65c044
WS
82 virtual bool Enable(bool enable = true);
83 virtual bool Show(bool show = true);
7f0cbaaa 84 virtual bool Reparent(wxWindowBase *newParent);
1e6feb95
VZ
85
86 // get the subcontrols
8cd6a9ad
VZ
87 wxTextCtrl *GetText() const { return m_textCtrl; }
88 wxSpinButton *GetSpinButton() const { return m_spinButton; }
1e6feb95 89
8cd6a9ad
VZ
90 // forwarded events from children windows
91 void OnSpinButton(wxSpinEvent& event);
92 void OnTextEnter(wxCommandEvent& event);
93 void OnTextChar(wxKeyEvent& event);
1e6feb95 94
405f0fef 95 friend class wxSpinCtrlTextGeneric;
1e6feb95
VZ
96
97protected:
98 // override the base class virtuals involved into geometry calculations
dba00620 99 virtual wxSize DoGetBestSize() const;
1e6feb95
VZ
100 virtual void DoMoveWindow(int x, int y, int width, int height);
101
8cd6a9ad
VZ
102 // generic double valued functions
103 double DoGetValue() const { return m_value; }
104 bool DoSetValue(double val);
105 void DoSetRange(double min_val, double max_val);
106 void DoSetIncrement(double inc);
107
108 // Ensure that the textctrl shows correct value
109 void SyncSpinToText();
110
111 // Send the correct event type
112 virtual void DoSendEvent() = 0;
113
70c14728 114 // check if the value is in range
8cd6a9ad
VZ
115 bool InRange(double n) const { return (n >= m_min) && (n <= m_max); }
116
70c14728
VZ
117 // ensure that the value is in range wrapping it round if necessary
118 double AdjustToFitInRange(double value) const;
119
120
8cd6a9ad
VZ
121 double m_value;
122 double m_min;
123 double m_max;
124 double m_increment;
125 bool m_snap_to_ticks;
126 wxString m_format;
127
128 int m_spin_value;
1e6feb95 129
1e6feb95 130 // the subcontrols
8cd6a9ad
VZ
131 wxTextCtrl *m_textCtrl;
132 wxSpinButton *m_spinButton;
739555e3 133
6c0ba0d0 134private:
8cd6a9ad
VZ
135 // common part of all ctors
136 void Init();
1e6feb95
VZ
137};
138
139#else // !wxUSE_SPINBTN
669a6e11 140
8cd6a9ad
VZ
141#define wxSPINCTRL_GETVALUE_FIX int = 1
142
669a6e11 143// ----------------------------------------------------------------------------
1e6feb95 144// wxSpinCtrl is just a text control
669a6e11
VZ
145// ----------------------------------------------------------------------------
146
1e6feb95
VZ
147#include "wx/textctrl.h"
148
53a2db12 149class WXDLLIMPEXP_CORE wxSpinCtrlGenericBase : public wxTextCtrl
669a6e11
VZ
150{
151public:
8cd6a9ad
VZ
152 wxSpinCtrlGenericBase() : m_value(0), m_min(0), m_max(100),
153 m_increment(1), m_snap_to_ticks(false),
154 m_format(wxT("%g")) { }
155
156 bool Create(wxWindow *parent,
157 wxWindowID id = wxID_ANY,
158 const wxString& value = wxEmptyString,
159 const wxPoint& pos = wxDefaultPosition,
160 const wxSize& size = wxDefaultSize,
f1ddb476 161 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c218ccee
VZ
162 double min = 0, double max = 100, double initial = 0,
163 double inc = 1,
8cd6a9ad
VZ
164 const wxString& name = _T("wxSpinCtrl"))
165 {
166 m_min = min;
167 m_max = max;
168 m_value = initial;
169 m_increment = inc;
170
171 bool ok = wxTextCtrl::Create(parent, id, value, pos, size, style,
172 wxDefaultValidator, name);
173 DoSetValue(initial);
174
175 return ok;
176 }
177
178 // accessors
179 // T GetValue() const
180 // T GetMin() const
181 // T GetMax() const
182 // T GetIncrement() const
183 virtual bool GetSnapToTicks() const { return m_snap_to_ticks; }
184 // unsigned GetDigits() const - wxSpinCtrlDouble only
185
186 // operations
187 virtual void SetValue(const wxString& text) { wxTextCtrl::SetValue(text); }
188 // void SetValue(T val)
189 // void SetRange(T minVal, T maxVal)
190 // void SetIncrement(T inc)
c218ccee
VZ
191 virtual void SetSnapToTicks(bool snap_to_ticks)
192 { m_snap_to_ticks = snap_to_ticks; }
8cd6a9ad 193 // void SetDigits(unsigned digits) - wxSpinCtrlDouble only
c71830c3 194
8cd6a9ad
VZ
195 // Select text in the textctrl
196 //void SetSelection(long from, long to);
197
198protected:
199 // generic double valued
200 double DoGetValue() const
201 {
202 double n;
203 if ( (wxSscanf(wxTextCtrl::GetValue(), wxT("%lf"), &n) != 1) )
204 n = INT_MIN;
205
206 return n;
207 }
208
c218ccee
VZ
209 bool DoSetValue(double val)
210 {
211 wxTextCtrl::SetValue(wxString::Format(m_format.c_str(), val));
212 return true;
213 }
214 void DoSetRange(double min_val, double max_val)
215 {
216 m_min = min_val;
217 m_max = max_val;
218 }
8cd6a9ad
VZ
219 void DoSetIncrement(double inc) { m_increment = inc; } // Note: unused
220
221 double m_value;
222 double m_min;
223 double m_max;
224 double m_increment;
225 bool m_snap_to_ticks;
226 wxString m_format;
227};
228
229#endif // wxUSE_SPINBTN/!wxUSE_SPINBTN
230
231#if !defined(wxHAS_NATIVE_SPINCTRL)
232
233//-----------------------------------------------------------------------------
234// wxSpinCtrl
235//-----------------------------------------------------------------------------
236
237class WXDLLIMPEXP_CORE wxSpinCtrl : public wxSpinCtrlGenericBase
238{
239public:
240 wxSpinCtrl() {}
c71830c3 241 wxSpinCtrl(wxWindow *parent,
ca65c044 242 wxWindowID id = wxID_ANY,
c71830c3
VZ
243 const wxString& value = wxEmptyString,
244 const wxPoint& pos = wxDefaultPosition,
245 const wxSize& size = wxDefaultSize,
f1ddb476 246 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c71830c3
VZ
247 int min = 0, int max = 100, int initial = 0,
248 const wxString& name = _T("wxSpinCtrl"))
249 {
250 Create(parent, id, value, pos, size, style, min, max, initial, name);
251 }
252
253 bool Create(wxWindow *parent,
ca65c044 254 wxWindowID id = wxID_ANY,
c71830c3
VZ
255 const wxString& value = wxEmptyString,
256 const wxPoint& pos = wxDefaultPosition,
257 const wxSize& size = wxDefaultSize,
f1ddb476 258 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c71830c3
VZ
259 int min = 0, int max = 100, int initial = 0,
260 const wxString& name = _T("wxSpinCtrl"))
261 {
c218ccee
VZ
262 return wxSpinCtrlGenericBase::Create(parent, id, value, pos, size,
263 style, min, max, initial, 1, name);
c71830c3 264 }
669a6e11
VZ
265
266 // accessors
c218ccee
VZ
267 int GetValue(wxSPINCTRL_GETVALUE_FIX) const
268 { return wxRound( DoGetValue() ); }
674f0f27
RR
269 int GetMin() const { return wxRound( m_min ); }
270 int GetMax() const { return wxRound( m_max ); }
271 int GetIncrement() const { return wxRound( m_increment ); }
8cd6a9ad
VZ
272
273 // operations
c218ccee
VZ
274 void SetValue(const wxString& value)
275 { wxSpinCtrlGenericBase::SetValue(value); }
8cd6a9ad
VZ
276 void SetValue( int value ) { DoSetValue(value); }
277 void SetRange( int minVal, int maxVal ) { DoSetRange(minVal, maxVal); }
278 void SetIncrement( double inc ) { DoSetIncrement(inc); }
279
280protected:
281 virtual void DoSendEvent();
282
283private:
284 DECLARE_DYNAMIC_CLASS(wxSpinCtrl)
285};
286
287#endif // wxHAS_NATIVE_SPINCTRL
288
289//-----------------------------------------------------------------------------
290// wxSpinCtrlDouble
291//-----------------------------------------------------------------------------
292
293class WXDLLIMPEXP_CORE wxSpinCtrlDouble : public wxSpinCtrlGenericBase
294{
295public:
296 wxSpinCtrlDouble() : m_digits(0) { }
297 wxSpinCtrlDouble(wxWindow *parent,
298 wxWindowID id = wxID_ANY,
299 const wxString& value = wxEmptyString,
300 const wxPoint& pos = wxDefaultPosition,
301 const wxSize& size = wxDefaultSize,
f1ddb476 302 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c218ccee
VZ
303 double min = 0, double max = 100, double initial = 0,
304 double inc = 1,
8cd6a9ad 305 const wxString& name = _T("wxSpinCtrlDouble"))
669a6e11 306 {
8cd6a9ad 307 m_digits = 0;
c218ccee
VZ
308 Create(parent, id, value, pos, size, style,
309 min, max, initial, inc, name);
8cd6a9ad 310 }
669a6e11 311
8cd6a9ad
VZ
312 bool Create(wxWindow *parent,
313 wxWindowID id = wxID_ANY,
314 const wxString& value = wxEmptyString,
315 const wxPoint& pos = wxDefaultPosition,
316 const wxSize& size = wxDefaultSize,
f1ddb476 317 long style = wxSP_ARROW_KEYS | wxALIGN_RIGHT,
c218ccee
VZ
318 double min = 0, double max = 100, double initial = 0,
319 double inc = 1,
8cd6a9ad
VZ
320 const wxString& name = _T("wxSpinCtrlDouble"))
321 {
c218ccee
VZ
322 return wxSpinCtrlGenericBase::Create(parent, id, value, pos, size,
323 style, min, max, initial,
324 inc, name);
669a6e11
VZ
325 }
326
8cd6a9ad
VZ
327 // accessors
328 double GetValue(wxSPINCTRL_GETVALUE_FIX) const { return DoGetValue(); }
329 double GetMin() const { return m_min; }
330 double GetMax() const { return m_max; }
331 double GetIncrement() const { return m_increment; }
332 unsigned GetDigits() const { return m_digits; }
669a6e11
VZ
333
334 // operations
c218ccee
VZ
335 void SetValue(const wxString& value)
336 { wxSpinCtrlGenericBase::SetValue(value); }
8cd6a9ad
VZ
337 void SetValue(double value) { DoSetValue(value); }
338 void SetRange(double minVal, double maxVal) { DoSetRange(minVal, maxVal); }
339 void SetIncrement(double inc) { DoSetIncrement(inc); }
340 void SetDigits(unsigned digits);
669a6e11
VZ
341
342protected:
8cd6a9ad 343 virtual void DoSendEvent();
669a6e11 344
8cd6a9ad 345 unsigned m_digits;
5fde6fcc
GD
346
347private:
8cd6a9ad 348 DECLARE_DYNAMIC_CLASS(wxSpinCtrlDouble)
669a6e11
VZ
349};
350
351#endif // _WX_GENERIC_SPINCTRL_H_