[libgda] GdauiDataProxy: get rid of GtkAction



commit 17fcf89b6adfa48eec50bb6868ebcf991fb989e3
Author: Vivien Malerba <malerba gnome-db org>
Date:   Sun Mar 15 21:47:49 2015 +0100

    GdauiDataProxy: get rid of GtkAction

 libgda-ui/gdaui-data-proxy-info.c  |  629 +++++++++++++++++++--------------
 libgda-ui/gdaui-data-proxy-info.h  |    9 +-
 libgda-ui/gdaui-data-proxy.c       |   99 ++----
 libgda-ui/gdaui-data-proxy.h       |   10 +-
 libgda-ui/gdaui-form.c             |   20 +-
 libgda-ui/gdaui-grid.c             |   21 +-
 libgda-ui/gdaui-raw-form.c         |  675 ++++++++++++------------------------
 libgda-ui/gdaui-raw-grid.c         |  571 +++++++++---------------------
 libgda-ui/gdaui-server-operation.c |   27 +-
 libgda-ui/libgda-ui.symbols        |    3 +-
 libgda-ui/libgdaui-6.0.vapi        |   10 +-
 11 files changed, 844 insertions(+), 1230 deletions(-)
---
diff --git a/libgda-ui/gdaui-data-proxy-info.c b/libgda-ui/gdaui-data-proxy-info.c
index 643800c..d355b6c 100644
--- a/libgda-ui/gdaui-data-proxy-info.c
+++ b/libgda-ui/gdaui-data-proxy-info.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -26,8 +26,8 @@
 #include "gdaui-data-selector.h"
 #include "gdaui-raw-grid.h"
 #include "gdaui-data-proxy-info.h"
+#include "gdaui-data-filter.h"
 #include "gdaui-enum-types.h"
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 static void gdaui_data_proxy_info_class_init (GdauiDataProxyInfoClass * class);
 static void gdaui_data_proxy_info_init (GdauiDataProxyInfo *wid);
@@ -54,25 +54,68 @@ static void proxy_reset_cb (GdaDataProxy *wid, GdauiDataProxyInfo *info);
 static void raw_grid_selection_changed_cb (GdauiRawGrid *grid, GdauiDataProxyInfo *info);
 
 
