X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/59bd9598bc9a092dd51cbd8cfc1aa37299a8cd61..9d5cfd0e64a2c09d957517405758de680806e674:/src/generic/choicdgg.cpp diff --git a/src/generic/choicdgg.cpp b/src/generic/choicdgg.cpp index 2e0df746a8..fa3c19415b 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) wxWindows team -// Licence: wxWindows license +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ // declarations // ============================================================================ -#ifdef __GNUG__ - #pragma implementation "choicdgg.h" -#endif - // ---------------------------------------------------------------------------- // headers // ---------------------------------------------------------------------------- @@ -28,21 +24,23 @@ #pragma hdrstop #endif +#if wxUSE_CHOICEDLG + #ifndef WX_PRECOMP #include #include "wx/utils.h" #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" // ---------------------------------------------------------------------------- @@ -51,17 +49,6 @@ #define wxID_LISTBOX 3000 -#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 - // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- @@ -81,9 +68,10 @@ 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]; + (*choices)[i] = aChoices[i]; } return n; @@ -126,28 +114,6 @@ wxString wxGetSingleChoice( const wxString& message, return res; } -#ifdef WXWIN_COMPATIBILITY_2 -// Overloaded for backward compatibility -wxString wxGetSingleChoice( const wxString& message, - const wxString& caption, - int n, char *choices[], - wxWindow *parent, - int x, int y, bool centre, - int width, int height ) -{ - wxString *strings = new wxString[n]; - int i; - for ( i = 0; i < n; i++) - { - strings[i] = choices[i]; - } - wxString ans(wxGetSingleChoice(message, caption, n, (const wxString *)strings, parent, - x, y, centre, width, height)); - delete[] strings; - return ans; -} -#endif // WXWIN_COMPATIBILITY_2 - int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n, const wxString *choices, @@ -166,24 +132,22 @@ int wxGetSingleChoiceIndex( const wxString& message, return choice; } -#ifdef WXWIN_COMPATIBILITY_2 -// Overloaded for backward compatibility int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, - int n, wxChar *choices[], + const wxArrayString& aChoices, wxWindow *parent, - int x, int y, bool centre, - int width, int height ) + int x, int y, + bool centre, + int width, int height) { - wxString *strings = new wxString[n]; - for ( int i = 0; i < n; i++) - strings[i] = choices[i]; - int ans = wxGetSingleChoiceIndex(message, caption, n, (const wxString *)strings, parent, - x, y, centre, width, height); - delete[] strings; - return ans; + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + int res = wxGetSingleChoiceIndex(message, caption, n, choices, parent, + x, y, centre, width, height); + delete [] choices; + + return res; } -#endif // WXWIN_COMPATIBILITY_2 void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, @@ -194,7 +158,8 @@ void *wxGetSingleChoiceData( const wxString& message, bool WXUNUSED(centre), 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); void *data; if ( dialog.ShowModal() == wxID_OK ) data = dialog.GetSelectionClientData(); @@ -204,29 +169,24 @@ void *wxGetSingleChoiceData( const wxString& message, return data; } -#ifdef WXWIN_COMPATIBILITY_2 -// Overloaded for backward compatibility void *wxGetSingleChoiceData( const wxString& message, const wxString& caption, - int n, wxChar *choices[], + const wxArrayString& aChoices, void **client_data, wxWindow *parent, - int x, int y, bool centre, int width, int height ) + int x, int y, + bool centre, + int width, int height) { - wxString *strings = new wxString[n]; - int i; - for ( i = 0; i < n; i++) - { - strings[i] = choices[i]; - } - void *data = wxGetSingleChoiceData(message, caption, - n, (const wxString *)strings, - client_data, parent, - x, y, centre, width, height); - delete[] strings; - return data; + wxString *choices; + int n = ConvertWXArrayToC(aChoices, &choices); + void *res = wxGetSingleChoiceData(message, caption, n, choices, + client_data, parent, + x, y, centre, width, height); + delete [] choices; + + return res; } -#endif // WXWIN_COMPATIBILITY_2 size_t wxGetMultipleChoices(wxArrayInt& selections, const wxString& message, @@ -238,6 +198,11 @@ size_t wxGetMultipleChoices(wxArrayInt& selections, int WXUNUSED(width), int WXUNUSED(height)) { wxMultiChoiceDialog dialog(parent, message, caption, n, choices); + + // 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 @@ -273,48 +238,74 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent, const wxString& message, const wxString& caption, int n, const wxString *choices, - long WXUNUSED(styleDlg), // FIXME: why unused? + long styleDlg, const wxPoint& pos, long styleLbox) { - if ( !wxDialog::Create(parent, -1, caption, pos, wxDefaultSize, - wxCHOICEDLG_DIALOG_STYLE) ) - return FALSE; +#ifdef __WXMAC__ + // FIXME: why?? + if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg & (~wxCANCEL) ) ) + return false; +#else + if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg) ) + return false; +#endif 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( wxOK|wxCANCEL ), 0, wxCENTRE | wxALL, 10 ); + // 3) buttons if any + wxSizer * + buttonSizer = CreateSeparatedButtonSizer(styleDlg & ButtonSizerFlags); + 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, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long styleDlg, + const wxPoint& pos, + long styleLbox) +{ + wxCArrayString chs(choices); + return Create(parent, message, caption, chs.GetCount(), chs.GetStrings(), + styleDlg, pos, styleLbox); +} + +wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox) +{ + return new wxListBox( this, wxID_LISTBOX, + wxDefaultPosition, wxDefaultSize, + n, choices, + styleLbox ); } // ---------------------------------------------------------------------------- @@ -323,7 +314,12 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent, 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) @@ -340,12 +336,10 @@ wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, Create(parent, message, caption, n, choices, clientData, style); } -#ifdef WXWIN_COMPATIBILITY_2 - wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption, - const wxStringList& choices, + const wxArrayString& choices, char **clientData, long style, const wxPoint& WXUNUSED(pos)) @@ -353,27 +347,6 @@ wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, Create(parent, message, caption, choices, clientData, style); } -bool wxSingleChoiceDialog::Create(wxWindow *parent, - const wxString& message, - const wxString& caption, - const wxStringList& choices, - char **clientData, - long style, - const wxPoint& pos) -{ - wxString *strings = new wxString[choices.Number()]; - int i; - for ( i = 0; i < choices.Number(); i++) - { - strings[i] = (char *)choices.Nth(i)->Data(); - } - bool ans = Create(parent, message, caption, choices.Number(), strings, clientData, style, pos); - delete[] strings; - return ans; -} - -#endif // WXWIN_COMPATIBILITY_2 - bool wxSingleChoiceDialog::Create( wxWindow *parent, const wxString& message, const wxString& caption, @@ -386,7 +359,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; @@ -396,7 +369,20 @@ bool wxSingleChoiceDialog::Create( wxWindow *parent, m_listbox->SetClientData(i, clientData[i]); } - return TRUE; + return true; +} + +bool wxSingleChoiceDialog::Create( wxWindow *parent, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + char **clientData, + long style, + const wxPoint& pos ) +{ + wxCArrayString chs(choices); + return Create( parent, message, caption, chs.GetCount(), chs.GetStrings(), + clientData, style, pos ); } // Set the selection @@ -408,26 +394,30 @@ void wxSingleChoiceDialog::SetSelection(int sel) void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event)) { - m_selection = m_listbox->GetSelection(); - m_stringSelection = m_listbox->GetStringSelection(); - // TODO! -#ifndef __WXMOTIF__ - if ( m_listbox->HasClientUntypedData() ) - SetClientData(m_listbox->GetClientData(m_selection)); -#endif - 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(); - // TODO! -#ifndef __WXMOTIF__ if ( m_listbox->HasClientUntypedData() ) SetClientData(m_listbox->GetClientData(m_selection)); -#endif EndModal(wxID_OK); } @@ -446,19 +436,71 @@ 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, + const wxString& message, + const wxString& caption, + const wxArrayString& choices, + long style, + const wxPoint& pos ) +{ + wxCArrayString chs(choices); + return Create( parent, message, caption, chs.GetCount(), + chs.GetStrings(), style, pos ); } 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]); } @@ -466,12 +508,22 @@ void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections) bool wxMultiChoiceDialog::TransferDataFromWindow() { - // VZ: I hate to do it but I can't fix wxMotif right now (FIXME) -#ifdef __WXMOTIF__ - #define IsSelected Selected + 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 - m_selections.Empty(); size_t count = m_listbox->GetCount(); for ( size_t n = 0; n < count; n++ ) { @@ -479,5 +531,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