gdk_threads_enter();
gtk_idle_remove( data->m_tag );
-
+
data->m_listbox->SetFirstItem( data->m_item );
-
+
delete data;
-
+
gdk_threads_leave();
return TRUE;
// eat return in all modes
ret = TRUE;
}
-
+
#if wxUSE_CHECKLISTBOX
if ((gdk_event->keyval == ' ') && (listbox->m_hasCheckBoxes) && (!ret))
{
m_hasVMT = FALSE;
Clear();
-
+
if (m_strings)
delete m_strings;
}
for (size_t n = 0; n < nItems; n++)
{
index = m_strings->Add( items[n] );
-
+
if (index != GetCount())
{
GtkAddItem( items[n], index );
if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_list))
return;
-
- // terribly efficient
+
+ // terribly efficient
const gchar *vadjustment_key = "gtk-vadjustment";
guint vadjustment_key_id = g_quark_from_static_string (vadjustment_key);
-
- GtkAdjustment *adjustment =
+
+ GtkAdjustment *adjustment =
(GtkAdjustment*) gtk_object_get_data_by_id (GTK_OBJECT (m_list), vadjustment_key_id);
wxCHECK_RET( adjustment, wxT("invalid listbox code") );
GList *target = g_list_nth( m_list->children, n );
wxCHECK_RET( target, wxT("invalid listbox index") );
-
+
GtkWidget *item = GTK_WIDGET(target->data);
wxCHECK_RET( item, wxT("invalid listbox code") );
data->m_listbox = this;
data->m_item = n;
data->m_tag = gtk_idle_add_priority( 800, wxlistbox_idle_callback, (gpointer) data );
-
+
return;
}
gtk_signal_disconnect_by_func( GTK_OBJECT(child->data),
GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
- if (HasFlag(wxLB_MULTIPLE))
+ if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED))
gtk_signal_disconnect_by_func( GTK_OBJECT(child->data),
GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this );
gtk_signal_connect( GTK_OBJECT(child->data), "select",
GTK_SIGNAL_FUNC(gtk_listitem_select_callback), (gpointer)this );
- if (HasFlag(wxLB_MULTIPLE))
+ if (HasFlag(wxLB_MULTIPLE) || HasFlag(wxLB_EXTENDED))
gtk_signal_connect( GTK_OBJECT(child->data), "deselect",
GTK_SIGNAL_FUNC(gtk_listitem_deselect_callback), (gpointer)this );
wxSize wxListBox::DoGetBestSize() const
{
- return wxSize(100, 110);
+ int lbWidth = 100; // some defaults
+ int lbHeight = 110;
+ int wLine;
+
+ // Find the widest line
+ for(int i = 0; i < GetCount(); i++) {
+ wxString str(GetString(i));
+ GetTextExtent(str, &wLine, NULL);
+ lbWidth = wxMax(lbWidth, wLine);
+ }
+
+ // Add room for the scrollbar
+ lbWidth += wxSystemSettings::GetSystemMetric(wxSYS_VSCROLL_X);
+
+ // And just a bit more
+ int cx, cy;
+ GetTextExtent("X", &cx, &cy);
+ lbWidth += 3 * cx;
+
+ // don't make the listbox too tall (limit height to around 10 items) but don't
+ // make it too small neither
+ lbHeight = (cy+4) * wxMin(wxMax(GetCount(), 3), 10);
+
+ return wxSize(lbWidth, lbHeight);
}
#endif