+typedef enum {
+       /* row modification actions */
+       ACTION_NEW,
+       ACTION_COMMIT,
+       ACTION_DELETE,
+       ACTION_RESET,
+
+       /* current row move actions */
+       ACTION_FIRSTRECORD,
+       ACTION_PREVRECORD,
+       ACTION_NEXTRECORD,
+       ACTION_LASTRECORD,
+
+       /* chunk changes actions */
+       ACTION_FIRSTCHUNCK,
+       ACTION_PREVCHUNCK,
+       ACTION_NEXTCHUNCK,
+       ACTION_LASTCHUNCK,
+
+       ACTION_FILTER, /* button to display a search GdaUiDataFilter */
+       ACTION_CURRENT_ROW, /* indicates current row */
+
+       ACTION_COUNT
+} ActionType;
+
+typedef struct {
+       GdauiAction  action;
+       GdauiAction  toggle_action; /* if != @action */
+       const gchar *icon_name;
+       const gchar *tip;
+} UIAction;
+
+UIAction uiactions[] = {
+       {GDAUI_ACTION_NEW_DATA, GDAUI_ACTION_NEW_DATA, "list-add-symbolic", N_("Insert new data")},
+       {GDAUI_ACTION_WRITE_MODIFIED_DATA, GDAUI_ACTION_WRITE_MODIFIED_DATA, "document-save-symbolic", 
N_("Commit the changes")},
+       {GDAUI_ACTION_DELETE_SELECTED_DATA, GDAUI_ACTION_UNDELETE_SELECTED_DATA, "edit-delete-symbolic", 
N_("Delete the selected entry")}, /* undelete: "document-revert" */
+       {GDAUI_ACTION_RESET_DATA, GDAUI_ACTION_RESET_DATA, "edit-undo-symbolic", N_("Cancel any 
modification")},
+
+       {GDAUI_ACTION_MOVE_FIRST_RECORD, GDAUI_ACTION_MOVE_FIRST_RECORD, "go-first-symbolic", N_("Move to 
first entry")},
+       {GDAUI_ACTION_MOVE_PREV_RECORD, GDAUI_ACTION_MOVE_PREV_RECORD, "go-previous-symbolic", N_("Move to 
previous entry")},
+       {GDAUI_ACTION_MOVE_NEXT_RECORD, GDAUI_ACTION_MOVE_NEXT_RECORD, "go-next-symbolic", N_("Move to next 
entry")},
+       {GDAUI_ACTION_MOVE_LAST_RECORD, GDAUI_ACTION_MOVE_LAST_RECORD, "go-last-symbolic", N_("Move to last 
entry")},
+
+       {GDAUI_ACTION_MOVE_FIRST_CHUNCK, GDAUI_ACTION_MOVE_FIRST_CHUNCK, "go-first-symbolic", N_("Show first 
chunck of data")},
+       {GDAUI_ACTION_MOVE_PREV_CHUNCK, GDAUI_ACTION_MOVE_PREV_CHUNCK, "go-previous-symbolic", N_("Show 
previous chunck of data")},
+       {GDAUI_ACTION_MOVE_NEXT_CHUNCK, GDAUI_ACTION_MOVE_NEXT_CHUNCK, "go-next-symbolic", N_("Show next 
chunck of data")},
+       {GDAUI_ACTION_MOVE_LAST_CHUNCK, GDAUI_ACTION_MOVE_LAST_CHUNCK, "go-last-symbolic", N_("Show last 
chunck of data")},
+};
+
 struct _GdauiDataProxyInfoPriv
 {
        GdauiDataProxy *data_proxy;
        GdaDataProxy      *proxy;
        GdaDataModelIter  *iter;
-       GdauiDataProxyInfoFlag flags; /* ORed values. */
-
-       GtkUIManager      *uimanager;
-       GtkActionGroup    *agroup; /* no ref held! */
-       guint              merge_id_row_modif;
-       guint              merge_id_row_move;
-       guint              merge_id_chunck_change;
+       GdauiDataProxyInfoFlag flags; /* ORed values, only modified when setting property */
 
-       GtkWidget         *buttons_bar;
-       gboolean           buttons_bar_from_ui;
-       GtkWidget         *tool_item;
        GtkWidget         *current_sample;
        GtkWidget         *row_spin;
 
+       GtkWidget         *action_items [ACTION_COUNT];
+       GtkWidget         *filter_popover;
+
        guint              idle_id;
 };
 
@@ -83,8 +126,7 @@ static GObjectClass *parent_class = NULL;
 enum {
        PROP_0,
        PROP_DATA_PROXY,
-       PROP_FLAGS,
-       PROP_UI_MANAGER
+       PROP_FLAGS
 };
 
 GType
@@ -106,7 +148,7 @@ gdaui_data_proxy_info_get_type (void)
                        0
                };
 
-               type = g_type_register_static (GTK_TYPE_BOX, "GdauiDataProxyInfo", &info, 0);
+               type = g_type_register_static (GTK_TYPE_TOOLBAR, "GdauiDataProxyInfo", &info, 0);
        }
 
        return type;
@@ -132,17 +174,6 @@ gdaui_data_proxy_info_class_init (GdauiDataProxyInfoClass *klass)
                                          g_param_spec_flags ("flags", NULL, NULL, 
GDAUI_TYPE_DATA_PROXY_INFO_FLAG,
                                                             GDAUI_DATA_PROXY_INFO_CURRENT_ROW,
                                                             G_PARAM_READABLE | G_PARAM_WRITABLE));
-       /**
-        * GdauiDataProxyInfo:ui-manager:
-        *
-        * Use this property to obtain the #GtkUIManager object internally used (to add new actions
-        * for example).
-        *
-        * Since: 4.2.9
-        */
-       g_object_class_install_property (object_class, PROP_UI_MANAGER,
-                                         g_param_spec_object ("ui-manager", NULL, NULL, GTK_TYPE_UI_MANAGER,
-                                                             G_PARAM_READABLE));
 }
 
 static void
@@ -152,8 +183,6 @@ gdaui_data_proxy_info_init (GdauiDataProxyInfo *wid)
        wid->priv->data_proxy = NULL;
        wid->priv->proxy = NULL;
        wid->priv->row_spin = NULL;
-       wid->priv->buttons_bar = NULL;
-       wid->priv->tool_item = NULL;
 }
 
 /**
@@ -175,9 +204,10 @@ gdaui_data_proxy_info_new (GdauiDataProxy *data_proxy, GdauiDataProxyInfoFlag fl
        g_return_val_if_fail (!data_proxy || GDAUI_IS_DATA_PROXY (data_proxy), NULL);
 
        info = (GtkWidget *) g_object_new (GDAUI_TYPE_DATA_PROXY_INFO,
+                                          "toolbar-style", GTK_TOOLBAR_ICONS,
+                                          "icon-size", GTK_ICON_SIZE_MENU,
                                           "data-proxy", data_proxy,
                                           "flags", flags, NULL);
-
        return info;
 }
 
@@ -246,19 +276,6 @@ gdaui_data_proxy_info_dispose (GObject *object)
                if (info->priv->idle_id)
                        g_source_remove (info->priv->idle_id);
 
-               if (info->priv->uimanager) {
-                       if (info->priv->merge_id_row_modif)
-                               gtk_ui_manager_remove_ui (info->priv->uimanager,
-                                                         info->priv->merge_id_row_modif);
-                       if (info->priv->merge_id_row_move)
-                               gtk_ui_manager_remove_ui (info->priv->uimanager,
-                                                         info->priv->merge_id_row_move);
-                       if (info->priv->merge_id_chunck_change)
-                               gtk_ui_manager_remove_ui (info->priv->uimanager,
-                                                         info->priv->merge_id_chunck_change);
-                       g_object_unref (info->priv->uimanager);
-               }
-
                /* the private area itself */
                g_free (info->priv);
                info->priv = NULL;
@@ -360,9 +377,6 @@ gdaui_data_proxy_info_get_property (GObject *object,
                case PROP_FLAGS:
                        g_value_set_flags (value, info->priv->flags);
                        break;
-               case PROP_UI_MANAGER:
-                       g_value_set_object (value, info->priv->uimanager);
-                       break;
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
@@ -409,56 +423,43 @@ raw_grid_selection_changed_cb (G_GNUC_UNUSED GdauiRawGrid *grid, GdauiDataProxyI
        modif_buttons_update (info);
 }
 
-/*
- *
- * Modification buttons (Commit changes, Reset info, New entry, Delete)
- *
- */
-static const gchar *ui_base =
-       "<ui>"
-       "  <toolbar name='ToolBar'>"
-       "    <placeholder name='RowModif'/>"
-       "    <placeholder name='RowModifExtension'/>"
-       "    <placeholder name='RowMove'/>"
-       "    <placeholder name='ChunkChange'/>"
-       "    <toolitem action='ActionFilter'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static const gchar *ui_row_modif =
-       "<ui>"
-       "  <toolbar name='ToolBar'>"
-       "    <placeholder name='RowModif'>"
-       "      <toolitem action='ActionNew'/>"
-       "      <toolitem action='ActionDelete'/>"
-       "      <toolitem action='ActionCommit'/>"
-       "      <toolitem action='ActionReset'/>"
-       "    </placeholder>"
-       "  </toolbar>"
-       "</ui>";
-static const gchar *ui_row_move =
-       "<ui>"
-       "  <toolbar name='ToolBar'>"
-       "    <placeholder name='RowMove'>"
-       "      <toolitem action='ActionFirstRecord'/>"
-       "      <toolitem action='ActionPrevRecord'/>"
-       "      <toolitem action='ActionNextRecord'/>"
-       "      <toolitem action='ActionLastRecord'/>"
-       "    </placeholder>"
-       "  </toolbar>"
-       "</ui>";
-static const gchar *ui_chunck_change =
-       "<ui>"
-       "  <toolbar name='ToolBar'>"
-       "    <placeholder name='ChunkChange'>"
-       "      <toolitem action='ActionFirstChunck'/>"
-       "      <toolitem action='ActionPrevChunck'/>"
-       "      <toolitem action='ActionNextChunck'/>"
-       "      <toolitem action='ActionLastChunck'/>"
-       "    </placeholder>"
-       "  </toolbar>"
-       "</ui>";
+static void
+filter_item_clicked_cb (GtkToolButton *titem, GdauiDataProxyInfo *info)
+{
+       if (!info->priv->filter_popover) {
+               /* create filter window */
+               info->priv->filter_popover = gtk_popover_new (GTK_WIDGET (titem));
+
+               /* add real filter widget */
+               GtkWidget *filter;
+               filter = gdaui_data_filter_new (info->priv->data_proxy);
+               gtk_widget_show (filter);
+               gtk_container_add (GTK_CONTAINER (info->priv->filter_popover), filter);
+       }
 
+       gtk_widget_show (info->priv->filter_popover);
+}
+
+static void
+action_statefull_clicked_cb (GtkToggleToolButton *toggle_tool_button, GdauiDataProxyInfo *info)
+{
+       UIAction *uiaction;;
+       uiaction = g_object_get_data ((GObject*) toggle_tool_button, "uia");
+       GdauiAction action;
+       if (gtk_toggle_tool_button_get_active (toggle_tool_button))
+               action = uiaction->action;
+       else
+               action = uiaction->toggle_action;
+       gdaui_data_proxy_perform_action (info->priv->data_proxy, action);
+}
+
+static void
+action_stateless_clicked_cb (GtkToolButton *tool_button, GdauiDataProxyInfo *info)
+{
+       UIAction *uiaction;;
+       uiaction = g_object_get_data ((GObject*) tool_button, "uia");
+       gdaui_data_proxy_perform_action (info->priv->data_proxy, uiaction->action);
+}
 
 static void row_spin_changed_cb (GtkSpinButton *spin, GdauiDataProxyInfo *info);
 static void
@@ -466,100 +467,173 @@ modif_buttons_make (GdauiDataProxyInfo *info)
 {
        GtkWidget *wid;
        GdauiDataProxyInfoFlag flags = info->priv->flags;
+       GtkWidget **action_items = info->priv->action_items;
 
        if (! info->priv->data_proxy)
                return;
 
-       if (info->priv->tool_item) {
-               /* remove tool_item from toolbar */
-               gtk_container_remove (GTK_CONTAINER (info->priv->buttons_bar),
-                                     info->priv->tool_item);
-               gtk_widget_unparent (info->priv->tool_item);
-       }
-
-       if (info->priv->uimanager) {
-               if (info->priv->merge_id_row_modif) {
-                       gtk_ui_manager_remove_ui (info->priv->uimanager, info->priv->merge_id_row_modif);
-                       info->priv->merge_id_row_modif = 0;
+       /* row modification actions */
+       if ((flags & GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS) && !action_items[ACTION_NEW]) {
+               ActionType atype;
+               for (atype = ACTION_NEW; atype <= ACTION_RESET; atype++) {
+                       UIAction *uiaction = &(uiactions[atype]);
+
+                       if (! gdaui_data_proxy_supports_action (info->priv->data_proxy, uiaction->action))
+                               continue;
+
+                       gboolean is_toggle;
+                       is_toggle = (uiaction->action == uiaction->toggle_action) ? FALSE : TRUE;
+                       if (is_toggle)
+                               action_items[atype] = (GtkWidget*) gtk_toggle_tool_button_new ();
+                       else    
+                               action_items[atype] = (GtkWidget*) gtk_tool_button_new (NULL, NULL);
+                       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (action_items[atype]), 
uiaction->icon_name);
+                       g_object_set_data ((GObject*) action_items[atype], "uia", uiaction);
+                       gtk_widget_set_tooltip_text (action_items[atype], uiaction->tip);
+
+                       gtk_toolbar_insert (GTK_TOOLBAR (info), GTK_TOOL_ITEM (action_items[atype]), -1);
+                       gtk_widget_show (action_items[atype]);
+
+                       if (is_toggle)
+                               g_signal_connect (action_items[atype], "toggled",
+                                                 G_CALLBACK (action_statefull_clicked_cb), info);
+                       else
+                               g_signal_connect (action_items[atype], "clicked",
+                                                 G_CALLBACK (action_stateless_clicked_cb), info);
                }
-               if (info->priv->merge_id_row_move) {
-                       gtk_ui_manager_remove_ui (info->priv->uimanager, info->priv->merge_id_row_move);
-                       info->priv->merge_id_row_move = 0;
+       }
+       else if (! (flags & GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS) && action_items[ACTION_NEW]) {
+               ActionType atype;
+               for (atype = ACTION_NEW; atype <= ACTION_RESET; atype++) {
+                       if (action_items[atype]) {
+                               gtk_widget_destroy (action_items[atype]);
+                               action_items[atype] = NULL;
+                       }
                }
-               if (info->priv->merge_id_chunck_change) {
-                       gtk_ui_manager_remove_ui (info->priv->uimanager, info->priv->merge_id_chunck_change);
-                       info->priv->merge_id_chunck_change = 0;
+       }
+
+       /* current row move actions */
+       if ((flags & GDAUI_DATA_PROXY_INFO_ROW_MOVE_BUTTONS) && !action_items[ACTION_FIRSTRECORD]) {
+               ActionType atype;
+               for (atype = ACTION_FIRSTRECORD; atype <= ACTION_LASTRECORD; atype++) {
+                       UIAction *uiaction = &(uiactions[atype]);
+
+                       if (! gdaui_data_proxy_supports_action (info->priv->data_proxy, uiaction->action))
+                               continue;
+
+                       gboolean is_toggle;
+                       is_toggle = (uiaction->action == uiaction->toggle_action) ? FALSE : TRUE;
+                       if (is_toggle)
+                               action_items[atype] = (GtkWidget*) gtk_toggle_tool_button_new ();
+                       else
+                               action_items[atype] = (GtkWidget*) gtk_tool_button_new (NULL, NULL);
+                       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (action_items[atype]), 
uiaction->icon_name);
+                       g_object_set_data ((GObject*) action_items[atype], "uia", uiaction);
+                       gtk_widget_set_tooltip_text (action_items[atype], uiaction->tip);
+
+                       gtk_toolbar_insert (GTK_TOOLBAR (info), GTK_TOOL_ITEM (action_items[atype]), -1);
+                       gtk_widget_show (action_items[atype]);
+
+                       if (is_toggle)
+                               g_signal_connect (action_items[atype], "toggled",
+                                                 G_CALLBACK (action_statefull_clicked_cb), info);
+                       else
+                               g_signal_connect (action_items[atype], "clicked",
+                                                 G_CALLBACK (action_stateless_clicked_cb), info);
                }
-               gtk_ui_manager_remove_action_group (info->priv->uimanager, info->priv->agroup);
-               info->priv->agroup = NULL;
        }
-       else {
-               info->priv->uimanager = gtk_ui_manager_new ();  
-               gtk_ui_manager_add_ui_from_string (info->priv->uimanager, ui_base, -1, NULL);
+       else if (! (flags & GDAUI_DATA_PROXY_INFO_ROW_MOVE_BUTTONS) && action_items[ACTION_FIRSTRECORD]) {
+               ActionType atype;
+               for (atype = ACTION_FIRSTRECORD; atype <= ACTION_LASTRECORD; atype++) {
+                       if (action_items[atype]) {
+                               gtk_widget_destroy (action_items[atype]);
+                               action_items[atype] = NULL;
+                       }
+               }
        }
 
-       info->priv->agroup = gdaui_data_proxy_get_actions_group (info->priv->data_proxy);
-       gtk_ui_manager_insert_action_group (info->priv->uimanager, info->priv->agroup, 0);
-
-       if (flags & (GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS |
-                    GDAUI_DATA_PROXY_INFO_ROW_MOVE_BUTTONS |
-                    GDAUI_DATA_PROXY_INFO_CHUNCK_CHANGE_BUTTONS)) {
-               GtkUIManager *ui;
-               ui = info->priv->uimanager;
-               if (flags & GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS)
-                       info->priv->merge_id_row_modif = gtk_ui_manager_add_ui_from_string (ui, ui_row_modif,
-                                                                                           -1, NULL);
-               if (flags & GDAUI_DATA_PROXY_INFO_ROW_MOVE_BUTTONS)
-                       info->priv->merge_id_row_move = gtk_ui_manager_add_ui_from_string (ui, ui_row_move,
-                                                                                          -1, NULL);
-               if (flags & GDAUI_DATA_PROXY_INFO_CHUNCK_CHANGE_BUTTONS)
-                       info->priv->merge_id_chunck_change = gtk_ui_manager_add_ui_from_string (ui, 
ui_chunck_change,
-                                                                                               -1, NULL);
+       /* chunk changes actions */
+       if ((flags & GDAUI_DATA_PROXY_INFO_CHUNCK_CHANGE_BUTTONS) && !action_items[ACTION_FIRSTCHUNCK]) {
+               ActionType atype;
+               for (atype = ACTION_FIRSTCHUNCK; atype <= ACTION_LASTCHUNCK; atype++) {
+                       UIAction *uiaction = &(uiactions[atype]);
+
+                       if (! gdaui_data_proxy_supports_action (info->priv->data_proxy, uiaction->action))
+                               continue;
+
+                       gboolean is_toggle;
+                       is_toggle = (uiaction->action == uiaction->toggle_action) ? FALSE : TRUE;
+                       if (is_toggle)
+                               action_items[atype] = (GtkWidget*) gtk_toggle_tool_button_new ();
+                       else    
+                               action_items[atype] = (GtkWidget*) gtk_tool_button_new (NULL, NULL);
+                       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (action_items[atype]), 
uiaction->icon_name);
+                       g_object_set_data ((GObject*) action_items[atype], "uia", uiaction);
+                       gtk_widget_set_tooltip_text (action_items[atype], uiaction->tip);
+
+                       gtk_toolbar_insert (GTK_TOOLBAR (info), GTK_TOOL_ITEM (action_items[atype]), -1);
+                       gtk_widget_show (action_items[atype]);
+
+                       if (is_toggle)
+                               g_signal_connect (action_items[atype], "toggled",
+                                                 G_CALLBACK (action_statefull_clicked_cb), info);
+                       else
+                               g_signal_connect (action_items[atype], "clicked",
+                                                 G_CALLBACK (action_stateless_clicked_cb), info);
+               }
        }
-
-       /* get rid of previous toolbar if any */
-       if (info->priv->buttons_bar) {
-               if (gtk_widget_get_parent (info->priv->buttons_bar)) {
-                       gtk_container_remove (GTK_CONTAINER (info), info->priv->buttons_bar);
-                       gtk_widget_unparent (info->priv->buttons_bar);
+       else if (! (flags & GDAUI_DATA_PROXY_INFO_CHUNCK_CHANGE_BUTTONS) && action_items[ACTION_FIRSTCHUNCK]) 
{
+               ActionType atype;
+               for (atype = ACTION_FIRSTCHUNCK; atype <= ACTION_LASTCHUNCK; atype++) {
+                       if (action_items[atype]) {
+                               gtk_widget_destroy (action_items[atype]);
+                               action_items[atype] = NULL;
+                       }
                }
-               if (info->priv->buttons_bar_from_ui)
-                       g_object_unref (info->priv->buttons_bar);
-               else
-                       gtk_widget_destroy (info->priv->buttons_bar);
-               info->priv->buttons_bar = NULL;
        }
 
-       /* create new toolbar */
-       GtkUIManager *ui;
-       ui = info->priv->uimanager;
-       info->priv->buttons_bar = gtk_ui_manager_get_widget (ui, "/ToolBar");
-       if (info->priv->buttons_bar)
-               info->priv->buttons_bar_from_ui = TRUE;
-       else {
-               info->priv->buttons_bar = gtk_toolbar_new ();
-               info->priv->buttons_bar_from_ui = FALSE;
+       /* filter button */
+       if (! (flags & GDAUI_DATA_PROXY_INFO_NO_FILTER) && ! action_items[ACTION_FILTER]) {
+               GtkWidget *icon;
+               icon = gtk_image_new_from_icon_name ("edit-find-symbolic", GTK_ICON_SIZE_MENU);
+               action_items[ACTION_FILTER] = (GtkWidget*) gtk_tool_button_new (icon, NULL);
+               gtk_toolbar_insert (GTK_TOOLBAR (info), GTK_TOOL_ITEM (action_items[ACTION_FILTER]), -1);
+               gtk_widget_set_tooltip_text (action_items[ACTION_FILTER], _("Filter data"));
+               gtk_widget_show (action_items[ACTION_FILTER]);
+               g_signal_connect (action_items[ACTION_FILTER], "clicked",
+                                 G_CALLBACK (filter_item_clicked_cb), info);
+       }
+       else if ((flags & GDAUI_DATA_PROXY_INFO_NO_FILTER) && action_items[ACTION_FILTER]) {
+               gtk_widget_destroy (action_items[ACTION_FILTER]);
+               action_items[ACTION_FILTER] = NULL;
+       }
+       else if (action_items[ACTION_FILTER]) {
+               /* reposition the tool item at the end of the toolbar */
+               g_object_ref ((GObject*) action_items[ACTION_FILTER]);
+               gtk_container_remove (GTK_CONTAINER (info), action_items[ACTION_FILTER]);
+               gtk_toolbar_insert (GTK_TOOLBAR (info), GTK_TOOL_ITEM (action_items[ACTION_FILTER]), -1);
+               g_object_unref ((GObject*) action_items[ACTION_FILTER]);
        }
-       g_object_ref_sink (info->priv->buttons_bar);
-       gtk_toolbar_set_icon_size (GTK_TOOLBAR (info->priv->buttons_bar), GTK_ICON_SIZE_MENU);
-       g_object_set (G_OBJECT (info->priv->buttons_bar), "toolbar-style", GTK_TOOLBAR_ICONS, NULL);
-       gtk_box_pack_start (GTK_BOX (info), info->priv->buttons_bar, TRUE, TRUE, 0);
-       gtk_widget_show (info->priv->buttons_bar);
 
+       /* row indication */
+       if (action_items[ACTION_CURRENT_ROW]) {
+               gtk_widget_destroy (action_items[ACTION_CURRENT_ROW]);
+               action_items[ACTION_CURRENT_ROW] = NULL;
+       }
        if (flags & GDAUI_DATA_PROXY_INFO_CURRENT_ROW) {
-               if (info->priv->tool_item) {
+               if (action_items[ACTION_CURRENT_ROW]) {
                        /* remove the current contents */
-                       gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (info->priv->tool_item)));
+                       gtk_widget_destroy (gtk_bin_get_child (GTK_BIN (action_items[ACTION_CURRENT_ROW])));
                        info->priv->row_spin = NULL;
                        info->priv->current_sample = NULL;
-                       gtk_toolbar_insert (GTK_TOOLBAR (info->priv->buttons_bar),
-                                           GTK_TOOL_ITEM (info->priv->tool_item), -1);
+                       gtk_toolbar_insert (GTK_TOOLBAR (info),
+                                           GTK_TOOL_ITEM (action_items[ACTION_CURRENT_ROW]), -1);
                }
                else {
                        GtkToolItem *ti;
                        ti = gtk_tool_item_new  ();
-                       gtk_toolbar_insert (GTK_TOOLBAR (info->priv->buttons_bar), ti, -1);
-                       info->priv->tool_item = GTK_WIDGET (g_object_ref (G_OBJECT (ti)));
+                       gtk_toolbar_insert (GTK_TOOLBAR (info), ti, -1);
+                       action_items[ACTION_CURRENT_ROW] = GTK_WIDGET (g_object_ref (G_OBJECT (ti)));
                }
 
                GtkWidget *toolwid;
@@ -602,11 +676,9 @@ modif_buttons_make (GdauiDataProxyInfo *info)
 
                pango_font_description_free (fdc);
 
-               gtk_container_add (GTK_CONTAINER (info->priv->tool_item), toolwid);
-               gtk_widget_show_all (info->priv->tool_item);
+               gtk_container_add (GTK_CONTAINER (action_items[ACTION_CURRENT_ROW]), toolwid);
+               gtk_widget_show_all (action_items[ACTION_CURRENT_ROW]);
        }
-       else if (info->priv->tool_item)
-               gtk_widget_hide (info->priv->tool_item);
 }
 
 static void
@@ -652,10 +724,11 @@ idle_modif_buttons_update (GdauiDataProxyInfo *info)
        gint proxied_rows = 0;
        gint all_rows = 0;
 
-       GtkAction *action;
        gint sample_first_row = 0, sample_last_row = 0, sample_size = 0;
        GdauiDataProxyInfoFlag flags = 0;
 
+       GtkWidget **action_items = info->priv->action_items;
+
        model_iter = gdaui_data_selector_get_data_set (GDAUI_DATA_SELECTOR (info->priv->data_proxy));
        if (info->priv->proxy) {
                filtered_proxy = gda_data_proxy_get_filter_expr (info->priv->proxy) ? TRUE : FALSE;
@@ -742,142 +815,168 @@ idle_modif_buttons_update (GdauiDataProxyInfo *info)
        }
 
        /* current row modifications */
-       if (info->priv->buttons_bar) {
-               gboolean changed = FALSE;
-               gboolean to_be_deleted = FALSE;
-               gboolean is_inserted = FALSE;
-               gboolean force_del_btn = FALSE;
-               gboolean force_undel_btn = FALSE;
-               gboolean has_selection;
-
-               has_selection = (row >= 0) ? TRUE : FALSE;
-               if (info->priv->proxy) {
-                       changed = gda_data_proxy_has_changed (info->priv->proxy);
-
-                       if (has_selection) {
-                               to_be_deleted = gda_data_proxy_row_is_deleted (info->priv->proxy, row);
-                               is_inserted = gda_data_proxy_row_is_inserted (info->priv->proxy, row);
-                       }
-                       else
-                               if (GDAUI_IS_RAW_GRID (info->priv->data_proxy)) {
-                                       /* bad for encapsulation, but very useful... */
-                                       GList *sel, *list;
-
-                                       sel = _gdaui_raw_grid_get_selection ((GdauiRawGrid*) 
info->priv->data_proxy);
-                                       if (sel) {
-                                               list = sel;
-                                               while (list && (!force_del_btn || !force_undel_btn)) {
-                                                       if ((GPOINTER_TO_INT (list->data) != -1) &&
-                                                           gda_data_proxy_row_is_deleted (info->priv->proxy,
-                                                                                          GPOINTER_TO_INT 
(list->data)))
-                                                               force_undel_btn = TRUE;
-                                                       else
-                                                               force_del_btn = TRUE;
-                                                       list = g_list_next (list);
-                                               }
-                                               list = sel;
-
-                                               is_inserted = TRUE;
-                                               while (list && is_inserted) {
-                                                       if (GPOINTER_TO_INT (list->data) != -1)
-                                                               is_inserted = FALSE;
-                                                       list = g_list_next (list);
-                                               }
-                                               g_list_free (sel);
-                                       }
+       gboolean changed = FALSE;
+       gboolean to_be_deleted = FALSE;
+       gboolean is_inserted = FALSE;
+       gboolean force_del_btn = FALSE;
+       gboolean force_undel_btn = FALSE;
+       gboolean has_selection;
+
+       has_selection = (row >= 0) ? TRUE : FALSE;
+       if (info->priv->proxy) {
+               changed = gda_data_proxy_has_changed (info->priv->proxy);
+
+               if (has_selection) {
+                       to_be_deleted = gda_data_proxy_row_is_deleted (info->priv->proxy, row);
+                       is_inserted = gda_data_proxy_row_is_inserted (info->priv->proxy, row);
+               }
+               else if (GDAUI_IS_RAW_GRID (info->priv->data_proxy)) {
+                       /* bad for encapsulation, but very useful... */
+                       GList *sel, *list;
+
+                       sel = _gdaui_raw_grid_get_selection ((GdauiRawGrid*) info->priv->data_proxy);
+                       if (sel) {
+                               list = sel;
+                               while (list && (!force_del_btn || !force_undel_btn)) {
+                                       if ((GPOINTER_TO_INT (list->data) != -1) &&
+                                           gda_data_proxy_row_is_deleted (info->priv->proxy,
+                                                                          GPOINTER_TO_INT (list->data)))
+                                               force_undel_btn = TRUE;
+                                       else
+                                               force_del_btn = TRUE;
+                                       list = g_list_next (list);
                                }
+                               list = sel;
+
+                               is_inserted = TRUE;
+                               while (list && is_inserted) {
+                                       if (GPOINTER_TO_INT (list->data) != -1)
+                                               is_inserted = FALSE;
+                                       list = g_list_next (list);
+                               }
+                               g_list_free (sel);
+                       }
                }
+       }
 
-               if (info->priv->flags & GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS) {
-                       GdauiDataProxyWriteMode mode;
-                       mode = gdaui_data_proxy_get_write_mode (info->priv->data_proxy);
+       if (info->priv->flags & GDAUI_DATA_PROXY_INFO_ROW_MODIFY_BUTTONS) {
+               GdauiDataProxyWriteMode mode;
+               mode = gdaui_data_proxy_get_write_mode (info->priv->data_proxy);
 
-                       action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowModif/ActionCommit");
-                       g_object_set (G_OBJECT (action), "sensitive", changed ? TRUE : FALSE, NULL);
+               if (info->priv->action_items [ACTION_COMMIT]) {
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_COMMIT], changed ? TRUE : 
FALSE);
                        if (mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_CHANGE)
-                               gtk_action_set_visible (action, FALSE);
+                               gtk_widget_hide (action_items [ACTION_COMMIT]);
                        else
-                               gtk_action_set_visible (action, TRUE);
+                               gtk_widget_show (action_items [ACTION_COMMIT]);
+               }
 
-                       action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowModif/ActionReset");
-                       g_object_set (G_OBJECT (action), "sensitive", changed ? TRUE : FALSE, NULL);
+               if (info->priv->action_items [ACTION_RESET]) {
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_RESET], changed ? TRUE : 
FALSE);
                        if (mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_CHANGE)
-                               gtk_action_set_visible (action, FALSE);
+                               gtk_widget_hide (action_items [ACTION_RESET]);
                        else
-                               gtk_action_set_visible (action, TRUE);
+                               gtk_widget_show (action_items [ACTION_RESET]);
+               }
 
-                       action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowModif/ActionNew");
-                       g_object_set (G_OBJECT (action), "sensitive",
-                                     flags & GDA_DATA_MODEL_ACCESS_INSERT ? TRUE : FALSE, NULL);
+               if (info->priv->action_items [ACTION_NEW]) {
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_NEW],
+                                                 flags & GDA_DATA_MODEL_ACCESS_INSERT ? TRUE : FALSE);
+               }
 
-                       action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowModif/ActionDelete");
-                       gtk_action_block_activate (action);
-                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), to_be_deleted);
-                       gtk_action_unblock_activate (action);
+               if (info->priv->action_items [ACTION_DELETE]) {
+                       g_signal_handlers_block_by_func (action_items[ACTION_DELETE],
+                                                        G_CALLBACK (action_statefull_clicked_cb), info);
+                       gtk_toggle_tool_button_set_active (GTK_TOGGLE_TOOL_BUTTON 
(action_items[ACTION_DELETE]),
+                                                          to_be_deleted);
+                       g_signal_handlers_unblock_by_func (action_items[ACTION_DELETE],
+                                                          G_CALLBACK (action_statefull_clicked_cb), info);
 
                        if (to_be_deleted) {
                                wrows = (flags & GDA_DATA_MODEL_ACCESS_DELETE) &&
                                        (force_undel_btn || has_selection);
-                               g_object_set (G_OBJECT (action), "sensitive", wrows, NULL);
-                               gtk_action_set_tooltip (action, _("Undelete the selected entry"));
+                               gtk_widget_set_tooltip_text (info->priv->action_items [ACTION_DELETE],
+                                                            _("Undelete the selected entry"));
                        }
                        else {
                                wrows = is_inserted ||
                                        ((flags & GDA_DATA_MODEL_ACCESS_DELETE) &&
                                         (force_del_btn || has_selection));
-                               g_object_set (G_OBJECT (action), "sensitive", wrows, NULL);
-                               gtk_action_set_tooltip (action, _("Delete the selected entry"));
+                               gtk_widget_set_tooltip_text (info->priv->action_items [ACTION_DELETE],
+                                                            _("Delete the selected entry"));
                        }
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_DELETE], wrows);
 
                        if ((mode == GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) ||
                            (mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_CHANGE) ||
                            (mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_ACTIVATED))
-                               gtk_action_set_visible (action, FALSE);
+                               gtk_widget_hide (action_items [ACTION_DELETE]);
                        else
-                               gtk_action_set_visible (action, TRUE);
+                               gtk_widget_show (action_items [ACTION_DELETE]);
                }
        }
 
        /* current row moving */
        if (info->priv->flags & GDAUI_DATA_PROXY_INFO_ROW_MOVE_BUTTONS) {
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowMove/ActionFirstRecord");
-               g_object_set (G_OBJECT (action), "sensitive", (row <= 0) ? FALSE : TRUE, NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowMove/ActionPrevRecord");
-               g_object_set (G_OBJECT (action), "sensitive", (row <= 0) ? FALSE : TRUE, NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowMove/ActionNextRecord");
-               g_object_set (G_OBJECT (action), "sensitive", (row == proxy_rows -1) || (row < 0) ? FALSE : 
TRUE,
-                             NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/RowMove/ActionLastRecord");
-               g_object_set (G_OBJECT (action), "sensitive", (row == proxy_rows -1) || (row < 0) ? FALSE : 
TRUE,
-                             NULL);
+               if (info->priv->action_items [ACTION_FIRSTRECORD])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_FIRSTRECORD], (row <= 0) ? 
FALSE : TRUE);
+               if (info->priv->action_items [ACTION_PREVRECORD])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_PREVRECORD], (row <= 0) ? 
FALSE : TRUE);
+               if (info->priv->action_items [ACTION_NEXTRECORD])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_NEXTRECORD],
+                                                 (row == proxy_rows -1) || (row < 0) ? FALSE : TRUE);
+               if (info->priv->action_items [ACTION_LASTRECORD])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_LASTRECORD],
+                                                 (row == proxy_rows -1) || (row < 0) ? FALSE : TRUE);
        }
 
        /* chunck indications */
        if (info->priv->flags & GDAUI_DATA_PROXY_INFO_CHUNCK_CHANGE_BUTTONS) {
                gboolean abool;
                wrows = (sample_size > 0) ? TRUE : FALSE;
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/ChunkChange/ActionFirstChunck");
-               g_object_set (G_OBJECT (action), "sensitive", wrows && sample_first_row > 0 ? TRUE : FALSE, 
NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/ChunkChange/ActionPrevChunck");
-               g_object_set (G_OBJECT (action), "sensitive", wrows && sample_first_row > 0 ? TRUE : FALSE, 
NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/ChunkChange/ActionNextChunck");
-               abool = (proxied_rows != -1) ? wrows && (sample_last_row < proxied_rows - 1) : TRUE;
-               g_object_set (G_OBJECT (action), "sensitive", abool, NULL);
-               action = gtk_ui_manager_get_action (info->priv->uimanager, 
"/ToolBar/ChunkChange/ActionLastChunck");
-               g_object_set (G_OBJECT (action), "sensitive", wrows && (sample_last_row < proxied_rows - 1), 
NULL);
+               if (info->priv->action_items [ACTION_FIRSTCHUNCK])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_FIRSTCHUNCK],
+                                                 wrows && (sample_first_row > 0) ? TRUE : FALSE);
+               if (info->priv->action_items [ACTION_PREVCHUNCK])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_PREVCHUNCK],
+                                                 wrows && (sample_first_row > 0) ? TRUE : FALSE);
+
+               abool = (proxied_rows != -1) ? (wrows && (sample_last_row < proxied_rows - 1)) : TRUE;
+               if (info->priv->action_items [ACTION_NEXTCHUNCK])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_NEXTCHUNCK], abool);
+               if (info->priv->action_items [ACTION_LASTCHUNCK])
+                       gtk_widget_set_sensitive (info->priv->action_items [ACTION_LASTCHUNCK],
+                                                 wrows && (sample_last_row < proxied_rows - 1));
        }
 
-       /* filter */
-       action = gtk_ui_manager_get_action (info->priv->uimanager, "/ToolBar/ActionFilter");
-       if (info->priv->flags & GDAUI_DATA_PROXY_INFO_NO_FILTER)
-               g_object_set (G_OBJECT (action), "visible", FALSE, NULL);
-       else
-               g_object_set (G_OBJECT (action), "visible", TRUE, NULL);
-
-       if (info->priv->uimanager)
-               gtk_ui_manager_ensure_update (info->priv->uimanager);
-
        /* remove IDLE */
        info->priv->idle_id = 0;
        return FALSE;
 }
+
+/**
+ * gdaui_data_proxy_info_get_item:
+ * @info: a #GdauiDataProxyInfo object
+ * @action: a #GdauiAction action
+ *
+ * Get the #GtkToolItem corresponding to the @action action
+ *
+ * Returns: the #GtkToolItem, or %NULL on error
+ *
+ * Since: 6.0
+ */
+GtkToolItem *
+gdaui_data_proxy_info_get_item (GdauiDataProxyInfo *info, GdauiAction action)
+{
+       g_return_val_if_fail (GDAUI_IS_DATA_PROXY_INFO (info), NULL);
+       g_return_val_if_fail ((action >= GDAUI_ACTION_NEW_DATA) && (action <= GDAUI_ACTION_MOVE_LAST_CHUNCK), 
NULL);
+
+       ActionType type;
+       for (type = ACTION_NEW; type < ACTION_COUNT; type++) {
+               UIAction *act;
+               act = &(uiactions[type]);
+               if (act->action == action)
+                       return GTK_TOOL_ITEM (info->priv->action_items [type]);
+       }
+       return NULL;
+}
diff --git a/libgda-ui/gdaui-data-proxy-info.h b/libgda-ui/gdaui-data-proxy-info.h
index f80f8c0..4d6853b 100644
--- a/libgda-ui/gdaui-data-proxy-info.h
+++ b/libgda-ui/gdaui-data-proxy-info.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
  * This library is free software; you can redistribute it and/or
@@ -24,6 +24,7 @@
 #include <gtk/gtk.h>
 #include <libgda/gda-decl.h>
 #include <libgda-ui/gdaui-decl.h>
+#include <libgda-ui/gdaui-enums.h>
 
 G_BEGIN_DECLS
 
@@ -59,7 +60,7 @@ typedef enum
 /* struct for the object's data */
 struct _GdauiDataProxyInfo
 {
-       GtkBox                 object;
+       GtkToolbar              object;
 
        GdauiDataProxyInfoPriv *priv;
 };
@@ -67,7 +68,7 @@ struct _GdauiDataProxyInfo
 /* struct for the object's class */
 struct _GdauiDataProxyInfoClass
 {
-       GtkBoxClass            parent_class;
+       GtkToolbarClass         parent_class;
 };
 
 /**
@@ -87,7 +88,7 @@ struct _GdauiDataProxyInfoClass
 
 GType             gdaui_data_proxy_info_get_type (void) G_GNUC_CONST;
 GtkWidget        *gdaui_data_proxy_info_new      (GdauiDataProxy *data_proxy, GdauiDataProxyInfoFlag flags);
-
+GtkToolItem      *gdaui_data_proxy_info_get_item (GdauiDataProxyInfo *info, GdauiAction action);
 G_END_DECLS
 
 #endif
diff --git a/libgda-ui/gdaui-data-proxy.c b/libgda-ui/gdaui-data-proxy.c
index 17c2dcf..61c066d 100644
--- a/libgda-ui/gdaui-data-proxy.c
+++ b/libgda-ui/gdaui-data-proxy.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  *
  * This library is free software; you can redistribute it and/or
@@ -153,35 +153,26 @@ gdaui_data_proxy_column_show_actions (GdauiDataProxy *iface, gint column, gboole
 }
 
 /**
- * gdaui_data_proxy_get_actions_group:
+ * gdaui_data_proxy_supports_action:
  * @iface: an object which implements the #GdauiDataProxy interface
+ * @action: a #GdauiAction action
  *
- * Each widget imlplementing the #GdauiDataProxy interface provides actions. Actions can be triggered
- * using the gdaui_data_proxy_perform_action() method, but using this method allows for the creation of
- * toolbars, menus, etc calling these actions.
+ * Determines if @action can be used on @iface (using gdaui_data_proxy_perform_action()).
  *
- * The actions are among: 
- * <itemizedlist><listitem><para>Data edition actions: "ActionNew", "ActionCommit", 
- *    "ActionDelete", "ActionReset". Note that the "ActionDelete" action is actually a #GtkToggleAction
- *    action which can be used to delete a row or undelete it.</para></listitem>
- * <listitem><para>Record by record moving: "ActionFirstRecord", "ActionPrevRecord", 
- *    "ActionNextRecord", "ActionLastRecord".</para></listitem>
- * <listitem><para>Chuncks of records moving: "ActionFirstChunck", "ActionPrevChunck", 
- *     "ActionNextChunck", "ActionLastChunck".</para></listitem>
- * <listitem><para>Filtering: "ActionFilter".</para></listitem></itemizedlist>
- * 
- * Returns: (transfer none): the #GtkActionGroup with all the possible actions on the widget.
+ * Returns: %TRUE if the requested action is supported, %FALSE otherwise
  *
- * Since: 4.2
+ * Since: 6.0
  */
-GtkActionGroup *
-gdaui_data_proxy_get_actions_group (GdauiDataProxy *iface)
+gboolean
+gdaui_data_proxy_supports_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       g_return_val_if_fail (GDAUI_IS_DATA_PROXY (iface), NULL);
+       g_return_val_if_fail (GDAUI_IS_DATA_PROXY (iface), FALSE);
+       g_return_val_if_fail ((action >= GDAUI_ACTION_NEW_DATA) && (action <= GDAUI_ACTION_MOVE_LAST_CHUNCK), 
FALSE);
 
-       if (GDAUI_DATA_PROXY_GET_IFACE (iface)->get_actions_group)
-               return (GDAUI_DATA_PROXY_GET_IFACE (iface)->get_actions_group) (iface);
-       return NULL;
+       if (GDAUI_DATA_PROXY_GET_IFACE (iface)->supports_action)
+               return (GDAUI_DATA_PROXY_GET_IFACE (iface)->supports_action) (iface, action);
+       else
+               return FALSE;
 }
 
 /**
@@ -199,63 +190,15 @@ gdaui_data_proxy_get_actions_group (GdauiDataProxy *iface)
 void
 gdaui_data_proxy_perform_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       gchar *action_name = NULL;
-       GtkActionGroup *group;
-       GtkAction *gtkaction;
+       g_return_val_if_fail (GDAUI_IS_DATA_PROXY (iface), FALSE);
+       g_return_val_if_fail ((action >= GDAUI_ACTION_NEW_DATA) && (action <= GDAUI_ACTION_MOVE_LAST_CHUNCK), 
FALSE);
 
-       g_return_if_fail (GDAUI_IS_DATA_PROXY (iface));
-       group = gdaui_data_proxy_get_actions_group (iface);
-       if (!group) {
-               g_warning ("Object class %s does not support the gdaui_data_proxy_get_actions_group() method",
-                          G_OBJECT_TYPE_NAME (iface));
-               return;
+       if (gdaui_data_proxy_supports_action (iface, action)) {
+               if (GDAUI_DATA_PROXY_GET_IFACE (iface)->perform_action)
+                       return (GDAUI_DATA_PROXY_GET_IFACE (iface)->perform_action) (iface, action);
        }
-       
-       switch (action) {
-       case GDAUI_ACTION_NEW_DATA:
-               action_name = "ActionNew";
-               break;
-       case GDAUI_ACTION_WRITE_MODIFIED_DATA:
-               action_name = "ActionCommit";
-               break;
-        case GDAUI_ACTION_DELETE_SELECTED_DATA:
-        case GDAUI_ACTION_UNDELETE_SELECTED_DATA:
-               action_name = "ActionDelete";
-               break;
-        case GDAUI_ACTION_RESET_DATA:
-               action_name = "ActionReset";
-               break;
-        case GDAUI_ACTION_MOVE_FIRST_RECORD:
-               action_name = "ActionFirstRecord";
-               break;
-        case GDAUI_ACTION_MOVE_PREV_RECORD:
-               action_name = "ActionPrevRecord";
-               break;
-        case GDAUI_ACTION_MOVE_NEXT_RECORD:
-               action_name = "ActionNextRecord";
-               break;
-        case GDAUI_ACTION_MOVE_LAST_RECORD:
-               action_name = "ActionLastRecord";
-               break;
-        case GDAUI_ACTION_MOVE_FIRST_CHUNCK:
-               action_name = "ActionFirstChunck";
-               break;
-        case GDAUI_ACTION_MOVE_PREV_CHUNCK:
-               action_name = "ActionPrevChunck";
-               break;
-        case GDAUI_ACTION_MOVE_NEXT_CHUNCK:
-               action_name = "ActionNextChunck";
-               break;
-        case GDAUI_ACTION_MOVE_LAST_CHUNCK:
-               action_name = "ActionLastChunck";
-               break;
-       default:
-               g_assert_not_reached ();
-       }
-
-       gtkaction = gtk_action_group_get_action (group, action_name);
-       if (gtkaction)
-               gtk_action_activate (gtkaction);
+       else
+               g_warning (_("GdauiAction is not supported by this GdauiDataProxy interface"));
 }
 
 /**
diff --git a/libgda-ui/gdaui-data-proxy.h b/libgda-ui/gdaui-data-proxy.h
index bf7ee83..66e7103 100644
--- a/libgda-ui/gdaui-data-proxy.h
+++ b/libgda-ui/gdaui-data-proxy.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -60,7 +60,8 @@ struct _GdauiDataProxyIface
        GdaDataProxy        *(* get_proxy)           (GdauiDataProxy *iface);
        void                 (* set_column_editable) (GdauiDataProxy *iface, gint column, gboolean editable);
        void                 (* show_column_actions) (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
-       GtkActionGroup      *(* get_actions_group)   (GdauiDataProxy *iface);
+       gboolean             (* supports_action)     (GdauiDataProxy *iface, GdauiAction action);
+       void                 (* perform_action)      (GdauiDataProxy *iface, GdauiAction action);
        gboolean             (* set_write_mode)      (GdauiDataProxy *iface, GdauiDataProxyWriteMode mode);
        GdauiDataProxyWriteMode (* get_write_mode)(GdauiDataProxy *iface);
 
@@ -84,8 +85,9 @@ struct _GdauiDataProxyIface
 GType             gdaui_data_proxy_get_type                  (void) G_GNUC_CONST;
 
 GdaDataProxy     *gdaui_data_proxy_get_proxy                 (GdauiDataProxy *iface);
-GtkActionGroup   *gdaui_data_proxy_get_actions_group         (GdauiDataProxy *iface);
-void              gdaui_data_proxy_perform_action            (GdauiDataProxy *iface, GdauiAction action);
+
+gboolean          gdaui_data_proxy_supports_action           (GdauiDataProxy *iface, GdauiAction action);
+void              gdaui_data_proxy_perform_action            (GdauiDataProxy *iface, GdauiAction action); /* 
FIXME: add an optional row number on which to apply the action, useless for GDAUI_ACTION_MOVE_* actions */
 
 void              gdaui_data_proxy_column_set_editable       (GdauiDataProxy *iface, gint column, gboolean 
editable);
 void              gdaui_data_proxy_column_show_actions       (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
diff --git a/libgda-ui/gdaui-form.c b/libgda-ui/gdaui-form.c
index 0b4bb08..3d7b1f3 100644
--- a/libgda-ui/gdaui-form.c
+++ b/libgda-ui/gdaui-form.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -47,7 +47,8 @@ static void            gdaui_form_widget_init         (GdauiDataProxyIface *ifac
 static GdaDataProxy   *gdaui_form_get_proxy           (GdauiDataProxy *iface);
 static void            gdaui_form_set_column_editable (GdauiDataProxy *iface, gint column, gboolean 
editable);
 static void            gdaui_form_show_column_actions (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
-static GtkActionGroup *gdaui_form_get_actions_group   (GdauiDataProxy *iface);
+static gboolean        gdaui_form_supports_action       (GdauiDataProxy *iface, GdauiAction action);
+static void            gdaui_form_perform_action        (GdauiDataProxy *iface, GdauiAction action);
 static gboolean        gdaui_form_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode 
mode);
 static GdauiDataProxyWriteMode gdaui_form_widget_get_write_mode (GdauiDataProxy *iface);
 
@@ -124,7 +125,8 @@ gdaui_form_widget_init (GdauiDataProxyIface *iface)
        iface->get_proxy = gdaui_form_get_proxy;
        iface->set_column_editable = gdaui_form_set_column_editable;
        iface->show_column_actions = gdaui_form_show_column_actions;
-       iface->get_actions_group = gdaui_form_get_actions_group;
+       iface->supports_action = gdaui_form_supports_action;
+       iface->perform_action = gdaui_form_perform_action;
        iface->set_write_mode = gdaui_form_widget_set_write_mode;
        iface->get_write_mode = gdaui_form_widget_get_write_mode;
 }
@@ -347,10 +349,16 @@ gdaui_form_show_column_actions (GdauiDataProxy *iface, gint column, gboolean sho
                                              column, show_actions);
 }
 
-static GtkActionGroup *
-gdaui_form_get_actions_group (GdauiDataProxy *iface)
+static gboolean
+gdaui_form_supports_action (GdauiDataProxy *iface, GdauiAction action)
+{
+       return gdaui_data_proxy_supports_action ((GdauiDataProxy*) GDAUI_FORM (iface)->priv->raw_form, 
action);
+}
+
+static void
+gdaui_form_perform_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       return gdaui_data_proxy_get_actions_group ((GdauiDataProxy*) GDAUI_FORM (iface)->priv->raw_form);
+       gdaui_data_proxy_perform_action ((GdauiDataProxy*) GDAUI_FORM (iface)->priv->raw_form, action);
 }
 
 static gboolean
diff --git a/libgda-ui/gdaui-grid.c b/libgda-ui/gdaui-grid.c
index 8c34cde..a30d429 100644
--- a/libgda-ui/gdaui-grid.c
+++ b/libgda-ui/gdaui-grid.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2011 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -47,7 +47,8 @@ static void            gdaui_grid_widget_init         (GdauiDataProxyIface *ifac
 static GdaDataProxy   *gdaui_grid_get_proxy           (GdauiDataProxy *iface);
 static void            gdaui_grid_set_column_editable (GdauiDataProxy *iface, gint column, gboolean 
editable);
 static void            gdaui_grid_show_column_actions (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
-static GtkActionGroup *gdaui_grid_get_actions_group   (GdauiDataProxy *iface);
+static gboolean        gdaui_grid_supports_action       (GdauiDataProxy *iface, GdauiAction action);
+static void            gdaui_grid_perform_action        (GdauiDataProxy *iface, GdauiAction action);
 static gboolean        gdaui_grid_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode 
mode);
 static GdauiDataProxyWriteMode gdaui_grid_widget_get_write_mode (GdauiDataProxy *iface);
 
@@ -125,7 +126,8 @@ gdaui_grid_widget_init (GdauiDataProxyIface *iface)
        iface->get_proxy = gdaui_grid_get_proxy;
        iface->set_column_editable = gdaui_grid_set_column_editable;
        iface->show_column_actions = gdaui_grid_show_column_actions;
-       iface->get_actions_group = gdaui_grid_get_actions_group;
+       iface->supports_action = gdaui_grid_supports_action;
+       iface->perform_action = gdaui_grid_perform_action;
        iface->set_write_mode = gdaui_grid_widget_set_write_mode;
        iface->get_write_mode = gdaui_grid_widget_get_write_mode;
 }
@@ -351,12 +353,19 @@ gdaui_grid_show_column_actions (GdauiDataProxy *iface, gint column, gboolean sho
                                              column, show_actions);
 }
 
