[libgda] GdauiDataProxy: get rid of GtkAction
- From: Vivien Malerba <vivien src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgda] GdauiDataProxy: get rid of GtkAction
- Date: Sun, 15 Mar 2015 20:50:42 +0000 (UTC)
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", ¶m, 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", ¶m, 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]