added wxGetMultiChoice() (which refuses to work for some reason - will fix

a.s.a.p.)


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@8676 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2000-11-03 20:52:17 +00:00
parent 53ccf1c0ba
commit d6c9c1b71e
7 changed files with 689 additions and 182 deletions

View File

@@ -630,6 +630,45 @@ is valid) if the dialog was cancelled.
<wx/colordlg.h> <wx/colordlg.h>
\membersection{::wxGetMultipleChoices}\label{wxgetmultiplechoices}
\func{size\_t}{wxGetMultipleChoices}{\\
\param{wxArrayInt\& }{selections},\\
\param{const wxString\& }{message},\\
\param{const wxString\& }{caption},\\
\param{const wxArrayString\& }{aChoices},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE},\\
\param{int }{width=150}, \param{int }{height=200}}
\func{size\_t}{wxGetMultipleChoices}{\\
\param{wxArrayInt\& }{selections},\\
\param{const wxString\& }{message},\\
\param{const wxString\& }{caption},\\
\param{int}{ n}, \param{const wxString\& }{choices[]},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE},\\
\param{int }{width=150}, \param{int }{height=200}}
Pops up a dialog box containing a message, OK/Cancel buttons and a
multiple-selection listbox. The user may choose an arbitrary (including 0)
number of items in the listbox whose indices will be returned in
{\it selection} array. The initial contents of this array will be used to
select the items when the dialog is shown.
You may pass the list of strings to choose from either using {\it choices}
which is an array of {\it n} strings for the listbox or by using a single
{\it aChoices} parameter of type \helpref{wxArrayString}{wxarraystring}.
If {\it centre} is TRUE, the message text (which may include new line
characters) is centred; if FALSE, the message is left-justified.
\wxheading{Include files}
<wx/choicdlg.h>
\membersection{::wxGetNumberFromUser}\label{wxgetnumberfromuser} \membersection{::wxGetNumberFromUser}\label{wxgetnumberfromuser}
\func{long}{wxGetNumberFromUser}{ \func{long}{wxGetNumberFromUser}{
@@ -715,18 +754,34 @@ is centred; if FALSE, the message is left-justified.
\membersection{::wxGetSingleChoice}\label{wxgetsinglechoice} \membersection{::wxGetSingleChoice}\label{wxgetsinglechoice}
\func{wxString}{wxGetSingleChoice}{\param{const wxString\& }{message}, \param{const wxString\& }{caption}, \param{int}{ n}, \param{const wxString\& }{choices[]},\\ \func{wxString}{wxGetSingleChoice}{\param{const wxString\& }{message},\\
\param{wxWindow *}{parent = NULL}, \param{int}{ x = -1}, \param{int}{ y = -1},\\ \param{const wxString\& }{caption},\\
\param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}} \param{const wxArrayString\& }{aChoices},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE},\\
\param{int }{width=150}, \param{int }{height=200}}
Pops up a dialog box containing a message, OK/Cancel buttons and a single-selection \func{wxString}{wxGetSingleChoice}{\param{const wxString\& }{message},\\
listbox. The user may choose an item and press OK to return a string or \param{const wxString\& }{caption},\\
Cancel to return the empty string. \param{int}{ n}, \param{const wxString\& }{choices[]},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE},\\
\param{int }{width=150}, \param{int }{height=200}}
{\it choices} is an array of {\it n} strings for the listbox. Pops up a dialog box containing a message, OK/Cancel buttons and a
single-selection listbox. The user may choose an item and press OK to return a
string or Cancel to return the empty string. Use
\helpref{wxGetSingleChoiceIndex}{wxgetsinglechoiceindex} if empty string is a
valid choice and if you want to be able to detect pressing Cancel reliably.
If {\it centre} is TRUE, the message text (which may include new line characters) You may pass the list of strings to choose from either using {\it choices}
is centred; if FALSE, the message is left-justified. which is an array of {\it n} strings for the listbox or by using a single
{\it aChoices} parameter of type \helpref{wxArrayString}{wxarraystring}.
If {\it centre} is TRUE, the message text (which may include new line
characters) is centred; if FALSE, the message is left-justified.
\wxheading{Include files} \wxheading{Include files}
@@ -734,12 +789,20 @@ is centred; if FALSE, the message is left-justified.
\membersection{::wxGetSingleChoiceIndex}\label{wxgetsinglechoiceindex} \membersection{::wxGetSingleChoiceIndex}\label{wxgetsinglechoiceindex}
\func{int}{wxGetSingleChoiceIndex}{\param{const wxString\& }{message}, \param{const wxString\& }{caption}, \param{int}{ n}, \param{const wxString\& }{choices[]},\\ \func{int}{wxGetSingleChoiceIndex}{\param{const wxString\& }{message},\\
\param{const wxString\& }{caption},\\
\param{const wxArrayString\& }{aChoices},\\
\param{wxWindow *}{parent = NULL}, \param{int}{ x = -1}, \param{int}{ y = -1},\\ \param{wxWindow *}{parent = NULL}, \param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}} \param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}}
As {\bf wxGetSingleChoice} but returns the index representing the selected string. \func{int}{wxGetSingleChoiceIndex}{\param{const wxString\& }{message},\\
If the user pressed cancel, -1 is returned. \param{const wxString\& }{caption},\\
\param{int}{ n}, \param{const wxString\& }{choices[]},\\
\param{wxWindow *}{parent = NULL}, \param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}}
As {\bf wxGetSingleChoice} but returns the index representing the selected
string. If the user pressed cancel, -1 is returned.
\wxheading{Include files} \wxheading{Include files}
@@ -747,12 +810,26 @@ If the user pressed cancel, -1 is returned.
\membersection{::wxGetSingleChoiceData}\label{wxgetsinglechoicedata} \membersection{::wxGetSingleChoiceData}\label{wxgetsinglechoicedata}
\func{wxString}{wxGetSingleChoiceData}{\param{const wxString\& }{message}, \param{const wxString\& }{caption}, \param{int}{ n}, \param{const wxString\& }{choices[]},\\ \func{wxString}{wxGetSingleChoiceData}{\param{const wxString\& }{message},\\
\param{const wxString\& }{client\_data[]}, \param{wxWindow *}{parent = NULL}, \param{int}{ x = -1},\\ \param{const wxString\& }{caption},\\
\param{int}{ y = -1}, \param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}} \param{const wxArrayString\& }{aChoices},\\
\param{const wxString\& }{client\_data[]},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}}
\func{wxString}{wxGetSingleChoiceData}{\param{const wxString\& }{message},\\
\param{const wxString\& }{caption},\\
\param{int}{ n}, \param{const wxString\& }{choices[]},\\
\param{const wxString\& }{client\_data[]},\\
\param{wxWindow *}{parent = NULL},\\
\param{int}{ x = -1}, \param{int}{ y = -1},\\
\param{bool}{ centre = TRUE}, \param{int }{width=150}, \param{int }{height=200}}
As {\bf wxGetSingleChoice} but takes an array of client data pointers As {\bf wxGetSingleChoice} but takes an array of client data pointers
corresponding to the strings, and returns one of these pointers. corresponding to the strings, and returns one of these pointers or NULL if
Cancel was pressed. The {\it client\_data} array must have the same number of
elements as {\it choices} or {\it aChoices}!
\wxheading{Include files} \wxheading{Include files}