-static GtkActionGroup *
-gdaui_grid_get_actions_group (GdauiDataProxy *iface)
+static gboolean
+gdaui_grid_supports_action (GdauiDataProxy *iface, GdauiAction action)
+{
+       return gdaui_data_proxy_supports_action ((GdauiDataProxy*) GDAUI_GRID (iface)->priv->raw_grid, 
action);
+}
+
+static void
+gdaui_grid_perform_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       return gdaui_data_proxy_get_actions_group ((GdauiDataProxy*) GDAUI_GRID (iface)->priv->raw_grid);
+       gdaui_data_proxy_perform_action ((GdauiDataProxy*) GDAUI_GRID (iface)->priv->raw_grid, action);
 }
 
+
 static gboolean
 gdaui_grid_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode mode)
 {
diff --git a/libgda-ui/gdaui-raw-form.c b/libgda-ui/gdaui-raw-form.c
index e3dd6f5..0469844 100644
--- a/libgda-ui/gdaui-raw-form.c
+++ b/libgda-ui/gdaui-raw-form.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -29,11 +29,9 @@
 #include "gdaui-data-selector.h"
 #include "gdaui-data-proxy.h"
 #include "gdaui-basic-form.h"
-#include "gdaui-data-filter.h"
 #include "internal/utility.h"
 #include "data-entries/gdaui-entry-shell.h"
 #include <libgda/gda-debug-macros.h>
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 static void gdaui_raw_form_class_init (GdauiRawFormClass * class);
 static void gdaui_raw_form_init (GdauiRawForm *wid);
@@ -60,7 +58,8 @@ static void            gdaui_raw_form_widget_init         (GdauiDataProxyIface *
 static GdaDataProxy   *gdaui_raw_form_get_proxy           (GdauiDataProxy *iface);
 static void            gdaui_raw_form_set_column_editable (GdauiDataProxy *iface, gint column, gboolean 
editable);
 static void            gdaui_raw_form_show_column_actions (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
-static GtkActionGroup *gdaui_raw_form_get_actions_group   (GdauiDataProxy *iface);
+static gboolean        gdaui_raw_form_supports_action       (GdauiDataProxy *iface, GdauiAction action);
+static void            gdaui_raw_form_perform_action        (GdauiDataProxy *iface, GdauiAction action);
 static gboolean        gdaui_raw_form_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode 
mode);
 static GdauiDataProxyWriteMode gdaui_raw_form_widget_get_write_mode (GdauiDataProxy *iface);
 
@@ -81,11 +80,6 @@ struct _GdauiRawFormPriv
        GdaDataModelIter           *iter;  /* proxy's iter */
 
        GdauiDataProxyWriteMode     write_mode;
-
-       GtkActionGroup             *actions_group;
-
-       GtkWidget                  *filter;
-       GtkWidget                  *filter_window;
 };
 
 #define PAGE_NO_DATA 0
@@ -145,7 +139,8 @@ gdaui_raw_form_widget_init (GdauiDataProxyIface *iface)
        iface->get_proxy = gdaui_raw_form_get_proxy;
        iface->set_column_editable = gdaui_raw_form_set_column_editable;
        iface->show_column_actions = gdaui_raw_form_show_column_actions;
-       iface->get_actions_group = gdaui_raw_form_get_actions_group;
+       iface->supports_action = gdaui_raw_form_supports_action;
+       iface->perform_action = gdaui_raw_form_perform_action;
        iface->set_write_mode = gdaui_raw_form_widget_set_write_mode;
        iface->get_write_mode = gdaui_raw_form_widget_get_write_mode;
 }
