]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/bmpcbox.cpp
   1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/gtk/bmpcboxg.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(m_widget
)->child 
); 
 126         gtk_entry_set_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
.SetPixbuf( 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 void wxBitmapComboBox::GTKInsertComboBoxTextItem( unsigned int n
, const wxString
& text 
) 
 282     GtkComboBox
* combobox 
= GTK_COMBO_BOX( m_widget 
); 
 283     GtkTreeModel 
*model 
= gtk_combo_box_get_model( combobox 
); 
 284     GtkListStore 
*store 
= GTK_LIST_STORE( model 
); 
 287     gtk_list_store_insert( store
, &iter
, n 
); 
 289     GValue value 
= { 0, }; 
 290     g_value_init( &value
, G_TYPE_STRING 
); 
 291     g_value_set_string( &value
, wxGTK_CONV( text 
) ); 
 292     gtk_list_store_set_value( store
, &iter
, m_stringCellIndex
, &value 
); 
 293     g_value_unset( &value 
); 
 296 // ---------------------------------------------------------------------------- 
 297 // wxTextEntry interface override 
 298 // ---------------------------------------------------------------------------- 
 300 void wxBitmapComboBox::WriteText(const wxString
& value
) 
 303         wxComboBox::WriteText(value
); 
 305         SetStringSelection(value
); 
 308 wxString 
wxBitmapComboBox::GetValue() const 
 311         return wxComboBox::GetValue(); 
 313     return GetStringSelection(); 
 316 void wxBitmapComboBox::Remove(long from
, long to
) 
 319         wxComboBox::Remove(from
, to
); 
 322 void wxBitmapComboBox::SetInsertionPoint(long pos
) 
 325         wxComboBox::SetInsertionPoint(pos
); 
 328 long wxBitmapComboBox::GetInsertionPoint() const 
 331         return wxComboBox::GetInsertionPoint(); 
 335 long wxBitmapComboBox::GetLastPosition() const 
 338         return wxComboBox::GetLastPosition(); 
 343 void wxBitmapComboBox::SetSelection(long from
, long to
) 
 346         wxComboBox::SetSelection(from
, to
); 
 349 void wxBitmapComboBox::GetSelection(long *from
, long *to
) const 
 352         wxComboBox::GetSelection(from
, to
); 
 355 bool wxBitmapComboBox::IsEditable() const 
 358         return wxTextEntry::IsEditable(); 
 363 void wxBitmapComboBox::SetEditable(bool editable
) 
 366         wxComboBox::SetEditable(editable
); 
 369 #endif // wxUSE_BITMAPCOMBOBOX