]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/choicdgg.cpp
Check gtk_tree_model_iter_nth_child() return value in wxChoice code.
[wxWidgets.git] / src / generic / choicdgg.cpp
index 62beddd961620fb11aef87f269991e0f9f378725..612b285ba4659b2bbee88875ee5c0b7db82838b7 100644 (file)
     #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"
 
 // ----------------------------------------------------------------------------
 
 #define wxID_LISTBOX 3000
 
-// ---------------------------------------------------------------------------
-// macros
-// ---------------------------------------------------------------------------
-
-/* Macro for avoiding #ifdefs when value have to be different depending on size of
-   device we display on - take it from something like wxDesktopPolicy in the future
- */
-
-#if defined(__SMARTPHONE__)
-    #define wxLARGESMALL(large,small) small
-#else
-    #define wxLARGESMALL(large,small) large
-#endif
-
 // ----------------------------------------------------------------------------
 // private functions
 // ----------------------------------------------------------------------------
@@ -102,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();
@@ -118,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();
@@ -153,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,
@@ -171,13 +218,17 @@ 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);
+                                client_data);
+
+    dialog.SetSelection(initialSelection);
+
     void *data;
     if ( dialog.ShowModal() == wxID_OK )
-        data = dialog.GetSelectionClientData();
+        data = dialog.GetSelectionData();
     else
         data = NULL;
 
@@ -191,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,
@@ -218,15 +300,19 @@ size_t wxGetMultipleChoices(wxArrayInt& selections,
     // 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,
@@ -237,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;
@@ -245,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
 // ----------------------------------------------------------------------------
@@ -257,11 +387,9 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
                                const wxPoint& pos,
                                long styleLbox)
 {
-#if defined(__SMARTPHONE__) || defined(__POCKETPC__)
-    styleDlg &= ~wxBORDER_MASK;
-    styleDlg &= ~wxRESIZE_BORDER;
-    styleDlg &= ~wxCAPTION;
-#endif
+    // 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;
@@ -269,42 +397,33 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
 
     // 1) text message
-    topsizer->Add( CreateTextSizer( message ), 0, wxALL, wxLARGESMALL(10,0) );
+    topsizer->
+        Add(CreateTextSizer(message), wxSizerFlags().Expand().TripleBorder());
 
     // 2) list box
-    m_listbox = CreateList(n,choices,styleLbox);
+    m_listbox = CreateList(n, choices, styleLbox);
 
     if ( n > 0 )
         m_listbox->SetSelection(0);
 
-    topsizer->Add( m_listbox, 1, wxEXPAND|wxLEFT|wxRIGHT, wxLARGESMALL(15,0) );
-
-    // smart phones does not support or do not waste space for wxButtons
-#ifdef __SMARTPHONE__
-
-    SetRightMenu(wxID_CANCEL, _("Cancel"));
+    topsizer->
+        Add(m_listbox, wxSizerFlags().Expand().Proportion(1).TripleBorder(wxLEFT | wxRIGHT));
 
-#else // __SMARTPHONE__/!__SMARTPHONE__
-
-#if wxUSE_STATLINE
-    // 3) static line
-    topsizer->Add( new wxStaticLine( this, wxID_ANY ), 0, wxEXPAND | wxLEFT|wxRIGHT|wxTOP, 10 );
-#endif
-
-    // 4) buttons
-    topsizer->Add( CreateButtonSizer( styleDlg & (wxOK|wxCANCEL) ), 0, wxEXPAND | wxALL, 10 );
-
-#endif // !__SMARTPHONE__
+    // 3) buttons if any
+    wxSizer *
+        buttonSizer = CreateSeparatedButtonSizer(styleBtns);
+    if ( buttonSizer )
+    {
+        topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder());
+    }
 
     SetSizer( topsizer );
 
-#if !defined(__SMARTPHONE__) && !defined(__POCKETPC__)
     topsizer->SetSizeHints( this );
     topsizer->Fit( this );
 
     if ( styleDlg & wxCENTRE )
         Centre(wxBOTH);
-#endif
 
     m_listbox->SetFocus();
 
@@ -348,35 +467,12 @@ END_EVENT_TABLE()
 
 IMPLEMENT_DYNAMIC_CLASS(wxSingleChoiceDialog, wxDialog)
 
-wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
-                                           const wxString& message,
-                                           const wxString& caption,
-                                           int n,
-                                           const wxString *choices,
-                                           char **clientData,
-                                           long style,
-                                           const wxPoint& WXUNUSED(pos))
-{
-    Create(parent, message, caption, n, choices, clientData, style);
-}
-
-wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent,
-                                           const wxString& message,
-                                           const wxString& caption,
-                                           const wxArrayString& choices,
-                                           char **clientData,
-                                           long style,
-                                           const wxPoint& WXUNUSED(pos))
-{
-    Create(parent, message, caption, choices, clientData, style);
-}
-
 bool wxSingleChoiceDialog::Create( wxWindow *parent,
                                    const wxString& message,
                                    const wxString& caption,
                                    int n,
                                    const wxString *choices,
-                                   char **clientData,
+                                   void **clientData,
                                    long style,
                                    const wxPoint& pos )
 {
@@ -400,7 +496,7 @@ bool wxSingleChoiceDialog::Create( wxWindow *parent,
                                    const wxString& message,
                                    const wxString& caption,
                                    const wxArrayString& choices,
-                                   char **clientData,
+                                   void **clientData,
                                    long style,
                                    const wxPoint& pos )
 {
@@ -412,6 +508,9 @@ 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;
 }
@@ -460,10 +559,17 @@ 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) )
+                                    styleLbox) )
         return false;
 
     return true;
@@ -483,6 +589,30 @@ bool wxMultiChoiceDialog::Create( wxWindow *parent,
 
 void wxMultiChoiceDialog::SetSelections(const wxArrayInt& selections)
 {
+#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();
@@ -502,6 +632,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++ )
     {