View File

@@ -1,11 +1,11 @@
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Name: choicdgg.h // Name: wx/generic/choicdgg.h
// Purpose: Generic choice dialogs // Purpose: Generic choice dialogs
// Author: Julian Smart // Author: Julian Smart
// Modified by: // Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions
// Created: 01/02/97 // Created: 01/02/97
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) // Copyright: (c) wxWindows team
// Licence: wxWindows licence // Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
@@ -16,38 +16,66 @@
#pragma interface "choicdgg.h" #pragma interface "choicdgg.h"
#endif #endif
#include "wx/dynarray.h"
#include "wx/dialog.h" #include "wx/dialog.h"
class WXDLLEXPORT wxListBox; class WXDLLEXPORT wxListBox;
// ----------------------------------------------------------------------------
// some (ugly...) constants
// ----------------------------------------------------------------------------
#define wxCHOICE_HEIGHT 150 #define wxCHOICE_HEIGHT 150
#define wxCHOICE_WIDTH 200 #define wxCHOICE_WIDTH 200
#define wxCHOICEDLG_STYLE (wxDEFAULT_DIALOG_STYLE|wxOK | wxCANCEL | wxCENTRE) #define wxCHOICEDLG_STYLE (wxDEFAULT_DIALOG_STYLE|wxOK | wxCANCEL | wxCENTRE)
class WXDLLEXPORT wxSingleChoiceDialog: public wxDialog // ----------------------------------------------------------------------------
// wxAnyChoiceDialog: a base class for dialogs containing a listbox
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxAnyChoiceDialog : public wxDialog
{ {
DECLARE_DYNAMIC_CLASS(wxSingleChoiceDialog)
public: public:
wxSingleChoiceDialog(wxWindow *parent, wxAnyChoiceDialog() { }
const wxString& message,
const wxString& caption,
int n,
const wxString *choices,
char **clientData = (char **)NULL,
long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition);
wxSingleChoiceDialog(wxWindow *parent, wxAnyChoiceDialog(wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& caption, const wxString& caption,
const wxStringList& choices, int n, const wxString *choices,
char **clientData = (char **)NULL, long styleDlg = wxCHOICEDLG_STYLE,
long style = wxCHOICEDLG_STYLE, const wxPoint& pos = wxDefaultPosition,
const wxPoint& pos = wxDefaultPosition); long styleLbox = wxLB_ALWAYS_SB)
{
(void)Create(parent, message, caption, n, choices,
styleDlg, pos, styleLbox);
}
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
const wxString& message,
const wxString& caption,
int n, const wxString *choices,
long styleDlg = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition,
long styleLbox = wxLB_ALWAYS_SB);
protected:
wxListBox *m_listbox;
};
// ----------------------------------------------------------------------------
// wxSingleChoiceDialog: a dialog with single selection listbox
// ----------------------------------------------------------------------------
class WXDLLEXPORT wxSingleChoiceDialog : public wxAnyChoiceDialog
{
public:
wxSingleChoiceDialog()
{
m_selection = -1;
}
wxSingleChoiceDialog(wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& caption, const wxString& caption,
int n, int n,
@@ -59,7 +87,8 @@ public:
bool Create(wxWindow *parent, bool Create(wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& caption, const wxString& caption,
const wxStringList& choices, int n,
const wxString *choices,
char **clientData = (char **)NULL, char **clientData = (char **)NULL,
long style = wxCHOICEDLG_STYLE, long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition); const wxPoint& pos = wxDefaultPosition);
@@ -75,57 +104,204 @@ public:
void OnOK(wxCommandEvent& event); void OnOK(wxCommandEvent& event);
void OnListBoxDClick(wxCommandEvent& event); void OnListBoxDClick(wxCommandEvent& event);
// old, deprecated methods
#ifdef WXWIN_COMPATIBILITY_2
wxSingleChoiceDialog(wxWindow *parent,
const wxString& message,
const wxString& caption,
const wxStringList& choices,
char **clientData = (char **)NULL,
long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition);
bool Create(wxWindow *parent,
const wxString& message,
const wxString& caption,
const wxStringList& choices,
char **clientData = (char **)NULL,
long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition);
#endif // WXWIN_COMPATIBILITY_2
protected: protected:
int m_selection; int m_selection;
long m_dialogStyle;
wxString m_stringSelection; wxString m_stringSelection;
wxListBox *m_listbox;
private: private:
DECLARE_DYNAMIC_CLASS(wxSingleChoiceDialog)
DECLARE_EVENT_TABLE() DECLARE_EVENT_TABLE()
}; };
WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message, const wxString& caption, // ----------------------------------------------------------------------------
int n, const wxString *choices, wxWindow *parent = (wxWindow *) NULL, // wxMultiChoiceDialog: a dialog with multi selection listbox
int x = -1, int y = -1, bool centre = TRUE, // ----------------------------------------------------------------------------
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT);
WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message, const wxString& caption, class WXDLLEXPORT wxMultiChoiceDialog : public wxAnyChoiceDialog
int n, wxChar *choices[], wxWindow *parent = (wxWindow *) NULL, {
int x = -1, int y = -1, bool centre = TRUE, public:
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT); wxMultiChoiceDialog() { }
wxMultiChoiceDialog(wxWindow *parent,
const wxString& message,
const wxString& caption,
int n,
const wxString *choices,
long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition)
{
(void)Create(parent, message, caption, n, choices, style, pos);
}
bool Create(wxWindow *parent,
const wxString& message,
const wxString& caption,
int n,
const wxString *choices,
long style = wxCHOICEDLG_STYLE,
const wxPoint& pos = wxDefaultPosition);
void SetSelections(const wxArrayInt& selections);
wxArrayInt GetSelections() const { return m_selections; }
// implementation from now on
void OnOK(wxCommandEvent& event);
protected:
wxArrayInt m_selections;
private:
DECLARE_DYNAMIC_CLASS(wxMultiChoiceDialog)
DECLARE_EVENT_TABLE()
};
// ----------------------------------------------------------------------------
// wrapper functions which can be used to get selection(s) from the user
// ----------------------------------------------------------------------------
// get the user selection as a string
WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message,
const wxString& caption,
const wxArrayString& choices,
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message,
const wxString& caption,
int n, const wxString *choices,
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
// Same as above but gets position in list of strings, instead of string, // Same as above but gets position in list of strings, instead of string,
// or -1 if no selection // or -1 if no selection
WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message, const wxString& caption, WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message,
int n, const wxString *choices, wxWindow *parent = (wxWindow *) NULL, const wxString& caption,
int x = -1, int y = -1, bool centre = TRUE, const wxArrayString& choices,
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT); wxWindow *parent = (wxWindow *) NULL,
int x = -1,
WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message, const wxString& caption, int y = -1,
int n, wxChar *choices[], wxWindow *parent = (wxWindow *) NULL,
int x = -1, int y = -1, bool centre = TRUE,
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT);
// Return client data instead
WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message, const wxString& caption,
int n, const wxString *choices, void **client_data,
wxWindow *parent = (wxWindow *) NULL, int x = -1, int y = -1,
bool centre = TRUE, bool centre = TRUE,
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT); int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message, const wxString& caption, WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message,
int n, wxChar *choices[], void **client_data, const wxString& caption,
wxWindow *parent = (wxWindow *) NULL, int x = -1, int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT);
/*
WXDLLEXPORT int wxGetMultipleChoice(const wxString& message, const wxString& caption,
int n, const wxString *choices, int n, const wxString *choices,
int nsel, int * selection, wxWindow *parent = (wxWindow *) NULL,
wxWindow *parent = NULL, int x = -1 , int y = -1, bool centre = TRUE, int x = -1,
int width = wxCHOICE_WIDTH, int height = wxCHOICE_HEIGHT); int y = -1,
*/ bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
// Return client data instead or NULL if cancelled
WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message,
const wxString& caption,
const wxArrayString& choices,
void **client_data,
wxWindow *parent = (wxWindow *) NULL,
int x = -1, int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message,
const wxString& caption,
int n, const wxString *choices,
void **client_data,
wxWindow *parent = (wxWindow *) NULL,
int x = -1, int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
// fill the array with the indices of the chosen items, it will be empty
// if no items were selected or Cancel was pressed - return the number of
// selections
WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections,
const wxString& message,
const wxString& caption,
int n, const wxString *choices,
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT size_t wxGetMultipleChoices(wxArrayInt& selections,
const wxString& message,
const wxString& caption,
const wxArrayString& choices,
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
// ----------------------------------------------------------------------------
// these methods are for backwards compatibility only, not documented and
// deprecated
// ----------------------------------------------------------------------------
WXDLLEXPORT wxString wxGetSingleChoice(const wxString& message,
const wxString& caption,
int n, wxChar *choices[],
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT int wxGetSingleChoiceIndex(const wxString& message,
const wxString& caption,
int n, wxChar *choices[],
wxWindow *parent = (wxWindow *) NULL,
int x = -1,
int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
WXDLLEXPORT void* wxGetSingleChoiceData(const wxString& message,
const wxString& caption,
int n, wxChar **choices,
void **client_data,
wxWindow *parent = (wxWindow *) NULL,
int x = -1, int y = -1,
bool centre = TRUE,
int width = wxCHOICE_WIDTH,
int height = wxCHOICE_HEIGHT);
#endif // __CHOICEDLGH_G__
#endif

View File

@@ -35,7 +35,7 @@
// what to test (in alphabetic order)? // what to test (in alphabetic order)?
//#define TEST_ARRAYS #define TEST_ARRAYS
//#define TEST_CMDLINE //#define TEST_CMDLINE
//#define TEST_DATETIME //#define TEST_DATETIME
//#define TEST_DIR //#define TEST_DIR
@@ -3117,11 +3117,57 @@ static void PrintArray(const char* name, const wxArrayString& array)
} }
} }
static int StringLenCompare(const wxString& first, const wxString& second) static void PrintArray(const char* name, const wxArrayInt& array)
{
printf("Dump of the array '%s'\n", name);
size_t nCount = array.GetCount();
for ( size_t n = 0; n < nCount; n++ )
{
printf("\t%s[%u] = %d\n", name, n, array[n]);
}
}
int wxCMPFUNC_CONV StringLenCompare(const wxString& first,
const wxString& second)
{ {
return first.length() - second.length(); return first.length() - second.length();
} }
int wxCMPFUNC_CONV IntCompare(int *first,
int *second)
{
return *first - *second;
}
int wxCMPFUNC_CONV IntRevCompare(int *first,
int *second)
{
return *second - *first;
}
static void TestArrayOfInts()
{
puts("*** Testing wxArrayInt ***\n");
wxArrayInt a;
a.Add(1);
a.Add(17);
a.Add(5);
a.Add(3);
puts("Initially:");
PrintArray("a", a);
puts("After sort:");
a.Sort(IntCompare);
PrintArray("a", a);
puts("After reverse sort:");
a.Sort(IntRevCompare);
PrintArray("a", a);
}
#include "wx/dynarray.h" #include "wx/dynarray.h"
WX_DECLARE_OBJARRAY(Bar, ArrayBars); WX_DECLARE_OBJARRAY(Bar, ArrayBars);
@@ -3581,6 +3627,8 @@ int main(int argc, char **argv)
#endif // TEST_STRINGS #endif // TEST_STRINGS
#ifdef TEST_ARRAYS #ifdef TEST_ARRAYS
if ( 0 )
{
wxArrayString a1; wxArrayString a1;
a1.Add("tiger"); a1.Add("tiger");
a1.Add("cat"); a1.Add("cat");
@@ -3624,6 +3672,8 @@ int main(int argc, char **argv)
PrintArray("a1", a1); PrintArray("a1", a1);
TestArrayOfObjects(); TestArrayOfObjects();
}
TestArrayOfInts();
#endif // TEST_ARRAYS #endif // TEST_ARRAYS
#ifdef TEST_DIR #ifdef TEST_DIR

