]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/combobox.cpp
Fix DrawRotatedtext to behave more like wxMSW: take into account
[wxWidgets.git] / src / gtk / combobox.cpp
index 8ed30aed1068ab60622e86846e0d2926130659c2..43f76581b634df122a8d2f0e6fea6d0d76e887f9 100644 (file)
@@ -63,6 +63,8 @@ gtk_combo_clicked_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
         GtkWidget *list = GTK_COMBO(combo->m_widget)->list;
         gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection );
     }
         GtkWidget *list = GTK_COMBO(combo->m_widget)->list;
         gtk_list_unselect_item( GTK_LIST(list), combo->m_prevSelection );
     }
+    else if ((curSelection >= 0) && (combo->GetString(curSelection) == combo->GetValue()))
+        return;
 
     combo->m_prevSelection = curSelection;
 
 
     combo->m_prevSelection = curSelection;
 
@@ -85,6 +87,13 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxComboBox *combo )
 
     if (!combo->m_hasVMT) return;
 
 
     if (!combo->m_hasVMT) return;
 
+    // avoids double events when the GetValue = one of the selections
+    if (combo->m_alreadySent)
+    {
+        combo->m_alreadySent = FALSE;
+        return;
+    }
+
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
     event.SetString( combo->GetValue() );
     event.SetEventObject( combo );
     wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, combo->GetId() );
     event.SetString( combo->GetValue() );
     event.SetEventObject( combo );
@@ -128,7 +137,6 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
     // and case-sensitive
     gtk_combo_set_case_sensitive( GTK_COMBO(m_widget), TRUE );
 
     // and case-sensitive
     gtk_combo_set_case_sensitive( GTK_COMBO(m_widget), TRUE );
 
-
     GtkWidget *list = GTK_COMBO(m_widget)->list;
 
 #ifndef __WXGTK20__
     GtkWidget *list = GTK_COMBO(m_widget)->list;
 
 #ifndef __WXGTK20__
