]> git.saurik.com Git - wxWidgets.git/blame_incremental - src/generic/choicdgg.cpp
cell attributes added (doesn't quite work, work in progress, beware, don't use, ...
[wxWidgets.git] / src / generic / choicdgg.cpp
... / ...
CommitLineData
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
42wxString 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
55wxString 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
72int 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
85int 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
99void *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
112void *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
133The new data passed are in the "int nsel" and "int * selection"
134
135The idea is to make a multiple selection from list of strings.
136The returned value is the total number selected. initialily there
137are nsel selected, with indices stored in
138selection[0],...,selection[nsel-1] which appear highlighted to
139begin with. On exit with value i
140selection[0..i-1] contains the indices of the selected items.
141(Some prior selectecions might be deselected.)
142Thus selection must be as big as choices, in case all items are
143selected.
144
145*/
146/*
147int 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
159BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
160 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
161 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
162END_EVENT_TABLE()
163
164IMPLEMENT_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
178wxSingleChoiceDialog::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
192wxSingleChoiceDialog::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
205bool 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
224bool 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
279void wxSingleChoiceDialog::SetSelection(int sel)
280{
281 m_listbox->SetSelection(sel);
282 m_selection = sel;
283}
284
285void 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
297void 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