Unicode fixes
[wxWidgets.git] / src / generic / numdlgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: numdlgg.cpp
3 // Purpose: wxGetNumberFromUser implementation
4 // Author: Vadim Zeitlin
5 // Modified by:
6 // Created: 23.07.99
7 // RCS-ID: $Id$
8 // Copyright: (c) Vadim Zeitlin
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #ifdef __GNUG__
21 #pragma interface "numdlgg.h"
22 #pragma implementation "numdlgg.h"
23 #endif
24
25 // For compilers that support precompilation, includes "wx.h".
26 #include "wx/wxprec.h"
27
28 #ifdef __BORLANDC__
29 #pragma hdrstop
30 #endif
31
32 #ifndef WX_PRECOMP
33 #include <stdio.h>
34
35 #include "wx/utils.h"
36 #include "wx/dialog.h"
37 #include "wx/button.h"
38 #include "wx/stattext.h"
39 #include "wx/textctrl.h"
40 #include "wx/intl.h"
41 #endif
42
43 // this is where wxGetNumberFromUser() is declared
44 #include "wx/generic/textdlgg.h"
45
46 // ----------------------------------------------------------------------------
47 // private classes
48 // ----------------------------------------------------------------------------
49
50 class WXDLLEXPORT wxNumberEntryDialog : public wxDialog
51 {
52 public:
53 wxNumberEntryDialog(wxWindow *parent,
54 const wxString& message,
55 const wxString& prompt,
56 const wxString& caption,
57 long value, long min, long max,
58 const wxPoint& pos);
59
60 long GetValue() const { return m_value; }
61
62 // implementation only
63 void OnOK(wxCommandEvent& event);
64 void OnCancel(wxCommandEvent& event);
65
66 protected:
67 wxTextCtrl *m_spinctrl; // TODO replace it with wxSpinCtrl once it's done
68
69 long m_value, m_min, m_max;
70
71 private:
72 DECLARE_EVENT_TABLE()
73 };
74
75 // ============================================================================
76 // implementation
77 // ============================================================================
78
79 // ----------------------------------------------------------------------------
80 // wxNumberEntryDialog
81 // ----------------------------------------------------------------------------
82
83 BEGIN_EVENT_TABLE(wxNumberEntryDialog, wxDialog)
84 EVT_BUTTON(wxID_OK, wxNumberEntryDialog::OnOK)
85 EVT_BUTTON(wxID_CANCEL, wxNumberEntryDialog::OnCancel)
86 END_EVENT_TABLE()
87
88 wxNumberEntryDialog::wxNumberEntryDialog(wxWindow *parent,
89 const wxString& message,
90 const wxString& prompt,
91 const wxString& caption,
92 long value,
93 long min,
94 long max,
95 const wxPoint& pos)
96 : wxDialog(parent, -1, caption,
97 pos, wxDefaultSize,
98 wxDEFAULT_DIALOG_STYLE | wxDIALOG_MODAL)
99 {
100 // init members
101 // ------------
102
103 m_value = value;
104 m_max = max;
105 m_min = min;
106
107 // calculate the sizes
108 // -------------------
109
110 wxArrayString lines;
111 wxSize sizeText = SplitTextMessage(message, &lines);
112
113 wxSize sizeBtn = GetStandardButtonSize();
114
115 int wPrompt, hPrompt;
116 GetTextExtent(prompt, &wPrompt, &hPrompt);
117
118 long wText = wxMax(2*sizeBtn.GetWidth(),
119 wxMax(wPrompt, sizeText.GetWidth()));
120 long hText = GetStandardTextHeight();
121
122 long wDialog = 5*LAYOUT_X_MARGIN + wText + wPrompt;
123 long hDialog = 2*LAYOUT_Y_MARGIN +
124 sizeText.GetHeight() * lines.GetCount() +
125 2*LAYOUT_Y_MARGIN +
126 hText +
127 2*LAYOUT_Y_MARGIN +
128 sizeBtn.GetHeight() +
129 2*LAYOUT_Y_MARGIN;
130
131 // create the controls
132 // -------------------
133
134 // message
135 long x = 2*LAYOUT_X_MARGIN;
136 long y = CreateTextMessage(lines,
137 wxPoint(x, 2*LAYOUT_Y_MARGIN),
138 sizeText);
139
140 y += 2*LAYOUT_X_MARGIN;
141
142 // prompt
143 (void)new wxStaticText(this, -1, prompt,
144 wxPoint(x, y),
145 wxSize(wPrompt, hPrompt));
146
147 // spin ctrl
148 wxString valStr;
149 valStr.Printf(_T("%lu"), m_value);
150 m_spinctrl = new wxTextCtrl(this, -1, valStr,
151 wxPoint(x + wPrompt + LAYOUT_X_MARGIN, y),
152 wxSize(wText, hText));
153 y += hText + 2*LAYOUT_X_MARGIN;
154
155 // and buttons
156 CreateStandardButtons(wDialog, y, sizeBtn.GetWidth(), sizeBtn.GetHeight());
157
158 // set the dialog size and position
159 SetClientSize(wDialog, hDialog);
160 if ( pos == wxDefaultPosition )
161 {
162 // centre the dialog if no explicit position given
163 Centre(wxBOTH | wxCENTER_FRAME);
164 }
165
166 m_spinctrl->SetFocus();
167 }
168
169 void wxNumberEntryDialog::OnOK(wxCommandEvent& event)
170 {
171 if ( (wxSscanf(m_spinctrl->GetValue(), _T("%lu"), &m_value) != 1) ||
172 (m_value < m_min) || (m_value > m_max) )
173 {
174 // not a number or out of range
175 m_value = -1;
176 }
177
178 EndModal(wxID_OK);
179 }
180
181 void wxNumberEntryDialog::OnCancel(wxCommandEvent& event)
182 {
183 m_value = -1;
184
185 EndModal(wxID_CANCEL);
186 }
187
188 // ----------------------------------------------------------------------------
189 // global functions
190 // ----------------------------------------------------------------------------
191
192 // wxGetTextFromUser is in utilscmn.cpp
193
194 long wxGetNumberFromUser(const wxString& msg,
195 const wxString& prompt,
196 const wxString& title,
197 long value,
198 long min,
199 long max,
200 wxWindow *parent,
201 const wxPoint& pos)
202 {
203 wxNumberEntryDialog dialog(parent, msg, prompt, title,
204 value, min, max, pos);
205 (void)dialog.ShowModal();
206
207 return dialog.GetValue();
208 }