[libgda] Avoid GdaBrowser UI locking
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgda] Avoid GdaBrowser UI locking
- Date: Mon, 19 Oct 2009 18:41:58 +0000 (UTC)
commit 7f2595f31b7db9f4ded96bd174f8b143275e8cbd
Author: Vivien Malerba <malerba gnome-db org>
Date: Tue Oct 13 19:39:56 2009 +0200
Avoid GdaBrowser UI locking
disable any user action while a query is being
executed which could lead to the UI locking
tools/browser/browser-connection.c | 2 +-
tools/browser/browser-window.c | 21 +++++++++++++-
tools/browser/query-exec/query-console.c | 31 +++++++++++++++++----
tools/browser/query-exec/query-exec-perspective.c | 31 ++++++++++++++++++++-
4 files changed, 76 insertions(+), 9 deletions(-)
---
diff --git a/tools/browser/browser-connection.c b/tools/browser/browser-connection.c
index be196d1..90d2f1d 100644
--- a/tools/browser/browser-connection.c
+++ b/tools/browser/browser-connection.c
@@ -725,7 +725,7 @@ browser_connection_get_information (BrowserConnection *bcnc)
* browser_connection_is_busy
* @bcnc: a #BrowserConnection
* @out_reason: a pointer to store a copy of the reason @bcnc is busy (will be set
- * to %NULL if @bcnc is not busy)
+ * to %NULL if @bcnc is not busy), or %NULL
*
* Tells if @bcnc is currently busy or not.
*
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index 66dfe53..108e6c4 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -73,6 +73,8 @@ struct _BrowserWindowPrivate {
GtkWidget *spinner;
GtkUIManager *ui_manager;
+ GtkActionGroup *agroup;
+
GtkToolbarStyle toolbar_style;
GtkActionGroup *cnc_agroup; /* one GtkAction for each BrowserConnection */
gulong cnc_added_sigid;
@@ -314,6 +316,7 @@ browser_window_new (BrowserConnection *bcnc, BrowserPerspectiveFactory *factory)
GtkActionGroup *group;
group = gtk_action_group_new ("Actions");
+ bwin->priv->agroup = group;
gtk_action_group_add_actions (group, ui_actions, G_N_ELEMENTS (ui_actions), bwin);
gtk_action_group_add_toggle_actions (group, ui_toggle_actions, G_N_ELEMENTS (ui_toggle_actions), bwin);
@@ -539,6 +542,21 @@ connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy, gchar *reason, Br
gtk_statusbar_pop (GTK_STATUSBAR (bwin->priv->statusbar),
bwin->priv->cnc_statusbar_context);
}
+
+ GtkAction *action;
+ action = gtk_action_group_get_action (bwin->priv->agroup, "WindowNew");
+ gtk_action_set_sensitive (action, !is_busy);
+ action = gtk_action_group_get_action (bwin->priv->agroup, "ConnectionMetaSync");
+ gtk_action_set_sensitive (action, !is_busy);
+
+ const gchar *cncname;
+ gchar *path;
+ cncname = browser_connection_get_name (bcnc);
+ path = g_strdup_printf ("/MenuBar/Window/WindowNewOthers/CncList/%s", cncname);
+ action = gtk_ui_manager_get_action (bwin->priv->ui_manager, path);
+ g_free (path);
+ if (action)
+ gtk_action_set_sensitive (action, !is_busy);
}
/* update @bwin->priv->cnc_agroup and @bwin->priv->ui_manager */
@@ -563,6 +581,7 @@ connection_added_cb (BrowserCore *bcore, BrowserConnection *bcnc, BrowserWindow
g_signal_connect (action, "activate",
G_CALLBACK (window_new_with_cnc_cb), bwin);
g_object_set_data (G_OBJECT (action), "bcnc", bcnc);
+ gtk_action_set_sensitive (action, ! browser_connection_is_busy (bcnc, NULL));
g_object_unref (action);
}
@@ -576,7 +595,7 @@ connection_removed_cb (BrowserCore *bcore, BrowserConnection *bcnc, BrowserWindo
guint *mid;
cncname = browser_connection_get_name (bcnc);
- path = g_strdup_printf ("/MenuBar/Window/WindowNewOthers/CncList/%s",cncname);
+ path = g_strdup_printf ("/MenuBar/Window/WindowNewOthers/CncList/%s", cncname);
action = gtk_ui_manager_get_action (bwin->priv->ui_manager, path);
g_free (path);
g_assert (action);
diff --git a/tools/browser/query-exec/query-console.c b/tools/browser/query-exec/query-console.c
index ddcf9c2..4143639 100644
--- a/tools/browser/query-exec/query-console.c
+++ b/tools/browser/query-exec/query-console.c
@@ -109,6 +109,8 @@ struct _QueryConsolePrivate {
BrowserConnection *bcnc;
GdaSqlParser *parser;
+ GtkActionGroup *agroup;
+
CcGrayBar *header;
GtkWidget *vpaned; /* top=>query editor, bottom=>results */
@@ -199,6 +201,7 @@ query_console_init (QueryConsole *tconsole, QueryConsoleClass *klass)
tconsole->priv->past_params = NULL;
tconsole->priv->params = NULL;
tconsole->priv->params_popup = NULL;
+ tconsole->priv->agroup = NULL;
}
static void connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy,
gchar *reason, QueryConsole *tconsole);
@@ -479,6 +482,12 @@ connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy, gchar *reason, Qu
{
gtk_widget_set_sensitive (tconsole->priv->exec_button, !is_busy);
gtk_widget_set_sensitive (tconsole->priv->indent_button, !is_busy);
+
+ if (tconsole->priv->agroup) {
+ GtkAction *action;
+ action = gtk_action_group_get_action (tconsole->priv->agroup, "ExecuteQuery");
+ gtk_action_set_sensitive (action, !is_busy);
+ }
}
static GtkWidget *
@@ -921,7 +930,6 @@ sql_execute_clicked_cb (GtkButton *button, QueryConsole *tconsole)
ebatch->batch = batch;
g_get_current_time (&(ebatch->start_time));
ebatch->hist_batch = query_editor_history_batch_new (ebatch->start_time, tconsole->priv->params);
- query_editor_start_history_batch (tconsole->priv->history, ebatch->hist_batch);
stmt_list = gda_batch_get_statements (batch);
for (list = stmt_list; list; list = list->next) {
@@ -971,6 +979,10 @@ query_exec_fetch_cb (QueryConsole *tconsole)
estmt->exec_id, NULL,
&(estmt->exec_error));
if (estmt->result || estmt->exec_error) {
+ ExecutionBatch *ebatch;
+ ebatch = tconsole->priv->current_exec;
+ query_editor_start_history_batch (tconsole->priv->history, ebatch->hist_batch);
+
QueryEditorHistoryItem *history;
GdaSqlStatement *sqlst;
g_object_get (G_OBJECT (estmt->stmt), "structure", &sqlst, NULL);
@@ -1119,11 +1131,18 @@ static const gchar *ui_actions_console =
static GtkActionGroup *
query_console_page_get_actions_group (BrowserPage *page)
{
- GtkActionGroup *agroup;
- agroup = gtk_action_group_new ("QueryExecConsoleActions");
- gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-
- return agroup;
+ QueryConsole *tconsole;
+ tconsole = QUERY_CONSOLE (page);
+ if (! tconsole->priv->agroup) {
+ tconsole->priv->agroup = gtk_action_group_new ("QueryExecConsoleActions");
+ gtk_action_group_add_actions (tconsole->priv->agroup,
+ ui_actions, G_N_ELEMENTS (ui_actions), page);
+
+ GtkAction *action;
+ action = gtk_action_group_get_action (tconsole->priv->agroup, "ExecuteQuery");
+ gtk_action_set_sensitive (action, !browser_connection_is_busy (tconsole->priv->bcnc, NULL));
+ }
+ return g_object_ref (tconsole->priv->agroup);
}
static const gchar *
diff --git a/tools/browser/query-exec/query-exec-perspective.c b/tools/browser/query-exec/query-exec-perspective.c
index 97b9ef5..b1a9d9d 100644
--- a/tools/browser/query-exec/query-exec-perspective.c
+++ b/tools/browser/query-exec/query-exec-perspective.c
@@ -136,6 +136,8 @@ static void close_button_clicked_cb (GtkWidget *wid, GtkWidget *page_widget);
static void transaction_status_changed_cb (BrowserConnection *bcnc, QueryExecPerspective *perspective);
+static void connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy,
+ gchar *reason, QueryExecPerspective *perspective);
/**
* query_exec_perspective_new
*
@@ -199,10 +201,31 @@ query_exec_perspective_new (BrowserWindow *bwin)
gtk_widget_grab_focus (page);
+ /* busy connection handling */
+ connection_busy_cb (perspective->priv->bcnc, browser_connection_is_busy (perspective->priv->bcnc, NULL),
+ NULL, perspective);
+ g_signal_connect (perspective->priv->bcnc, "busy",
+ G_CALLBACK (connection_busy_cb), perspective);
+
return bpers;
}
static void
+connection_busy_cb (BrowserConnection *bcnc, gboolean is_busy,
+ gchar *reason, QueryExecPerspective *perspective)
+{
+ if (perspective->priv->action_group) {
+ GtkAction *action;
+ action = gtk_action_group_get_action (perspective->priv->action_group, "QueryExecBegin");
+ gtk_action_set_sensitive (action, !is_busy);
+ action = gtk_action_group_get_action (perspective->priv->action_group, "QueryExecCommit");
+ gtk_action_set_sensitive (action, !is_busy);
+ action = gtk_action_group_get_action (perspective->priv->action_group, "QueryExecRollback");
+ gtk_action_set_sensitive (action, !is_busy);
+ }
+}
+
+static void
fav_selection_changed_cb (GtkWidget *widget, gint fav_id, BrowserFavoritesType fav_type,
const gchar *selection, QueryExecPerspective *perspective)
{
@@ -271,8 +294,11 @@ query_exec_perspective_dispose (GObject *object)
if (perspective->priv) {
g_signal_handlers_disconnect_by_func (perspective->priv->bcnc,
G_CALLBACK (transaction_status_changed_cb), perspective);
- if (perspective->priv->bcnc)
+ if (perspective->priv->bcnc) {
+ g_signal_handlers_disconnect_by_func (perspective->priv->bcnc,
+ G_CALLBACK (connection_busy_cb), perspective);
g_object_unref (perspective->priv->bcnc);
+ }
if (perspective->priv->action_group)
g_object_unref (perspective->priv->action_group);
@@ -444,6 +470,9 @@ query_exec_perspective_get_actions_group (BrowserPerspective *perspective)
agroup = gtk_action_group_new ("QueryExecActions");
gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), bpers);
bpers->priv->action_group = g_object_ref (agroup);
+
+ connection_busy_cb (bpers->priv->bcnc, browser_connection_is_busy (bpers->priv->bcnc, NULL),
+ NULL, bpers);
}
transaction_status_changed_cb (bpers->priv->bcnc, bpers);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]