[libgda] GdaBrowser: allow edit virtual connections' properties



commit fda6f187fdcd1f61700938ef303e105b8d1b3ffa
Author: Vivien Malerba <malerba gnome-db org>
Date:   Mon Oct 19 18:51:21 2009 +0200

    GdaBrowser: allow edit virtual connections' properties

 tools/browser/browser-connections-list.c      |   37 +++++++++--
 tools/browser/browser-connections-list.h      |    3 +-
 tools/browser/browser-virtual-connection.c    |   87 ++++++++++++++++++++++++-
 tools/browser/browser-virtual-connection.h    |    6 +-
 tools/browser/browser-window.c                |   42 +++++++++++-
 tools/browser/connection-binding-properties.c |   30 ++++++++-
 6 files changed, 191 insertions(+), 14 deletions(-)
---
diff --git a/tools/browser/browser-connections-list.c b/tools/browser/browser-connections-list.c
index c96d261..00d45eb 100644
--- a/tools/browser/browser-connections-list.c
+++ b/tools/browser/browser-connections-list.c
@@ -306,6 +306,7 @@ connection_new_cb (GtkButton *button, BrowserConnectionsList *clist)
 
 /**
  * browser_connections_list_show
+ * @current: a connection to select for displaed properties, or %NULL
  *
  * Creates a new #BrowserConnectionsList widget and displays it.
  * Only one is created and shown (singleton)
@@ -313,7 +314,7 @@ connection_new_cb (GtkButton *button, BrowserConnectionsList *clist)
  * Returns: the new object
  */
 void
-browser_connections_list_show (void)
+browser_connections_list_show (BrowserConnection *current)
 {
 	if (!_clist) {
 		GtkWidget *clist, *sw, *table, *treeview, *label, *wid;
@@ -351,7 +352,7 @@ browser_connections_list_show (void)
 		wid = gtk_label_new ("");
 		str = g_strdup_printf ("<big><b>%s:\n</b></big>%s",
 				       _("List of opened connections"),
-					 "The connection properties are read-only.");
+				       "The connection properties are read-only.");
 		gtk_label_set_markup (GTK_LABEL (wid), str);
 		g_free (str);
 		gtk_misc_set_alignment (GTK_MISC (wid), 0., -1);
@@ -437,11 +438,6 @@ browser_connections_list_show (void)
 					     (BrowserConnectionsList*) clist);
 		g_slist_free (connections);
 
-		/* select the 1st available */
-		GtkTreeIter iter;
-		if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter))
-			gtk_tree_selection_select_iter (select, &iter);
-
 		_clist->priv->cnc_added_sigid = g_signal_connect (browser_core_get (), "connection-added",
 								  G_CALLBACK (connection_added_cb), _clist);
 		_clist->priv->cnc_removed_sigid = g_signal_connect (browser_core_get (), "connection-removed",
@@ -453,6 +449,33 @@ browser_connections_list_show (void)
 		gtk_window_set_screen (GTK_WINDOW (_clist), gdk_screen_get_default ()); /* FIXME: specify GdkScreen */
 		gtk_window_present (GTK_WINDOW (_clist));
 	}
+
+	if (current) {
+		GtkTreeModel *model;
+		GtkTreeIter iter;
+		model = gtk_tree_view_get_model (GTK_TREE_VIEW (_clist->priv->treeview));
+		if (gtk_tree_model_get_iter_first (model, &iter)) {
+			do {
+				BrowserConnection *bcnc;
+				gtk_tree_model_get (model, &iter, COLUMN_BCNC, &bcnc, -1);
+				g_object_unref (bcnc);
+				if (bcnc == current) {
+					GtkTreeSelection *select;
+					select = gtk_tree_view_get_selection (GTK_TREE_VIEW (_clist->priv->treeview));
+					gtk_tree_selection_select_iter (select, &iter);
+					break;
+				}
+			} while (gtk_tree_model_iter_next (model, &iter));
+		}
+	}
+	else {
+		/* select the 1st available */
+		GtkTreeModel *model;
+		GtkTreeIter iter;
+		model = gtk_tree_view_get_model (GTK_TREE_VIEW (_clist->priv->treeview));
+		if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter))
+			gtk_tree_selection_select_iter (select, &iter);
+	}
 }
 
 static void
