]>
git.saurik.com Git - wxWidgets.git/blob - src/generic/choicdgg.cpp
1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Choice dialogs
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart and Markus Holzem
9 // Licence: wxWindows license
10 /////////////////////////////////////////////////////////////////////////////
13 #pragma implementation "choicdgg.h"
16 // For compilers that support precompilation, includes "wx.h".
17 #include "wx/wxprec.h"
26 #include "wx/dialog.h"
27 #include "wx/button.h"
28 #include "wx/listbox.h"
29 #include "wx/stattext.h"
34 #include "wx/statline.h"
37 #include "wx/generic/choicdgg.h"
39 #define wxID_LISTBOX 3000
41 wxString
wxGetSingleChoice( const wxString
& message
, const wxString
& caption
, int n
,
42 const wxString
*choices
, wxWindow
*parent
,
43 int WXUNUSED(x
), int WXUNUSED(y
), bool WXUNUSED(centre
),
44 int WXUNUSED(width
), int WXUNUSED(height
) )
46 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
47 if ( dialog
.ShowModal() == wxID_OK
)
48 return dialog
.GetStringSelection();
53 // Overloaded for backward compatibility
54 wxString
wxGetSingleChoice( const wxString
& message
, const wxString
& caption
, int n
,
55 char *choices
[], wxWindow
*parent
,
56 int x
, int y
, bool centre
,
57 int width
, int height
)
59 wxString
*strings
= new wxString
[n
];
61 for ( i
= 0; i
< n
; i
++)
63 strings
[i
] = choices
[i
];
65 wxString
ans(wxGetSingleChoice(message
, caption
, n
, (const wxString
*)strings
, parent
,
66 x
, y
, centre
, width
, height
));
71 int wxGetSingleChoiceIndex( const wxString
& message
, const wxString
& caption
, int n
,
72 const wxString
*choices
, wxWindow
*parent
,
73 int WXUNUSED(x
), int WXUNUSED(y
), bool WXUNUSED(centre
),
74 int WXUNUSED(width
), int WXUNUSED(height
) )
76 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
);
77 if ( dialog
.ShowModal() == wxID_OK
)
78 return dialog
.GetSelection();
83 // Overloaded for backward compatibility
84 int wxGetSingleChoiceIndex( const wxString
& message
, const wxString
& caption
, int n
,
85 wxChar
*choices
[], wxWindow
*parent
,
86 int x
, int y
, bool centre
,
87 int width
, int height
)
89 wxString
*strings
= new wxString
[n
];
90 for ( int i
= 0; i
< n
; i
++)
91 strings
[i
] = choices
[i
];
92 int ans
= wxGetSingleChoiceIndex(message
, caption
, n
, (const wxString
*)strings
, parent
,
93 x
, y
, centre
, width
, height
);
98 wxChar
*wxGetSingleChoiceData( const wxString
& message
, const wxString
& caption
, int n
,
99 const wxString
*choices
, wxChar
**client_data
, wxWindow
*parent
,
100 int WXUNUSED(x
), int WXUNUSED(y
), bool WXUNUSED(centre
),
101 int WXUNUSED(width
), int WXUNUSED(height
) )
103 wxSingleChoiceDialog
dialog(parent
, message
, caption
, n
, choices
, client_data
);
104 if ( dialog
.ShowModal() == wxID_OK
)
105 return dialog
.GetSelectionClientData();
110 // Overloaded for backward compatibility
111 wxChar
*wxGetSingleChoiceData( const wxString
& message
, const wxString
& caption
, int n
,
112 wxChar
*choices
[], wxChar
**client_data
, wxWindow
*parent
,
113 int x
, int y
, bool centre
,
114 int width
, int height
)
116 wxString
*strings
= new wxString
[n
];
118 for ( i
= 0; i
< n
; i
++)
120 strings
[i
] = choices
[i
];
122 wxChar
*data
= wxGetSingleChoiceData(message
, caption
, n
, (const wxString
*)strings
, client_data
, parent
,
123 x
, y
, centre
, width
, height
);
129 /* Multiple choice dialog contributed by Robert Cowell
132 The new data passed are in the "int nsel" and "int * selection"
134 The idea is to make a multiple selection from list of strings.
135 The returned value is the total number selected. initialily there
136 are nsel selected, with indices stored in
137 selection[0],...,selection[nsel-1] which appear highlighted to
138 begin with. On exit with value i
139 selection[0..i-1] contains the indices of the selected items.
140 (Some prior selectecions might be deselected.)
141 Thus selection must be as big as choices, in case all items are
146 int wxGetMultipleChoice(const wxString& message, const wxString& caption,
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)
156 // wxSingleChoiceDialog
158 #if !USE_SHARED_LIBRARY
159 BEGIN_EVENT_TABLE(wxSingleChoiceDialog
, wxDialog
)
160 EVT_BUTTON(wxID_OK
, wxSingleChoiceDialog::OnOK
)
161 EVT_LISTBOX_DCLICK(wxID_LISTBOX
, wxSingleChoiceDialog::OnListBoxDClick
)
164 IMPLEMENT_CLASS(wxSingleChoiceDialog
, wxDialog
)
167 #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
171 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
172 const wxString
& message
,
173 const wxString
& caption
,
175 const wxString
*choices
,
179 : wxDialog(parent
, -1, caption
, pos
, wxDefaultSize
,
180 wxCHOICEDLG_DIALOG_STYLE
)
182 Create(parent
, message
, caption
, n
, choices
, clientData
, style
);
185 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow
*parent
,
186 const wxString
& message
,
187 const wxString
& caption
,
188 const wxStringList
& choices
,
192 : wxDialog(parent
, -1, caption
, pos
, wxDefaultSize
,
193 wxCHOICEDLG_DIALOG_STYLE
)
195 Create(parent
, message
, caption
, choices
, clientData
, style
);
198 bool wxSingleChoiceDialog::Create(wxWindow
*parent
,
199 const wxString
& message
,
200 const wxString
& caption
,
201 const wxStringList
& choices
,
206 wxString
*strings
= new wxString
[choices
.Number()];
208 for ( i
= 0; i
< choices
.Number(); i
++)
210 strings
[i
] = (char *)choices
.Nth(i
)->Data();
212 bool ans
= Create(parent
, message
, caption
, choices
.Number(), strings
, clientData
, style
, pos
);
217 bool wxSingleChoiceDialog::Create( wxWindow
*WXUNUSED(parent
),
218 const wxString
& message
,
219 const wxString
& WXUNUSED(caption
),
221 const wxString
*choices
,
224 const wxPoint
& WXUNUSED(pos
) )
226 m_dialogStyle
= style
;
230 // dialog layout constants
231 static const int LAYOUT_X_MARGIN
= 5;
232 static const int LAYOUT_Y_MARGIN
= 5;
233 static const int MARGIN_BETWEEN_BUTTONS
= 3*LAYOUT_X_MARGIN
;
235 // calc the message size
236 // ---------------------
238 // TODO this should be factored out to a common function (also used in
241 dc
.SetFont(wxSystemSettings::GetSystemFont(wxSYS_DEFAULT_GUI_FONT
));
245 long height
, width
, heightTextMax
= 0, widthTextMax
= 0;
246 for ( const char *pc
= message
; ; pc
++ ) {
247 if ( *pc
== '\n' || *pc
== '\0' ) {
248 dc
.GetTextExtent(curLine
, &width
, &height
);
249 if ( width
> widthTextMax
)
250 widthTextMax
= width
;
251 if ( height
> heightTextMax
)
252 heightTextMax
= height
;
269 size_t nLineCount
= lines
.Count();
270 long hTotalMsg
= heightTextMax
*nLineCount
;
272 // calc the button size
273 // --------------------
275 bool hasCancel
= FALSE
;
277 // always create the OK button - the code below supposes we do have buttons
278 // and besides the user should have some way to close this dialog
279 wxASSERT_MSG( style
& wxOK
, _T("this dialog should have OK button") );
281 wxString
labelOk(_("OK"));
283 dc
.GetTextExtent(labelOk
, &width
, NULL
);
284 if ( width
> wButton
)
287 wxString labelCancel
;
288 if ( style
& wxCANCEL
)
290 labelCancel
= _("Cancel");
291 dc
.GetTextExtent(labelCancel
, &width
, NULL
);
292 if ( width
> wButton
)
303 long hButton
= wButton
*23/75;
304 long wTotalButtons
= wButton
;
307 wTotalButtons
*= 2; // second button
308 wTotalButtons
+= MARGIN_BETWEEN_BUTTONS
; // margin between the 2
311 // listbox and stat line
312 // ---------------------
314 // make the listbox at least as tall as the message - otherwise it looks
315 // ugly (the lower limit of 300 for the width is arbitrary OTOH)
317 // NB: we write "n + 2" because the horiz. scrollbar also takes some place
318 long hListbox
= wxMax((n
+ 2) * heightTextMax
, hTotalMsg
),
319 wListbox
= wxMax(300, wxMax(wTotalButtons
, widthTextMax
));
326 // now the complete dialog size
327 // ----------------------------
329 long hDialog
= 2*LAYOUT_Y_MARGIN
+ // top margin
330 hTotalMsg
+ // message
331 2*LAYOUT_Y_MARGIN
+ // margin between text and listbox
332 hListbox
+ // listbox
334 LAYOUT_Y_MARGIN
+ // margin
335 hStatLine
+ // separator line
337 2*LAYOUT_Y_MARGIN
+ // margin between listbox and buttons
338 hButton
+ // button(s)
339 LAYOUT_Y_MARGIN
; // bottom margin
341 long wDialog
= wxMax(wTotalButtons
, widthTextMax
) +
342 4*LAYOUT_X_MARGIN
; // 2 from each side
344 // create the controls
345 // -------------------
349 int y
= 2*LAYOUT_Y_MARGIN
;
350 for ( size_t nLine
= 0; nLine
< nLineCount
; nLine
++ )
352 text
= new wxStaticText(this, -1, lines
[nLine
],
353 wxPoint(2*LAYOUT_X_MARGIN
, y
),
354 wxSize(widthTextMax
, heightTextMax
));
358 y
+= 2*LAYOUT_X_MARGIN
;
361 m_listbox
= new wxListBox( this, wxID_LISTBOX
,
362 wxPoint(2*LAYOUT_X_MARGIN
, y
),
363 wxSize(wListbox
, hListbox
),
370 for (int i
= 0; i
< n
; i
++)
371 m_listbox
->SetClientData(i
, clientData
[i
]);
376 (void) new wxStaticLine( this, -1,
377 wxPoint(0, y
+ LAYOUT_Y_MARGIN
),
378 wxSize(wDialog
, hStatLine
) );
380 y
+= LAYOUT_Y_MARGIN
+ hStatLine
;
385 y
+= 2*LAYOUT_X_MARGIN
;
387 // NB: create [Ok] first to get the right tab order
389 wxButton
*ok
= (wxButton
*) NULL
;
390 wxButton
*cancel
= (wxButton
*) NULL
;
392 long x
= wDialog
/ 2;
394 x
-= MARGIN_BETWEEN_BUTTONS
/ 2 + wButton
;
398 ok
= new wxButton( this, wxID_OK
, labelOk
,
400 wxSize(wButton
, hButton
) );
404 x
+= MARGIN_BETWEEN_BUTTONS
+ wButton
;
405 cancel
= new wxButton( this, wxID_CANCEL
, labelCancel
,
407 wxSize(wButton
, hButton
) );
413 SetClientSize( wDialog
, hDialog
);
421 void wxSingleChoiceDialog::SetSelection(int sel
)
423 m_listbox
->SetSelection(sel
);
427 void wxSingleChoiceDialog::OnOK(wxCommandEvent
& WXUNUSED(event
))
429 m_selection
= m_listbox
->GetSelection();
430 m_stringSelection
= m_listbox
->GetStringSelection();
431 m_clientData
= m_listbox
->GetClientData(m_selection
);
436 void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent
& WXUNUSED(event
))
438 m_selection
= m_listbox
->GetSelection();
439 m_stringSelection
= m_listbox
->GetStringSelection();
440 m_clientData
= m_listbox
->GetClientData(m_selection
);