[libgda] GdaBrowser: allow edit virtual connections' properties
- From: Vivien Malerba <vivien src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [libgda] GdaBrowser: allow edit virtual connections' properties
- Date: Mon, 19 Oct 2009 18:43:14 +0000 (UTC)
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]