]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/choicdgg.cpp
tree ctrl sorting shouldn't crash when items don't have data
[wxWidgets.git] / src / generic / choicdgg.cpp
index 2f1c8a242f864bb7a1921dee59737511a383d8be..3758f96020215fd543b097b45f308650a9aa4cef 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        choicesg.cpp
+// Name:        choicdgg.cpp
 // Purpose:     Choice dialogs
 // Author:      Julian Smart
 // Modified by:
 
 #include "wx/generic/choicdgg.h"
 
-extern void wxSplitMessage2(const char *message, wxList *messageList, wxWindow *parent, wxRowColSizer *sizer);
+// Split message, using constraints to position controls
+static void wxSplitMessage2(const wxChar *message, wxList *messageList, wxWindow *parent, wxRowColSizer *sizer)
+{
+  wxChar *copyMessage = copystring(message);
+  size_t i = 0;
+  size_t len = wxStrlen(copyMessage);
+  wxChar *currentMessage = copyMessage;
+
+//  wxWindow *lastWindow = parent;
+
+  while (i < len) {
+    while ((i < len) && (copyMessage[i] != _T('\n'))) i++;
+    if (i < len) copyMessage[i] = 0;
+    wxStaticText *mess = new wxStaticText(parent, -1, currentMessage);
+
+/*
+    wxLayoutConstraints *c = new wxLayoutConstraints;
+    c->left.SameAs             (parent, wxLeft, 10);
+    c->top.SameAs              (lastWindow, wxBottom, 5);
+    c->right.AsIs                      ();
+    c->height.AsIs                     ();
+
+    mess->SetConstraints(c);
+*/
+    sizer->AddSizerChild(mess);
+
+    messageList->Append(mess);
+
+    currentMessage = copyMessage + i + 1;
+  }
+  delete[] copyMessage;
+}
 
-wxString wxGetSingleChoice( const wxString& message, const wxString& caption, const int n, 
-                            const wxString *choices, wxWindow *parent, 
-                           const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre), 
-                           const int WXUNUSED(width), const int WXUNUSED(height) )
+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) )
 {
        wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
        if ( dialog.ShowModal() == wxID_OK )
@@ -50,10 +81,10 @@ wxString wxGetSingleChoice( const wxString& message, const wxString& caption, co
 }
 
 // Overloaded for backward compatibility
-wxString wxGetSingleChoice( const wxString& message, const wxString& caption, const int n, 
-                            char *choices[], wxWindow *parent, 
-                           const int x, const int y, const bool centre, 
-                           const int width, const int height )
+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;
@@ -67,10 +98,10 @@ wxString wxGetSingleChoice( const wxString& message, const wxString& caption, co
        return ans;
 }
 
-int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, const int n, 
-                            const wxString *choices, wxWindow *parent, 
-                           const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre), 
-                           const int WXUNUSED(width), const int WXUNUSED(height) )
+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) )
 {
        wxSingleChoiceDialog dialog(parent, message, caption, n, choices);
        if ( dialog.ShowModal() == wxID_OK )
@@ -82,10 +113,10 @@ int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, co
 }
 
 // Overloaded for backward compatibility
-int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, const int n, 
-                            char *choices[], wxWindow *parent, 
-                           const int x, const int y, const bool centre, 
-                           const int width, const int height )
+int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, int n, 
+                            wxChar *choices[], wxWindow *parent,
+                           int x, int y, bool centre, 
+                           int width, int height )
 {
        wxString *strings = new wxString[n];
        int i;
@@ -99,10 +130,10 @@ int wxGetSingleChoiceIndex( const wxString& message, const wxString& caption, co
        return ans;
 }
 
-char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, const int n,
-                             const wxString *choices, char **client_data, wxWindow *parent, 
-                            const int WXUNUSED(x), const int WXUNUSED(y), const bool WXUNUSED(centre), 
-                            const int WXUNUSED(width), const int WXUNUSED(height) )
+wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n,
+                              const wxString *choices, wxChar **client_data, wxWindow *parent,
+                              int WXUNUSED(x), int WXUNUSED(y), bool WXUNUSED(centre), 
+                              int WXUNUSED(width), int WXUNUSED(height) )
 {
        wxSingleChoiceDialog dialog(parent, message, caption, n, choices, client_data);
        if ( dialog.ShowModal() == wxID_OK )
@@ -114,10 +145,10 @@ char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, c
 }
 
 // Overloaded for backward compatibility