View File

@@ -60,6 +60,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(DIALOGS_PASSWORD_ENTRY, MyFrame::PasswordEntry) EVT_MENU(DIALOGS_PASSWORD_ENTRY, MyFrame::PasswordEntry)
EVT_MENU(DIALOGS_NUM_ENTRY, MyFrame::NumericEntry) EVT_MENU(DIALOGS_NUM_ENTRY, MyFrame::NumericEntry)
EVT_MENU(DIALOGS_SINGLE_CHOICE, MyFrame::SingleChoice) EVT_MENU(DIALOGS_SINGLE_CHOICE, MyFrame::SingleChoice)
EVT_MENU(DIALOGS_MULTI_CHOICE, MyFrame::MultiChoice)
EVT_MENU(DIALOGS_FILE_OPEN, MyFrame::FileOpen) EVT_MENU(DIALOGS_FILE_OPEN, MyFrame::FileOpen)
EVT_MENU(DIALOGS_FILE_OPEN2, MyFrame::FileOpen2) EVT_MENU(DIALOGS_FILE_OPEN2, MyFrame::FileOpen2)
EVT_MENU(DIALOGS_FILES_OPEN, MyFrame::FilesOpen) EVT_MENU(DIALOGS_FILES_OPEN, MyFrame::FilesOpen)
@@ -127,6 +128,7 @@ bool MyApp::OnInit()
file_menu->Append(DIALOGS_PASSWORD_ENTRY, "&Password entry\tCtrl-P"); file_menu->Append(DIALOGS_PASSWORD_ENTRY, "&Password entry\tCtrl-P");
file_menu->Append(DIALOGS_NUM_ENTRY, "&Numeric entry\tCtrl-N"); file_menu->Append(DIALOGS_NUM_ENTRY, "&Numeric entry\tCtrl-N");
file_menu->Append(DIALOGS_SINGLE_CHOICE, "&Single choice\tCtrl-C"); file_menu->Append(DIALOGS_SINGLE_CHOICE, "&Single choice\tCtrl-C");
file_menu->Append(DIALOGS_MULTI_CHOICE, "M&ultiple choice\tCtrl-U");
file_menu->AppendSeparator(); file_menu->AppendSeparator();
file_menu->Append(DIALOGS_TIP, "&Tip of the day\tCtrl-T"); file_menu->Append(DIALOGS_TIP, "&Tip of the day\tCtrl-T");
file_menu->AppendSeparator(); file_menu->AppendSeparator();
@@ -349,6 +351,30 @@ void MyFrame::SingleChoice(wxCommandEvent& WXUNUSED(event) )
} }
} }
void MyFrame::MultiChoice(wxCommandEvent& WXUNUSED(event) )
{
const wxString choices[] = { "One", "Two", "Three", "Four", "Five" } ;
int n = 5;
wxArrayInt selections;
size_t count = wxGetMultipleChoices(selections,
"This is a small sample\n"
"A multi-choice convenience dialog",
"Please select a value",
n, (const wxString *)choices,
this);
if ( count )
{
wxLogMessage("You selected %u items:", count);
for ( size_t n = 0; n < count; n++ )
{
wxLogMessage("\t%u: %u (%s)", n, selections[n],
choices[selections[n]].c_str());
}
}
//else: cancelled or nothing selected
}
void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) ) void MyFrame::FileOpen(wxCommandEvent& WXUNUSED(event) )
{ {
wxFileDialog dialog(this, "Testing open file dialog", "", "", "*.txt", 0); wxFileDialog dialog(this, "Testing open file dialog", "", "", "*.txt", 0);

View File

@@ -61,6 +61,7 @@ public:
void LogDialog(wxCommandEvent& event); void LogDialog(wxCommandEvent& event);
void MessageBox(wxCommandEvent& event); void MessageBox(wxCommandEvent& event);
void SingleChoice(wxCommandEvent& event); void SingleChoice(wxCommandEvent& event);
void MultiChoice(wxCommandEvent& event);
void TextEntry(wxCommandEvent& event); void TextEntry(wxCommandEvent& event);
void PasswordEntry(wxCommandEvent& event); void PasswordEntry(wxCommandEvent& event);
void NumericEntry(wxCommandEvent& event); void NumericEntry(wxCommandEvent& event);
@@ -110,6 +111,7 @@ enum
DIALOGS_CHOOSE_FONT_GENERIC, DIALOGS_CHOOSE_FONT_GENERIC,
DIALOGS_MESSAGE_BOX, DIALOGS_MESSAGE_BOX,
DIALOGS_SINGLE_CHOICE, DIALOGS_SINGLE_CHOICE,
DIALOGS_MULTI_CHOICE,
DIALOGS_TEXT_ENTRY, DIALOGS_TEXT_ENTRY,
DIALOGS_PASSWORD_ENTRY, DIALOGS_PASSWORD_ENTRY,
DIALOGS_FILE_OPEN, DIALOGS_FILE_OPEN,

View File

@@ -67,6 +67,16 @@ public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size); MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
// event handlers (these functions should _not_ be virtual) // event handlers (these functions should _not_ be virtual)
void OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this);
dc.DrawRectangle(20, 20, 100, 100);
dc.SetPen(*wxRED_PEN);
dc.SetDeviceOrigin(20, 20);
dc.SetClippingRegion(0, 0, 100, 100);
dc.DrawLine(0, 0, 1000, 1000);
}
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event); void OnAbout(wxCommandEvent& event);
@@ -95,6 +105,7 @@ enum
// handlers) which process them. It can be also done at run-time, but for the // handlers) which process them. It can be also done at run-time, but for the
// simple menu events like this the static method is much simpler. // simple menu events like this the static method is much simpler.
BEGIN_EVENT_TABLE(MyFrame, wxFrame) BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_PAINT(MyFrame::OnPaint)
EVT_MENU(Minimal_Quit, MyFrame::OnQuit) EVT_MENU(Minimal_Quit, MyFrame::OnQuit)
EVT_MENU(Minimal_About, MyFrame::OnAbout) EVT_MENU(Minimal_About, MyFrame::OnAbout)
END_EVENT_TABLE() END_EVENT_TABLE()