@@ -187,75 +182,159 @@ gdaui_raw_form_class_init (GdauiRawFormClass *class)
                                                              G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
-static void action_new_cb (GtkAction *action, GdauiRawForm *form);
-static void action_delete_cb (GtkToggleAction *action, GdauiRawForm *form);
-static void action_commit_cb (GtkAction *action, GdauiRawForm *form);
-static void action_reset_cb (GtkAction *action, GdauiRawForm *form);
-static void action_first_record_cb (GtkAction *action, GdauiRawForm *form);
-static void action_prev_record_cb (GtkAction *action, GdauiRawForm *form);
-static void action_next_record_cb (GtkAction *action, GdauiRawForm *form);
-static void action_last_record_cb (GtkAction *action, GdauiRawForm *form);
-static void action_filter_cb (GtkAction *action, GdauiRawForm *form);
-
-static GtkToggleActionEntry ui_actions_t[] = {
-       { "ActionDelete", GTK_STOCK_REMOVE, "_Delete", NULL, N_("Delete the current record"), G_CALLBACK 
(action_delete_cb), FALSE},
-};
-
-static GtkActionEntry ui_actions[] = {
-       { "ActionNew", GTK_STOCK_ADD, "_New", NULL, N_("Create a new record"), G_CALLBACK (action_new_cb)},
-       { "ActionCommit", GTK_STOCK_SAVE, "_Commit", NULL, N_("Commit the modifications"), G_CALLBACK 
(action_commit_cb)},
-       { "ActionReset", GTK_STOCK_CLEAR, "_Clear", NULL, N_("Clear all the modifications"), G_CALLBACK 
(action_reset_cb)},
-       { "ActionFirstRecord", GTK_STOCK_GOTO_FIRST, "_First record", NULL, N_("Go to first record"), 
G_CALLBACK (action_first_record_cb)},
-       { "ActionLastRecord", GTK_STOCK_GOTO_LAST, "_Last record", NULL, N_("Go to last record"), G_CALLBACK 
(action_last_record_cb)},
-       { "ActionPrevRecord", GTK_STOCK_GO_BACK, "_Previous record", NULL, N_("Go to previous record"), 
G_CALLBACK (action_prev_record_cb)},
-       { "ActionNextRecord", GTK_STOCK_GO_FORWARD, "Ne_xt record", NULL, N_("Go to next record"), G_CALLBACK 
(action_next_record_cb)},
-       { "ActionFilter", GTK_STOCK_FIND, "Filter", NULL, N_("Filter records"), G_CALLBACK (action_filter_cb)}
-};
-
-static void
-action_new_activated_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *wid)
-{
-       /* make the first entry grab the focus */
-       if (wid->priv->iter && GDA_SET (wid->priv->iter)->holders)
-               gdaui_basic_form_entry_grab_focus (GDAUI_BASIC_FORM (wid),
-                                                  (GdaHolder *)
-                                                  GDA_SET (wid->priv->iter)->holders->data);
+static gboolean
+gdaui_raw_form_supports_action (GdauiDataProxy *iface, GdauiAction action)
+{
+       switch (action) {
+       case GDAUI_ACTION_NEW_DATA:
+       case GDAUI_ACTION_WRITE_MODIFIED_DATA:
+       case GDAUI_ACTION_DELETE_SELECTED_DATA:
+       case GDAUI_ACTION_UNDELETE_SELECTED_DATA:
+       case GDAUI_ACTION_RESET_DATA:
+       case GDAUI_ACTION_MOVE_FIRST_RECORD:
+        case GDAUI_ACTION_MOVE_PREV_RECORD:
+        case GDAUI_ACTION_MOVE_NEXT_RECORD:
+        case GDAUI_ACTION_MOVE_LAST_RECORD:
+               return TRUE;
+       default:
+               return FALSE;
+       };
 }
 
 static void
-form_activated_cb (GdauiRawForm *form, G_GNUC_UNUSED gpointer data)
+form_holder_changed_cb (GdauiRawForm *form, G_GNUC_UNUSED gpointer data)
 {
-       if (form->priv->write_mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_ACTIVATED) {
+       if (form->priv->write_mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_CHANGE) {
                gint row;
-               
+
                row = gda_data_model_iter_get_row (form->priv->iter);
                if (row >= 0) {
                        /* write back the current row */
                        if (gda_data_proxy_row_has_changed (form->priv->proxy, row)) {
                                GError *error = NULL;
                                if (!gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error)) {
-                                       gboolean discard;
-                                       discard = _gdaui_utility_display_error_with_keep_or_discard_choice 
((GdauiDataProxy *) form,
-                                                                                                           
error);
-                                       if (discard)
-                                               gda_data_proxy_cancel_row_changes (form->priv->proxy, row, 
-1);
-                                       g_error_free (error);
+                                       _gdaui_utility_display_error ((GdauiDataProxy *) form, TRUE, error);
+                                       if (error)
+                                               g_error_free (error);
                                }
                        }
                }
        }
 }
 
+static void arrow_actions_real_do (GdauiRawForm *form, gint movement);
+
 static void
-form_holder_changed_cb (GdauiRawForm *form, G_GNUC_UNUSED gpointer data)
+gdaui_raw_form_perform_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       if (form->priv->write_mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_CHANGE) {
+       GdauiRawForm *form = GDAUI_RAW_FORM (iface);
+
+       switch (action) {
+       case GDAUI_ACTION_NEW_DATA: {
+               gint newrow;
+               GError *error = NULL;
+               GSList *list;
+
+               if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
+                       /* validate current row (forces calling iter_validate_set_cb()) */
+                       if (gda_data_model_iter_is_valid (form->priv->iter) &&
+                           ! gda_set_is_valid (GDA_SET (form->priv->iter), NULL))
+                               return;
+               }
+
+               /* append a row in the proxy */
+               g_signal_handlers_block_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
+               newrow = gda_data_model_append_row (GDA_DATA_MODEL (form->priv->proxy), &error);
+               if (newrow == -1) {
+                       g_warning (_("Can't append row to data model: %s"),
+                                  error && error->message ? error->message : _("Unknown error"));
+                       g_error_free (error);
+                       g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
+                       return;
+               }
+
+               if (!gda_data_model_iter_move_to_row (form->priv->iter, newrow)) {
+                       g_warning ("Can't set GdaDataModelIterator on new row");
+                       g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
+                       return;
+               }
+
+               /* set parameters to their default values */
+               for (list = GDA_SET (form->priv->iter)->holders; list; list = list->next) {
+                       GdaHolder *param;
+                       const GValue *value;
+
+                       g_object_get (G_OBJECT (list->data), "full_bind", &param, NULL);
+                       if (! param) {
+                               value = gda_holder_get_default_value (GDA_HOLDER (list->data));
+                               if (value)
+                                       gda_holder_set_value_to_default (GDA_HOLDER (list->data));
+                       }
+                       else
+                               g_object_unref (param);
+               }
+
+               g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
+               form_holder_changed_cb (form, NULL);
+
+               /* make the first entry grab the focus */
+               if (form->priv->iter && GDA_SET (form->priv->iter)->holders)
+                       gdaui_basic_form_entry_grab_focus (GDAUI_BASIC_FORM (form),
+                                                          (GdaHolder *)
+                                                          GDA_SET (form->priv->iter)->holders->data);
+               break;
+       }
+       case GDAUI_ACTION_WRITE_MODIFIED_DATA: {
                gint row;
+               GError *error = NULL;
+               gboolean allok = TRUE;
+               gint mod1, mod2;
 
+               mod1 = gda_data_proxy_get_n_modified_rows (form->priv->proxy);
                row = gda_data_model_iter_get_row (form->priv->iter);
-               if (row >= 0) {
-                       /* write back the current row */
-                       if (gda_data_proxy_row_has_changed (form->priv->proxy, row)) {
+               if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
+                       gint newrow;
+
+                       allok = gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error);
+                       if (allok) {
+                               newrow = gda_data_model_iter_get_row (form->priv->iter);
+                               if (row != newrow) /* => current row has changed because the proxy had to 
emit a "row_removed" when
+                                                     actually succeeded the commit
+                                                     => we need to come back to that row
+                                                  */
+                                       gda_data_model_iter_move_to_row (form->priv->iter, row);
+                       }
+               }
+               else
+                       allok = gda_data_proxy_apply_all_changes (form->priv->proxy, &error);
+
+               mod2 = gda_data_proxy_get_n_modified_rows (form->priv->proxy);
+               if (!allok) {
+                       if (mod1 != mod2)
+                               /* the data model has changed while doing the writing */
+                               _gdaui_utility_display_error ((GdauiDataProxy *) form, FALSE, error);
+                       else
+                               _gdaui_utility_display_error ((GdauiDataProxy *) form, TRUE, error);
+                       g_error_free (error);
+               }
+
+               /* get to a correct selected row */
+               for (; (row >= 0) &&!gda_data_model_iter_move_to_row (form->priv->iter, row); row--);
+
+               break;
+       }
+       case GDAUI_ACTION_DELETE_SELECTED_DATA: {
+               gint row;
+               row = gda_data_model_iter_get_row (form->priv->iter);
+               g_return_if_fail (row >= 0);
+               gda_data_proxy_delete (form->priv->proxy, row);
+               
+               if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
+                       /* force the proxy to apply the current row deletion */
+                       gint newrow;
+                       
+                       newrow = gda_data_model_iter_get_row (form->priv->iter);
+                       if (row == newrow) {/* => row has been marked as delete but not yet really deleted */
                                GError *error = NULL;
                                if (!gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error)) {
                                        _gdaui_utility_display_error ((GdauiDataProxy *) form, TRUE, error);
@@ -264,13 +343,105 @@ form_holder_changed_cb (GdauiRawForm *form, G_GNUC_UNUSED gpointer data)
                                }
                        }
                }
+               break;
+       }
+
+       case GDAUI_ACTION_UNDELETE_SELECTED_DATA: {
+               gint row;
+               
+               row = gda_data_model_iter_get_row (form->priv->iter);
+               g_return_if_fail (row >= 0);
+               gda_data_proxy_undelete (form->priv->proxy, row);
+
+               break;
+       }
+       case GDAUI_ACTION_RESET_DATA: {
+               gda_data_proxy_cancel_all_changes (form->priv->proxy);
+               gda_data_model_send_hint (GDA_DATA_MODEL (form->priv->proxy), GDA_DATA_MODEL_HINT_REFRESH, 
NULL);
+               break;
+       }
+       case GDAUI_ACTION_MOVE_FIRST_RECORD:
+               arrow_actions_real_do (form, -2);
+               break;
+        case GDAUI_ACTION_MOVE_PREV_RECORD:
+               arrow_actions_real_do (form, -1);
+               break;
+        case GDAUI_ACTION_MOVE_NEXT_RECORD:
+               arrow_actions_real_do (form, 1);
+               break;
+        case GDAUI_ACTION_MOVE_LAST_RECORD:
+               arrow_actions_real_do (form, 2);
+               break;
+       default:
+               break;
+       }
+}
+
+static void
+arrow_actions_real_do (GdauiRawForm *form, gint movement)
+{
+       gint row, oldrow;
+
+       row = gda_data_model_iter_get_row (form->priv->iter);
+       g_return_if_fail (row >= 0);
+       oldrow = row;
+
+       /* see if some data have been modified and need to be written to the DBMS */
+       /* if ((form->priv->mode & GDAUI_ACTION_MODIF_AUTO_COMMIT) && */
+       /*          gda_data_proxy_has_changed (form->priv->proxy)) */
+       /*              action_commit_cb (NULL, form); */
+
+       /* movement */
+       switch (movement) {
+       case -2:
+               row = 0;
+               break;
+       case -1:
+               if (row > 0)
+                       row--;
+               break;
+       case 1:
+               if (row < gda_data_model_get_n_rows (GDA_DATA_MODEL (form->priv->proxy)) - 1 )
+                       row++;
+               break;
+       case 2:
+               row = gda_data_model_get_n_rows (GDA_DATA_MODEL (form->priv->proxy)) - 1;
+               break;
+       default:
+               g_assert_not_reached ();
+       }
+
+       if (oldrow != row)
+               gda_data_model_iter_move_to_row (form->priv->iter, row);
+}
+
+static void
+form_activated_cb (GdauiRawForm *form, G_GNUC_UNUSED gpointer data)
+{
+       if (form->priv->write_mode == GDAUI_DATA_PROXY_WRITE_ON_VALUE_ACTIVATED) {
+               gint row;
+               
+               row = gda_data_model_iter_get_row (form->priv->iter);
+               if (row >= 0) {
+                       /* write back the current row */
+                       if (gda_data_proxy_row_has_changed (form->priv->proxy, row)) {
+                               GError *error = NULL;
+                               if (!gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error)) {
+                                       gboolean discard;
+                                       discard = _gdaui_utility_display_error_with_keep_or_discard_choice 
((GdauiDataProxy *) form,
+                                                                                                           
error);
+                                       if (discard)
+                                               gda_data_proxy_cancel_row_changes (form->priv->proxy, row, 
-1);
+                                       g_error_free (error);
+                               }
+                       }
+               }
        }
 }
 
 static void
 gdaui_raw_form_init (GdauiRawForm *wid)
 {
-       GtkAction *action;
        wid->priv = g_new0 (GdauiRawFormPriv, 1);
 
        wid->priv->data_model = NULL;
@@ -283,19 +454,6 @@ gdaui_raw_form_init (GdauiRawForm *wid)
        g_signal_connect (G_OBJECT (wid), "holder-changed",
                          G_CALLBACK (form_holder_changed_cb), NULL);
 
-       /* action group */
-        wid->priv->actions_group = gtk_action_group_new ("Actions");
-       gtk_action_group_set_translation_domain (wid->priv->actions_group, GETTEXT_PACKAGE);
-
-        gtk_action_group_add_actions (wid->priv->actions_group, ui_actions, G_N_ELEMENTS (ui_actions), wid);
-        gtk_action_group_add_toggle_actions (wid->priv->actions_group, ui_actions_t, G_N_ELEMENTS 
(ui_actions_t), wid);
-       action = gtk_action_group_get_action (wid->priv->actions_group, "ActionNew");
-       g_signal_connect (G_OBJECT (action), "activate",
-                         G_CALLBACK (action_new_activated_cb), wid);
-
-       wid->priv->filter = NULL;
-       wid->priv->filter_window = NULL;
-
        /* raw forms' default unknown color */
        gdaui_basic_form_set_unknown_color ((GdauiBasicForm*) wid, -1., -1., -1., -1.);
 }
