1/////////////////////////////////////////////////////////////////////////////
2// Name:        wx/generic/choicdgg.h
3// Purpose:     Generic choice dialogs
4// Author:      Julian Smart
5// Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions
6// Created:     01/02/97
7// RCS-ID:      $Id: choicdgg.h 49563 2007-10-31 20:46:21Z VZ $
8// Copyright:   (c) wxWidgets team
9// Licence:     wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifndef _WX_GENERIC_CHOICDGG_H_
13#define _WX_GENERIC_CHOICDGG_H_
14
15#include "wx/dynarray.h"
16#include "wx/dialog.h"
17
18class WXDLLIMPEXP_FWD_CORE wxListBoxBase;
19
20// ----------------------------------------------------------------------------
21// some (ugly...) constants
22// ----------------------------------------------------------------------------
23
24#define wxCHOICE_HEIGHT 150
25#define wxCHOICE_WIDTH 200
26
27#ifdef __WXWINCE__
28#define wxCHOICEDLG_STYLE \
29    (wxDEFAULT_DIALOG_STYLE | wxOK | wxCANCEL | wxCENTRE)
30#else
31#define wxCHOICEDLG_STYLE \
32    (wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxOK | wxCANCEL | wxCENTRE)
33#endif
34
35// ----------------------------------------------------------------------------
36// wxAnyChoiceDialog: a base class for dialogs containing a listbox
37// ----------------------------------------------------------------------------
38
39class WXDLLEXPORT wxAnyChoiceDialog : public wxDialog
40{
41public:
42    wxAnyChoiceDialog() { }
43
44    wxAnyChoiceDialog(wxWindow *parent,
45                      const wxString& message,
46                      const wxString& caption,
47                      int n, const wxString *choices,
48                      long styleDlg = wxCHOICEDLG_STYLE,
49                      const wxPoint& pos = wxDefaultPosition,
50                      long styleLbox = wxLB_ALWAYS_SB)
51    {
52        (void)Create(parent, message, caption, n, choices,
53                     styleDlg, pos, styleLbox);
54    }
55    wxAnyChoiceDialog(wxWindow *parent,
56                      const wxString& message,
57                      const wxString& caption,
58                      const wxArrayString& choices,
59                      long styleDlg = wxCHOICEDLG_STYLE,
60                      const wxPoint& pos = wxDefaultPosition,
61                      long styleLbox = wxLB_ALWAYS_SB)
62    {
63        (void)Create(parent, message, caption, choices,
64                     styleDlg, pos, styleLbox);
65    }
66
67    bool Create(wxWindow *parent,
68                const wxString& message,
69                const wxString& caption,
70                int n, const wxString *choices,
71                long styleDlg = wxCHOICEDLG_STYLE,
72                const wxPoint& pos = wxDefaultPosition,
73                long styleLbox = wxLB_ALWAYS_SB);
74    bool Create(wxWindow *parent,
75                const wxString& message,
76                const wxString& caption,
77                const wxArrayString& choices,
78                long styleDlg = wxCHOICEDLG_STYLE,
79                const wxPoint& pos = wxDefaultPosition,
80                long styleLbox = wxLB_ALWAYS_SB);
81
82protected:
83    wxListBoxBase *m_listbox;
84
85    virtual wxListBoxBase *CreateList(int n,
86                                      const wxString *choices,
87                                      long styleLbox);
88
89    DECLARE_NO_COPY_CLASS(wxAnyChoiceDialog)
90};
91
92// ----------------------------------------------------------------------------
93// wxSingleChoiceDialog: a dialog with single selection listbox
94// ----------------------------------------------------------------------------
95
96class WXDLLEXPORT wxSingleChoiceDialog : public wxAnyChoiceDialog
97{
98public:
99    wxSingleChoiceDialog()
100    {
101        m_selection = -1;
102    }
103
104    wxSingleChoiceDialog(wxWindow *parent,
105                         const wxString& message,
106                         const wxString& caption,
107                         int n,
108                         const wxString *choices,
109                         char **clientData = (char **)NULL,
110                         long style = wxCHOICEDLG_STYLE,
111                         const wxPoint& pos = wxDefaultPosition);
112    wxSingleChoiceDialog(wxWindow *parent,
113                         const wxString& message,
114                         const wxString& caption,
115                         const wxArrayString& choices,
116                         char **clientData = (char **)NULL,
117                         long style = wxCHOICEDLG_STYLE,
118                         const wxPoint& pos = wxDefaultPosition);
119
120    bool Create(wxWindow *parent,
121                const wxString& message,
122                const wxString& caption,
123                int n,
124                const wxString *choices,
125                char **clientData = (char **)NULL,
126                long style = wxCHOICEDLG_STYLE,
127                const wxPoint& pos = wxDefaultPosition);
128    bool Create(wxWindow *parent,
129                const wxString& message,
130                const wxString& caption,
131                const wxArrayString& choices,
132                char **clientData = (char **)NULL,
133                long style = wxCHOICEDLG_STYLE,
134                const wxPoint& pos = wxDefaultPosition);
135
136    void SetSelection(int sel);
137    int GetSelection() const { return m_selection; }
138    wxString GetStringSelection() const { return m_stringSelection; }
139
140    // obsolete function (NB: no need to make it return wxChar, it's untyped)
141    char *GetSelectionClientData() const { return (char *)m_clientData; }
142
143    // implementation from now on
144    void OnOK(wxCommandEvent& event);
145#ifndef __SMARTPHONE__
146    void OnListBoxDClick(wxCommandEvent& event);
147#endif
148#ifdef __WXWINCE__
149    void OnJoystickButtonDown(wxJoystickEvent& event);
150#endif
151
152protected:
153    int         m_selection;
154    wxString    m_stringSelection;
155
156    void DoChoice();
157
158private:
159    DECLARE_DYNAMIC_CLASS_NO_COPY(wxSingleChoiceDialog)
160    DECLARE_EVENT_TABLE()
161};
162
163// ----------------------------------------------------------------------------
164// wxMultiChoiceDialog: a dialog with multi selection listbox
165// ----------------------------------------------------------------------------
166
167class WXDLLEXPORT wxMultiChoiceDialog : public wxAnyChoiceDialog
168{
169public:
170    wxMultiChoiceDialog() { }
171
172    wxMultiChoiceDialog(wxWindow *parent,
173                        const wxString& message,
174                        const wxString& caption,
175                        int n,
176                        const wxString *choices,
177                        long style = wxCHOICEDLG_STYLE,
178                        const wxPoint& pos = wxDefaultPosition)
179    {
180        (void)Create(parent, message, caption, n, choices, style, pos);
181    }
182    wxMultiChoiceDialog(wxWindow *parent,
183                        const wxString& message,
184                        const wxString& caption,
185                        const wxArrayString& choices,
186                        long style = wxCHOICEDLG_STYLE,
187                        const wxPoint& pos = wxDefaultPosition)
188    {
189        (void)Create(parent, message, caption, choices, style, pos);
190    }
191
192    bool Create(wxWindow *parent,
193                const wxString& message,
194                const wxString& caption,
195                int n,
196                const wxString *choices,
197                long style = wxCHOICEDLG_STYLE,
198                const wxPoint& pos = wxDefaultPosition);
199    bool Create(wxWindow *parent,
200                const wxString& message,
201                const wxString& caption,
202                const wxArrayString& choices,
203                long style = wxCHOICEDLG_STYLE,
204                const wxPoint& pos = wxDefaultPosition);
205
206    void SetSelections(const wxArrayInt& selections);
207    wxArrayInt GetSelections() const { return m_selections; }
208
209    // implementation from now on
210    virtual bool TransferDataFromWindow();
211
212protected:
213#if wxUSE_CHECKLISTBOX
214    virtual wxListBoxBase *CreateList(int n,
215                                      const wxString *choices,
216                                      long styleLbox);
217#endif // wxUSE_CHECKLISTBOX
218
219    wxArrayInt m_selections;
220
221private:
222    DECLARE_DYNAMIC_CLASS_NO_COPY(wxMultiChoiceDialog)
223};
224
225// ----------------------------------------------------------------------------
226// wrapper functions which can be used to get selection(s) from the user
227// ----------------------------------------------------------------------------
228
229// get the user selection as a string
230WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message,
231                                       const wxString& caption,
232                                       const wxArrayString& choices,
233                                       wxWindow *parent = NULL,
234                                       int x = wxDefaultCoord,
235                                       int y = wxDefaultCoord,
236                                       bool centre = true,
237                                       int width = wxCHOICE_WIDTH,
238                                       int height = wxCHOICE_HEIGHT);
239
240WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message,
241                                       const wxString& caption,
242                                       int n, const wxString *choices,
243                                       wxWindow *parent = NULL,
244                                       int x = wxDefaultCoord,
245                                       int y = wxDefaultCoord,
246                                       bool centre = true,
247                                       int width = wxCHOICE_WIDTH,
248                                       int height = wxCHOICE_HEIGHT);
249
250// Same as above but gets position in list of strings, instead of string,
251// or -1 if no selection
252WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message,
253                                       const wxString& caption,
254                                       const wxArrayString& choices,
255                                       wxWindow *parent = NULL,
256                                       int x = wxDefaultCoord,
257                                       int y = wxDefaultCoord,
258                                       bool centre = true,
259                                       int width = wxCHOICE_WIDTH,
260                                       int height = wxCHOICE_HEIGHT);
261
262WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message,
263                                       const wxString& caption,
264                                       int n, const wxString *choices,
265                                       wxWindow *parent = NULL,
266                                       int x = wxDefaultCoord,
267                                       int y = wxDefaultCoord,
268                                       bool centre = true,
269                                       int width = wxCHOICE_WIDTH,
270                                       int height = wxCHOICE_HEIGHT);
271
272// Return client data instead or NULL if cancelled
273WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message,
274                                        const wxString& caption,
275                                        const wxArrayString& choices,
276                                        void **client_data,
277                                        wxWindow *parent = NULL,
278                                        int x = wxDefaultCoord,
279                                        int y = wxDefaultCoord,
280                                        bool centre = true,
281                                        int width = wxCHOICE_WIDTH,
282                                        int height = wxCHOICE_HEIGHT);
283
284WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message,
285                                        const wxString& caption,
286                                        int n, const wxString *choices,
287                                        void **client_data,
288                                        wxWindow *parent = NULL,
289                                        int x = wxDefaultCoord,
290                                        int y = wxDefaultCoord,
291                                        bool centre = true,
292                                        int width = wxCHOICE_WIDTH,
293                                        int height = wxCHOICE_HEIGHT);
294
295// fill the array with the indices of the chosen items, it will be empty
296// if no items were selected or Cancel was pressed - return the number of
297// selections
298WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections,
299                                        const wxString& message,
300                                        const wxString& caption,
301                                        int n, const wxString *choices,
302                                        wxWindow *parent = NULL,
303                                        int x = wxDefaultCoord,
304                                        int y = wxDefaultCoord,
305                                        bool centre = true,
306                                        int width = wxCHOICE_WIDTH,
307                                        int height = wxCHOICE_HEIGHT);
308
309WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections,
310                                        const wxString& message,
311                                        const wxString& caption,
312                                        const wxArrayString& choices,
313                                        wxWindow *parent = NULL,
314                                        int x = wxDefaultCoord,
315                                        int y = wxDefaultCoord,
316                                        bool centre = true,
317                                        int width = wxCHOICE_WIDTH,
318                                        int height = wxCHOICE_HEIGHT);
319
320#endif // _WX_GENERIC_CHOICDGG_H_
321