// wxChoice
//-----------------------------------------------------------------------------
+class wxGtkCollatedArrayString;
+
class WXDLLIMPEXP_CORE wxChoice : public wxChoiceBase
{
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;
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_
{
// 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();
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 );