@@ -333,15 +491,6 @@ gdaui_raw_form_dispose (GObject *object)
        if (form->priv) {
                gdaui_raw_form_clean (form);
 
-               if (form->priv->filter)
-                       gtk_widget_destroy (form->priv->filter);
-               if (form->priv->filter_window)
-                       gtk_widget_destroy (form->priv->filter_window);
-
-               /* UI */
-               if (form->priv->actions_group)
-                       g_object_unref (G_OBJECT (form->priv->actions_group));
-
                /* the private area itself */
                g_free (form->priv);
                form->priv = NULL;
@@ -605,360 +754,6 @@ proxy_row_inserted_or_removed_cb (G_GNUC_UNUSED GdaDataProxy *proxy, gint row, G
                        gda_data_model_iter_move_to_row (form->priv->iter, row > 0 ? row - 1 : 0);
 }
 
-/*
- *
- * Modification buttons (Commit changes, Reset form, New entry, Delete)
- *
- */
-static void
-action_new_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       gint newrow;
-       GError *error = NULL;
-       GSList *list;
-
-       if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
-               /* validate current row (forces calling iter_validate_set_cb()) */
-               if (gda_data_model_iter_is_valid (form->priv->iter) &&
-                   ! gda_set_is_valid (GDA_SET (form->priv->iter), NULL))
-                       return;
-       }
-
-       /* append a row in the proxy */
-       g_signal_handlers_block_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
-       newrow = gda_data_model_append_row (GDA_DATA_MODEL (form->priv->proxy), &error);
-       if (newrow == -1) {
-               g_warning (_("Can't append row to data model: %s"),
-                          error && error->message ? error->message : _("Unknown error"));
-               g_error_free (error);
-               g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
-               return;
-       }
-
-       if (!gda_data_model_iter_move_to_row (form->priv->iter, newrow)) {
-               g_warning ("Can't set GdaDataModelIterator on new row");
-               g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
-               return;
-       }
-
-       /* set parameters to their default values */
-       for (list = GDA_SET (form->priv->iter)->holders; list; list = list->next) {
-               GdaHolder *param;
-               const GValue *value;
-
-               g_object_get (G_OBJECT (list->data), "full_bind", &param, NULL);
-               if (! param) {
-                       value = gda_holder_get_default_value (GDA_HOLDER (list->data));
-                       if (value)
-                               gda_holder_set_value_to_default (GDA_HOLDER (list->data));
-               }
-               else
-                       g_object_unref (param);
-       }
-
-       g_signal_handlers_unblock_by_func (form, G_CALLBACK (form_holder_changed_cb), NULL);
-       form_holder_changed_cb (form, NULL);
-}
-
-static void
-action_delete_cb (GtkToggleAction *action, GdauiRawForm *form)
-{
-       if (gtk_toggle_action_get_active (action)) {
-               gint row;
-               row = gda_data_model_iter_get_row (form->priv->iter);
-               g_return_if_fail (row >= 0);
-               gda_data_proxy_delete (form->priv->proxy, row);
-               
-               if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
-                       /* force the proxy to apply the current row deletion */
-                       gint newrow;
-                       
-                       newrow = gda_data_model_iter_get_row (form->priv->iter);
-                       if (row == newrow) {/* => row has been marked as delete but not yet really deleted */
-                               GError *error = NULL;
-                               if (!gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error)) {
-                                       _gdaui_utility_display_error ((GdauiDataProxy *) form, TRUE, error);
-                                       if (error)
-                                               g_error_free (error);
-                               }
-                       }
-               }
-       }
-       else {
-               gint row;
-               
-               row = gda_data_model_iter_get_row (form->priv->iter);
-               g_return_if_fail (row >= 0);
-               gda_data_proxy_undelete (form->priv->proxy, row);
-       }
-}
-
-static void
-action_commit_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       gint row;
-       GError *error = NULL;
-       gboolean allok = TRUE;
-       gint mod1, mod2;
-
-       mod1 = gda_data_proxy_get_n_modified_rows (form->priv->proxy);
-       row = gda_data_model_iter_get_row (form->priv->iter);
-       if (form->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
-               gint newrow;
-
-               allok = gda_data_proxy_apply_row_changes (form->priv->proxy, row, &error);
-               if (allok) {
-                       newrow = gda_data_model_iter_get_row (form->priv->iter);
-                       if (row != newrow) /* => current row has changed because the proxy had to emit a 
"row_removed" when
-                                             actually succeeded the commit
-                                             => we need to come back to that row
-                                          */
-                               gda_data_model_iter_move_to_row (form->priv->iter, row);
-               }
-       }
-       else
-               allok = gda_data_proxy_apply_all_changes (form->priv->proxy, &error);
-
-       mod2 = gda_data_proxy_get_n_modified_rows (form->priv->proxy);
-       if (!allok) {
-               if (mod1 != mod2)
-                       /* the data model has changed while doing the writing */
-                       _gdaui_utility_display_error ((GdauiDataProxy *) form, FALSE, error);
-               else
-                       _gdaui_utility_display_error ((GdauiDataProxy *) form, TRUE, error);
-               g_error_free (error);
-       }
-
-       /* get to a correct selected row */
-       for (; (row >= 0) &&!gda_data_model_iter_move_to_row (form->priv->iter, row); row--);
-}
-
-static void
-action_reset_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       gda_data_proxy_cancel_all_changes (form->priv->proxy);
-       gda_data_model_send_hint (GDA_DATA_MODEL (form->priv->proxy), GDA_DATA_MODEL_HINT_REFRESH, NULL);
-}
-
-static void arrow_actions_real_do (GdauiRawForm *form, gint movement);
-static void
-action_first_record_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       arrow_actions_real_do (form, -2);
-}
-
-static void
-action_prev_record_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       arrow_actions_real_do (form, -1);
-}
-
-static void
-action_next_record_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       arrow_actions_real_do (form, 1);
-}
-
-static void
-action_last_record_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       arrow_actions_real_do (form, 2);
-}
-
-static void
-hide_filter_window (GdauiRawForm *form)
-{
-       gtk_widget_hide (form->priv->filter_window);
-       gtk_grab_remove (form->priv->filter_window);
-}
-
-static gboolean
-filter_event (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkEventAny *event, GdauiRawForm *form)
-{
-       hide_filter_window (form);
-       return TRUE;
-}
-
-static gboolean
-key_press_filter_event (G_GNUC_UNUSED GtkWidget *widget, GdkEventKey *event, GdauiRawForm *form)
-{
-       if (event->keyval == GDK_KEY_Escape ||
-           event->keyval == GDK_KEY_Tab ||
-            event->keyval == GDK_KEY_KP_Tab ||
-            event->keyval == GDK_KEY_ISO_Left_Tab) {
-               hide_filter_window (form);
-               return TRUE;
-       }
-       return FALSE;
-}
-
-static void
-filter_position_func (GtkWidget *widget,
-                     GtkWidget *search_dialog,
-                     G_GNUC_UNUSED gpointer   user_data)
-{
-       gint x, y;
-       gint tree_x, tree_y;
-       gint tree_width, tree_height;
-       GdkWindow *window;
-       GdkScreen *screen;
-       GtkRequisition requisition;
-       gint monitor_num;
-       GdkRectangle monitor;
-
-       window = gtk_widget_get_window (widget);
-       screen = gdk_window_get_screen (window);
-       monitor_num = gdk_screen_get_monitor_at_window (screen, window);
-       gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
-       gtk_widget_realize (search_dialog);
-
-       gdk_window_get_origin (window, &tree_x, &tree_y);
-       tree_width = gdk_window_get_width (window);
-       tree_height = gdk_window_get_height (window);
-       gtk_widget_get_preferred_size (search_dialog, NULL, &requisition);
-
-       if (tree_x + tree_width > gdk_screen_get_width (screen))
-               x = gdk_screen_get_width (screen) - requisition.width;
-       else if (tree_x + tree_width - requisition.width < 0)
-               x = 0;
-       else
-               x = tree_x + tree_width - requisition.width;
-
-       if (tree_y + tree_height + requisition.height > gdk_screen_get_height (screen))
-               y = gdk_screen_get_height (screen) - requisition.height;
-       else if (tree_y + tree_height < 0) /* isn't really possible ... */
-               y = 0;
-       else
-               y = tree_y + tree_height;
-
-       gtk_window_move (GTK_WINDOW (search_dialog), x, y);
-}
-
-static gboolean
-popup_grab_on_window (GtkWidget *widget, guint32 activate_time)
-{
-       GdkDeviceManager *manager;
-       GdkDevice *pointer;
-       GdkWindow *window;
-       window = gtk_widget_get_window (widget);
-       manager = gdk_display_get_device_manager (gtk_widget_get_display (widget));
-       pointer = gdk_device_manager_get_client_pointer (manager);
-        if (gdk_device_grab (pointer, window, GDK_OWNERSHIP_WINDOW, TRUE,
-                              GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
-                              NULL, activate_time) == GDK_GRAB_SUCCESS) {
-               GdkDevice *keyb;
-               keyb = gdk_device_get_associated_device (pointer);
-                if (gdk_device_grab (keyb, window, GDK_OWNERSHIP_WINDOW, TRUE,
-                                    GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, NULL, activate_time) == 0)
-                        return TRUE;
-               else {
-                        gdk_device_ungrab (pointer, activate_time);
-                        return FALSE;
-                }
-        }
-        return FALSE;
-}
-
-static void
-action_filter_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawForm *form)
-{
-       GtkWidget *toplevel;
-       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (form));
-
-       if (!form->priv->filter_window) {
-               /* create filter window */
-               GtkWidget *frame, *vbox;
-
-               form->priv->filter_window = gtk_window_new (GTK_WINDOW_POPUP);
-
-               gtk_widget_set_events (form->priv->filter_window,
-                                      gtk_widget_get_events (form->priv->filter_window) | 
GDK_KEY_PRESS_MASK);
-
-               if (gtk_widget_is_toplevel (toplevel) && gtk_window_get_group ((GtkWindow*) toplevel))
-                       gtk_window_group_add_window (gtk_window_get_group ((GtkWindow*) toplevel),
-                                                    GTK_WINDOW (form->priv->filter_window));
-
-               g_signal_connect (form->priv->filter_window, "delete-event",
-                                 G_CALLBACK (filter_event), form);
-               g_signal_connect (form->priv->filter_window, "button-press-event",
-                                 G_CALLBACK (filter_event), form);
-               g_signal_connect (form->priv->filter_window, "key-press-event",
-                                 G_CALLBACK (key_press_filter_event), form);
-               frame = gtk_frame_new (NULL);
-               gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
-               gtk_widget_show (frame);
-               gtk_container_add (GTK_CONTAINER (form->priv->filter_window), frame);
-
-               vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-               gtk_widget_show (vbox);
-               gtk_container_add (GTK_CONTAINER (frame), vbox);
-               gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
-
-               /* add real filter widget */
-               if (! form->priv->filter) {
-                       form->priv->filter = gdaui_data_filter_new (GDAUI_DATA_PROXY (form));
-                       gtk_widget_show (form->priv->filter);
-               }
-               gtk_container_add (GTK_CONTAINER (vbox), form->priv->filter);
-       }
-       else if (gtk_widget_is_toplevel (toplevel)) {
-               if (gtk_window_get_group ((GtkWindow*) toplevel))
-                       gtk_window_group_add_window (gtk_window_get_group ((GtkWindow*) toplevel),
-                                                    GTK_WINDOW (form->priv->filter_window));
-               else if (gtk_window_get_group ((GtkWindow*) form->priv->filter_window))
-                       gtk_window_group_remove_window (gtk_window_get_group ((GtkWindow*) 
form->priv->filter_window),
-                                                       GTK_WINDOW (form->priv->filter_window));
-       }
-
-       /* move the filter window to a correct location */
-       /* FIXME: let the user specify the position function like GtkTreeView -> search_position_func() */
-       gtk_widget_show (form->priv->filter_window);
-       gtk_grab_add (form->priv->filter_window);
-       filter_position_func (GTK_WIDGET (form), form->priv->filter_window, NULL);
-       gtk_widget_show (form->priv->filter_window);
-       popup_grab_on_window (form->priv->filter_window,
-                             gtk_get_current_event_time ());
-}
-
-
-static void
-arrow_actions_real_do (GdauiRawForm *form, gint movement)
-{
-       gint row, oldrow;
-
-       row = gda_data_model_iter_get_row (form->priv->iter);
-       g_return_if_fail (row >= 0);
-       oldrow = row;
-
-       /* see if some data have been modified and need to be written to the DBMS */
-       /* if ((form->priv->mode & GDAUI_ACTION_MODIF_AUTO_COMMIT) && */
-       /*          gda_data_proxy_has_changed (form->priv->proxy)) */
-       /*              action_commit_cb (NULL, form); */
-
-       /* movement */
-       switch (movement) {
-       case -2:
-               row = 0;
-               break;
-       case -1:
-               if (row > 0)
-                       row--;
-               break;
-       case 1:
-               if (row < gda_data_model_get_n_rows (GDA_DATA_MODEL (form->priv->proxy)) - 1 )
-                       row++;
-               break;
-       case 2:
-               row = gda_data_model_get_n_rows (GDA_DATA_MODEL (form->priv->proxy)) - 1;
-               break;
-       default:
-               g_assert_not_reached ();
-       }
-
-       if (oldrow != row)
-               gda_data_model_iter_move_to_row (form->priv->iter, row);
-}
 
 /*
  * GdauiDataProxy interface implementation
@@ -1007,18 +802,6 @@ gdaui_raw_form_show_column_actions (GdauiDataProxy *iface, G_GNUC_UNUSED gint co
        g_object_set ((GObject*) form, "show-actions", show_actions, NULL);
 }
 
-static GtkActionGroup *
-gdaui_raw_form_get_actions_group (GdauiDataProxy *iface)
-{
-       GdauiRawForm *form;
-
-       g_return_val_if_fail (GDAUI_IS_RAW_FORM (iface), NULL);
-       form = GDAUI_RAW_FORM (iface);
-       g_return_val_if_fail (form->priv, NULL);
-
-       return form->priv->actions_group;
-}
-
 static gboolean
 gdaui_raw_form_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode mode)
 {
diff --git a/libgda-ui/gdaui-raw-grid.c b/libgda-ui/gdaui-raw-grid.c
index 7126ce5..c88066b 100644
--- a/libgda-ui/gdaui-raw-grid.c
+++ b/libgda-ui/gdaui-raw-grid.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2009 Bas Driessen <bas driessen xobas com>
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -33,7 +33,6 @@
 #include <libgda/binreloc/gda-binreloc.h>
 #include <gtk/gtk.h>
 #include <libgda/gda-debug-macros.h>
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 static void gdaui_raw_grid_class_init (GdauiRawGridClass *klass);
 static void gdaui_raw_grid_init (GdauiRawGrid *wid);
@@ -70,7 +69,8 @@ static void            gdaui_raw_grid_widget_init           (GdauiDataProxyIface
 static GdaDataProxy   *gdaui_raw_grid_get_proxy             (GdauiDataProxy *iface);
 static void            gdaui_raw_grid_set_column_editable   (GdauiDataProxy *iface, gint column, gboolean 
editable);
 static void            gdaui_raw_grid_show_column_actions   (GdauiDataProxy *iface, gint column, gboolean 
show_actions);
-static GtkActionGroup *gdaui_raw_grid_get_actions_group     (GdauiDataProxy *iface);
+static gboolean        gdaui_raw_grid_supports_action       (GdauiDataProxy *iface, GdauiAction action);
+static void            gdaui_raw_grid_perform_action        (GdauiDataProxy *iface, GdauiAction action);
 static gboolean        gdaui_raw_grid_widget_set_write_mode (GdauiDataProxy *iface, GdauiDataProxyWriteMode 
mode);
 static GdauiDataProxyWriteMode gdaui_raw_grid_widget_get_write_mode (GdauiDataProxy *iface);
 
@@ -135,14 +135,9 @@ struct _GdauiRawGridPriv
        gboolean                    default_show_info_cell;
        gboolean                    default_show_global_actions;
 
-       GtkActionGroup             *actions_group;
-
        gint                        export_type; /* used by the export dialog */
        GdauiDataProxyWriteMode     write_mode;
 
