[libgda] GdaBrowser: one can now define SQL code as actions (to be used later)



commit 6c1e0cd7138d11232e9679ad8c22c315a757bf35
Author: Vivien Malerba <malerba gnome-db org>
Date:   Mon Jan 17 20:33:47 2011 +0100

    GdaBrowser: one can now define SQL code as actions (to be used later)

 tools/browser/browser-favorites.c                  |   14 ++-
 tools/browser/browser-favorites.h                  |    5 +-
 tools/browser/query-exec/query-favorite-selector.c |  112 ++++++++++++++++++--
 3 files changed, 119 insertions(+), 12 deletions(-)
---
diff --git a/tools/browser/browser-favorites.c b/tools/browser/browser-favorites.c
index ac3bc4b..7c5b2e5 100644
--- a/tools/browser/browser-favorites.c
+++ b/tools/browser/browser-favorites.c
@@ -212,6 +212,8 @@ favorite_type_to_string (BrowserFavoritesType type)
 		return "QUERY";
 	case BROWSER_FAVORITES_DATA_MANAGERS:
 		return "DATAMAN";
+	case BROWSER_FAVORITES_ACTIONS:
+		return "ACTION";
 	default:
 		g_warning ("Unknown type of favorite");
 	}
@@ -232,6 +234,8 @@ favorite_string_to_type (const gchar *str)
 	}
 	else if (*str == 'Q')
 		return BROWSER_FAVORITES_QUERIES;
+	else if (*str == 'A')
+		return BROWSER_FAVORITES_ACTIONS;
 	else
 		g_warning ("Unknown type '%s' of favorite", str);
 	return 0;
@@ -485,6 +489,12 @@ favorites_reorder (BrowserFavorites *bfav, gint order_key, gint id, gint new_pos
 
 /**
  * browser_favorites_add
+ * @bfav: a #BrowserFavorites object
+ * @session_id: session ID (0)
+ * @fav: a pointer to a #BrowserFavoritesAttributes structure
+ * @order_key: ordering key or -1 for none
+ * @pos: position (ignored if @order_key < 0)
+ * @error: a place to store errors, or %NULL
  *
  * Add a new favorite, or replace an existing one.
  * NOTE:
@@ -924,10 +934,10 @@ browser_favorites_list (BrowserFavorites *bfav, guint session_id, BrowserFavorit
 
 
 /**
- * browser_favorites_delete_favorite
+ * browser_favorites_delete
  * @bfav: a #BrowserFavorites
  * @session_id: 0 for now
- * @fav: a pointer to a #BrowserFavoritesAttributes definting which favorite to delete
+ * @fav: a pointer to a #BrowserFavoritesAttributes definning which favorite to delete
  * @error: a place to store errors, or %NULL
  *
  * Delete a favorite
diff --git a/tools/browser/browser-favorites.h b/tools/browser/browser-favorites.h
index 3a0ec0e..92985e1 100644
--- a/tools/browser/browser-favorites.h
+++ b/tools/browser/browser-favorites.h
@@ -46,9 +46,10 @@ typedef enum {
         BROWSER_FAVORITES_TABLES   = 1 << 0,
 	BROWSER_FAVORITES_DIAGRAMS = 1 << 1,
 	BROWSER_FAVORITES_QUERIES  = 1 << 2,
-	BROWSER_FAVORITES_DATA_MANAGERS  = 1 << 3
+	BROWSER_FAVORITES_DATA_MANAGERS  = 1 << 3,
+	BROWSER_FAVORITES_ACTIONS  = 1 << 4
 } BrowserFavoritesType;
-#define BROWSER_FAVORITES_NB_TYPES 4
+#define BROWSER_FAVORITES_NB_TYPES 5
 
 /**
  * BrowserFavoritesAttributes:
diff --git a/tools/browser/query-exec/query-favorite-selector.c b/tools/browser/query-exec/query-favorite-selector.c
index 848ed5b..ea8c869 100644
--- a/tools/browser/query-exec/query-favorite-selector.c
+++ b/tools/browser/query-exec/query-favorite-selector.c
@@ -45,6 +45,7 @@ struct _QueryFavoriteSelectorPrivate {
 	GtkWidget *popup_menu;
 	GtkWidget *popup_properties;
 	GtkWidget *properties_name;
+	GtkWidget *properties_action;
 	GtkWidget *properties_text;
 	gint       properties_id;
 	gint       properties_position;
@@ -192,11 +193,24 @@ favorite_delete_selected (QueryFavoriteSelector *tsel)
 			if (lerror)
 				g_error_free (lerror);
 		}
+		else {
+			/* remove any associated action */
+			gint id;
+			gchar *tmp;
+			tmp = g_strdup_printf ("QUERY%d", fav.id);
+			id = browser_favorites_find (bfav, 0, tmp, &fav, NULL);
+			if (id >= 0) {
+				browser_favorites_delete (bfav, 0, &fav, NULL);
+				/*g_print ("ACTION_DELETED %d: %s\n", fav.id, tmp);*/
+			}
+			g_free (tmp);
+		}
 	}
 }
 
 static gboolean
