- wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") );
-
- wxList::compatibility_iterator node = m_clientDataList.Item( n );
-
- return node ? node->GetData() : NULL;
-}
-
-void wxComboBox::DoSetItemClientObject( int n, wxClientData* clientData )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- wxList::compatibility_iterator node = m_clientObjectList.Item( n );
- if (!node) return;
-
- // wxItemContainer already deletes data for us
-
- node->SetData( (wxObject*) clientData );
-}
-
-wxClientData* wxComboBox::DoGetItemClientObject( int n ) const
-{
- wxCHECK_MSG( m_widget != NULL, (wxClientData*)NULL, wxT("invalid combobox") );
-
- wxList::compatibility_iterator node = m_clientObjectList.Item( n );
-
- return node ? (wxClientData*) node->GetData() : NULL;
-}
-
-void wxComboBox::Clear()
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- DisableEvents();
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
- gtk_list_clear_items( GTK_LIST(list), 0, GetCount() );
-
- wxList::compatibility_iterator node = m_clientObjectList.GetFirst();
- while (node)
- {
- wxClientData *cd = (wxClientData*)node->GetData();
- if (cd) delete cd;
- node = node->GetNext();
- }
- m_clientObjectList.Clear();
-
- m_clientDataList.Clear();
-
- EnableEvents();
-
- InvalidateBestSize();
-}
-
-void wxComboBox::Delete( int n )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkList *listbox = GTK_LIST( GTK_COMBO(m_widget)->list );
-
- GList *child = g_list_nth( listbox->children, n );
-
- if (!child)
- {
- wxFAIL_MSG(wxT("wrong index"));
- return;
- }
-
- DisableEvents();
-
- GList *list = g_list_append( (GList*) NULL, child->data );
- gtk_list_remove_items( listbox, list );
- g_list_free( list );
-
- wxList::compatibility_iterator node = m_clientObjectList.Item( n );
- if (node)
- {
- wxClientData *cd = (wxClientData*)node->GetData();
- if (cd) delete cd;
- m_clientObjectList.Erase( node );
- }
-
- node = m_clientDataList.Item( n );
- if (node)
- m_clientDataList.Erase( node );
-
- EnableEvents();
-
- InvalidateBestSize();
-}
-
-void wxComboBox::SetString(int n, const wxString &text)
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- GList *child = g_list_nth( GTK_LIST(list)->children, n );
- if (child)
- {
- GtkBin *bin = GTK_BIN( child->data );
- GtkLabel *label = GTK_LABEL( bin->child );
- gtk_label_set_text(label, wxGTK_CONV(text));
- }
- else
- {
- wxFAIL_MSG( wxT("wxComboBox: wrong index") );
- }
-
- InvalidateBestSize();
-}
-
-int wxComboBox::FindString( const wxString &item ) const
-{
- wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- GList *child = GTK_LIST(list)->children;
- int count = 0;
- while (child)
- {
- GtkBin *bin = GTK_BIN( child->data );
- GtkLabel *label = GTK_LABEL( bin->child );
-#ifdef __WXGTK20__
- wxString str( wxGTK_CONV_BACK( gtk_label_get_text(label) ) );
-#else
- wxString str( label->label );
-#endif
- if (item == str)
- return count;
-
- count++;
- child = child->next;
- }
-
- return wxNOT_FOUND;
-}
-
-int wxComboBox::GetSelection() const
-{
- wxCHECK_MSG( m_widget != NULL, -1, wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- GList *selection = GTK_LIST(list)->selection;
- if (selection)
- {
- GList *child = GTK_LIST(list)->children;
- int count = 0;
- while (child)
- {
- if (child->data == selection->data) return count;
- count++;
- child = child->next;
- }
- }
-
- return -1;
-}
-
-wxString wxComboBox::GetString( int n ) const
-{
- wxCHECK_MSG( m_widget != NULL, wxT(""), wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- wxString str;
- GList *child = g_list_nth( GTK_LIST(list)->children, n );
- if (child)
- {
- GtkBin *bin = GTK_BIN( child->data );
- GtkLabel *label = GTK_LABEL( bin->child );
-#ifdef __WXGTK20__
- str = wxGTK_CONV_BACK( gtk_label_get_text(label) );
-#else
- str = wxString( label->label );
-#endif
- }
- else
- {
- wxFAIL_MSG( wxT("wxComboBox: wrong index") );
- }
-
- return str;
-}
-
-wxString wxComboBox::GetStringSelection() const
-{
- wxCHECK_MSG( m_widget != NULL, wxT(""), wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- GList *selection = GTK_LIST(list)->selection;
- if (selection)
- {
- GtkBin *bin = GTK_BIN( selection->data );
- GtkLabel *label = GTK_LABEL( bin->child );
-#ifdef __WXGTK20__
- wxString tmp( wxGTK_CONV_BACK( gtk_label_get_text(label) ) );
-#else
- wxString tmp( label->label );
-#endif
- return tmp;
- }
-
- wxFAIL_MSG( wxT("wxComboBox: no selection") );
-
- return wxT("");
-}
-
-int wxComboBox::GetCount() const
-{
- wxCHECK_MSG( m_widget != NULL, 0, wxT("invalid combobox") );
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
-
- GList *child = GTK_LIST(list)->children;
- int count = 0;
- while (child) { count++; child = child->next; }
- return count;
-}
-
-void wxComboBox::SetSelection( int n )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- DisableEvents();
-
- GtkWidget *list = GTK_COMBO(m_widget)->list;
- gtk_list_unselect_item( GTK_LIST(list), m_prevSelection );
- gtk_list_select_item( GTK_LIST(list), n );
- m_prevSelection = n;
-
- EnableEvents();
-}
-
-bool wxComboBox::SetStringSelection( const wxString &string )
-{
- wxCHECK_MSG( m_widget != NULL, false, wxT("invalid combobox") );
-
- int res = FindString( string );
- if (res == -1) return false;
- SetSelection( res );
- return true;
-}
-
-wxString wxComboBox::GetValue() const
-{
- GtkEntry *entry = GTK_ENTRY( GTK_COMBO(m_widget)->entry );
- wxString tmp( wxGTK_CONV_BACK( gtk_entry_get_text( entry ) ) );
-
-#if 0
- for (int i = 0; i < wxStrlen(tmp.c_str()) +1; i++)
- {
- wxChar c = tmp[i];
- printf( "%d ", (int) (c) );
- }
- printf( "\n" );
-#endif
-
- return tmp;
-}
-
-void wxComboBox::SetValue( const wxString& value )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- wxString tmp = wxT("");
- if (!value.IsNull()) tmp = value;
- gtk_entry_set_text( GTK_ENTRY(entry), wxGTK_CONV( tmp ) );
-
- InvalidateBestSize();
-}
-
-void wxComboBox::Copy()
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_editable_copy_clipboard( GTK_EDITABLE(entry) DUMMY_CLIPBOARD_ARG );
-}
-
-void wxComboBox::Cut()
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_editable_cut_clipboard( GTK_EDITABLE(entry) DUMMY_CLIPBOARD_ARG );
-}
-
-void wxComboBox::Paste()
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_editable_paste_clipboard( GTK_EDITABLE(entry) DUMMY_CLIPBOARD_ARG);
-}
-
-void wxComboBox::Undo()
-{
- // TODO
-}
-
-void wxComboBox::Redo()
-{
- // TODO
-}
-
-void wxComboBox::SelectAll()
-{
- SetSelection(0, GetLastPosition());
-}
-
-bool wxComboBox::CanUndo() const
-{
- // TODO
- return false;
-}
-
-bool wxComboBox::CanRedo() const
-{
- // TODO
- return false;
-}
-
-bool wxComboBox::HasSelection() const
-{
- long from, to;
- GetSelection(&from, &to);
- return from != to;
-}
-
-bool wxComboBox::CanCopy() const
-{
- // Can copy if there's a selection
- return HasSelection();
-}
-
-bool wxComboBox::CanCut() const
-{
- return CanCopy() && IsEditable();
-}
-
-bool wxComboBox::CanPaste() const
-{
- // TODO: check for text on the clipboard
- return IsEditable() ;
-}
-
-bool wxComboBox::IsEditable() const
-{
- return !HasFlag(wxCB_READONLY);
-}
-
-
-void wxComboBox::SetInsertionPoint( long pos )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- if ( pos == GetLastPosition() )
- pos = -1;
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_entry_set_position( GTK_ENTRY(entry), (int)pos );
-}
-
-long wxComboBox::GetInsertionPoint() const
-{
- return (long) GET_EDITABLE_POS( GTK_COMBO(m_widget)->entry );
-}
-
-wxTextPos wxComboBox::GetLastPosition() const
-{
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- int pos = GTK_ENTRY(entry)->text_length;
- return (long) pos-1;
-}
-
-void wxComboBox::Replace( long from, long to, const wxString& value )
-{
- wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
-
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_editable_delete_text( GTK_EDITABLE(entry), (gint)from, (gint)to );
- if (value.IsNull()) return;
- gint pos = (gint)to;
-
-#if wxUSE_UNICODE
- wxCharBuffer buffer = wxConvUTF8.cWX2MB( value );
- gtk_editable_insert_text( GTK_EDITABLE(entry), (const char*) buffer, strlen( (const char*) buffer ), &pos );
-#else
- gtk_editable_insert_text( GTK_EDITABLE(entry), value.c_str(), value.Length(), &pos );
-#endif
-}
-
-void wxComboBox::SetSelection( long from, long to )
-{
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_editable_select_region( GTK_EDITABLE(entry), (gint)from, (gint)to );
-}
-
-void wxComboBox::GetSelection( long* from, long* to ) const
-{
- if (IsEditable())
- {
- GtkEditable *editable = GTK_EDITABLE(GTK_COMBO(m_widget)->entry);
-#ifdef __WXGTK20__
- gint start, end;
- gtk_editable_get_selection_bounds(editable, & start, & end);
- *from = start;
- *to = end;
-#else
- *from = (long) editable->selection_start_pos;
- *to = (long) editable->selection_end_pos;
-#endif
- }
-}
-
-void wxComboBox::SetEditable( bool editable )
-{
- GtkWidget *entry = GTK_COMBO(m_widget)->entry;
- gtk_entry_set_editable( GTK_ENTRY(entry), editable );