]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/combobox.cpp
Implementation of wxFopen, wxFreopen, wxStrftime
[wxWidgets.git] / src / gtk / combobox.cpp
index 91ed541378e17894c9929c9dba55bb468e8c782f..20718dfae39cdb4da9be9a2883f05c6121b9d345 100644 (file)
 #endif
 
 #include "wx/combobox.h"
-#include "wx/settings.h"
 
-#include <wx/intl.h>
+#if wxUSE_COMBOBOX
+
+#include "wx/settings.h"
+#include "wx/intl.h"
 
 #include "gdk/gdk.h"
 #include "gtk/gtk.h"
@@ -41,7 +43,7 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
     if (g_isIdle) wxapp_install_idle_handler();
 
-    if (!combo->HasVMT()) return;
+    if (!combo->m_hasVMT) return;
 
     if (g_blockEventsOnDrag) return;
 
@@ -70,6 +72,8 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 {
     if (g_isIdle) wxapp_install_idle_handler();
     
+    if (!combo->m_hasVMT) return;
+
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
     event.SetString( combo->GetValue() );
     event.SetEventObject( combo );
@@ -99,7 +103,9 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
 
     PreCreation( parent, id, pos, size, style, name );
 
+#if wxUSE_VALIDATORS
     SetValidator( validator );
+#endif
 
     m_widget = gtk_combo_new();
 
@@ -134,9 +140,7 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
         gtk_widget_show( list_item );
     }
 
-    m_parent->AddChild( this );
-
-    (m_parent->m_insertCallback)( m_parent, this );
+    m_parent->DoAddChild( this );
 
     PostCreation();
 
@@ -161,13 +165,15 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
 
 wxComboBox::~wxComboBox()
 {
-    wxNode *node = m_clientDataList.First();
+    wxNode *node = m_clientObjectList.First();
     while (node)
     {
         wxClientData *cd = (wxClientData*)node->Data();
         if (cd) delete cd;
         node = node->Next();
     }
+    m_clientObjectList.Clear();
+
     m_clientDataList.Clear();
 }
 
@@ -416,8 +422,12 @@ void wxComboBox::SetSelection( int n )
 {
     wxCHECK_RET( m_widget != NULL, _T("invalid combobox") );
 
+    DisableEvents();
+
     GtkWidget *list = GTK_COMBO(m_widget)->list;
     gtk_list_select_item( GTK_LIST(list), n );
+
+    EnableEvents();
 }
 
 void wxComboBox::SetStringSelection( const wxString &string )
@@ -580,17 +590,43 @@ void wxComboBox::OnChar( wxKeyEvent &event )
     event.Skip();
 }
 
+void wxComboBox::DisableEvents()
+{
+    GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list );
+    GList *child = list->children;
+    while (child)
+    {
+        gtk_signal_disconnect_by_func( GTK_OBJECT(child->data), 
+          GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this );
+
+        child = child->next;
+    }
+}
+
+void wxComboBox::EnableEvents()
+{
+    GtkList *list = GTK_LIST( GTK_COMBO(m_widget)->list );
+    GList *child = list->children;
+    while (child)
+    {
+        gtk_signal_connect( GTK_OBJECT(child->data), "select",
+          GTK_SIGNAL_FUNC(gtk_combo_clicked_callback), (gpointer)this );
+
+        child = child->next;
+    }
+}
+
 void wxComboBox::OnSize( wxSizeEvent &event )
 {
-    wxControl::OnSize( event );
+    event.Skip();
+    
+    return;
 
-/*
     int w = 21;
     gtk_widget_set_usize( GTK_COMBO(m_widget)->entry, m_width-w-1, m_height );
 
     gtk_widget_set_uposition( GTK_COMBO(m_widget)->button, m_x+m_width-w, m_y );
     gtk_widget_set_usize( GTK_COMBO(m_widget)->button, w, m_height );
-*/
 }
 
 void wxComboBox::ApplyWidgetStyle()
@@ -625,3 +661,4 @@ bool wxComboBox::IsOwnGtkWindow( GdkWindow *window )
              (window == GTK_COMBO(m_widget)->button->window ) );
 }
 
+#endif