-key_press_event_cb (GtkTreeView *treeview, GdkEventKey *event, QueryFavoriteSelector *tsel)
+key_press_event_cb (G_GNUC_UNUSED GtkTreeView *treeview, GdkEventKey *event,
+		    QueryFavoriteSelector *tsel)
 {
 	if (event->keyval == GDK_Delete) {
 		favorite_delete_selected (tsel);
@@ -234,6 +248,9 @@ prop_save_timeout (QueryFavoriteSelector *tsel)
 	BrowserFavorites *bfav;
 	BrowserFavoritesAttributes fav;
 	GError *error = NULL;
+	gboolean allok, actiondel = TRUE;
+
+	bfav = browser_connection_get_favorites (tsel->priv->bcnc);
 
 	memset (&fav, 0, sizeof (BrowserFavoritesAttributes));
 	fav.id = tsel->priv->properties_id;
@@ -242,16 +259,56 @@ prop_save_timeout (QueryFavoriteSelector *tsel)
 	fav.descr = NULL;
 	fav.contents = query_editor_get_all_text (QUERY_EDITOR (tsel->priv->properties_text));
 
-	bfav = browser_connection_get_favorites (tsel->priv->bcnc);
-	if (! browser_favorites_add (bfav, 0, &fav, ORDER_KEY_QUERIES, tsel->priv->properties_position, &error)) {
+	allok = browser_favorites_add (bfav, 0, &fav, ORDER_KEY_QUERIES,
+				       tsel->priv->properties_position, &error);
+	if (! allok) {
 		browser_show_error ((GtkWindow*) gtk_widget_get_toplevel ((GtkWidget*) tsel),
 				    _("Could not add favorite: %s"),
 				    error && error->message ? error->message : _("No detail"));
 		if (error)
 			g_error_free (error);
 	}
-
 	g_free (fav.contents);
+
+	if (allok && (fav.id >= 0)) {
+		const gchar *action;
+		gint qid = fav.id;
+		action = gtk_entry_get_text (GTK_ENTRY (tsel->priv->properties_action));
+		if (action && *action) {
+			fav.id = -1;
+			fav.type = BROWSER_FAVORITES_ACTIONS;
+			fav.name = (gchar*) action;
+			fav.descr = NULL;
+			fav.contents = g_strdup_printf ("QUERY%d", qid);
+			allok = browser_favorites_add (bfav, 0, &fav, -1,
+						       tsel->priv->properties_position, &error);
+			if (! allok) {
+				browser_show_error ((GtkWindow*) gtk_widget_get_toplevel ((GtkWidget*) tsel),
+						    _("Could not add action: %s"),
+						    error && error->message ? error->message : _("No detail"));
+				if (error)
+					g_error_free (error);
+			}
+			else
+				actiondel = FALSE;
+			/*g_print ("ACTION_ADDED %d: %s\n", fav.id, fav.contents);*/
+			g_free (fav.contents);
+		}
+	}
+
+	if (actiondel && (tsel->priv->properties_id >= 0)) {
+		/* remove action */
+		gint id;
+		gchar *tmp;
+		tmp = g_strdup_printf ("QUERY%d", tsel->priv->properties_id);
+		id = browser_favorites_find (bfav, 0, tmp, &fav, NULL);
+		if (id >= 0) {
+			browser_favorites_delete (bfav, 0, &fav, NULL);
+			/*g_print ("ACTION_DELETED %d: %s\n", fav.id, tmp);*/
+		}
+		g_free (tmp);
+	}
+
 	tsel->priv->prop_save_timeout = 0;
 	return FALSE; /* remove timeout */
 }
@@ -270,6 +327,7 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 	if (! tsel->priv->popup_properties) {
 		GtkWidget *pcont, *vbox, *hbox, *label, *entry, *text, *table;
 		gchar *str;
+		gfloat align;
 		
 		pcont = popup_container_new (GTK_WIDGET (mitem));
 		vbox = gtk_vbox_new (FALSE, 0);
@@ -279,7 +337,8 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 		str = g_strdup_printf ("<b>%s:</b>", _("Favorite's properties"));
 		gtk_label_set_markup (GTK_LABEL (label), str);
 		g_free (str);
-		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+		gtk_misc_get_alignment (GTK_MISC (label), NULL, &align);
+		gtk_misc_set_alignment (GTK_MISC (label), 0., align);
 		gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
 		
 		hbox = gtk_hbox_new (FALSE, 0); /* HIG */
@@ -287,14 +346,15 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 		label = gtk_label_new ("      ");
 		gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
 		
-		table = gtk_table_new (2, 2, FALSE);
+		table = gtk_table_new (3, 2, FALSE);
 		gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
 		
 		label = gtk_label_new ("");
 		str = g_strdup_printf ("<b>%s:</b>", _("Name"));
 		gtk_label_set_markup (GTK_LABEL (label), str);
 		g_free (str);
-		gtk_misc_set_alignment (GTK_MISC (label), 0., -1);
+		gtk_misc_get_alignment (GTK_MISC (label), NULL, &align);
+		gtk_misc_set_alignment (GTK_MISC (label), 0., align);
 		gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1, GTK_FILL, GTK_FILL, 0, 0);
 		
 		label = gtk_label_new ("");
@@ -303,6 +363,14 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 		g_free (str);
 		gtk_misc_set_alignment (GTK_MISC (label), 0., 0.);
 		gtk_table_attach (GTK_TABLE (table), label, 0, 1, 1, 2, GTK_FILL, GTK_FILL, 0, 0);
+
+		label = gtk_label_new ("");
+		str = g_strdup_printf ("<b>%s:</b>", _("Action name"));
+		gtk_label_set_markup (GTK_LABEL (label), str);
+		g_free (str);
+		gtk_misc_get_alignment (GTK_MISC (label), NULL, &align);
+		gtk_misc_set_alignment (GTK_MISC (label), 0., align);
+		gtk_table_attach (GTK_TABLE (table), label, 0, 1, 2, 3, GTK_FILL, GTK_FILL, 0, 0);
 		
 		entry = gtk_entry_new ();
 		gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
@@ -318,6 +386,12 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 		g_signal_connect (text, "changed",
 				  G_CALLBACK (property_changed_cb), tsel);
 
+		entry = gtk_entry_new ();
+		gtk_table_attach (GTK_TABLE (table), entry, 1, 2, 2, 3, GTK_EXPAND | GTK_FILL, GTK_SHRINK, 0, 0);
+		tsel->priv->properties_action = entry;
+		g_signal_connect (entry, "changed",
+				  G_CALLBACK (property_changed_cb), tsel);
+
 		tsel->priv->popup_properties = pcont;
 		gtk_widget_show_all (vbox);
 	}
@@ -350,12 +424,34 @@ properties_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 						   G_CALLBACK (property_changed_cb), tsel);
 		g_free (contents);
 
