X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..8a31648287be0ef976f133de2786b137f1e98340:/src/generic/choicdgg.cpp diff --git a/src/generic/choicdgg.cpp b/src/generic/choicdgg.cpp index 98453ceb5f..79f7019d0d 100644 --- a/src/generic/choicdgg.cpp +++ b/src/generic/choicdgg.cpp @@ -1,22 +1,18 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: choicdgg.cpp +// Name: src/generic/choicdgg.cpp // Purpose: Choice dialogs // Author: Julian Smart // Modified by: 03.11.00: VZ to add wxArrayString and multiple sel functions // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) wxWidgets team -// Licence: wxWidgets licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "choicdgg.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -36,16 +32,15 @@ #include "wx/dialog.h" #include "wx/button.h" #include "wx/listbox.h" + #include "wx/checklst.h" #include "wx/stattext.h" #include "wx/intl.h" #include "wx/sizer.h" #include "wx/arrstr.h" #endif -#if wxUSE_STATLINE - #include "wx/statline.h" -#endif - +#include "wx/statline.h" +#include "wx/settings.h" #include "wx/generic/choicdgg.h" // ---------------------------------------------------------------------------- @@ -92,9 +87,13 @@ wxString wxGetSingleChoice( const wxString& message, wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), - int WXUNUSED(width), int WXUNUSED(height) ) + int WXUNUSED(width), int WXUNUSED(height), + int initialSelection) { wxSingleChoiceDialog dialog(parent, message, caption, n, choices); + + dialog.SetSelection(initialSelection); + wxString choice; if ( dialog.ShowModal() == wxID_OK ) choice = dialog.GetStringSelection(); @@ -108,26 +107,56 @@ wxString wxGetSingleChoice( const wxString& message, wxWindow *parent, int x, int y, bool centre, - int width, int height) + int width, int height, + int initialSelection) { wxString *choices; int n = ConvertWXArrayToC(aChoices, &choices); wxString res = wxGetSingleChoice(message, caption, n, choices, parent, - x, y, centre, width, height); + x, y, centre, width, height, + initialSelection); delete [] choices; return res; } +wxString wxGetSingleChoice( const wxString& message, + const wxString& caption, + const wxArrayString& choices, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoice(message, caption, choices, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + +wxString wxGetSingleChoice( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoice(message, caption, n, choices, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + int wxGetSingleChoiceIndex( 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), + int initialSelection) { wxSingleChoiceDialog dialog(parent, message, caption, n, choices); + + dialog.SetSelection(initialSelection); + int choice; if ( dialog.ShowModal() == wxID_OK ) choice = dialog.GetSelection(); @@ -143,17 +172,45 @@ int wxGetSingleChoiceIndex( const wxString& message, wxWindow *parent, int x, int y, bool centre, - int width, int height) + int width, int height, + int initialSelection) { wxString *choices; int n = ConvertWXArrayToC(aChoices, &choices); int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent, - x, y, centre, width, height); + x, y, centre, width, height, + initialSelection); delete [] choices; return res; } +int wxGetSingleChoiceIndex( const wxString& message, + const wxString& caption, + const wxArrayString& choices, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoiceIndex(message, caption, choices, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + + +int wxGetSingleChoiceIndex( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoiceIndex(message, caption, n, choices, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + + void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n, const wxString *choices, @@ -161,10 +218,14 @@ void *wxGetSingleChoiceData( const wxString& message, wxWindow *parent, int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), - int WXUNUSED(width), int WXUNUSED(height) ) + int WXUNUSED(width), int WXUNUSED(height), + int initialSelection) { wxSingleChoiceDialog dialog(parent, message, caption, n, choices, (char **)client_data); + + dialog.SetSelection(initialSelection); + void *data; if ( dialog.ShowModal() == wxID_OK ) data = dialog.GetSelectionClientData(); @@ -181,19 +242,50 @@ void *wxGetSingleChoiceData( const wxString& message, wxWindow *parent, int x, int y, bool centre, - int width, int height) + int width, int height, + int initialSelection) { wxString *choices; int n = ConvertWXArrayToC(aChoices, &choices); void *res = wxGetSingleChoiceData(message, caption, n, choices, client_data, parent, - x, y, centre, width, height); + x, y, centre, width, height, + initialSelection); delete [] choices; return res; } -size_t wxGetMultipleChoices(wxArrayInt& selections, +void* wxGetSingleChoiceData( const wxString& message, + const wxString& caption, + const wxArrayString& choices, + void **client_data, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoiceData(message, caption, choices, + client_data, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + +void* wxGetSingleChoiceData( const wxString& message, + const wxString& caption, + int n, const wxString *choices, + void **client_data, + int initialSelection, + wxWindow *parent) +{ + return wxGetSingleChoiceData(message, caption, n, choices, + client_data, parent, + wxDefaultCoord, wxDefaultCoord, + true, wxCHOICE_WIDTH, wxCHOICE_HEIGHT, + initialSelection); +} + + +int wxGetSelectedChoices(wxArrayInt& selections, const wxString& message, const wxString& caption, int n, const wxString *choices, @@ -204,18 +296,23 @@ size_t wxGetMultipleChoices(wxArrayInt& selections, { wxMultiChoiceDialog dialog(parent, message, caption, n, choices); - if ( !selections.IsEmpty() ) - dialog.SetSelections(selections); + // call this even if selections array is empty and this then (correctly) + // deselects the first item which is selected by default + dialog.SetSelections(selections); - if ( dialog.ShowModal() == wxID_OK ) - selections = dialog.GetSelections(); - else - selections.Empty(); + if ( dialog.ShowModal() != wxID_OK ) + { + // NB: intentionally do not clear the selections array here, the caller + // might want to preserve its original contents if the dialog was + // cancelled + return -1; + } + selections = dialog.GetSelections(); return selections.GetCount(); } -size_t wxGetMultipleChoices(wxArrayInt& selections, +int wxGetSelectedChoices(wxArrayInt& selections, const wxString& message, const wxString& caption, const wxArrayString& aChoices, @@ -226,7 +323,7 @@ size_t wxGetMultipleChoices(wxArrayInt& selections, { wxString *choices; int n = ConvertWXArrayToC(aChoices, &choices); - size_t res = wxGetMultipleChoices(selections, message, caption, + int res = wxGetSelectedChoices(selections, message, caption, n, choices, parent, x, y, centre, width, height); delete [] choices; @@ -234,6 +331,50 @@ size_t wxGetMultipleChoices(wxArrayInt& selections, return res; } +#if WXWIN_COMPATIBILITY_2_8 +size_t wxGetMultipleChoices(wxArrayInt& selections, + const wxString& message, + const wxString& caption, + int n, const wxString *choices, + wxWindow *parent, + int x, int y, + bool centre, + int width, int height) +{ + int rc = wxGetSelectedChoices(selections, message, caption, + n, choices, + parent, x, y, centre, width, height); + if ( rc == -1 ) + { + selections.clear(); + return 0; + } + + return rc; +} + +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 rc = wxGetSelectedChoices(selections, message, caption, + aChoices, + parent, x, y, centre, width, height); + if ( rc == -1 ) + { + selections.clear(); + return 0; + } + + return rc; +} +#endif // WXWIN_COMPATIBILITY_2_8 + // ---------------------------------------------------------------------------- // wxAnyChoiceDialog // ---------------------------------------------------------------------------- @@ -246,43 +387,47 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent, const wxPoint& pos, long styleLbox) { - if ( !wxDialog::Create(parent, -1, caption, pos, wxDefaultSize, styleDlg) ) - return FALSE; + // extract the buttons styles from the dialog one and remove them from it + const long styleBtns = styleDlg & (wxOK | wxCANCEL); + styleDlg &= ~styleBtns; + + if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg) ) + return false; wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL ); // 1) text message - topsizer->Add( CreateTextSizer( message ), 0, wxALL, 10 ); + topsizer-> + Add(CreateTextSizer(message), wxSizerFlags().Expand().TripleBorder()); // 2) list box - m_listbox = new wxListBox( this, wxID_LISTBOX, - wxDefaultPosition, wxDefaultSize, - n, choices, - styleLbox ); + m_listbox = CreateList(n, choices, styleLbox); + if ( n > 0 ) m_listbox->SetSelection(0); - topsizer->Add( m_listbox, 1, wxEXPAND | wxLEFT|wxRIGHT, 15 ); + topsizer-> + Add(m_listbox, wxSizerFlags().Expand().Proportion(1).TripleBorder(wxLEFT | wxRIGHT)); -#if wxUSE_STATLINE - // 3) static line - topsizer->Add( new wxStaticLine( this, -1 ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 ); -#endif - - // 4) buttons - topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxCENTRE | wxALL, 10 ); + // 3) buttons if any + wxSizer * + buttonSizer = CreateSeparatedButtonSizer(styleBtns); + if ( buttonSizer ) + { + topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder()); + } - SetAutoLayout( TRUE ); SetSizer( topsizer ); topsizer->SetSizeHints( this ); topsizer->Fit( this ); - Centre( wxBOTH ); + if ( styleDlg & wxCENTRE ) + Centre(wxBOTH); m_listbox->SetFocus(); - return TRUE; + return true; } bool wxAnyChoiceDialog::Create(wxWindow *parent, @@ -298,13 +443,26 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent, styleDlg, pos, styleLbox); } +wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox) +{ + return new wxListBox( this, wxID_LISTBOX, + wxDefaultPosition, wxDefaultSize, + n, choices, + styleLbox ); +} + // ---------------------------------------------------------------------------- // wxSingleChoiceDialog // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog) EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK) +#ifndef __SMARTPHONE__ EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick) +#endif +#ifdef __WXWINCE__ + EVT_JOY_BUTTON_DOWN(wxSingleChoiceDialog::OnJoystickButtonDown) +#endif END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog) @@ -344,7 +502,7 @@ bool wxSingleChoiceDialog::Create( wxWindow *parent, if ( !wxAnyChoiceDialog::Create(parent, message, caption, n, choices, style, pos) ) - return FALSE; + return false; m_selection = n > 0 ? 0 : -1; @@ -354,7 +512,7 @@ bool wxSingleChoiceDialog::Create( wxWindow *parent, m_listbox->SetClientData(i, clientData[i]); } - return TRUE; + return true; } bool wxSingleChoiceDialog::Create( wxWindow *parent, @@ -373,20 +531,33 @@ bool wxSingleChoiceDialog::Create( wxWindow *parent, // Set the selection void wxSingleChoiceDialog::SetSelection(int sel) { + wxCHECK_RET( sel >= 0 && (unsigned)sel < m_listbox->GetCount(), + "Invalid initial selection" ); + m_listbox->SetSelection(sel); m_selection = sel; } void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event)) { - m_selection = m_listbox->GetSelection(); - m_stringSelection = m_listbox->GetStringSelection(); - if ( m_listbox->HasClientUntypedData() ) - SetClientData(m_listbox->GetClientData(m_selection)); - EndModal(wxID_OK); + DoChoice(); } +#ifndef __SMARTPHONE__ void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event)) +{ + DoChoice(); +} +#endif + +#ifdef __WXWINCE__ +void wxSingleChoiceDialog::OnJoystickButtonDown(wxJoystickEvent& WXUNUSED(event)) +{ + DoChoice(); +} +#endif + +void wxSingleChoiceDialog::DoChoice() { m_selection = m_listbox->GetSelection(); m_stringSelection = m_listbox->GetStringSelection(); @@ -411,13 +582,20 @@ bool wxMultiChoiceDialog::Create( wxWindow *parent, long style, const wxPoint& pos ) { + long styleLbox; +#if wxUSE_CHECKLISTBOX + styleLbox = wxLB_ALWAYS_SB; +#else + styleLbox = wxLB_ALWAYS_SB | wxLB_EXTENDED; +#endif + if ( !wxAnyChoiceDialog::Create(parent, message, caption, n, choices, style, pos, - wxLB_ALWAYS_SB | wxLB_EXTENDED) ) - return FALSE; + styleLbox) ) + return false; - return TRUE; + return true; } bool wxMultiChoiceDialog::Create( wxWindow *parent, @@ -434,8 +612,41 @@ bool wxMultiChoiceDialog::Create( wxWindow *parent, void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections) { - size_t count = selections.GetCount(); - for ( size_t n = 0; n < count; n++ ) +#if wxUSE_CHECKLISTBOX + wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox); + if (checkListBox) + { + // first clear all currently selected items + size_t n, + count = checkListBox->GetCount(); + for ( n = 0; n < count; ++n ) + { + if (checkListBox->IsChecked(n)) + checkListBox->Check(n, false); + } + + // now select the ones which should be selected + count = selections.GetCount(); + for ( n = 0; n < count; n++ ) + { + checkListBox->Check(selections[n]); + } + + return; + } +#endif + + // first clear all currently selected items + size_t n, + count = m_listbox->GetCount(); + for ( n = 0; n < count; ++n ) + { + m_listbox->Deselect(n); + } + + // now select the ones which should be selected + count = selections.GetCount(); + for ( n = 0; n < count; n++ ) { m_listbox->Select(selections[n]); } @@ -444,6 +655,21 @@ void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections) bool wxMultiChoiceDialog::TransferDataFromWindow() { m_selections.Empty(); + +#if wxUSE_CHECKLISTBOX + wxCheckListBox* checkListBox = wxDynamicCast(m_listbox, wxCheckListBox); + if (checkListBox) + { + size_t count = checkListBox->GetCount(); + for ( size_t n = 0; n < count; n++ ) + { + if ( checkListBox->IsChecked(n) ) + m_selections.Add(n); + } + return true; + } +#endif + size_t count = m_listbox->GetCount(); for ( size_t n = 0; n < count; n++ ) { @@ -451,7 +677,19 @@ bool wxMultiChoiceDialog::TransferDataFromWindow() m_selections.Add(n); } - return TRUE; + return true; } +#if wxUSE_CHECKLISTBOX + +wxListBoxBase *wxMultiChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox) +{ + return new wxCheckListBox( this, wxID_LISTBOX, + wxDefaultPosition, wxDefaultSize, + n, choices, + styleLbox ); +} + +#endif // wxUSE_CHECKLISTBOX + #endif // wxUSE_CHOICEDLG