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