+		/* action, if any */
+		g_signal_handlers_block_by_func (tsel->priv->properties_action,
+						 G_CALLBACK (property_changed_cb), tsel);
+		gtk_entry_set_text (GTK_ENTRY (tsel->priv->properties_action), "");
+		if (tsel->priv->properties_id >= 0) {
+			gint id;
+			gchar *tmp;
+			BrowserFavorites *bfav;
+			BrowserFavoritesAttributes fav;
+			bfav = browser_connection_get_favorites (tsel->priv->bcnc);
+			tmp = g_strdup_printf ("QUERY%d", tsel->priv->properties_id);
+			id = browser_favorites_find (bfav, 0, tmp, &fav, NULL);
+			if (id >= 0) {
+				gtk_entry_set_text (GTK_ENTRY (tsel->priv->properties_action), fav.name);
+				/*g_print ("ACTION_USED %d: %s\n", fav.id, tmp);*/
+			}
+			g_free (tmp);
+		}
+		g_signal_handlers_unblock_by_func (tsel->priv->properties_action,
+						   G_CALLBACK (property_changed_cb), tsel);
+
+
 		gtk_widget_show (tsel->priv->popup_properties);
 	}
 }
 
 static void
-delete_activated_cb (GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
+delete_activated_cb (G_GNUC_UNUSED GtkMenuItem *mitem, QueryFavoriteSelector *tsel)
 {
 	favorite_delete_selected (tsel);
 }



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