1 /////////////////////////////////////////////////////////////////////////////// 2 // Name: wx/gtk/private/string.h 3 // Purpose: wxGtkString class declaration 4 // Author: Vadim Zeitlin 5 // Created: 2006-10-19 6 // Copyright: (c) 2006 Vadim Zeitlin <vadim@wxwindows.org> 7 // Licence: wxWindows licence 8 /////////////////////////////////////////////////////////////////////////////// 9 10 #ifndef _WX_GTK_PRIVATE_STRING_H_ 11 #define _WX_GTK_PRIVATE_STRING_H_ 12 13 // ---------------------------------------------------------------------------- 14 // Convenience class for g_freeing a gchar* on scope exit automatically 15 // ---------------------------------------------------------------------------- 16 17 class wxGtkString 18 { 19 public: wxGtkString(gchar * s)20 explicit wxGtkString(gchar *s) : m_str(s) { } ~wxGtkString()21 ~wxGtkString() { g_free(m_str); } 22 c_str()23 const gchar *c_str() const { return m_str; } 24 25 operator gchar *() const { return m_str; } 26 27 private: 28 gchar *m_str; 29 30 wxDECLARE_NO_COPY_CLASS(wxGtkString); 31 }; 32 33 34 // ---------------------------------------------------------------------------- 35 // list for sorting collated strings 36 // ---------------------------------------------------------------------------- 37 38 #include "wx/string.h" 39 #include "wx/vector.h" 40 #include "wx/sharedptr.h" 41 42 class wxGtkCollatableString 43 { 44 public: wxGtkCollatableString(const wxString & label,gchar * key)45 wxGtkCollatableString( const wxString &label, gchar *key ) 46 { 47 m_label = label; 48 m_key = key; 49 } 50 ~wxGtkCollatableString()51 ~wxGtkCollatableString() 52 { 53 if (m_key) 54 g_free( m_key ); 55 } 56 57 wxString m_label; 58 gchar *m_key; 59 }; 60 61 class wxGtkCollatedArrayString 62 { 63 public: wxGtkCollatedArrayString()64 wxGtkCollatedArrayString() { } 65 Add(const wxString & new_label)66 int Add( const wxString &new_label ) 67 { 68 int index = 0; 69 70 gchar *new_key_lower = g_utf8_casefold( new_label.utf8_str(), -1); 71 gchar *new_key = g_utf8_collate_key( new_key_lower, -1); 72 g_free( new_key_lower ); 73 74 wxSharedPtr<wxGtkCollatableString> new_ptr( new wxGtkCollatableString( new_label, new_key ) ); 75 76 wxVector< wxSharedPtr<wxGtkCollatableString> >::iterator iter; 77 for (iter = m_list.begin(); iter != m_list.end(); ++iter) 78 { 79 wxSharedPtr<wxGtkCollatableString> ptr = *iter; 80 81 gchar *key = ptr->m_key; 82 if (strcmp(key,new_key) >= 0) 83 { 84 m_list.insert( iter, new_ptr ); 85 return index; 86 } 87 index ++; 88 } 89 90 m_list.push_back( new_ptr ); 91 return index; 92 } 93 GetCount()94 size_t GetCount() 95 { 96 return m_list.size(); 97 } 98 At(size_t index)99 wxString At( size_t index ) 100 { 101 return m_list[index]->m_label; 102 } 103 Clear()104 void Clear() 105 { 106 m_list.clear(); 107 } 108 RemoveAt(size_t index)109 void RemoveAt( size_t index ) 110 { 111 m_list.erase( m_list.begin() + index ); 112 } 113 114 private: 115 wxVector< wxSharedPtr<wxGtkCollatableString> > m_list; 116 }; 117 118 119 #endif // _WX_GTK_PRIVATE_STRING_H_ 120 121