replaced T() makro with wxT() due to namespace probs, _T() exists, too
[wxWidgets.git] / src / generic / choicdgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: choicdgg.cpp
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
11
12 #ifdef __GNUG__
13 #pragma implementation "choicdgg.h"
14 #endif
15
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
18
19 #ifdef __BORLANDC__
20 #pragma hdrstop
21 #endif
22
23 #ifndef WX_PRECOMP
24 #include <stdio.h>
25 #include "wx/utils.h"
26 #include "wx/dialog.h"
27 #include "wx/button.h"
28 #include "wx/listbox.h"
29 #include "wx/stattext.h"
30 #include "wx/intl.h"
31 #include "wx/sizer.h"
32 #endif
33
34 #if wxUSE_STATLINE
35 #include "wx/statline.h"
36 #endif
37
38 #include "wx/generic/choicdgg.h"
39
40 #define wxID_LISTBOX 3000
41
42 wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
43 const wxString *choices, wxWindow *parent,
44 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
45 int WXUNUSED(width), int WXUNUSED(height) )
46 {
47 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
48 if ( dialog.ShowModal() == wxID_OK )
49 return dialog.GetStringSelection();
50 else
51 return wxT("");
52 }
53
54 // Overloaded for backward compatibility
55 wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
56 char *choices[], wxWindow *parent,
57 int x, int y, bool centre,
58 int width, int height )
59 {
60 wxString *strings = new wxString[n];
61 int i;
62 for ( i = 0; i < n; i++)
63 {
64 strings[i] = choices[i];
65 }
66 wxString ans(wxGetSingleChoice(message, caption, n, (const wxString *)strings, parent,
67 x, y, centre, width, height));
68 delete[] strings;
69 return ans;
70 }
71
72 int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
73 const wxString *choices, wxWindow *parent,
74 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
75 int WXUNUSED(width), int WXUNUSED(height) )
76 {
77 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
78 if ( dialog.ShowModal() == wxID_OK )
79 return dialog.GetSelection();
80 else
81 return -1;
82 }
83
84 // Overloaded for backward compatibility
85 int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
86 wxChar *choices[], wxWindow *parent,
87 int x, int y, bool centre,
88 int width, int height )
89 {
90 wxString *strings = new wxString[n];
91 for ( int i = 0; i < n; i++)
92 strings[i] = choices[i];
93 int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent,
94 x, y, centre, width, height);
95 delete[] strings;
96 return ans;
97 }
98
99 wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
100 const wxString *choices, wxChar **client_data, wxWindow *parent,
101 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
102 int WXUNUSED(width), int WXUNUSED(height) )
103 {
104 wxSingleChoiceDialog dialog(parent, message, caption, n, choices, (char **)client_data);
105 if ( dialog.ShowModal() == wxID_OK )
106 return (wxChar *)dialog.GetSelectionClientData();
107 else
108 return NULL;
109 }
110
111 // Overloaded for backward compatibility
112 wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
113 wxChar *choices[], wxChar **client_data, wxWindow *parent,
114 int x, int y, bool centre,
115 int width, int height )
116 {
117 wxString *strings = new wxString[n];
118 int i;
119 for ( i = 0; i < n; i++)
120 {
121 strings[i] = choices[i];
122 }
123 wxChar *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
124 x, y, centre, width, height);
125 delete[] strings;
126 return data;
127 }
128
129
130 /* Multiple choice dialog contributed by Robert Cowell
131 *
132
133 The new data passed are in the "int nsel" and "int * selection"
134
135 The idea is to make a multiple selection from list of strings.
136 The returned value is the total number selected. initialily there
137 are nsel selected, with indices stored in
138 selection[0],...,selection[nsel-1] which appear highlighted to
139 begin with. On exit with value i
140 selection[0..i-1] contains the indices of the selected items.
141 (Some prior selectecions might be deselected.)
142 Thus selection must be as big as choices, in case all items are
143 selected.
144
145 */
146 /*
147 int wxGetMultipleChoice(const wxString& message, const wxString& caption,
148 int n, const wxString *choices,
149 int nsel, int * selection,
150 wxWindow *parent , int x , int y, bool centre,
151 int width, int height)
152 {
153 return -1;
154 }
155 */
156
157 // wxSingleChoiceDialog
158
159 #if !USE_SHARED_LIBRARY
160 BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
161 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
162 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
163 END_EVENT_TABLE()
164
165 IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
166 #endif
167
168 #if defined(__WXMSW__) || defined(__WXMAC__)
169 #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
170 wxDIALOG_MODAL | \
171 wxTAB_TRAVERSAL)
172 #else
173 #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
174 wxDIALOG_MODAL | \
175 wxRESIZE_BORDER | \
176 wxTAB_TRAVERSAL)
177 #endif
178
179
180 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
181 const wxString& message,
182 const wxString& caption,
183 int n,
184 const wxString *choices,
185 char **clientData,
186 long style,
187 const wxPoint& pos)
188 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
189 wxCHOICEDLG_DIALOG_STYLE)
190 {
191 Create(parent, message, caption, n, choices, clientData, style);
192 }
193
194 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
195 const wxString& message,
196 const wxString& caption,
197 const wxStringList& choices,
198 char **clientData,
199 long style,
200 const wxPoint& pos)
201 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
202 wxCHOICEDLG_DIALOG_STYLE)
203 {
204 Create(parent, message, caption, choices, clientData, style);
205 }
206
207 bool wxSingleChoiceDialog::Create(wxWindow *parent,
208 const wxString& message,
209 const wxString& caption,
210 const wxStringList& choices,
211 char **clientData,
212 long style,
213 const wxPoint& pos)
214 {
215 wxString *strings = new wxString[choices.Number()];
216 int i;
217 for ( i = 0; i < choices.Number(); i++)
218 {
219 strings[i] = (char *)choices.Nth(i)->Data();
220 }
221 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
222 delete[] strings;
223 return ans;
224 }
225
226 bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent),
227 const wxString& message,
228 const wxString& WXUNUSED(caption),
229 int n,
230 const wxString *choices,
231 char **clientData,
232 long style,
233 const wxPoint& WXUNUSED(pos) )
234 {
235 m_selection = 0;
236 m_clientData = NULL;
237 m_stringSelection = wxT("");
238
239 m_dialogStyle = style;
240
241 wxBeginBusyCursor();
242
243 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
244
245 // 1) text message
246 topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
247
248 // 2) list box
249 m_listbox = new wxListBox( this, wxID_LISTBOX, wxDefaultPosition, wxSize(160,100) ,
250 n, choices, wxLB_ALWAYS_SB );
251 m_listbox->SetSelection( m_selection );
252 if (clientData)
253 {
254 for (int i = 0; i < n; i++)
255 m_listbox->SetClientData(i, clientData[i]);
256 }
257 topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
258
259 #if wxUSE_STATLINE
260 // 3) static line
261 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
262 #endif
263
264 // 4) buttons
265 topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
266
267 SetAutoLayout( TRUE );
268 SetSizer( topsizer );
269
270 topsizer->SetSizeHints( this );
271 topsizer->Fit( this );
272
273 Centre( wxBOTH );
274
275 m_listbox->SetFocus();
276
277 wxEndBusyCursor();
278
279 return TRUE;
280 }
281
282 // Set the selection
283 void wxSingleChoiceDialog::SetSelection(int sel)
284 {
285 m_listbox->SetSelection(sel);
286 m_selection = sel;
287 }
288
289 void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
290 {
291 m_selection = m_listbox->GetSelection();
292 m_stringSelection = m_listbox->GetStringSelection();
293 m_clientData = m_listbox->GetClientData(m_selection);
294
295 EndModal(wxID_OK);
296 }
297
298 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
299 {
300 m_selection = m_listbox->GetSelection();
301 m_stringSelection = m_listbox->GetStringSelection();
302 m_clientData = m_listbox->GetClientData(m_selection);
303
304 EndModal(wxID_OK);
305 }
306