]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/bmpcbox.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/gtk/bmpcbox.cpp
3 // Purpose: wxBitmapComboBox
4 // Author: Jaakko Salli
7 // Copyright: (c) 2008 Jaakko Salli
8 // Licence: wxWindows licence
9 /////////////////////////////////////////////////////////////////////////////
11 // ============================================================================
13 // ============================================================================
15 // ----------------------------------------------------------------------------
17 // ----------------------------------------------------------------------------
19 #include "wx/wxprec.h"
25 #if wxUSE_BITMAPCOMBOBOX
27 #include "wx/bmpcbox.h"
33 #include "wx/gtk/private.h"
35 // ============================================================================
37 // ============================================================================
40 IMPLEMENT_DYNAMIC_CLASS(wxBitmapComboBox
, wxComboBox
)
43 // ----------------------------------------------------------------------------
44 // wxBitmapComboBox creation
45 // ----------------------------------------------------------------------------
47 void wxBitmapComboBox::Init()
49 m_bitmapCellIndex
= 0;
50 m_stringCellIndex
= 1;
51 m_bitmapSize
= wxSize(-1, -1);
54 wxBitmapComboBox::wxBitmapComboBox(wxWindow
*parent
,
56 const wxString
& value
,
59 const wxArrayString
& choices
,
61 const wxValidator
& validator
,
64 wxBitmapComboBoxBase()
68 Create(parent
,id
,value
,pos
,size
,choices
,style
,validator
,name
);
71 bool wxBitmapComboBox::Create(wxWindow
*parent
,
73 const wxString
& value
,
76 const wxArrayString
& choices
,
78 const wxValidator
& validator
,
81 wxCArrayString
chs(choices
);
82 return Create(parent
, id
, value
, pos
, size
, chs
.GetCount(),
83 chs
.GetStrings(), style
, validator
, name
);
86 bool wxBitmapComboBox::Create(wxWindow
*parent
,
88 const wxString
& value
,
92 const wxString choices
[],
94 const wxValidator
& validator
,
97 if ( !wxComboBox::Create(parent
, id
, value
, pos
, size
,
98 n
, choices
, style
, validator
, name
) )
101 // Select 'value' in entry-less mode
104 int n
= FindString(value
);
105 if ( n
!= wxNOT_FOUND
)
112 void wxBitmapComboBox::GTKCreateComboBoxWidget()
116 store
= gtk_list_store_new( 2, G_TYPE_OBJECT
, G_TYPE_STRING
);
118 if ( HasFlag(wxCB_READONLY
) )
120 m_widget
= gtk_combo_box_new_with_model( GTK_TREE_MODEL(store
) );
124 m_widget
= gtk_combo_box_entry_new_with_model( GTK_TREE_MODEL(store
), m_stringCellIndex
);
125 m_entry
= GTK_ENTRY(gtk_bin_get_child(GTK_BIN(m_widget
)));
126 gtk_editable_set_editable(GTK_EDITABLE(m_entry
), true);
128 g_object_ref(m_widget
);
130 // This must be called as gtk_combo_box_entry_new_with_model adds
131 // automatically adds one text column.
132 gtk_cell_layout_clear( GTK_CELL_LAYOUT(m_widget
) );
134 GtkCellRenderer
* imageRenderer
= gtk_cell_renderer_pixbuf_new();
135 gtk_cell_layout_pack_start( GTK_CELL_LAYOUT(m_widget
),
136 imageRenderer
, FALSE
);
137 gtk_cell_layout_add_attribute( GTK_CELL_LAYOUT(m_widget
),
138 imageRenderer
, "pixbuf", 0);
140 GtkCellRenderer
* textRenderer
= gtk_cell_renderer_text_new();
141 gtk_cell_layout_pack_end( GTK_CELL_LAYOUT(m_widget
),
142 textRenderer
, TRUE
);
143 gtk_cell_layout_add_attribute( GTK_CELL_LAYOUT(m_widget
),
144 textRenderer
, "text", 1);
147 wxBitmapComboBox::~wxBitmapComboBox()
151 GtkWidget
* wxBitmapComboBox::GetConnectWidget()
154 return wxComboBox::GetConnectWidget();
156 return wxChoice::GetConnectWidget();
159 GdkWindow
*wxBitmapComboBox::GTKGetWindow(wxArrayGdkWindows
& windows
) const
162 return wxComboBox::GTKGetWindow(windows
);
164 return wxChoice::GTKGetWindow(windows
);
167 wxSize
wxBitmapComboBox::DoGetBestSize() const
169 wxSize best
= wxComboBox::DoGetBestSize();
171 int delta
= GetBitmapSize().y
- GetCharHeight();
180 // ----------------------------------------------------------------------------
182 // ----------------------------------------------------------------------------
184 void wxBitmapComboBox::SetItemBitmap(unsigned int n
, const wxBitmap
& bitmap
)
188 if ( m_bitmapSize
.x
< 0 )
190 m_bitmapSize
.x
= bitmap
.GetWidth();
191 m_bitmapSize
.y
= bitmap
.GetHeight();
194 GtkComboBox
* combobox
= GTK_COMBO_BOX( m_widget
);
195 GtkTreeModel
*model
= gtk_combo_box_get_model( combobox
);
198 if ( gtk_tree_model_iter_nth_child( model
, &iter
, NULL
, n
) )
200 GValue value0
= { 0, };
201 g_value_init( &value0
, G_TYPE_OBJECT
);
202 g_value_set_object( &value0
, bitmap
.GetPixbuf() );
203 gtk_list_store_set_value( GTK_LIST_STORE(model
), &iter
,
204 m_bitmapCellIndex
, &value0
);
205 g_value_unset( &value0
);
210 wxBitmap
wxBitmapComboBox::GetItemBitmap(unsigned int n
) const
214 GtkComboBox
* combobox
= GTK_COMBO_BOX( m_widget
);
215 GtkTreeModel
*model
= gtk_combo_box_get_model( combobox
);
218 if (gtk_tree_model_iter_nth_child (model
, &iter
, NULL
, n
))
220 GValue value
= { 0, };
221 gtk_tree_model_get_value( model
, &iter
,
222 m_bitmapCellIndex
, &value
);
223 GdkPixbuf
* pixbuf
= (GdkPixbuf
*) g_value_get_object( &value
);
226 g_object_ref( pixbuf
);
227 bitmap
= wxBitmap(pixbuf
);
229 g_value_unset( &value
);
235 int wxBitmapComboBox::Append(const wxString
& item
, const wxBitmap
& bitmap
)
237 const int n
= wxComboBox::Append(item
);
238 if ( n
!= wxNOT_FOUND
)
239 SetItemBitmap(n
, bitmap
);
243 int wxBitmapComboBox::Append(const wxString
& item
, const wxBitmap
& bitmap
,
246 const int n
= wxComboBox::Append(item
, clientData
);
247 if ( n
!= wxNOT_FOUND
)
248 SetItemBitmap(n
, bitmap
);
252 int wxBitmapComboBox::Append(const wxString
& item
, const wxBitmap
& bitmap
,
253 wxClientData
*clientData
)
255 const int n
= wxComboBox::Append(item
, clientData
);
256 if ( n
!= wxNOT_FOUND
)
257 SetItemBitmap(n
, bitmap
);
261 int wxBitmapComboBox::Insert(const wxString
& item
,
262 const wxBitmap
& bitmap
,
265 const int n
= wxComboBox::Insert(item
, pos
);
266 if ( n
!= wxNOT_FOUND
)
267 SetItemBitmap(n
, bitmap
);
271 int wxBitmapComboBox::Insert(const wxString
& item
, const wxBitmap
& bitmap
,
272 unsigned int pos
, wxClientData
*clientData
)
274 const int n
= wxComboBox::Insert(item
, pos
, clientData
);
275 if ( n
!= wxNOT_FOUND
)
276 SetItemBitmap(n
, bitmap
);
280 int wxBitmapComboBox::Insert(const wxString
& item
, const wxBitmap
& bitmap
,
281 unsigned int pos
, void *clientData
)
283 const int n
= wxComboBox::Insert(item
, pos
, clientData
);
284 if ( n
!= wxNOT_FOUND
)
285 SetItemBitmap(n
, bitmap
);
289 void wxBitmapComboBox::GTKInsertComboBoxTextItem( unsigned int n
, const wxString
& text
)
291 GtkComboBox
* combobox
= GTK_COMBO_BOX( m_widget
);
292 GtkTreeModel
*model
= gtk_combo_box_get_model( combobox
);
293 GtkListStore
*store
= GTK_LIST_STORE( model
);
296 gtk_list_store_insert( store
, &iter
, n
);
298 GValue value
= { 0, };
299 g_value_init( &value
, G_TYPE_STRING
);
300 g_value_set_string( &value
, wxGTK_CONV( text
) );
301 gtk_list_store_set_value( store
, &iter
, m_stringCellIndex
, &value
);
302 g_value_unset( &value
);
305 // ----------------------------------------------------------------------------
306 // wxTextEntry interface override
307 // ----------------------------------------------------------------------------
309 void wxBitmapComboBox::WriteText(const wxString
& value
)
312 wxComboBox::WriteText(value
);
314 SetStringSelection(value
);
317 wxString
wxBitmapComboBox::GetValue() const
320 return wxComboBox::GetValue();
322 return GetStringSelection();
325 void wxBitmapComboBox::Remove(long from
, long to
)
328 wxComboBox::Remove(from
, to
);
331 void wxBitmapComboBox::SetInsertionPoint(long pos
)
334 wxComboBox::SetInsertionPoint(pos
);
337 long wxBitmapComboBox::GetInsertionPoint() const
340 return wxComboBox::GetInsertionPoint();
344 long wxBitmapComboBox::GetLastPosition() const
347 return wxComboBox::GetLastPosition();
352 void wxBitmapComboBox::SetSelection(long from
, long to
)
355 wxComboBox::SetSelection(from
, to
);
358 void wxBitmapComboBox::GetSelection(long *from
, long *to
) const
361 wxComboBox::GetSelection(from
, to
);
364 bool wxBitmapComboBox::IsEditable() const
367 return wxTextEntry::IsEditable();
372 void wxBitmapComboBox::SetEditable(bool editable
)
375 wxComboBox::SetEditable(editable
);
378 #endif // wxUSE_BITMAPCOMBOBOX