]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/choicdgg.cpp
avoid asserts when the cipboard is acquired by another application
[wxWidgets.git] / src / generic / choicdgg.cpp
index 5a8d6f2135ee7406ce26a8556ecb1f4c24c7149e..d037f6255d2f41bcd442625a141d51967fcc2303 100644 (file)
@@ -40,6 +40,7 @@
 #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
 // ----------------------------------------------------------------------------
@@ -256,6 +243,7 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
                                long styleLbox)
 {
 #ifdef __WXMAC__
+    // FIXME: why??
     if ( !wxDialog::Create(parent, wxID_ANY, caption, pos, wxDefaultSize, styleDlg & (~wxCANCEL) ) )
         return false;
 #else
@@ -266,30 +254,24 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
     wxBoxSizer *topsizer = new wxBoxSizer( wxVERTICAL );
 
     // 1) text message
-#ifdef __WXMAC__
-    // align text and list at least on mac
-    topsizer->Add( CreateTextSizer( message ), 0, wxALL, wxLARGESMALL(15,0) );
-#else
-    topsizer->Add( CreateTextSizer( message ), 0, wxALL, wxLARGESMALL(10,0) );
-#endif
+    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) );
+    topsizer->
+        Add(m_listbox, wxSizerFlags().Expand().Proportion(1).TripleBorder(wxLEFT | wxRIGHT));
 
     // 3) buttons if any
-    wxSizer *buttonSizer = CreateButtonSizer( styleDlg & ButtonSizerFlags , true, wxLARGESMALL(10,0) );
-    if(buttonSizer->GetChildren().GetCount() > 0 )
+    wxSizer *
+        buttonSizer = CreateSeparatedButtonSizer(styleDlg & ButtonSizerFlags);
+    if ( buttonSizer )
     {
-        topsizer->Add( buttonSizer, 0, wxEXPAND | wxALL, wxLARGESMALL(10,0) );
-    }
-    else
-    {
-        topsizer->AddSpacer( wxLARGESMALL(15,0) );
-        delete buttonSizer;
+        topsizer->Add(buttonSizer, wxSizerFlags().Expand().DoubleBorder());
     }
 
     SetSizer( topsizer );
@@ -320,8 +302,11 @@ bool wxAnyChoiceDialog::Create(wxWindow *parent,
 
 wxListBoxBase *wxAnyChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
 {
+       wxSize size = wxDefaultSize;
+       if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA)
+               size = wxSize(300, 200);
     return new wxListBox( this, wxID_LISTBOX,
-                          wxDefaultPosition, wxDefaultSize,
+                          wxDefaultPosition, size,
                           n, choices,
                           styleLbox );
 }
@@ -454,10 +439,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;
@@ -477,6 +469,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();
@@ -496,6 +512,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++ )
     {
@@ -510,8 +541,12 @@ bool wxMultiChoiceDialog::TransferDataFromWindow()
 
 wxListBoxBase *wxMultiChoiceDialog::CreateList(int n, const wxString *choices, long styleLbox)
 {
+       wxSize size = wxDefaultSize;
+       if (wxSystemSettings::GetScreenType() > wxSYS_SCREEN_PDA)
+               size = wxSize(300, 200);
+
     return new wxCheckListBox( this, wxID_LISTBOX,
-                               wxDefaultPosition, wxDefaultSize,
+                               wxDefaultPosition, size,
                                n, choices,
                                styleLbox );
 }