+static void
+gtk_tree_view_remove_widget (GtkCellEditable *cell_editable,
+ GtkTreeView *tree_view)
+{
+ g_return_if_fail (tree_view->priv->edited_column != NULL);
+ _gtk_tree_view_column_stop_editing (tree_view->priv->edited_column);
+ gtk_container_remove (GTK_CONTAINER (tree_view),
+ GTK_WIDGET (cell_editable));
+}
+
+static void
+gtk_tree_view_start_editing (GtkTreeView *tree_view,
+ GtkTreeViewColumn *column,
+ GtkCellEditable *cell_editable,
+ GdkRectangle *cell_area,
+ GdkEvent *event,
+ guint flags)
+{
+ tree_view->priv->edited_column = column;
+ _gtk_tree_view_column_start_editing (column, GTK_CELL_EDITABLE (cell_editable));
+ GTK_TREE_VIEW_SET_FLAG (tree_view, GTK_TREE_VIEW_DRAW_KEYFOCUS);
+ gtk_tree_view_put (tree_view,
+ GTK_WIDGET (cell_editable),
+ cell_area->x, cell_area->y, cell_area->width, cell_area->height);
+ gtk_cell_editable_start_editing (GTK_CELL_EDITABLE (cell_editable),
+ (GdkEvent *)event);
+ gtk_widget_grab_focus (GTK_WIDGET (cell_editable));
+ g_signal_connect (cell_editable, "remove_widget", G_CALLBACK (gtk_tree_view_remove_widget), tree_view);
+}
+
+static void
+gtk_tree_view_stop_editing (GtkTreeView *tree_view)
+{
+ if (tree_view->priv->edited_column == NULL)
+ return;
+ gtk_cell_editable_editing_done (tree_view->priv->edited_column->editable_widget);
+ gtk_cell_editable_remove_widget (tree_view->priv->edited_column->editable_widget);
+}
+