-       GtkWidget                  *filter;
-       GtkWidget                  *filter_window;
-
        /* store the position of the mouse for popup menu on button press event */
        gint                        bin_x;
        gint                        bin_y;
@@ -167,8 +162,7 @@ enum {
        PROP_0,
        PROP_MODEL,
        PROP_XML_LAYOUT,
-       PROP_INFO_CELL_VISIBLE,
-       PROP_GLOBAL_ACTIONS_VISIBLE
+       PROP_INFO_CELL_VISIBLE
 };
 
 /*
@@ -183,31 +177,6 @@ static void     tree_view_selection_changed_cb (GtkTreeSelection *selection, Gda
 static void     tree_view_row_activated_cb     (GtkTreeView *tree_view, GtkTreePath *path,
                                                GtkTreeViewColumn *column, GdauiRawGrid *grid);
 
-static void action_new_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_delete_cb (GtkToggleAction *action, GdauiRawGrid *grid);
-static void action_commit_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_reset_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_first_chunck_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_prev_chunck_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_next_chunck_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_last_chunck_cb (GtkAction *action, GdauiRawGrid *grid);
-static void action_filter_cb (GtkAction *action, GdauiRawGrid *grid);
-
-static GtkToggleActionEntry ui_actions_t[] = {
-       { "ActionDelete", GTK_STOCK_REMOVE, "_Delete", NULL, N_("Delete the current record"), G_CALLBACK 
(action_delete_cb), FALSE},
-};
-
-static GtkActionEntry ui_actions[] = {
-       { "ActionNew", GTK_STOCK_ADD, "_New", NULL, N_("Create a new record"), G_CALLBACK (action_new_cb)},
-       { "ActionCommit", GTK_STOCK_SAVE, "_Commit", NULL, N_("Commit the modifications"), G_CALLBACK 
(action_commit_cb)},
-       { "ActionReset", GTK_STOCK_CLEAR, "_Clear", NULL, N_("Clear all the modifications"), G_CALLBACK 
(action_reset_cb)},
-       { "ActionFirstChunck", GTK_STOCK_GOTO_FIRST, "_First chunck", NULL, N_("Go to first chunck"), 
G_CALLBACK (action_first_chunck_cb)},
-       { "ActionLastChunck", GTK_STOCK_GOTO_LAST, "_Last chunck", NULL, N_("Go to last chunck"), G_CALLBACK 
(action_last_chunck_cb)},
-       { "ActionPrevChunck", GTK_STOCK_GO_BACK, "_Previous chunck", NULL, N_("Go to previous chunck"), 
G_CALLBACK (action_prev_chunck_cb)},
-       { "ActionNextChunck", GTK_STOCK_GO_FORWARD, "Ne_xt chunck", NULL, N_("Go to next chunck"), G_CALLBACK 
(action_next_chunck_cb)},
-       { "ActionFilter", GTK_STOCK_FIND, "Filter", NULL, N_("Filter records"), G_CALLBACK (action_filter_cb)}
-};
-
 GType
 gdaui_raw_grid_get_type (void)
 {
@@ -253,7 +222,8 @@ gdaui_raw_grid_widget_init (GdauiDataProxyIface *iface)
        iface->get_proxy = gdaui_raw_grid_get_proxy;
        iface->set_column_editable = gdaui_raw_grid_set_column_editable;
        iface->show_column_actions = gdaui_raw_grid_show_column_actions;
-       iface->get_actions_group = gdaui_raw_grid_get_actions_group;
+       iface->supports_action = gdaui_raw_grid_supports_action;
+       iface->perform_action = gdaui_raw_grid_perform_action;
        iface->set_write_mode = gdaui_raw_grid_widget_set_write_mode;
        iface->get_write_mode = gdaui_raw_grid_widget_get_write_mode;
 }
@@ -324,10 +294,6 @@ gdaui_raw_grid_class_init (GdauiRawGridClass *klass)
        g_object_class_install_property (object_class, PROP_INFO_CELL_VISIBLE,
                                          g_param_spec_boolean ("info-cell-visible", NULL, _("Info cell 
visible"), FALSE,
                                                                G_PARAM_READABLE | G_PARAM_WRITABLE));
-
-       g_object_class_install_property (object_class, PROP_GLOBAL_ACTIONS_VISIBLE,
-                                         g_param_spec_boolean ("global-actions-visible", NULL, _("Global 
Actions visible"), FALSE,
-                                                               G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 static gboolean
@@ -414,15 +380,6 @@ gdaui_raw_grid_init (GdauiRawGrid *grid)
        g_signal_connect (grid, "query-tooltip",
                          G_CALLBACK (gdaui_raw_grid_query_tooltip), NULL);
 
-       /* action group */
-       grid->priv->actions_group = gtk_action_group_new ("Actions");
-       gtk_action_group_set_translation_domain (grid->priv->actions_group, GETTEXT_PACKAGE);
-       gtk_action_group_add_actions (grid->priv->actions_group, ui_actions, G_N_ELEMENTS (ui_actions), grid);
-       gtk_action_group_add_toggle_actions (grid->priv->actions_group, ui_actions_t, G_N_ELEMENTS 
(ui_actions_t), grid);
-
-       grid->priv->filter = NULL;
-       grid->priv->filter_window = NULL;
-
        grid->priv->formatting_funcs = NULL;
 }
 
