]> git.saurik.com Git - wxWidgets.git/blame - src/generic/choicdgg.cpp
with only a little modification could be generic
[wxWidgets.git] / src / generic / choicdgg.cpp
CommitLineData
c801d85f 1/////////////////////////////////////////////////////////////////////////////
dfad0599 2// Name: choicdgg.cpp
c801d85f
KB
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
d427503c 9// Licence: wxWindows license
c801d85f
KB
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
d427503c 13 #pragma implementation "choicdgg.h"
c801d85f
KB
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
d427503c 20 #pragma hdrstop
c801d85f
KB
21#endif
22
23#ifndef WX_PRECOMP
257bf510
VZ
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"
92afa2b1 31 #include "wx/sizer.h"
dcf924a3
RR
32#endif
33
34#if wxUSE_STATLINE
c50f1fb9 35 #include "wx/statline.h"
c801d85f
KB
36#endif
37
38#include "wx/generic/choicdgg.h"
39
257bf510 40#define wxID_LISTBOX 3000
dcf924a3 41
c50f1fb9 42wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
debe6624 43 const wxString *choices, wxWindow *parent,
c50f1fb9 44 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
257bf510 45 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 46{
d427503c
VZ
47 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
48 if ( dialog.ShowModal() == wxID_OK )
d427503c 49 return dialog.GetStringSelection();
d427503c 50 else
223d09f6 51 return wxT("");
c801d85f
KB
52}
53
54// Overloaded for backward compatibility
c50f1fb9 55wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
debe6624 56 char *choices[], wxWindow *parent,
c50f1fb9 57 int x, int y, bool centre,
257bf510 58 int width, int height )
c801d85f 59{
d427503c
VZ
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;
c801d85f
KB
70}
71
c50f1fb9 72int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
debe6624 73 const wxString *choices, wxWindow *parent,
c50f1fb9 74 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
d427503c 75 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 76{
d427503c
VZ
77 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
78 if ( dialog.ShowModal() == wxID_OK )
d427503c 79 return dialog.GetSelection();
d427503c
VZ
80 else
81 return -1;
c801d85f
KB
82}
83
84// Overloaded for backward compatibility
c50f1fb9 85int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
87138c52 86 wxChar *choices[], wxWindow *parent,
c50f1fb9 87 int x, int y, bool centre,
d427503c 88 int width, int height )
c801d85f 89{
d427503c 90 wxString *strings = new wxString[n];
dcf924a3 91 for ( int i = 0; i < n; i++)
d427503c 92 strings[i] = choices[i];
d427503c
VZ
93 int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent,
94 x, y, centre, width, height);
95 delete[] strings;
96 return ans;
c801d85f
KB
97}
98
2695a14e
OK
99void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
100 const wxString *choices, void **client_data, wxWindow *parent,
c50f1fb9 101 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
d427503c 102 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 103{
b91b2200 104 wxSingleChoiceDialog dialog(parent, message, caption, n, choices, (char **)client_data);
d427503c 105 if ( dialog.ShowModal() == wxID_OK )
2695a14e 106 return dialog.GetSelectionClientData();
d427503c
VZ
107 else
108 return NULL;
c801d85f
KB
109}
110
111// Overloaded for backward compatibility
2695a14e
OK
112void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
113 wxChar *choices[], void **client_data, wxWindow *parent,
c50f1fb9 114 int x, int y, bool centre,
d427503c 115 int width, int height )
c801d85f 116{
d427503c
VZ
117 wxString *strings = new wxString[n];
118 int i;
119 for ( i = 0; i < n; i++)
120 {
121 strings[i] = choices[i];
122 }
2695a14e 123 void *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
d427503c
VZ
124 x, y, centre, width, height);
125 delete[] strings;
126 return data;
c801d85f
KB
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,
d427503c
VZ
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)
c801d85f 152{
d427503c 153 return -1;
c801d85f
KB
154}
155*/
156
157// wxSingleChoiceDialog
158
159#if !USE_SHARED_LIBRARY
160BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
d427503c
VZ
161 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
162 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
c801d85f
KB
163END_EVENT_TABLE()
164
165IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
166#endif
167
92afa2b1 168#if defined(__WXMSW__) || defined(__WXMAC__)
257bf510
VZ
169#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
170 wxDIALOG_MODAL | \
171 wxTAB_TRAVERSAL)
92afa2b1
RR
172#else
173#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
174 wxDIALOG_MODAL | \
175 wxRESIZE_BORDER | \
176 wxTAB_TRAVERSAL)
177#endif
178
257bf510
VZ
179
180wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
181 const wxString& message,
182 const wxString& caption,
c50f1fb9 183 int n,
257bf510
VZ
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)
c801d85f 190{
257bf510 191 Create(parent, message, caption, n, choices, clientData, style);
c801d85f
KB
192}
193
257bf510
VZ
194wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
195 const wxString& message,
196 const wxString& caption,
c50f1fb9 197 const wxStringList& choices,
b91b2200 198 char **clientData,
c50f1fb9 199 long style,
257bf510
VZ
200 const wxPoint& pos)
201 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
202 wxCHOICEDLG_DIALOG_STYLE)
c801d85f 203{
257bf510 204 Create(parent, message, caption, choices, clientData, style);
c801d85f
KB
205}
206
257bf510
VZ
207bool 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)
c801d85f 214{
d427503c
VZ
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;
c801d85f
KB
224}
225
257bf510 226bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent),
c50f1fb9 227 const wxString& message,
257bf510 228 const wxString& WXUNUSED(caption),
c50f1fb9 229 int n,
257bf510
VZ
230 const wxString *choices,
231 char **clientData,
232 long style,
d427503c 233 const wxPoint& WXUNUSED(pos) )
c801d85f 234{
d427503c 235 m_selection = 0;
92afa2b1
RR
236
237 m_dialogStyle = style;
238
239 wxBeginBusyCursor();
240
241 wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
242
243 // 1) text message
244 topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
245
246 // 2) list box
247 m_listbox = new wxListBox( this, wxID_LISTBOX, wxDefaultPosition, wxSize(160,100) ,
248 n, choices, wxLB_ALWAYS_SB );
249 m_listbox->SetSelection( m_selection );
250 if (clientData)
d427503c 251 {
257bf510
VZ
252 for (int i = 0; i < n; i++)
253 m_listbox->SetClientData(i, clientData[i]);
d427503c 254 }
92afa2b1 255 topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
c801d85f 256
257bf510 257#if wxUSE_STATLINE
92afa2b1
RR
258 // 3) static line
259 topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
257bf510 260#endif
c50f1fb9 261
92afa2b1
RR
262 // 4) buttons
263 topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
257bf510 264
dc6c62a9
RR
265 SetAutoLayout( TRUE );
266 SetSizer( topsizer );
267
92afa2b1
RR
268 topsizer->SetSizeHints( this );
269 topsizer->Fit( this );
257bf510 270
92afa2b1 271 Centre( wxBOTH );
257bf510 272
92afa2b1 273 m_listbox->SetFocus();
c801d85f 274
92afa2b1 275 wxEndBusyCursor();
c801d85f 276
d427503c 277 return TRUE;
c801d85f
KB
278}
279
ef77f91e
JS
280// Set the selection
281void wxSingleChoiceDialog::SetSelection(int sel)
282{
257bf510 283 m_listbox->SetSelection(sel);
ef77f91e
JS
284 m_selection = sel;
285}
286
c801d85f
KB
287void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
288{
257bf510
VZ
289 m_selection = m_listbox->GetSelection();
290 m_stringSelection = m_listbox->GetStringSelection();
25f47127
JS
291 // TODO!
292#ifndef __WXMOTIF__
eb553cb2
VZ
293 if ( m_listbox->HasClientUntypedData() )
294 SetClientData(m_listbox->GetClientData(m_selection));
25f47127 295#endif
d427503c 296 EndModal(wxID_OK);
c801d85f
KB
297}
298
debe6624
JS
299void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
300{
257bf510
VZ
301 m_selection = m_listbox->GetSelection();
302 m_stringSelection = m_listbox->GetStringSelection();
25f47127
JS
303
304 // TODO!
305#ifndef __WXMOTIF__
eb553cb2
VZ
306 if ( m_listbox->HasClientUntypedData() )
307 SetClientData(m_listbox->GetClientData(m_selection));
25f47127 308#endif
d427503c
VZ
309
310 EndModal(wxID_OK);
debe6624
JS
311}
312