+ wxCHECK_RET( m_treeview, wxT("invalid listbox") );
+ wxCHECK_RET( IsValid(n), wxT("invalid index"));
+
+ //RN: I have no idea why this line is needed...
+ if (gdk_pointer_is_grabbed () && GTK_WIDGET_HAS_GRAB (m_treeview))
+ return;
+
+ GtkTreeIter iter;
+ if ( !GtkGetIteratorFor(n, &iter) )
+ return;
+
+ GtkTreePath* path = gtk_tree_model_get_path(
+ GTK_TREE_MODEL(m_liststore), &iter);
+
+ // Scroll to the desired cell (0.0 == topleft alignment)
+ gtk_tree_view_scroll_to_cell(m_treeview, path, NULL,
+ TRUE, 0.0f, 0.0f);
+
+ gtk_tree_path_free(path);
+}
+
+// ----------------------------------------------------------------------------
+// hittest
+// ----------------------------------------------------------------------------
+
+int wxListBox::DoListHitTest(const wxPoint& point) const
+{
+ // gtk_tree_view_get_path_at_pos() also gets items that are not visible and
+ // we only want visible items we need to check for it manually here
+ if ( !GetClientRect().Contains(point) )
+ return wxNOT_FOUND;
+
+ // need to translate from master window since it is in client coords
+ gint binx, biny;
+ gdk_window_get_geometry(gtk_tree_view_get_bin_window(m_treeview),
+ &binx, &biny, NULL, NULL, NULL);
+
+ GtkTreePath* path;
+ if ( !gtk_tree_view_get_path_at_pos
+ (
+ m_treeview,
+ point.x - binx,
+ point.y - biny,
+ &path,
+ NULL, // [out] column (always 0 here)
+ NULL, // [out] x-coord relative to the cell (not interested)
+ NULL // [out] y-coord relative to the cell
+ ) )