]> git.saurik.com Git - wxWidgets.git/commitdiff
make wxChoice and wxComboBox sort in a case insensitive and locale adapted way, fixes...
authorRobert Roebling <robert@roebling.de>
Wed, 18 Aug 2010 21:29:53 +0000 (21:29 +0000)
committerRobert Roebling <robert@roebling.de>
Wed, 18 Aug 2010 21:29:53 +0000 (21:29 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65342 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/gtk/choice.h
include/wx/gtk/private/string.h
src/gtk/choice.cpp
src/gtk/combobox.cpp

index 31704b746c943d1e04ffad6c91a5e672212742cf..e5da9b413d305cc3d79231af78105bcc78892801 100644 (file)
@@ -17,6 +17,8 @@ class WXDLLIMPEXP_FWD_BASE wxArrayString;
 // wxChoice
 //-----------------------------------------------------------------------------
 
+class wxGtkCollatedArrayString;
+
 class WXDLLIMPEXP_CORE wxChoice : public wxChoiceBase
 {
 public:
@@ -84,7 +86,7 @@ public:
 protected:
     // this array is only used for controls with wxCB_SORT style, so only
     // allocate it if it's needed (hence using pointer)
-    wxSortedArrayString *m_strings;
+    wxGtkCollatedArrayString *m_strings;
 
     // contains the client data for the items
     wxArrayPtrVoid m_clientData;
index a537667166bf64c89493bf054c6f6534bc6ceb04..8be04b483f0dc354a5ba7011cba374368a6e43b4 100644 (file)
@@ -31,5 +31,90 @@ private:
     wxDECLARE_NO_COPY_CLASS(wxGtkString);
 };
 
+
+// ----------------------------------------------------------------------------
+// list for sorting collated strings
+// ----------------------------------------------------------------------------
+
+#include "wx/vector.h"
+#include "wx/sharedptr.h"
+
+class wxGtkCollatableString
+{
+public:
+    wxGtkCollatableString( const wxString &label, gchar *key )
+    {
+        m_label = label;
+        m_key = key;
+    }
+    
+    ~wxGtkCollatableString()
+    {
+        if (m_key) 
+            g_free( m_key );
+    }
+
+    wxString     m_label;
+    gchar       *m_key;
+};
+
+class wxGtkCollatedArrayString
+{
+public:
+    wxGtkCollatedArrayString() { }
+    
+    int Add( const wxString &new_label )
+    {
+        int index = 0;
+        
+        gchar *new_key_lower = g_utf8_casefold( new_label.utf8_str(), -1); 
+        gchar *new_key = g_utf8_collate_key( new_key_lower, -1); 
+        g_free( new_key_lower );
+        
+        wxSharedPtr<wxGtkCollatableString> new_ptr( new wxGtkCollatableString( new_label, new_key ) );
+    
+        wxVector< wxSharedPtr<wxGtkCollatableString> >::iterator iter;
+        for (iter = m_list.begin(); iter != m_list.end(); ++iter)
+        {
+            wxSharedPtr<wxGtkCollatableString> ptr = *iter;
+            
+            gchar *key = ptr->m_key;
+            if (strcmp(key,new_key) > 0)
+            {
+                m_list.insert( iter, new_ptr );
+                return index;
+            }
+            index ++;
+        }
+        
+        m_list.push_back( new_ptr );
+        return index;
+    }
+    
+    size_t GetCount()
+    {
+        return m_list.size();
+    }
+    
+    wxString At( size_t index )
+    {
+        return m_list[index]->m_label;
+    }
+    
+    void Clear()
+    {
+        m_list.clear();
+    }
+    
+    void RemoveAt( size_t index )
+    {
+        m_list.erase( m_list.begin() + index );
+    }
+    
+private:
+    wxVector< wxSharedPtr<wxGtkCollatableString> > m_list;
+};
+
+
 #endif // _WX_GTK_PRIVATE_STRING_H_
 
index 759985b65b9d1adde721a6b1b998550dc689f688..fc63e3e4e015745223cf2d857754eac222d47d36 100644 (file)
@@ -75,7 +75,7 @@ bool wxChoice::Create( wxWindow *parent, wxWindowID id,
     {
         // if our m_strings != NULL, Append() will check for it and insert
         // items in the correct order
-        m_strings = new wxSortedArrayString;
+        m_strings = new wxGtkCollatedArrayString;
     }
 
     m_widget = gtk_combo_box_new_text();
@@ -140,9 +140,9 @@ int wxChoice::DoInsertItems(const wxArrayStringsAdapter & items,
         n = pos + i;
         // If sorted, use this wxSortedArrayStrings to determine
         // the right insertion point
-        if(m_strings)
+        if (m_strings)
             n = m_strings->Add(items[i]);
-
+            
         GTKInsertComboBoxTextItem( n, items[i] );
 
         m_clientData.Insert( NULL, n );
index 8ff0dc6b7976a735b44be44e6ff141e0cb67d60e..a0fb1e962dd28544452c873b3d1ab2662808e05a 100644 (file)
@@ -118,7 +118,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
     }
 
     if (HasFlag(wxCB_SORT))
-        m_strings = new wxSortedArrayString();
+        m_strings = new wxGtkCollatedArrayString();
 
     GTKCreateComboBoxWidget();