diff --git a/tools/browser/browser-connections-list.h b/tools/browser/browser-connections-list.h
index f276185..9ae8c06 100644
--- a/tools/browser/browser-connections-list.h
+++ b/tools/browser/browser-connections-list.h
@@ -22,6 +22,7 @@
 #define __BROWSER_CONNECTIONS_LIST_H_
 
 #include <gtk/gtk.h>
+#include "decl.h"
 
 G_BEGIN_DECLS
 
@@ -48,7 +49,7 @@ struct _BrowserConnectionsListClass
 };
 
 GType           browser_connections_list_get_type               (void) G_GNUC_CONST;
-void            browser_connections_list_show                   (void);
+void            browser_connections_list_show                   (BrowserConnection *current);
 
 G_END_DECLS
 
diff --git a/tools/browser/browser-virtual-connection.c b/tools/browser/browser-virtual-connection.c
index 18d1466..f848281 100644
--- a/tools/browser/browser-virtual-connection.c
+++ b/tools/browser/browser-virtual-connection.c
@@ -320,7 +320,7 @@ sub_thread_open_cnc (BrowserVirtualConnectionSpecs *specs, GError **error)
  * Returns: the new connection
  */
 BrowserConnection *
-browser_virtual_connection_new (BrowserVirtualConnectionSpecs *specs, GError **error)
+browser_virtual_connection_new (const BrowserVirtualConnectionSpecs *specs, GError **error)
 {
 	/* open virtual GdaConnection in sub thread */
 	GdaThreadWrapper *wrapper;
@@ -367,6 +367,91 @@ browser_virtual_connection_new (BrowserVirtualConnectionSpecs *specs, GError **e
 		return NULL;
 }
 
+/**
+ * browser_virtual_connection_modify_specs
+ * @bcnc: a #BrowserVirtualConnection connection
+ * @new_specs: a pointer to a #BrowserVirtualConnectionSpecs for the new specs
+ * @error: a place to store errors, or %NULL
+ *
+ * Returns: %TRUE if no error occurred
+ */
+gboolean
+browser_virtual_connection_modify_specs (BrowserVirtualConnection *bcnc,
+					 const BrowserVirtualConnectionSpecs *new_specs, GError **error)
+{
+	g_return_val_if_fail (BROWSER_IS_VIRTUAL_CONNECTION (bcnc), FALSE);
+	g_return_val_if_fail (new_specs, FALSE);
+
+	/* undo the current specs */
+	GSList *list;
+	GdaConnection *cnc;
+	cnc = g_object_get_data (G_OBJECT (BROWSER_CONNECTION (bcnc)->priv->cnc), "gda-virtual-connection");
+	for (list = bcnc->priv->specs->parts; list; list = bcnc->priv->specs->parts) {
+		BrowserVirtualConnectionPart *part;
+		part = (BrowserVirtualConnectionPart*) list->data;
+		switch (part->part_type) {
+		case BROWSER_VIRTUAL_CONNECTION_PART_MODEL: {
+			BrowserVirtualConnectionModel *pm;
+			pm = &(part->u.model);
+			if (! gda_vconnection_data_model_remove (GDA_VCONNECTION_DATA_MODEL (cnc),
+								 pm->table_name, error))
+				return FALSE;
+			break;
+		}
+		case BROWSER_VIRTUAL_CONNECTION_PART_CNC: {
+			BrowserVirtualConnectionCnc *scnc;
+			scnc = &(part->u.cnc);
+			if (!gda_vconnection_hub_remove (GDA_VCONNECTION_HUB (cnc), scnc->source_cnc->priv->cnc,
+							 error))
+				return FALSE;
+			break;
+		}
+		default:
+			g_assert_not_reached ();
+		}
+
+		/* get rid of @part */
+		browser_virtual_connection_part_free (part);
+		bcnc->priv->specs->parts = g_slist_remove (bcnc->priv->specs->parts, part);
+	}
+
+	/* apply the new specs */
+	browser_virtual_connection_specs_free (bcnc->priv->specs);
+	bcnc->priv->specs = g_new0 (BrowserVirtualConnectionSpecs, 1);
+
+	for (list = new_specs->parts; list; list = list->next) {
+		BrowserVirtualConnectionPart *part;
+		part = (BrowserVirtualConnectionPart*) list->data;
+		switch (part->part_type) {
+		case BROWSER_VIRTUAL_CONNECTION_PART_MODEL: {
+			BrowserVirtualConnectionModel *pm;
+			pm = &(part->u.model);
+			if (! gda_vconnection_data_model_add_model (GDA_VCONNECTION_DATA_MODEL (cnc),
+								    pm->model, pm->table_name, error))
+				return FALSE;
+			break;
+		}
+		case BROWSER_VIRTUAL_CONNECTION_PART_CNC: {
+			BrowserVirtualConnectionCnc *scnc;
+			scnc = &(part->u.cnc);
+			if (!gda_vconnection_hub_add (GDA_VCONNECTION_HUB (cnc), scnc->source_cnc->priv->cnc,
+						      scnc->table_schema, error))
+				return FALSE;
+			break;
+		}
+		default:
+			g_assert_not_reached ();
+		}
+
+		/* add @part to bcnc->priv->specs */
+		bcnc->priv->specs->parts = g_slist_append (bcnc->priv->specs->parts,
+							   browser_virtual_connection_part_copy (part));
+	}
+	
+	return TRUE;
+}
+
+
 /*
  * Spec manipulations
  */
diff --git a/tools/browser/browser-virtual-connection.h b/tools/browser/browser-virtual-connection.h
index 840e1bc..d17b686 100644
--- a/tools/browser/browser-virtual-connection.h
+++ b/tools/browser/browser-virtual-connection.h
@@ -86,9 +86,11 @@ BrowserVirtualConnectionSpecs *browser_virtual_connection_specs_copy (const Brow
 void                           browser_virtual_connection_specs_free (BrowserVirtualConnectionSpecs *specs);
 
 GType              browser_virtual_connection_get_type               (void) G_GNUC_CONST;
-BrowserConnection *browser_virtual_connection_new                    (BrowserVirtualConnectionSpecs *specs,
+BrowserConnection *browser_virtual_connection_new                    (const BrowserVirtualConnectionSpecs *specs,
+								      GError **error);
+gboolean           browser_virtual_connection_modify_specs           (BrowserVirtualConnection *bcnc,
+								      const BrowserVirtualConnectionSpecs *new_specs,
 								      GError **error);
-
 G_END_DECLS
 
 #endif
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index 8180c81..72e6246 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -191,6 +191,7 @@ static void window_close_cb (GtkAction *action, BrowserWindow *bwin);
 static void window_fullscreen_cb (GtkToggleAction *action, BrowserWindow *bwin);
 static void window_new_cb (GtkAction *action, BrowserWindow *bwin);
 static void window_new_with_cnc_cb (GtkAction *action, BrowserWindow *bwin);
+static void connection_properties_cb (GtkAction *action, BrowserWindow *bwin);
 static void connection_close_cb (GtkAction *action, BrowserWindow *bwin);
 static void connection_open_cb (GtkAction *action, BrowserWindow *bwin);
 static void connection_bind_cb (GtkAction *action, BrowserWindow *bwin);
@@ -209,6 +210,7 @@ static const GtkActionEntry ui_actions[] = {
         { "ConnectionBind", NULL, N_("_Bind connection"), "<control>B", N_("Use connection to create\n"
 						    "a new binding connection to access data\n"
 						    "from multiple databases at once"), G_CALLBACK (connection_bind_cb)},
+        { "ConnectionProps", GTK_STOCK_PROPERTIES, "_Properties", NULL, "Connection properties", G_CALLBACK (connection_properties_cb)},
         { "ConnectionList", NULL, "_Connections list", NULL, "Connections list", G_CALLBACK (connection_list_cb)},
         { "ConnectionMetaSync", GTK_STOCK_REFRESH, "_Fetch meta data", NULL, "Fetch meta data", G_CALLBACK (connection_meta_update_cb)},
         { "ConnectionClose", GTK_STOCK_CLOSE, "_Close connection", NULL, "Close this connection", G_CALLBACK (connection_close_cb)},
@@ -231,6 +233,7 @@ static const gchar *ui_actions_info =
         "      <menuitem name='ConnectionList' action= 'ConnectionList'/>"
         "      <menuitem name='ConnectionMetaSync' action= 'ConnectionMetaSync'/>"
         "      <separator/>"
+        "      <menuitem name='ConnectionProps' action= 'ConnectionProps'/>"
         "      <menuitem name='ConnectionBind' action= 'ConnectionBind'/>"
         "      <menuitem name='ConnectionClose' action= 'ConnectionClose'/>"
         "      <separator/>"
@@ -614,7 +617,6 @@ connection_removed_cb (BrowserCore *bcore, BrowserConnection *bcnc, BrowserWindo
 	gtk_action_group_remove_action (bwin->priv->cnc_agroup, action);
 }
 
-
 static void
 connection_close_cb (GtkAction *action, BrowserWindow *bwin)
 {
@@ -778,6 +780,42 @@ connection_open_cb (GtkAction *action, BrowserWindow *bwin)
 }
 
 static void
+connection_properties_cb (GtkAction *action, BrowserWindow *bwin)
+{
+	if (BROWSER_IS_VIRTUAL_CONNECTION (bwin->priv->bcnc)) {
+		GtkWidget *win;
+		BrowserVirtualConnectionSpecs *specs;
+		gint res;
+
+		g_object_get (G_OBJECT (bwin->priv->bcnc), "specs", &specs, NULL);
+		win = connection_binding_properties_new_edit (specs); /* @specs is not modified */
+		gtk_window_set_transient_for (GTK_WINDOW (win), GTK_WINDOW (bwin));
+		gtk_widget_show (win);
+		
+		res = gtk_dialog_run (GTK_DIALOG (win));
+		gtk_widget_hide (win);
+		if (res == GTK_RESPONSE_OK) {
+			GError *error = NULL;
+			if (!browser_virtual_connection_modify_specs (BROWSER_VIRTUAL_CONNECTION (bwin->priv->bcnc),
+					connection_binding_properties_get_specs (CONNECTION_BINDING_PROPERTIES (win)),
+								      &error)) {
+				browser_show_error ((GtkWindow*) bwin,
+						    _("Error updating bound connection: %s"),
+						    error && error->message ? error->message : _("No detail"));
+				g_clear_error (&error);
+			}
+
+			/* update meta store */
+			browser_connection_update_meta_data (bwin->priv->bcnc);
+		}
+		gtk_widget_destroy (win);
+	}
+	else {
+		browser_connections_list_show (bwin->priv->bcnc);
+	}
+}
+
+static void
 connection_bind_cb (GtkAction *action, BrowserWindow *bwin)
 {
 	GtkWidget *win;
@@ -814,7 +852,7 @@ connection_bind_cb (GtkAction *action, BrowserWindow *bwin)
 static void
 connection_list_cb (GtkAction *action, BrowserWindow *bwin)
 {
-	browser_connections_list_show ();
+	browser_connections_list_show (bwin->priv->bcnc);
 }
 
 static void
diff --git a/tools/browser/connection-binding-properties.c b/tools/browser/connection-binding-properties.c
index d182425..b0681e5 100644
--- a/tools/browser/connection-binding-properties.c
+++ b/tools/browser/connection-binding-properties.c
@@ -148,6 +148,34 @@ connection_binding_properties_new_create (BrowserConnection *bcnc)
 	return (GtkWidget*) cprop;
 }
 
+/**
+ * connection_binding_properties_new_edit
+ * @specs: a #BrowserVirtualConnectionSpecs pointer
+ *
+ * Creates a new #ConnectionBindingProperties window, starting with a _copy_ of @specs
+ *
+ * Returns: the new object
+ */
+GtkWidget *
+connection_binding_properties_new_edit (const BrowserVirtualConnectionSpecs *specs)
+{
+	ConnectionBindingProperties *cprop;
+
+	g_return_val_if_fail (specs, NULL);
+
+	cprop = CONNECTION_BINDING_PROPERTIES (g_object_new (CONNECTION_TYPE_BINDING_PROPERTIES, NULL));
+	cprop->priv->specs = browser_virtual_connection_specs_copy (specs);
+	gtk_window_set_title (GTK_WINDOW (cprop), _("Virtual connection's properties"));
+
+	create_layout (cprop);
+	update_display (cprop);
+
+	gtk_widget_show (gtk_dialog_add_button (GTK_DIALOG (cprop), GTK_STOCK_APPLY, GTK_RESPONSE_OK));
+	gtk_widget_show (gtk_dialog_add_button (GTK_DIALOG (cprop), GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL));
+
+	return (GtkWidget*) cprop;
+}
+
 static void
 create_layout (ConnectionBindingProperties *cprop)
 {
@@ -483,7 +511,7 @@ update_buttons_sensitiveness (ConnectionBindingProperties *cprop)
 
 			if (g_hash_table_lookup (schemas_hash, cnc->table_schema))
 				goto out;
-			g_hash_table_insert (schemas_hash, cnc->table_schema, 0x01);
+			g_hash_table_insert (schemas_hash, cnc->table_schema, (gpointer) 0x01);
 			break;
 		}
 		case BROWSER_VIRTUAL_CONNECTION_PART_MODEL:



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