]> git.saurik.com Git - wxWidgets.git/blame - src/generic/choicdgg.cpp
bug fix for m_parent == NULL
[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"
dcf924a3
RR
31#endif
32
33#if wxUSE_STATLINE
c50f1fb9 34 #include "wx/statline.h"
c801d85f
KB
35#endif
36
37#include "wx/generic/choicdgg.h"
38
257bf510 39#define wxID_LISTBOX 3000
dcf924a3 40
c50f1fb9 41wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
debe6624 42 const wxString *choices, wxWindow *parent,
c50f1fb9 43 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
257bf510 44 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 45{
d427503c
VZ
46 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
47 if ( dialog.ShowModal() == wxID_OK )
d427503c 48 return dialog.GetStringSelection();
d427503c 49 else
dcf924a3 50 return _T("");
c801d85f
KB
51}
52
53// Overloaded for backward compatibility
c50f1fb9 54wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n,
debe6624 55 char *choices[], wxWindow *parent,
c50f1fb9 56 int x, int y, bool centre,
257bf510 57 int width, int height )
c801d85f 58{
d427503c
VZ
59 wxString *strings = new wxString[n];
60 int i;
61 for ( i = 0; i < n; i++)
62 {
63 strings[i] = choices[i];
64 }
65 wxString ans(wxGetSingleChoice(message, caption, n, (const wxString *)strings, parent,
66 x, y, centre, width, height));
67 delete[] strings;
68 return ans;
c801d85f
KB
69}
70
c50f1fb9 71int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
debe6624 72 const wxString *choices, wxWindow *parent,
c50f1fb9 73 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
d427503c 74 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 75{
d427503c
VZ
76 wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
77 if ( dialog.ShowModal() == wxID_OK )
d427503c 78 return dialog.GetSelection();
d427503c
VZ
79 else
80 return -1;
c801d85f
KB
81}
82
83// Overloaded for backward compatibility
c50f1fb9 84int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n,
87138c52 85 wxChar *choices[], wxWindow *parent,
c50f1fb9 86 int x, int y, bool centre,
d427503c 87 int width, int height )
c801d85f 88{
d427503c 89 wxString *strings = new wxString[n];
dcf924a3 90 for ( int i = 0; i < n; i++)
d427503c 91 strings[i] = choices[i];
d427503c
VZ
92 int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent,
93 x, y, centre, width, height);
94 delete[] strings;
95 return ans;
c801d85f
KB
96}
97
87138c52 98wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
d427503c 99 const wxString *choices, wxChar **client_data, wxWindow *parent,
c50f1fb9 100 int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre),
d427503c 101 int WXUNUSED(width), int WXUNUSED(height) )
c801d85f 102{
d427503c
VZ
103 wxSingleChoiceDialog dialog(parent, message, caption, n, choices, client_data);
104 if ( dialog.ShowModal() == wxID_OK )
d427503c 105 return dialog.GetSelectionClientData();
d427503c
VZ
106 else
107 return NULL;
c801d85f
KB
108}
109
110// Overloaded for backward compatibility
c50f1fb9 111wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
d427503c 112 wxChar *choices[], wxChar **client_data, wxWindow *parent,
c50f1fb9 113 int x, int y, bool centre,
d427503c 114 int width, int height )
c801d85f 115{
d427503c
VZ
116 wxString *strings = new wxString[n];
117 int i;
118 for ( i = 0; i < n; i++)
119 {
120 strings[i] = choices[i];
121 }
122 wxChar *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
123 x, y, centre, width, height);
124 delete[] strings;
125 return data;
c801d85f
KB
126}
127
128
129/* Multiple choice dialog contributed by Robert Cowell
130 *
131
132The new data passed are in the "int nsel" and "int * selection"
133
134The idea is to make a multiple selection from list of strings.
135The returned value is the total number selected. initialily there
136are nsel selected, with indices stored in
137selection[0],...,selection[nsel-1] which appear highlighted to
138begin with. On exit with value i
139selection[0..i-1] contains the indices of the selected items.
140(Some prior selectecions might be deselected.)
141Thus selection must be as big as choices, in case all items are
142selected.
143
144*/
145/*
146int wxGetMultipleChoice(const wxString& message, const wxString& caption,
d427503c
VZ
147 int n, const wxString *choices,
148 int nsel, int * selection,
149 wxWindow *parent , int x , int y, bool centre,
150 int width, int height)
c801d85f 151{
d427503c 152 return -1;
c801d85f
KB
153}
154*/
155
156// wxSingleChoiceDialog
157
158#if !USE_SHARED_LIBRARY
159BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
d427503c
VZ
160 EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
161 EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
c801d85f
KB
162END_EVENT_TABLE()
163
164IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
165#endif
166
257bf510
VZ
167#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
168 wxDIALOG_MODAL | \
169 wxTAB_TRAVERSAL)
170
171wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
172 const wxString& message,
173 const wxString& caption,
c50f1fb9 174 int n,
257bf510
VZ
175 const wxString *choices,
176 char **clientData,
177 long style,
178 const wxPoint& pos)
179 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
180 wxCHOICEDLG_DIALOG_STYLE)
c801d85f 181{
257bf510 182 Create(parent, message, caption, n, choices, clientData, style);
c801d85f
KB
183}
184
257bf510
VZ
185wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
186 const wxString& message,
187 const wxString& caption,
c50f1fb9
VZ
188 const wxStringList& choices,
189 wxChar **clientData,
190 long style,
257bf510
VZ
191 const wxPoint& pos)
192 : wxDialog(parent, -1, caption, pos, wxDefaultSize,
193 wxCHOICEDLG_DIALOG_STYLE)
c801d85f 194{
257bf510 195 Create(parent, message, caption, choices, clientData, style);
c801d85f
KB
196}
197
257bf510
VZ
198bool wxSingleChoiceDialog::Create(wxWindow *parent,
199 const wxString& message,
200 const wxString& caption,
201 const wxStringList& choices,
202 char **clientData,
203 long style,
204 const wxPoint& pos)
c801d85f 205{
d427503c
VZ
206 wxString *strings = new wxString[choices.Number()];
207 int i;
208 for ( i = 0; i < choices.Number(); i++)
209 {
210 strings[i] = (char *)choices.Nth(i)->Data();
211 }
212 bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos);
213 delete[] strings;
214 return ans;
c801d85f
KB
215}
216
257bf510 217bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent),
c50f1fb9 218 const wxString& message,
257bf510 219 const wxString& WXUNUSED(caption),
c50f1fb9 220 int n,
257bf510
VZ
221 const wxString *choices,
222 char **clientData,
223 long style,
d427503c 224 const wxPoint& WXUNUSED(pos) )
c801d85f 225{
d427503c 226 m_selection = 0;
d427503c 227 m_clientData = NULL;
c801d85f 228
257bf510
VZ
229 // calc the message size
230 // ---------------------
231
257bf510 232 wxArrayString lines;
c50f1fb9
VZ
233 wxSize sizeText = SplitTextMessage(message, &lines);
234 long heightTextMax = sizeText.GetHeight(),
235 widthTextMax = sizeText.GetWidth();
257bf510
VZ
236 size_t nLineCount = lines.Count();
237 long hTotalMsg = heightTextMax*nLineCount;
238
239 // calc the button size
240 // --------------------
241
257bf510
VZ
242 // always create the OK button - the code below supposes we do have buttons
243 // and besides the user should have some way to close this dialog
244 wxASSERT_MSG( style & wxOK, _T("this dialog should have OK button") );
245
c50f1fb9 246 bool hasCancel = (style & wxCANCEL) != 0;
257bf510 247
c50f1fb9 248 wxSize sizeButtons = GetStandardButtonSize(hasCancel);
257bf510 249
c50f1fb9
VZ
250 long wButton = sizeButtons.GetWidth(),
251 hButton = sizeButtons.GetHeight();
257bf510 252
257bf510
VZ
253 long wTotalButtons = wButton;
254 if ( hasCancel )
dcf924a3 255 {
257bf510
VZ
256 wTotalButtons *= 2; // second button
257 wTotalButtons += MARGIN_BETWEEN_BUTTONS; // margin between the 2
d427503c 258 }
c801d85f 259
257bf510
VZ
260 // listbox and stat line
261 // ---------------------
262
263 // make the listbox at least as tall as the message - otherwise it looks
264 // ugly (the lower limit of 300 for the width is arbitrary OTOH)
265 //
266 // NB: we write "n + 2" because the horiz. scrollbar also takes some place
267 long hListbox = wxMax((n + 2) * heightTextMax, hTotalMsg),
268 wListbox = wxMax(300, wxMax(wTotalButtons, widthTextMax));
269
270#if wxUSE_STATLINE
c50f1fb9 271 long hStatLine = wxStaticLine::GetDefaultSize();
257bf510
VZ
272#endif
273
274 // now the complete dialog size
275 // ----------------------------
276
277 long hDialog = 2*LAYOUT_Y_MARGIN + // top margin
278 hTotalMsg + // message
279 2*LAYOUT_Y_MARGIN + // margin between text and listbox
280 hListbox + // listbox
281#if wxUSE_STATLINE
282 LAYOUT_Y_MARGIN + // margin
283 hStatLine + // separator line
284#endif
285 2*LAYOUT_Y_MARGIN + // margin between listbox and buttons
286 hButton + // button(s)
287 LAYOUT_Y_MARGIN; // bottom margin
288
abe2606b 289 long wDialog = wxMax(wListbox, wxMax(wTotalButtons, widthTextMax)) +
257bf510
VZ
290 4*LAYOUT_X_MARGIN; // 2 from each side
291
292 // create the controls
293 // -------------------
294
295 // message
296 wxStaticText *text;
297 int y = 2*LAYOUT_Y_MARGIN;
298 for ( size_t nLine = 0; nLine < nLineCount; nLine++ )
dcf924a3 299 {
257bf510
VZ
300 text = new wxStaticText(this, -1, lines[nLine],
301 wxPoint(2*LAYOUT_X_MARGIN, y),
302 wxSize(widthTextMax, heightTextMax));
303 y += heightTextMax;
d427503c 304 }
c801d85f 305
257bf510
VZ
306 y += 2*LAYOUT_X_MARGIN;
307
308 // listbox
309 m_listbox = new wxListBox( this, wxID_LISTBOX,
310 wxPoint(2*LAYOUT_X_MARGIN, y),
c50f1fb9 311 wxSize(wListbox, hListbox),
257bf510
VZ
312 n, choices,
313 wxLB_HSCROLL);
314 y += hListbox;
315
316 if ( clientData )
d427503c 317 {
257bf510
VZ
318 for (int i = 0; i < n; i++)
319 m_listbox->SetClientData(i, clientData[i]);
d427503c 320 }
c801d85f 321
257bf510
VZ
322 // separator line
323#if wxUSE_STATLINE
324 (void) new wxStaticLine( this, -1,
c50f1fb9
VZ
325 wxPoint(2*LAYOUT_X_MARGIN, y + LAYOUT_Y_MARGIN),
326 wxSize(wDialog - 4*LAYOUT_X_MARGIN, hStatLine) );
257bf510
VZ
327
328 y += LAYOUT_Y_MARGIN + hStatLine;
329#endif
c50f1fb9 330
257bf510
VZ
331 // buttons
332
333 y += 2*LAYOUT_X_MARGIN;
334
c50f1fb9 335 CreateStandardButtons(wDialog, y, wButton, hButton, hasCancel);
257bf510
VZ
336
337 SetClientSize( wDialog, hDialog );
c801d85f 338
257bf510 339 Centre( wxBOTH );
c801d85f 340
d427503c 341 return TRUE;
c801d85f
KB
342}
343
ef77f91e
JS
344// Set the selection
345void wxSingleChoiceDialog::SetSelection(int sel)
346{
257bf510 347 m_listbox->SetSelection(sel);
ef77f91e
JS
348 m_selection = sel;
349}
350
c801d85f
KB
351void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
352{
257bf510
VZ
353 m_selection = m_listbox->GetSelection();
354 m_stringSelection = m_listbox->GetStringSelection();
355 m_clientData = m_listbox->GetClientData(m_selection);
d427503c
VZ
356
357 EndModal(wxID_OK);
c801d85f
KB
358}
359
debe6624
JS
360void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
361{
257bf510
VZ
362 m_selection = m_listbox->GetSelection();
363 m_stringSelection = m_listbox->GetStringSelection();
364 m_clientData = m_listbox->GetClientData(m_selection);
d427503c
VZ
365
366 EndModal(wxID_OK);
debe6624
JS
367}
368