[libgda] Avoid GdaBrowser UI locking



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]