]> git.saurik.com Git - wxWidgets.git/blob - src/generic/choicdgg.cpp
virtualized m_row/col height/widths arrays
[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 void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
100 const wxString *choices, void **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 dialog.GetSelectionClientData();
107 else
108 return NULL;
109 }
110
111 // Overloaded for backward compatibility
112 void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
113 wxChar *choices[], void **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 void *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 BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
160 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
161 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
162 END_EVENT_TABLE()
163
164 IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
165
166 #if defined(__WXMSW__) || defined(__WXMAC__)
167 #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
168 wxDIALOG_MODAL | \
169 wxTAB_TRAVERSAL)
170 #else
171 #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
172 wxDIALOG_MODAL | \
173 wxRESIZE_BORDER | \
174 wxTAB_TRAVERSAL)
175 #endif
176
177
178 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
179 const wxString& message,
180 const wxString& caption,
181 int n,
182 const wxString *choices,
183 char **clientData,
184 long style,
185 const wxPoint& pos)
186 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
187 wxCHOICEDLG_DIALOG_STYLE)
188 {
189 Create(parent, message, caption, n, choices, clientData, style);
190 }
191
192 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
193 const wxString& message,
194 const wxString& caption,
195 const wxStringList& choices,
196 char **clientData,
197 long style,
198 const wxPoint& pos)
199 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
200 wxCHOICEDLG_DIALOG_STYLE)
201 {
202 Create(parent, message, caption, choices, clientData, style);
203 }
204
205 bool wxSingleChoiceDialog::Create(wxWindow *parent,
206 const wxString& message,
207 const wxString& caption,
208 const wxStringList& choices,
209 char **clientData,
210 long style,
211 const wxPoint& pos)
212 {
213 wxString *strings = new wxString[choices.Number()];
214 int i;
215 for ( i = 0; i < choices.Number(); i++)
216 {
217 strings[i] = (char *)choices.Nth(i)->Data();
218 }
219 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
220 delete[] strings;
221 return ans;
222 }
223
224 bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent),
225 const wxString& message,
226 const wxString& WXUNUSED(caption),
227 int n,
228 const wxString *choices,
229 char **clientData,
230 long style,
231 const wxPoint& WXUNUSED(pos) )
232 {
233 m_selection = 0;
234
235 m_dialogStyle = style;
236
237 wxBeginBusyCursor();
238
239 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
240
241 // 1) text message
242 topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
243
244 // 2) list box
245 m_listbox = new wxListBox( this, wxID_LISTBOX, wxDefaultPosition, wxSize(160,100) ,
246 n, choices, wxLB_ALWAYS_SB );
247 m_listbox->SetSelection( m_selection );
248 if (clientData)
249 {
250 for (int i = 0; i < n; i++)
251 m_listbox->SetClientData(i, clientData[i]);
252 }
253 topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
254
255 #if wxUSE_STATLINE
256 // 3) static line
257 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
258 #endif
259
260 // 4) buttons
261 topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
262
263 SetAutoLayout( TRUE );
264 SetSizer( topsizer );
265
266 topsizer->SetSizeHints( this );
267 topsizer->Fit( this );
268
269 Centre( wxBOTH );
270
271 m_listbox->SetFocus();
272
273 wxEndBusyCursor();
274
275 return TRUE;
276 }
277
278 // Set the selection
279 void wxSingleChoiceDialog::SetSelection(int sel)
280 {
281 m_listbox->SetSelection(sel);
282 m_selection = sel;
283 }
284
285 void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
286 {
287 m_selection = m_listbox->GetSelection();
288 m_stringSelection = m_listbox->GetStringSelection();
289 // TODO!
290 #ifndef __WXMOTIF__
291 if ( m_listbox->HasClientUntypedData() )
292 SetClientData(m_listbox->GetClientData(m_selection));
293 #endif
294 EndModal(wxID_OK);
295 }
296
297 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
298 {
299 m_selection = m_listbox->GetSelection();
300 m_stringSelection = m_listbox->GetStringSelection();
301
302 // TODO!
303 #ifndef __WXMOTIF__
304 if ( m_listbox->HasClientUntypedData() )
305 SetClientData(m_listbox->GetClientData(m_selection));
306 #endif
307
308 EndModal(wxID_OK);
309 }
310