make wxChoice and wxComboBox sort in a case insensitive and locale adapted way, fixes #12351: Incorrect sort order in wxChoice / wxComboBox
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65342 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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_
|
||||
|
||||
|
Reference in New Issue
Block a user