@@ -460,16 +417,6 @@ gdaui_raw_grid_dispose (GObject *object)
        if (grid->priv) {
                gdaui_raw_grid_clean (grid);
 
-               if (grid->priv->actions_group) {
-                       g_object_unref (G_OBJECT (grid->priv->actions_group));
-                       grid->priv->actions_group = NULL;
-               }
-
-               if (grid->priv->filter)
-                       gtk_widget_destroy (grid->priv->filter);
-               if (grid->priv->filter_window)
-                       gtk_widget_destroy (grid->priv->filter_window);
-
                if (grid->priv->formatting_funcs) {
                        g_slist_foreach (grid->priv->formatting_funcs, (GFunc) formatting_func_destroy,
                                         NULL);
@@ -589,10 +536,6 @@ gdaui_raw_grid_set_property (GObject *object,
                        break;
                }
 
-               case PROP_GLOBAL_ACTIONS_VISIBLE:
-                       gtk_action_group_set_visible (grid->priv->actions_group, g_value_get_boolean (value));
-                       break;
-
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
@@ -617,10 +560,6 @@ gdaui_raw_grid_get_property (GObject *object,
                case PROP_INFO_CELL_VISIBLE:
                        g_value_set_boolean(value, grid->priv->default_show_info_cell);
                        break;
-               case PROP_GLOBAL_ACTIONS_VISIBLE:
-                       g_value_set_boolean(value, grid->priv->default_show_global_actions);
-                       break;
-
                default:
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
                        break;
@@ -1485,307 +1424,6 @@ data_cell_status_changed (GtkCellRenderer *renderer, const gchar *path, GdaValue
        gda_value_free (attribute);
 }
 
-static void
-action_new_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       GtkTreeIter iter;
-       GtkTreePath *path;
-
-       if (gdaui_data_store_append (grid->priv->store, &iter)) {
-               path = gtk_tree_model_get_path (GTK_TREE_MODEL (grid->priv->store), &iter);
-               gtk_tree_view_set_cursor (GTK_TREE_VIEW (grid), path, NULL, FALSE);
-               gtk_tree_path_free (path);
-       }
-}
-
-static void
-action_delete_cb (GtkToggleAction *action, GdauiRawGrid *grid)
-{
-       if (gtk_toggle_action_get_active (action)) {
-               GtkTreeIter iter;
-               GtkTreeSelection *select;
-               GtkTreeModel *model;
-               GList *sel_rows;
-               GdaDataProxy *proxy;
-               
-               select = gtk_tree_view_get_selection (GTK_TREE_VIEW (grid));
-               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
-               proxy = gdaui_data_store_get_proxy (GDAUI_DATA_STORE (model));
-               
-               /* rem: get the list of selected rows after each row deletion because the data model might 
have changed and
-                * row numbers might also have changed */
-               while (sel_rows) {
-                       gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) (sel_rows->data));
-                       if (!gda_data_proxy_row_is_deleted (proxy,
-                                                           gdaui_data_store_get_row_from_iter 
(GDAUI_DATA_STORE (model),
-                                                                                               &iter))) {
-                               gdaui_data_store_delete (grid->priv->store, &iter);
-                               g_list_foreach (sel_rows, (GFunc) gtk_tree_path_free, NULL);
-                               g_list_free (sel_rows);
-                               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
-                       }
-                       else
-                               sel_rows = sel_rows->next;
-               }
-       }
-       else {
-               GtkTreeIter iter;
-               GtkTreeSelection *select;
-               GtkTreeModel *model;
-               GList *sel_rows, *cur_row;
-               
-               select = gtk_tree_view_get_selection (GTK_TREE_VIEW (grid));
-               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
-               cur_row = sel_rows;
-               while (cur_row) {
-                       gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) (cur_row->data));
-                       gdaui_data_store_undelete (grid->priv->store, &iter);
-                       cur_row = g_list_next (cur_row);
-               }
-               g_list_foreach (sel_rows, (GFunc) gtk_tree_path_free, NULL);
-               g_list_free (sel_rows);
-       }
-}
-
-static void
-action_commit_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gint row;
-       GError *error = NULL;
-       gboolean allok = TRUE;
-       gint mod1, mod2;
-
-       mod1 = gda_data_proxy_get_n_modified_rows (grid->priv->proxy);
-       row = gda_data_model_iter_get_row (grid->priv->iter);
-       if (grid->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
-               gint newrow;
-
-               allok = gda_data_proxy_apply_row_changes (grid->priv->proxy, row, &error);
-               if (allok) {
-                       newrow = gda_data_model_iter_get_row (grid->priv->iter);
-                       if (row != newrow) /* => current row has changed because the
-                                                proxy had to emit a "row_removed" when
-                                                actually succeeded the commit
-                                             => we need to come back to that row
-                                          */
-                               gda_data_model_iter_move_to_row (grid->priv->iter, row);
-               }
-       }
-       else
-               allok = gda_data_proxy_apply_all_changes (grid->priv->proxy, &error);
-
-       mod2 = gda_data_proxy_get_n_modified_rows (grid->priv->proxy);
-       if (!allok) {
-               if (mod1 != mod2)
-                       /* the data model has changed while doing the writing */
-                       _gdaui_utility_display_error ((GdauiDataProxy *) grid, FALSE, error);
-               else
-                       _gdaui_utility_display_error ((GdauiDataProxy *) grid, TRUE, error);
-               g_error_free (error);
-       }
-}
-
-static void
-action_reset_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gda_data_proxy_cancel_all_changes (grid->priv->proxy);
-       gda_data_model_send_hint (GDA_DATA_MODEL (grid->priv->proxy), GDA_DATA_MODEL_HINT_REFRESH, NULL);
-}
-
-static void
-action_first_chunck_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gda_data_proxy_set_sample_start (grid->priv->proxy, 0);
-}
-
-static void
-action_prev_chunck_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gint sample_size, sample_start;
-
-       sample_size = gda_data_proxy_get_sample_size (grid->priv->proxy);
-       if (sample_size > 0) {
-               sample_start = gda_data_proxy_get_sample_start (grid->priv->proxy);
-               sample_start -= sample_size;
-               gda_data_proxy_set_sample_start (grid->priv->proxy, sample_start);
-       }
-}
-
-static void
-action_next_chunck_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gint sample_size, sample_start;
-
-       sample_size = gda_data_proxy_get_sample_size (grid->priv->proxy);
-       if (sample_size > 0) {
-               sample_start = gda_data_proxy_get_sample_start (grid->priv->proxy);
-               sample_start += sample_size;
-               gda_data_proxy_set_sample_start (grid->priv->proxy, sample_start);
-       }
-}
-
-static void
-action_last_chunck_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       gda_data_proxy_set_sample_start (grid->priv->proxy, G_MAXINT);
-}
-
-static void
-hide_filter_window (GdauiRawGrid *grid)
-{
-       gtk_widget_hide (grid->priv->filter_window);
-       gtk_grab_remove (grid->priv->filter_window);
-}
-
-static gboolean
-filter_event (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkEventAny *event, GdauiRawGrid *grid)
-{
-       hide_filter_window (grid);
-       return TRUE;
-}
-
-static gboolean
-key_press_filter_event (G_GNUC_UNUSED GtkWidget *widget, GdkEventKey *event, GdauiRawGrid *grid)
-{
-       if (event->keyval == GDK_KEY_Escape ||
-           event->keyval == GDK_KEY_Tab ||
-            event->keyval == GDK_KEY_KP_Tab ||
-            event->keyval == GDK_KEY_ISO_Left_Tab) {
-               hide_filter_window (grid);
-               return TRUE;
-       }
-       return FALSE;
-}
-
-static void
-filter_position_func (GtkWidget *widget,
-                     GtkWidget *search_dialog,
-                     G_GNUC_UNUSED gpointer   user_data)
-{
-       gint x, y;
-       gint tree_x, tree_y;
-       gint tree_width, tree_height;
-       GdkWindow *window;
-       GdkScreen *screen;
-       GtkRequisition requisition;
-       gint monitor_num;
-       GdkRectangle monitor;
-
-       window = gtk_widget_get_window (widget);
-       screen = gdk_window_get_screen (window);
-
-       monitor_num = gdk_screen_get_monitor_at_window (screen, window);
-       gdk_screen_get_monitor_geometry (screen, monitor_num, &monitor);
-
-       gtk_widget_realize (search_dialog);
-
-       gdk_window_get_origin (window, &tree_x, &tree_y);
-       tree_width = gdk_window_get_width (window);
-       tree_height = gdk_window_get_height (window);
-       gtk_widget_get_preferred_size (search_dialog, NULL, &requisition);
-
-       if (tree_x + tree_width > gdk_screen_get_width (screen))
-               x = gdk_screen_get_width (screen) - requisition.width;
-       else if (tree_x + tree_width - requisition.width < 0)
-               x = 0;
-       else
-               x = tree_x + tree_width - requisition.width;
-
-       if (tree_y + tree_height + requisition.height > gdk_screen_get_height (screen))
-               y = gdk_screen_get_height (screen) - requisition.height;
-       else if (tree_y + tree_height < 0) /* isn't really possible ... */
-               y = 0;
-       else
-               y = tree_y + tree_height;
-
-       gtk_window_move (GTK_WINDOW (search_dialog), x, y);
-}
-
-static gboolean
-popup_grab_on_window (GtkWidget *widget, guint32 activate_time)
-{
-       GdkDeviceManager *manager;
-       GdkDevice *pointer;
-       GdkWindow *window;
-       window = gtk_widget_get_window (widget);
-       manager = gdk_display_get_device_manager (gtk_widget_get_display (widget));
-       pointer = gdk_device_manager_get_client_pointer (manager);
-        if (gdk_device_grab (pointer, window, GDK_OWNERSHIP_WINDOW, TRUE,
-                              GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK,
-                              NULL, activate_time) == GDK_GRAB_SUCCESS) {
-               GdkDevice *keyb;
-               keyb = gdk_device_get_associated_device (pointer);
-                if (gdk_device_grab (keyb, window, GDK_OWNERSHIP_WINDOW, TRUE,
-                                    GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK, NULL, activate_time) == 0)
-                        return TRUE;
-               else {
-                        gdk_device_ungrab (pointer, activate_time);
-                        return FALSE;
-                }
-        }
-        return FALSE;
-}
-
-static void
-action_filter_cb (G_GNUC_UNUSED GtkAction *action, GdauiRawGrid *grid)
-{
-       GtkWidget *toplevel;
-       toplevel = gtk_widget_get_toplevel (GTK_WIDGET (grid));
-
-       if (!grid->priv->filter_window) {
-               /* create filter window */
-               GtkWidget *frame, *vbox;
-
-               grid->priv->filter_window = gtk_window_new (GTK_WINDOW_POPUP);
-
-               gtk_widget_set_events (grid->priv->filter_window,
-                                      gtk_widget_get_events (grid->priv->filter_window) | 
GDK_KEY_PRESS_MASK);
-
-               if (gtk_widget_is_toplevel (toplevel) && gtk_window_get_group (GTK_WINDOW (toplevel)))
-                       gtk_window_group_add_window (gtk_window_get_group (GTK_WINDOW (toplevel)),
-                                                    GTK_WINDOW (grid->priv->filter_window));
-
-               g_signal_connect (grid->priv->filter_window, "delete-event",
-                                 G_CALLBACK (filter_event), grid);
-               g_signal_connect (grid->priv->filter_window, "button-press-event",
-                                 G_CALLBACK (filter_event), grid);
-               g_signal_connect (grid->priv->filter_window, "key-press-event",
-                                 G_CALLBACK (key_press_filter_event), grid);
-               frame = gtk_frame_new (NULL);
-               gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);
-               gtk_widget_show (frame);
-               gtk_container_add (GTK_CONTAINER (grid->priv->filter_window), frame);
-
-               vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
-               gtk_widget_show (vbox);
-               gtk_container_add (GTK_CONTAINER (frame), vbox);
-               gtk_container_set_border_width (GTK_CONTAINER (vbox), 3);
-
-               /* add real filter widget */
-               if (! grid->priv->filter) {
-                       grid->priv->filter = gdaui_data_filter_new (GDAUI_DATA_PROXY (grid));
-                       gtk_widget_show (grid->priv->filter);
-               }
-               gtk_container_add (GTK_CONTAINER (vbox), grid->priv->filter);
-       }
-       else if (gtk_widget_is_toplevel (toplevel)) {
-               if (gtk_window_get_group ((GtkWindow*) toplevel))
-                       gtk_window_group_add_window (gtk_window_get_group ((GtkWindow*) toplevel),
-                                                    GTK_WINDOW (grid->priv->filter_window));
-               else if (gtk_window_get_group (GTK_WINDOW (grid->priv->filter_window)))
-                       gtk_window_group_remove_window (gtk_window_get_group (GTK_WINDOW 
(grid->priv->filter_window)),
-                                                       GTK_WINDOW (grid->priv->filter_window));
-       }
-
-       /* move the filter window to a correct location */
-       /* FIXME: let the user specify the position function like GtkTreeView -> search_position_func() */
-       gtk_widget_show (grid->priv->filter_window);
-       gtk_grab_add (grid->priv->filter_window);
-       filter_position_func (GTK_WIDGET (grid), grid->priv->filter_window, NULL);
-       popup_grab_on_window (grid->priv->filter_window,
-                             gtk_get_current_event_time ());
-}
-
 /*
  * Catch any event in the GtkTreeView widget
  */
@@ -1866,8 +1504,6 @@ static void menu_select_all_cb (GtkWidget *widget, GdauiRawGrid *grid);
 static void menu_unselect_all_cb (GtkWidget *widget, GdauiRawGrid *grid);
 static void menu_show_columns_cb (GtkWidget *widget, GdauiRawGrid *grid);
 static void menu_save_as_cb (GtkWidget *widget, GdauiRawGrid *grid);