@@ -197,12 +205,12 @@ bool wxComboBox::Create( wxWindow *parent, wxWindowID id, const wxString& value,
 
 wxComboBox::~wxComboBox()
 {
 
 wxComboBox::~wxComboBox()
 {
-    wxNode *node = m_clientObjectList.First();
+    wxNode *node = m_clientObjectList.GetFirst();
     while (node)
     {
     while (node)
     {
-        wxClientData *cd = (wxClientData*)node->Data();
+        wxClientData *cd = (wxClientData*)node->GetData();
         if (cd) delete cd;
         if (cd) delete cd;
-        node = node->Next();
+        node = node->GetNext();
     }
     m_clientObjectList.Clear();
 
     }
     m_clientObjectList.Clear();
 
@@ -272,7 +280,7 @@ void wxComboBox::SetClientData( int n, void* clientData )
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
 
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
 
-    wxNode *node = m_clientDataList.Nth( n );
+    wxNode *node = m_clientDataList.Item( n );
     if (!node) return;
 
     node->SetData( (wxObject*) clientData );
     if (!node) return;
 
     node->SetData( (wxObject*) clientData );
@@ -282,20 +290,20 @@ void* wxComboBox::GetClientData( int n )
 {
     wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, NULL, wxT("invalid combobox") );
 
-    wxNode *node = m_clientDataList.Nth( n );
+    wxNode *node = m_clientDataList.Item( n );
     if (!node) return NULL;
 
     if (!node) return NULL;
 
-    return node->Data();
+    return node->GetData();
 }
 
 void wxComboBox::SetClientObject( int n, wxClientData* clientData )
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
 
 }
 
 void wxComboBox::SetClientObject( int n, wxClientData* clientData )
 {
     wxCHECK_RET( m_widget != NULL, wxT("invalid combobox") );
 
-    wxNode *node = m_clientObjectList.Nth( n );
+    wxNode *node = m_clientObjectList.Item( n );
     if (!node) return;
 
     if (!node) return;
 
-    wxClientData *cd = (wxClientData*) node->Data();
+    wxClientData *cd = (wxClientData*) node->GetData();
     if (cd) delete cd;
 
     node->SetData( (wxObject*) clientData );
     if (cd) delete cd;
 
     node->SetData( (wxObject*) clientData );
@@ -305,10 +313,10 @@ wxClientData* wxComboBox::GetClientObject( int n )
 {
     wxCHECK_MSG( m_widget != NULL, (wxClientData*)NULL, wxT("invalid combobox") );
 
 {
     wxCHECK_MSG( m_widget != NULL, (wxClientData*)NULL, wxT("invalid combobox") );
 
-    wxNode *node = m_clientObjectList.Nth( n );
+    wxNode *node = m_clientObjectList.Item( n );
     if (!node) return (wxClientData*) NULL;
 
     if (!node) return (wxClientData*) NULL;
 
-    return (wxClientData*) node->Data();
+    return (wxClientData*) node->GetData();
 }
 
 void wxComboBox::Clear()
 }
 
 void wxComboBox::Clear()
@@ -318,12 +326,12 @@ void wxComboBox::Clear()
     GtkWidget *list = GTK_COMBO(m_widget)->list;
     gtk_list_clear_items( GTK_LIST(list), 0, Number() );
 
     GtkWidget *list = GTK_COMBO(m_widget)->list;
     gtk_list_clear_items( GTK_LIST(list), 0, Number() );
 
-    wxNode *node = m_clientObjectList.First();
+    wxNode *node = m_clientObjectList.GetFirst();
     while (node)
     {
     while (node)
     {
-        wxClientData *cd = (wxClientData*)node->Data();
+        wxClientData *cd = (wxClientData*)node->GetData();
         if (cd) delete cd;
         if (cd) delete cd;
-        node = node->Next();
+        node = node->GetNext();
     }
     m_clientObjectList.Clear();
 
     }
     m_clientObjectList.Clear();
 
@@ -348,15 +356,15 @@ void wxComboBox::Delete( int n )
     gtk_list_remove_items( listbox, list );
     g_list_free( list );
 
     gtk_list_remove_items( listbox, list );
     g_list_free( list );
 
-    wxNode *node = m_clientObjectList.Nth( n );
+    wxNode *node = m_clientObjectList.Item( n );
     if (node)
     {
     if (node)
     {
-        wxClientData *cd = (wxClientData*)node->Data();
+        wxClientData *cd = (wxClientData*)node->GetData();
         if (cd) delete cd;
         m_clientObjectList.DeleteNode( node );
     }
 
         if (cd) delete cd;
         m_clientObjectList.DeleteNode( node );
     }
 
-    node = m_clientDataList.Nth( n );
+    node = m_clientDataList.Item( n );
     if (node)
     {
         m_clientDataList.DeleteNode( node );
     if (node)
     {
         m_clientDataList.DeleteNode( node );
@@ -614,57 +622,31 @@ void wxComboBox::SetEditable( bool editable )
 
 void wxComboBox::OnChar( wxKeyEvent &event )
 {
 
 void wxComboBox::OnChar( wxKeyEvent &event )
 {
-    if ( event.KeyCode() == WXK_RETURN )
+    if ( event.GetKeyCode() == WXK_RETURN )
     {
         wxString value = GetValue();
     {
         wxString value = GetValue();
+        int selection = GetSelection();
 
 
-        if ( Number() == 0 )
+        // note that gtk automatically selects an item if its in the list
+        // so you don't have to call FindString
+        if ((selection >= 0) && (GetString(selection) == value))
         {
         {
-            // make Enter generate "selected" event if there is only one item
-            // in the combobox - without it, it's impossible to select it at
-            // all!
+            // make Enter generate "selected" event if it equals an item
             wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() );
             wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() );
-            event.SetInt( 0 );
+            event.SetInt( selection );
             event.SetString( value );
             event.SetEventObject( this );
             GetEventHandler()->ProcessEvent( event );
         }
         else
         {
             event.SetString( value );
             event.SetEventObject( this );
             GetEventHandler()->ProcessEvent( event );
         }
         else
         {
-            // add the item to the list if it's not there yet
-            if ( FindString(value) == wxNOT_FOUND )
-            {
-                Append(value);
-                SetStringSelection(value);
-
-                // and generate the selected event for it
-                wxCommandEvent event( wxEVT_COMMAND_COMBOBOX_SELECTED, GetId() );
-                event.SetInt( Number() - 1 );
-                event.SetString( value );
-                event.SetEventObject( this );
-                GetEventHandler()->ProcessEvent( event );
-            }
-
-            // This will invoke the dialog default action, such
-            // as the clicking the default button.
-
-            wxWindow *top_frame = m_parent;
-            while (top_frame->GetParent() && !(top_frame->IsTopLevel()))
-            top_frame = top_frame->GetParent();
-    
-            if (top_frame && GTK_IS_WINDOW(top_frame->m_widget))
-            {
-                GtkWindow *window = GTK_WINDOW(top_frame->m_widget);
-
-                if (window->default_widget)
-                {
-                    gtk_widget_activate (window->default_widget);
-                    return;
-                }
-            }
-            
-            return;
+            wxCommandEvent event(wxEVT_COMMAND_TEXT_ENTER, GetId());
+            event.SetString(value);
+            event.SetInt(selection);
+            event.SetEventObject( this );
+            GetEventHandler()->ProcessEvent( event );
         }
         }
+        return;
     }
     
     event.Skip();
     }
     
     event.Skip();