View File

@@ -2,17 +2,25 @@
// Name: choicdgg.cpp // Name: choicdgg.cpp
// Purpose: Choice dialogs // Purpose: Choice dialogs
// Author: Julian Smart // Author: Julian Smart
// Modified by: // Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions
// Created: 04/01/98 // Created: 04/01/98
// RCS-ID: $Id$ // RCS-ID: $Id$
// Copyright: (c) Julian Smart and Markus Holzem // Copyright: (c) wxWindows team
// Licence: wxWindows license // Licence: wxWindows license
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
#ifdef __GNUG__ #ifdef __GNUG__
#pragma implementation "choicdgg.h" #pragma implementation "choicdgg.h"
#endif #endif
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h". // For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h" #include "wx/wxprec.h"
@@ -37,11 +45,60 @@
#include "wx/generic/choicdgg.h" #include "wx/generic/choicdgg.h"
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
#define wxID_LISTBOX 3000 #define wxID_LISTBOX 3000
wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n, #if defined(__WXMSW__) || defined(__WXMAC__)
const wxString *choices, wxWindow *parent, #define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), wxDIALOG_MODAL | \
wxTAB_TRAVERSAL)
#else
#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
wxDIALOG_MODAL | \
wxRESIZE_BORDER | \
wxTAB_TRAVERSAL)
#endif
// ----------------------------------------------------------------------------
// private functions
// ----------------------------------------------------------------------------
// convert wxArrayString into a wxString[] which must be delete[]d by caller
static int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices);
// ============================================================================
// implementation
// ============================================================================
// ----------------------------------------------------------------------------
// helpers
// ----------------------------------------------------------------------------
int ConvertWXArrayToC(const wxArrayString& aChoices, wxString **choices)
{
int n = aChoices.GetCount();
*choices = new wxString[n];
for ( int i = 0; i < n; i++ )
{
*choices[i] = aChoices[i];
}
return n;
}
// ----------------------------------------------------------------------------
// wrapper functions
// ----------------------------------------------------------------------------
wxString wxGetSingleChoice( const wxString& message,
const wxString& caption,
int n, const wxString *choices,
wxWindow *parent,
int WXUNUSED(x), int WXUNUSED(y),
bool WXUNUSED(centre),
int WXUNUSED(width), int WXUNUSED(height) ) int WXUNUSED(width), int WXUNUSED(height) )
{ {
wxSingleChoiceDialog dialog(parent, message, caption, n, choices); wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
@@ -52,9 +109,29 @@ wxString wxGetSingleChoice( const wxString& message, const wxString& caption, in
return choice; return choice;
} }
wxString wxGetSingleChoice( const wxString& message,
const wxString& caption,
const wxArrayString& aChoices,
wxWindow *parent,
int x, int y,
bool centre,
int width, int height)
{
wxString *choices;
int n = ConvertWXArrayToC(aChoices, &choices);
wxString res = wxGetSingleChoice(message, caption, n, choices, parent,
x, y, centre, width, height);
delete [] choices;
return res;
}
#ifdef WXWIN_COMPATIBILITY_2
// Overloaded for backward compatibility // Overloaded for backward compatibility
wxString wxGetSingleChoice( const wxString& message, const wxString& caption, int n, wxString wxGetSingleChoice( const wxString& message,
char *choices[], wxWindow *parent, const wxString& caption,
int n, char *choices[],
wxWindow *parent,
int x, int y, bool centre, int x, int y, bool centre,
int width, int height ) int width, int height )
{ {
@@ -69,10 +146,14 @@ wxString wxGetSingleChoice( const wxString& message, const wxString& caption, in
delete[] strings; delete[] strings;
return ans; return ans;
} }
#endif // WXWIN_COMPATIBILITY_2
int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n, int wxGetSingleChoiceIndex( const wxString& message,
const wxString *choices, wxWindow *parent, const wxString& caption,
int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), int n, const wxString *choices,
wxWindow *parent,
int WXUNUSED(x), int WXUNUSED(y),
bool WXUNUSED(centre),
int WXUNUSED(width), int WXUNUSED(height) ) int WXUNUSED(width), int WXUNUSED(height) )
{ {
wxSingleChoiceDialog dialog(parent, message, caption, n, choices); wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
@@ -85,9 +166,12 @@ int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, in
return choice; return choice;
} }
#ifdef WXWIN_COMPATIBILITY_2
// Overloaded for backward compatibility // Overloaded for backward compatibility
int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n, int wxGetSingleChoiceIndex( const wxString& message,
wxChar *choices[], wxWindow *parent, const wxString& caption,
int n, wxChar *choices[],
wxWindow *parent,
int x, int y, bool centre, int x, int y, bool centre,
int width, int height ) int width, int height )
{ {
@@ -99,10 +183,15 @@ int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, in
delete[] strings; delete[] strings;
return ans; return ans;
} }
#endif // WXWIN_COMPATIBILITY_2
void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n, void *wxGetSingleChoiceData( const wxString& message,
const wxString *choices, void **client_data, wxWindow *parent, const wxString& caption,
int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), int n, const wxString *choices,
void **client_data,
wxWindow *parent,
int WXUNUSED(x), int WXUNUSED(y),
bool WXUNUSED(centre),
int WXUNUSED(width), int WXUNUSED(height) ) int WXUNUSED(width), int WXUNUSED(height) )
{ {
wxSingleChoiceDialog dialog(parent, message, caption, n, choices, (char **)client_data); wxSingleChoiceDialog dialog(parent, message, caption, n, choices, (char **)client_data);
@@ -115,11 +204,14 @@ void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, i
return data; return data;
} }
#ifdef WXWIN_COMPATIBILITY_2
// Overloaded for backward compatibility // Overloaded for backward compatibility
void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n, void *wxGetSingleChoiceData( const wxString& message,
wxChar *choices[], void **client_data, wxWindow *parent, const wxString& caption,
int x, int y, bool centre, int n, wxChar *choices[],
int width, int height ) void **client_data,
wxWindow *parent,
int x, int y, bool centre, int width, int height )
{ {
wxString *strings = new wxString[n]; wxString *strings = new wxString[n];
int i; int i;
@@ -127,60 +219,114 @@ void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, i
{ {
strings[i] = choices[i]; strings[i] = choices[i];
} }
void *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent, void *data = wxGetSingleChoiceData(message, caption,
n, (const wxString *)strings,
client_data, parent,
x, y, centre, width, height); x, y, centre, width, height);
delete[] strings; delete[] strings;
return data; return data;
} }
#endif // WXWIN_COMPATIBILITY_2
size_t wxGetMultipleChoices(wxArrayInt& selections,
/* Multiple choice dialog contributed by Robert Cowell const wxString& message,
* const wxString& caption,
The new data passed are in the "int nsel" and "int * selection"
The idea is to make a multiple selection from list of strings.
The returned value is the total number selected. initialily there
are nsel selected, with indices stored in
selection[0],...,selection[nsel-1] which appear highlighted to
begin with. On exit with value i
selection[0..i-1] contains the indices of the selected items.
(Some prior selectecions might be deselected.)
Thus selection must be as big as choices, in case all items are
selected.
*/
/*
int wxGetMultipleChoice(const wxString& message, const wxString& caption,
int n, const wxString *choices, int n, const wxString *choices,
int nsel, int * selection, wxWindow *parent,
wxWindow *parent , int x , int y, bool centre, int WXUNUSED(x), int WXUNUSED(y),
bool WXUNUSED(centre),
int WXUNUSED(width), int WXUNUSED(height))
{
wxMultiChoiceDialog dialog(parent, message, caption, n, choices);
if ( dialog.ShowModal() == wxID_OK )
selections = dialog.GetSelections();
else
selections.Empty();
return selections.GetCount();
}
size_t wxGetMultipleChoices(wxArrayInt selections,
const wxString& message,
const wxString& caption,
const wxArrayString& aChoices,
wxWindow *parent,
int x, int y,
bool centre,
int width, int height) int width, int height)
{ {
return -1; wxString *choices;
} int n = ConvertWXArrayToC(aChoices, &choices);
*/ size_t res = wxGetMultipleChoices(selections, message, caption,
n, choices, parent,
x, y, centre, width, height);
delete [] choices;
return res;
}
// ----------------------------------------------------------------------------
// wxAnyChoiceDialog
// ----------------------------------------------------------------------------
bool wxAnyChoiceDialog::Create(wxWindow *parent,
const wxString& message,
const wxString& caption,
int n, const wxString *choices,
long styleDlg,
const wxPoint& pos,
long styleLbox)
{
if ( !wxDialog::Create(parent, -1, caption, pos, wxDefaultSize,
wxCHOICEDLG_DIALOG_STYLE) )
return FALSE;
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
// 1) text message
topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
// 2) list box
m_listbox = new wxListBox( this, wxID_LISTBOX,
wxDefaultPosition, wxDefaultSize,
n, choices,
styleLbox );
if ( n > 0 )
m_listbox->SetSelection(0);
topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
#if wxUSE_STATLINE
// 3) static line
topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
#endif
// 4) buttons
topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
SetAutoLayout( TRUE );
SetSizer( topsizer );
topsizer->SetSizeHints( this );
topsizer->Fit( this );
Centre( wxBOTH );
m_listbox->SetFocus();
return TRUE;
}
// ----------------------------------------------------------------------------
// wxSingleChoiceDialog // wxSingleChoiceDialog
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog) BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK) EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick) EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
END_EVENT_TABLE() END_EVENT_TABLE()
IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog) IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
#if defined(__WXMSW__) || defined(__WXMAC__)
#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
wxDIALOG_MODAL | \
wxTAB_TRAVERSAL)
#else
#define wxCHOICEDLG_DIALOG_STYLE (wxDEFAULT_DIALOG_STYLE | \
wxDIALOG_MODAL | \
wxRESIZE_BORDER | \
wxTAB_TRAVERSAL)
#endif
wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
const wxString& message, const wxString& message,
@@ -190,12 +336,12 @@ wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
char **clientData, char **clientData,
long style, long style,
const wxPoint& pos) const wxPoint& pos)
: wxDialog(parent, -1, caption, pos, wxDefaultSize,
wxCHOICEDLG_DIALOG_STYLE)
{ {
Create(parent, message, caption, n, choices, clientData, style); Create(parent, message, caption, n, choices, clientData, style);
} }
#ifdef WXWIN_COMPATIBILITY_2
wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& caption, const wxString& caption,
@@ -203,8 +349,6 @@ wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
char **clientData, char **clientData,
long style, long style,
const wxPoint& pos) const wxPoint& pos)
: wxDialog(parent, -1, caption, pos, wxDefaultSize,
wxCHOICEDLG_DIALOG_STYLE)
{ {
Create(parent, message, caption, choices, clientData, style); Create(parent, message, caption, choices, clientData, style);
} }
@@ -228,56 +372,29 @@ bool wxSingleChoiceDialog::Create(wxWindow *parent,
return ans; return ans;
} }
bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), #endif // WXWIN_COMPATIBILITY_2
bool wxSingleChoiceDialog::Create( wxWindow *parent,
const wxString& message, const wxString& message,
const wxString& WXUNUSED(caption), const wxString& caption,
int n, int n,
const wxString *choices, const wxString *choices,
char **clientData, char **clientData,
long style, long style,
const wxPoint& WXUNUSED(pos) ) const wxPoint& pos )
{ {
m_selection = 0; if ( !wxAnyChoiceDialog::Create(parent, message, caption,
n, choices,
style, pos) )
return FALSE;
m_dialogStyle = style; m_selection = n > 0 ? 0 : -1;
wxBeginBusyCursor();
wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
// 1) text message
topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 );
// 2) list box
m_listbox = new wxListBox( this, wxID_LISTBOX, wxDefaultPosition, wxSize(160,100) ,
n, choices, wxLB_ALWAYS_SB );
m_listbox->SetSelection( m_selection );
if (clientData) if (clientData)
{ {
for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)
m_listbox->SetClientData(i, clientData[i]); m_listbox->SetClientData(i, clientData[i]);
} }
topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 );
#if wxUSE_STATLINE
// 3) static line
topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
#endif
// 4) buttons
topsizer->Add( CreateButtonSizer( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 );
SetAutoLayout( TRUE );
SetSizer( topsizer );
topsizer->SetSizeHints( this );
topsizer->Fit( this );
Centre( wxBOTH );
m_listbox->SetFocus();
wxEndBusyCursor();
return TRUE; return TRUE;
} }
@@ -315,3 +432,51 @@ void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
EndModal(wxID_OK); EndModal(wxID_OK);
} }
// ----------------------------------------------------------------------------
// wxMultiChoiceDialog
// ----------------------------------------------------------------------------
BEGIN_EVENT_TABLE(wxMultiChoiceDialog, wxDialog)
EVT_BUTTON(wxID_OK, wxMultiChoiceDialog::OnOK)
END_EVENT_TABLE()
IMPLEMENT_DYNAMIC_CLASS(wxMultiChoiceDialog, wxDialog)
bool wxMultiChoiceDialog::Create( wxWindow *parent,
const wxString& message,
const wxString& caption,
int n,
const wxString *choices,
long style,
const wxPoint& pos )
{
if ( !wxAnyChoiceDialog::Create(parent, message, caption,
n, choices,
style, pos,
wxLB_ALWAYS_SB | wxLB_MULTIPLE) )
return FALSE;
return TRUE;
}
void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
{
size_t count = selections.GetCount();
for ( size_t n = 0; n < count; n++ )
{
m_listbox->Select(selections[n]);
}
}
void wxMultiChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
{
m_selections.Empty();
size_t count = m_listbox->GetCount();
for ( size_t n = 0; n < count; n++ )
{
if ( m_listbox->IsSelected(n) )
m_selections.Add(n);
}
EndModal(wxID_OK);
}