-char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, const int n, 
-                             char *choices[], char **client_data, wxWindow *parent, 
-                            const int x, const int y, const bool centre, 
-                            const int width, const int height )
+wxChar *wxGetSingleChoiceData( const wxString& message, const wxString& caption, int n, 
+                              wxChar *choices[], wxChar **client_data, wxWindow *parent,
+                              int x, int y, bool centre, 
+                              int width, int height )
 {
        wxString *strings = new wxString[n];
        int i;
@@ -125,7 +156,7 @@ char *wxGetSingleChoiceData( const wxString& message, const wxString& caption, c
        {
                strings[i] = choices[i];
        }
-       char *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
+       wxChar *data = wxGetSingleChoiceData(message, caption, n, (const wxString *)strings, client_data, parent,
                x, y, centre, width, height);
        delete[] strings;
        return data;
@@ -150,10 +181,10 @@ selected.
 */
 /*
 int wxGetMultipleChoice(const wxString& message, const wxString& caption,
-                         const int n, const wxString *choices,
-                         const int nsel, int * selection,
-                         wxWindow *parent , const int x , const int y, const bool centre,
-                         const int width, const int height)
+                         int n, const wxString *choices,
+                         int nsel, int * selection,
+                         wxWindow *parent , int x , int y, bool centre,
+                         int width, int height)
 {
        return -1;
 }
@@ -164,27 +195,28 @@ int wxGetMultipleChoice(const wxString& message, const wxString& caption,
 #if !USE_SHARED_LIBRARY
 BEGIN_EVENT_TABLE(wxSingleChoiceDialog, wxDialog)
        EVT_BUTTON(wxID_OK, wxSingleChoiceDialog::OnOK)
+       EVT_LISTBOX_DCLICK(wxID_LISTBOX, wxSingleChoiceDialog::OnListBoxDClick)
 END_EVENT_TABLE()
 
 IMPLEMENT_CLASS(wxSingleChoiceDialog, wxDialog)
 #endif
 
 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-        const int n, const wxString *choices, char **clientData, long style, const wxPoint& pos):
-         wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
+        int n, const wxString *choices, wxChar **clientData, long style, const wxPoint& pos):
+         wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL|wxTAB_TRAVERSAL)
 {
         Create(parent, message, caption, n, choices, clientData, style);
 }
 
 wxSingleChoiceDialog::wxSingleChoiceDialog(wxWindow *parent, const wxString& message, const wxString& caption,
-        const wxStringList& choices, char **clientData, long style, const wxPoint& pos):
+        const wxStringList& choices, wxChar **clientData, long style, const wxPoint& pos):
          wxDialog(parent, -1, caption, pos, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL)
 {
         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)
+        const wxStringList& choices, wxChar **clientData, long style, const wxPoint& pos)
 {
        wxString *strings = new wxString[choices.Number()];
        int i;
@@ -198,13 +230,13 @@ bool wxSingleChoiceDialog::Create(wxWindow *parent, const wxString& message, con
 }
 
 bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& message, 
-                                   const wxString& WXUNUSED(caption), const int n, 
-                                  const wxString *choices, char **clientData, long style, 
+                                   const wxString& WXUNUSED(caption), int n, 
+                                  const wxString *choices, wxChar **clientData, long style,
                                   const wxPoint& WXUNUSED(pos) )
 {
        m_dialogStyle = style;
        m_selection = 0;
-       m_stringSelection = "";
+       m_stringSelection = _T("");
        m_clientData = NULL;
 
        wxBeginBusyCursor();
@@ -213,7 +245,7 @@ bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& m
        topSizer->SetBorder(10, 10);
 
        wxRowColSizer *messageSizer = new wxRowColSizer(topSizer, wxSIZER_COLS, 100);
-       messageSizer->SetName("messageSizer");
+       messageSizer->SetName(_T("messageSizer"));
 
 //    bool centre = ((style & wxCENTRE) == wxCENTRE);
 
@@ -237,7 +269,7 @@ bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& m
 
        wxRowColSizer *listBoxSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
        listBoxSizer->AddSizerChild(listBox);
-       listBoxSizer->SetName("listBoxSizer");
+       listBoxSizer->SetName(_T("listBoxSizer"));
 
        // Create constraints for the text sizer
        wxLayoutConstraints *textC = new wxLayoutConstraints;
@@ -247,11 +279,12 @@ bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& m
 
        // Insert another spacer
        wxSpacingSizer *spacingSizer2 = new wxSpacingSizer(topSizer, wxBelow, listBoxSizer, 10);
-       spacingSizer->SetName("spacingSizer2");
+       spacingSizer->SetName(_T("spacingSizer2"));
 
        // Insert a sizer for the buttons
        wxRowColSizer *buttonSizer = new wxRowColSizer(topSizer, wxSIZER_ROWS);
-       buttonSizer->SetName("buttonSizer");
+       buttonSizer->SetName(_T("buttonSizer"));
+       buttonSizer->SetSpacing(12,0);
 
        // Specify constraints for the button sizer
        wxLayoutConstraints *c = new wxLayoutConstraints;
@@ -265,12 +298,12 @@ bool wxSingleChoiceDialog::Create( wxWindow *WXUNUSED(parent), const wxString& m
        wxButton *cancel = NULL;
 
   if (style & wxOK) {
-    ok = new wxButton(this, wxID_OK, _("OK"));
+    ok = new wxButton(this, wxID_OK, _("OK"), wxDefaultPosition, wxSize(75,-1) );
        buttonSizer->AddSizerChild(ok);
   }
 
   if (style & wxCANCEL) {
-    cancel = new wxButton(this, wxID_CANCEL, _("Cancel"));
+    cancel = new wxButton(this, wxID_CANCEL, _("Cancel"), wxDefaultPosition, wxSize(75,-1));
        buttonSizer->AddSizerChild(cancel);
   }
 
@@ -306,7 +339,20 @@ void wxSingleChoiceDialog::OnOK(wxCommandEvent& WXUNUSED(event))
        {
                m_selection = listBox->GetSelection();
                m_stringSelection = listBox->GetStringSelection();
-               m_clientData = listBox->GetClientData(m_selection);
+               m_clientData = (wxChar*)listBox->GetClientData(m_selection);
+       }
+
+       EndModal(wxID_OK);
+}
+
+void wxSingleChoiceDialog::OnListBoxDClick(wxCommandEvent& WXUNUSED(event))
+{
+       wxListBox *listBox = (wxListBox *)FindWindow(wxID_LISTBOX);
+       if ( listBox )
+       {
+               m_selection = listBox->GetSelection();
+               m_stringSelection = listBox->GetStringSelection();
+               m_clientData = (wxChar*)listBox->GetClientData(m_selection);
        }
 
        EndModal(wxID_OK);