-static void menu_set_filter_cb (GtkWidget *widget, GdauiRawGrid *grid);
-static void menu_unset_filter_cb (GtkWidget *widget, GdauiRawGrid *grid);
 static void menu_copy_row_cb (GtkWidget *widget, GdauiRawGrid *grid);
 static GtkWidget *new_menu_item (const gchar *label,
                                 GCallback cb_func,
@@ -1896,7 +1532,6 @@ tree_view_popup_button_pressed_cb (G_GNUC_UNUSED GtkWidget *widget, GdkEventButt
        GtkTreeSelection *selection;
        GtkSelectionMode sel_mode;
        GSList *list;
-       GtkWidget *mitem;
 
        if (event->button != 3)
                return FALSE;
@@ -1922,6 +1557,7 @@ tree_view_popup_button_pressed_cb (G_GNUC_UNUSED GtkWidget *widget, GdkEventButt
                        nentries ++;
        }
        if (nentries > 1) {
+               GtkWidget *mitem;
                mitem = gtk_menu_item_new_with_label (_("Shown columns"));
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                gtk_widget_show (mitem);
@@ -1967,15 +1603,6 @@ tree_view_popup_button_pressed_cb (G_GNUC_UNUSED GtkWidget *widget, GdkEventButt
                                                    gtk_tree_view_get_headers_visible (tree_view),
                                                    G_CALLBACK (menu_show_columns_cb), grid));
        
-       gtk_menu_shell_append (GTK_MENU_SHELL (menu),
-                              new_menu_item (_("_Set filter"),
-                                             G_CALLBACK (menu_set_filter_cb), grid));
-
-       mitem = new_menu_item (_("_Unset filter"), G_CALLBACK (menu_unset_filter_cb), grid);
-       gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
-       if (!gda_data_proxy_get_filter_expr (grid->priv->proxy))
-               gtk_widget_set_sensitive (mitem, FALSE);
-       
        if (sel_mode != GTK_SELECTION_NONE) {
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new ());
                gtk_menu_shell_append (GTK_MENU_SHELL (menu), new_menu_item (_("Save _As"),
@@ -2526,19 +2153,6 @@ confirm_file_overwrite (GtkWindow *parent, const gchar *path)
 }
 
 static void
-menu_set_filter_cb (G_GNUC_UNUSED GtkWidget *widget, GdauiRawGrid *grid)
-{
-       action_filter_cb (NULL, grid);
-}
-
-static void
-menu_unset_filter_cb (G_GNUC_UNUSED GtkWidget *widget, GdauiRawGrid *grid)
-{
-       gda_data_proxy_set_filter_expr (grid->priv->proxy, NULL, NULL);
-}
-
-
-static void
 tree_view_row_activated_cb (G_GNUC_UNUSED GtkTreeView *tree_view, GtkTreePath *path,
                            G_GNUC_UNUSED GtkTreeViewColumn *column, GdauiRawGrid *grid)
 {
@@ -2876,16 +2490,173 @@ gdaui_raw_grid_show_column_actions (GdauiDataProxy *iface, gint column, gboolean
        }
 }
 
-static GtkActionGroup *
-gdaui_raw_grid_get_actions_group (GdauiDataProxy *iface)
+static gboolean
+gdaui_raw_grid_supports_action (GdauiDataProxy *iface, GdauiAction action)
+{
+       switch (action) {
+       case GDAUI_ACTION_NEW_DATA:
+       case GDAUI_ACTION_WRITE_MODIFIED_DATA:
+       case GDAUI_ACTION_DELETE_SELECTED_DATA:
+       case GDAUI_ACTION_UNDELETE_SELECTED_DATA:
+       case GDAUI_ACTION_RESET_DATA:
+       case GDAUI_ACTION_MOVE_FIRST_CHUNCK:
+        case GDAUI_ACTION_MOVE_PREV_CHUNCK:
+        case GDAUI_ACTION_MOVE_NEXT_CHUNCK:
+        case GDAUI_ACTION_MOVE_LAST_CHUNCK:
+               return TRUE;
+       default:
+               return FALSE;
+       };
+}
+
+static void
+gdaui_raw_grid_perform_action (GdauiDataProxy *iface, GdauiAction action)
 {
-       GdauiRawGrid *grid;
+       GdauiRawGrid *grid = GDAUI_RAW_GRID (iface);
 
-       g_return_val_if_fail (GDAUI_IS_RAW_GRID (iface), NULL);
-       grid = GDAUI_RAW_GRID (iface);
-       g_return_val_if_fail (grid->priv, NULL);
+       switch (action) {
+       case GDAUI_ACTION_NEW_DATA: {
+               GtkTreeIter iter;
+               GtkTreePath *path;
 
-       return grid->priv->actions_group;
+               if (gdaui_data_store_append (grid->priv->store, &iter)) {
+                       path = gtk_tree_model_get_path (GTK_TREE_MODEL (grid->priv->store), &iter);
+                       gtk_tree_view_set_cursor (GTK_TREE_VIEW (grid), path, NULL, FALSE);
+                       gtk_tree_path_free (path);
+               }
+               break;
+       }
+
+       case GDAUI_ACTION_WRITE_MODIFIED_DATA: {
+               gint row;
+               GError *error = NULL;
+               gboolean allok = TRUE;
+               gint mod1, mod2;
+
+               mod1 = gda_data_proxy_get_n_modified_rows (grid->priv->proxy);
+               row = gda_data_model_iter_get_row (grid->priv->iter);
+               if (grid->priv->write_mode >= GDAUI_DATA_PROXY_WRITE_ON_ROW_CHANGE) {
+                       gint newrow;
+
+                       allok = gda_data_proxy_apply_row_changes (grid->priv->proxy, row, &error);
+                       if (allok) {
+                               newrow = gda_data_model_iter_get_row (grid->priv->iter);
+                               if (row != newrow) /* => current row has changed because the
+                                                     proxy had to emit a "row_removed" when
+                                                     actually succeeded the commit
+                                                     => we need to come back to that row
+                                                  */
+                                       gda_data_model_iter_move_to_row (grid->priv->iter, row);
+                       }
+               }
+               else
+                       allok = gda_data_proxy_apply_all_changes (grid->priv->proxy, &error);
+
+               mod2 = gda_data_proxy_get_n_modified_rows (grid->priv->proxy);
+               if (!allok) {
+                       if (mod1 != mod2)
+                               /* the data model has changed while doing the writing */
+                               _gdaui_utility_display_error ((GdauiDataProxy *) grid, FALSE, error);
+                       else
+                               _gdaui_utility_display_error ((GdauiDataProxy *) grid, TRUE, error);
+                       g_error_free (error);
+               }
+
+               break;
+       }
+
+       case GDAUI_ACTION_DELETE_SELECTED_DATA: {
+               GtkTreeIter iter;
+               GtkTreeSelection *select;
+               GtkTreeModel *model;
+               GList *sel_rows;
+               GdaDataProxy *proxy;
+
+               select = gtk_tree_view_get_selection (GTK_TREE_VIEW (grid));
+               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
+               proxy = gdaui_data_store_get_proxy (GDAUI_DATA_STORE (model));
+
+               /* rem: get the list of selected rows after each row deletion because the data model might 
have changed and
+                * row numbers might also have changed */
+               while (sel_rows) {
+                       gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) (sel_rows->data));
+                       if (!gda_data_proxy_row_is_deleted (proxy,
+                                                           gdaui_data_store_get_row_from_iter 
(GDAUI_DATA_STORE (model),
+                                                                                               &iter))) {
+                               gdaui_data_store_delete (grid->priv->store, &iter);
+                               g_list_foreach (sel_rows, (GFunc) gtk_tree_path_free, NULL);
+                               g_list_free (sel_rows);
+                               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
+                       }
+                       else
+                               sel_rows = sel_rows->next;
+               }
+
+               break;
+       }
+
+       case GDAUI_ACTION_UNDELETE_SELECTED_DATA: {
+               GtkTreeIter iter;
+               GtkTreeSelection *select;
+               GtkTreeModel *model;
+               GList *sel_rows, *cur_row;
+
+               select = gtk_tree_view_get_selection (GTK_TREE_VIEW (grid));
+               sel_rows = gtk_tree_selection_get_selected_rows (select, &model);
+               cur_row = sel_rows;
+               while (cur_row) {
+                       gtk_tree_model_get_iter (model, &iter, (GtkTreePath *) (cur_row->data));
+                       gdaui_data_store_undelete (grid->priv->store, &iter);
+                       cur_row = g_list_next (cur_row);
+               }
+               g_list_foreach (sel_rows, (GFunc) gtk_tree_path_free, NULL);
+               g_list_free (sel_rows);
+
+               break;
+       }
+
+       case GDAUI_ACTION_RESET_DATA:
+               gda_data_proxy_cancel_all_changes (grid->priv->proxy);
+               gda_data_model_send_hint (GDA_DATA_MODEL (grid->priv->proxy), GDA_DATA_MODEL_HINT_REFRESH, 
NULL);
+               break;
+
+       case GDAUI_ACTION_MOVE_FIRST_CHUNCK:
+               gda_data_proxy_set_sample_start (grid->priv->proxy, 0);
+               break;
+
+        case GDAUI_ACTION_MOVE_PREV_CHUNCK: {
+               gint sample_size, sample_start;
+
+               sample_size = gda_data_proxy_get_sample_size (grid->priv->proxy);
+               if (sample_size > 0) {
+                       sample_start = gda_data_proxy_get_sample_start (grid->priv->proxy);
+                       sample_start -= sample_size;
+                       if (sample_start >= 0)
+                               gda_data_proxy_set_sample_start (grid->priv->proxy, sample_start);
+               }
+
+               break;
+       }
+
+        case GDAUI_ACTION_MOVE_NEXT_CHUNCK: {
+               gint sample_size, sample_start;
+
+               sample_size = gda_data_proxy_get_sample_size (grid->priv->proxy);
+               if (sample_size > 0) {
+                       sample_start = gda_data_proxy_get_sample_start (grid->priv->proxy);
+                       sample_start += sample_size;
+                       gda_data_proxy_set_sample_start (grid->priv->proxy, sample_start);
+               }
+               break;
+       }
+
+        case GDAUI_ACTION_MOVE_LAST_CHUNCK:
+               gda_data_proxy_set_sample_start (grid->priv->proxy, G_MAXINT);
+               break;
+
+       default:
+               break;
+       }
 }
 
 static void
diff --git a/libgda-ui/gdaui-server-operation.c b/libgda-ui/gdaui-server-operation.c
index f441576..fb42743 100644
--- a/libgda-ui/gdaui-server-operation.c
+++ b/libgda-ui/gdaui-server-operation.c
@@ -1192,19 +1192,20 @@ create_table_fields_array_create_widget (GdauiServerOperation *form, const gchar
 
        gtk_widget_set_vexpand (hlayout, TRUE);
 
-       {
-               GtkActionGroup *group;
-               GtkAction *action;
-               group = gdaui_data_proxy_get_actions_group (GDAUI_DATA_PROXY (form_props));
-               action = gtk_action_group_get_action (group, "ActionNew");
-               g_object_set (G_OBJECT (action), "tooltip", _("Add a new field"), NULL);
-               action = gtk_action_group_get_action (group, "ActionDelete");
-               g_object_set (G_OBJECT (action), "tooltip", _("Remove selected field"), NULL);
-               action = gtk_action_group_get_action (group, "ActionCommit");
-               gtk_action_set_visible (action, FALSE);
-               action = gtk_action_group_get_action (group, "ActionReset");
-               gtk_action_set_visible (action, FALSE);
-       }
+       GtkToolItem *item;
+       item = gdaui_data_proxy_info_get_item (GDAUI_DATA_PROXY_INFO (winfo), GDAUI_ACTION_NEW_DATA);
+       if (item)
+               gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Add a new field"));
+       item = gdaui_data_proxy_info_get_item (GDAUI_DATA_PROXY_INFO (winfo), 
GDAUI_ACTION_DELETE_SELECTED_DATA);
+       if (item)
+               gtk_widget_set_tooltip_text (GTK_WIDGET (item), _("Remove selected field"));
+       item = gdaui_data_proxy_info_get_item (GDAUI_DATA_PROXY_INFO (winfo), 
GDAUI_ACTION_WRITE_MODIFIED_DATA);
+       if (item)
+               gtk_widget_hide (GTK_WIDGET (item));
+       item = gdaui_data_proxy_info_get_item (GDAUI_DATA_PROXY_INFO (winfo), GDAUI_ACTION_RESET_DATA);
+       if (item)
+               gtk_widget_hide (GTK_WIDGET (item));
+       g_print ("==================================================================\n");
 
        return hlayout;
 }
diff --git a/libgda-ui/libgda-ui.symbols b/libgda-ui/libgda-ui.symbols
index 327d6b8..1d26742 100644
--- a/libgda-ui/libgda-ui.symbols
+++ b/libgda-ui/libgda-ui.symbols
@@ -64,15 +64,16 @@
        gdaui_data_filter_new
        gdaui_data_proxy_column_set_editable
        gdaui_data_proxy_column_show_actions
-       gdaui_data_proxy_get_actions_group
        gdaui_data_proxy_get_proxy
        gdaui_data_proxy_get_type
        gdaui_data_proxy_get_write_mode
        gdaui_data_proxy_info_flag_get_type
+       gdaui_data_proxy_info_get_item
        gdaui_data_proxy_info_get_type
        gdaui_data_proxy_info_new
        gdaui_data_proxy_perform_action
        gdaui_data_proxy_set_write_mode
+       gdaui_data_proxy_supports_action
        gdaui_data_proxy_write_mode_get_type
        gdaui_data_selector_get_data_set
        gdaui_data_selector_get_model
diff --git a/libgda-ui/libgdaui-6.0.vapi b/libgda-ui/libgdaui-6.0.vapi
index 86ae8a7..d9d38c9 100644
--- a/libgda-ui/libgdaui-6.0.vapi
+++ b/libgda-ui/libgdaui-6.0.vapi
@@ -173,13 +173,11 @@ namespace Gdaui {
        public class DataFilterPriv {
        }
        [CCode (cheader_filename = "libgda-ui/libgda-ui.h", type_id = "gdaui_data_proxy_info_get_type ()")]
-       public class DataProxyInfo : Gtk.Box, Atk.Implementor, Gtk.Buildable, Gtk.Orientable {
+       public class DataProxyInfo : Gtk.Toolbar, Atk.Implementor, Gtk.Buildable, Gtk.Orientable, 
Gtk.ToolShell {
                [CCode (has_construct_function = false, type = "GtkWidget*")]
                public DataProxyInfo (Gdaui.DataProxy data_proxy, Gdaui.DataProxyInfoFlag flags);
                [NoAccessorMethod]
                public Gdaui.DataProxy data_proxy { owned get; set; }
-               [NoAccessorMethod]
-               public Gtk.UIManager ui_manager { owned get; }
        }
        [CCode (cheader_filename = "libgda-ui/libgda-ui.h")]
        [Compact]
@@ -451,8 +449,6 @@ namespace Gdaui {
                public void set_sample_size (int sample_size);
                public void set_sample_start (int sample_start);
                [NoAccessorMethod]
-               public bool global_actions_visible { get; set; }
-               [NoAccessorMethod]
                public bool info_cell_visible { get; set; }
                [NoAccessorMethod]
                public Gda.DataModel model { owned get; set; }
@@ -613,15 +609,15 @@ namespace Gdaui {
        public interface DataProxy : GLib.Object {
                public void column_set_editable (int column, bool editable);
                public void column_show_actions (int column, bool show_actions);
-               public abstract unowned Gtk.ActionGroup get_actions_group ();
                public abstract unowned Gda.DataProxy get_proxy ();
                public abstract Gdaui.DataProxyWriteMode get_write_mode ();
-               public void perform_action (Gdaui.Action action);
+               public abstract void perform_action (Gdaui.Action action);
                [NoWrapper]
                public abstract void set_column_editable (int column, bool editable);
                public abstract bool set_write_mode (Gdaui.DataProxyWriteMode mode);
                [NoWrapper]
                public abstract void show_column_actions (int column, bool show_actions);
+               public abstract bool supports_action (Gdaui.Action action);
                public virtual signal void proxy_changed (Gda.DataProxy proxy);
        }
        [CCode (cheader_filename = "libgda-ui/libgda-ui.h", type_id = "gdaui_data_selector_get_type ()")]


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]