[gtksourceview/gtksourcecompletion] Moved proposal activation from proposal to provider and added two new signals to completion (popup a



commit 9525c98a809d67b2e47a9dc9901f2286ba4ec003
Author: Jesse van den Kieboom <jesse icecrew nl>
Date:   Sun Apr 19 13:03:08 2009 +0200

    Moved proposal activation from proposal to provider and added two new signals to completion (popup and finish)
    
    The same default replace word action on proposal activation is kept, it just now resides in the provider.
---
 gtksourceview/gtksourcecompletion.c         |  139 +++++++++++++++++++--------
 gtksourceview/gtksourcecompletion.h         |    7 +-
 gtksourceview/gtksourcecompletionitem.c     |   15 ---
 gtksourceview/gtksourcecompletionproposal.c |   40 +--------
 gtksourceview/gtksourcecompletionproposal.h |    8 --
 gtksourceview/gtksourcecompletionprovider.c |   34 +++++++
 gtksourceview/gtksourcecompletionprovider.h |    6 +
 gtksourceview/gtksourceview-marshal.list    |    1 +
 8 files changed, 146 insertions(+), 104 deletions(-)

diff --git a/gtksourceview/gtksourcecompletion.c b/gtksourceview/gtksourcecompletion.c
index 4b92f4b..054032f 100644
--- a/gtksourceview/gtksourcecompletion.c
+++ b/gtksourceview/gtksourcecompletion.c
@@ -51,6 +51,8 @@
 enum
 {
 	PROPOSAL_ACTIVATED,
+	POPUP,
+	FINISH,
 	LAST_SIGNAL
 };
 
@@ -157,14 +159,26 @@ static gboolean
 activate_current_proposal (GtkSourceCompletion *completion)
 {
 	gboolean activated = FALSE;
-	GtkSourceCompletionProposal *prop = NULL;
+	GtkTreeIter iter;
+	GtkSourceCompletionProposal *proposal = NULL;
+	GtkSourceCompletionProvider *provider = NULL;
 	
-	if (get_selected_proposal (completion, NULL, &prop))
+	if (get_selected_proposal (completion, &iter, &proposal))
 	{
-		g_signal_emit (G_OBJECT (completion), signals[PROPOSAL_ACTIVATED],
-			       0, prop, &activated);
+		gtk_tree_model_get (GTK_TREE_MODEL (completion->priv->model_proposals),
+		                    &iter,
+		                    GTK_SOURCE_COMPLETION_MODEL_COLUMN_PROVIDER, &provider,
+		                    -1);
+		                    
+		g_signal_emit (G_OBJECT (completion), 
+		               signals[PROPOSAL_ACTIVATED],
+			       0, 
+			       provider, 
+			       proposal, 
+			       &activated);
 		
-		g_object_unref (prop);
+		g_object_unref (provider);
+		g_object_unref (proposal);
 	}
 	
 	return activated;
@@ -848,39 +862,17 @@ hide_info_cb (GtkWidget *widget,
 
 static gboolean
 gtk_source_completion_proposal_activated_default (GtkSourceCompletion         *completion,
+						  GtkSourceCompletionProvider *provider,
 						  GtkSourceCompletionProposal *proposal)
 {
 	gboolean ret;
 	
-	ret = gtk_source_completion_proposal_activate (proposal, 
-	                                               GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (
-	                                                                  GTK_TEXT_VIEW (completion->priv->view))));
+	ret = gtk_source_completion_provider_activate_proposal (provider, proposal); 
 	gtk_source_completion_finish (completion);
 	return ret;
 }
 
 static void
-gtk_source_completion_finish_real (GtkSourceCompletion *completion)
-{
-	completion->priv->filter_provider = NULL;
-
-	gtk_label_set_markup (GTK_LABEL (completion->priv->default_info), "");
-
-	gtk_source_completion_model_clear (completion->priv->model_proposals);
-
-	g_list_free (completion->priv->active_providers);
-	completion->priv->active_providers = NULL;
-	
-	g_free (completion->priv->filter_criteria);
-	completion->priv->filter_criteria = NULL;
-	
-	completion->priv->info_visible = GTK_WIDGET_VISIBLE (completion->priv->info_window);
-	
-	gtk_widget_hide (completion->priv->info_window);
-	gtk_widget_hide (completion->priv->window);
-}
-
-static void
 gtk_source_completion_realize (GtkWidget *widget,
 			       GtkSourceCompletion *completion)
 {
@@ -1359,6 +1351,39 @@ gtk_source_completion_set_property (GObject      *object,
 }
 
 static void
+gtk_source_completion_finish_default (GtkSourceCompletion *completion)
+{
+	completion->priv->filter_provider = NULL;
+
+	gtk_label_set_markup (GTK_LABEL (completion->priv->default_info), "");
+
+	gtk_source_completion_model_clear (completion->priv->model_proposals);
+
+	g_list_free (completion->priv->active_providers);
+	completion->priv->active_providers = NULL;
+	
+	g_free (completion->priv->filter_criteria);
+	completion->priv->filter_criteria = NULL;
+	
+	completion->priv->info_visible = GTK_WIDGET_VISIBLE (completion->priv->info_window);
+	
+	gtk_widget_hide (completion->priv->info_window);
+	gtk_widget_hide (completion->priv->window);
+}
+
+static void
+gtk_source_completion_popup_default (GtkSourceCompletion *completion)
+{
+	gtk_widget_show (GTK_WIDGET (completion->priv->window));
+	gtk_widget_grab_focus (GTK_WIDGET (completion->priv->view));
+
+	if (completion->priv->select_on_show)
+	{
+		select_first_proposal (completion);
+	}
+}
+
+static void
 gtk_source_completion_class_init (GtkSourceCompletionClass *klass)
 {
 	GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -1371,6 +1396,8 @@ gtk_source_completion_class_init (GtkSourceCompletionClass *klass)
 	object_class->dispose = gtk_source_completion_dispose;
 
 	klass->proposal_activated = gtk_source_completion_proposal_activated_default;
+	klass->popup = gtk_source_completion_popup_default;
+	klass->finish = gtk_source_completion_finish_default;
 
 	/**
 	 * GtkSourceCompletion:manage-completion-keys:
@@ -1483,10 +1510,48 @@ gtk_source_completion_class_init (GtkSourceCompletionClass *klass)
 			      G_STRUCT_OFFSET (GtkSourceCompletionClass, proposal_activated),
 			      g_signal_accumulator_true_handled, 
 			      NULL,
-			      _gtksourceview_marshal_BOOLEAN__OBJECT, 
+			      _gtksourceview_marshal_BOOLEAN__OBJECT_OBJECT, 
 			      G_TYPE_BOOLEAN,
-			      1,
+			      2,
+			      G_TYPE_OBJECT,
 			      G_TYPE_OBJECT);
+
+	/**
+	 * GtkSourceCompletion::popup:
+	 * @completion: The #GtkSourceCompletion who emits the signal
+	 *
+	 * Emitted when the completion window is popped up. The default handler
+	 * will actually show the window.
+	 **/
+	signals[POPUP] =
+		g_signal_new ("popup",
+			      G_TYPE_FROM_CLASS (klass),
+			      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+			      G_STRUCT_OFFSET (GtkSourceCompletionClass, popup),
+			      NULL, 
+			      NULL,
+			      g_cclosure_marshal_VOID__VOID, 
+			      G_TYPE_NONE,
+			      0);
+
+
+	/**
+	 * GtkSourceCompletion::finish:
+	 * @completion: The #GtkSourceCompletion who emits the signal
+	 *
+	 * Emitted when the completion window is popped up. The default handler
+	 * will actually show the window.
+	 **/
+	signals[FINISH] =
+		g_signal_new ("finish",
+			      G_TYPE_FROM_CLASS (klass),
+			      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+			      G_STRUCT_OFFSET (GtkSourceCompletionClass, finish),
+			      NULL, 
+			      NULL,
+			      g_cclosure_marshal_VOID__VOID, 
+			      G_TYPE_NONE,
+			      0);
 }
 
 static void
@@ -1883,7 +1948,7 @@ gtk_source_completion_popup (GtkSourceCompletion *completion,
 	g_return_val_if_fail (GTK_IS_SOURCE_COMPLETION (completion), FALSE);
 	
 	/* Make sure to clear any active completion */
-	gtk_source_completion_finish_real (completion);
+	gtk_source_completion_finish_default (completion);
 	
 	/* Use all registered providers if no providers were specified */
 	if (providers == NULL)
@@ -1938,13 +2003,7 @@ gtk_source_completion_popup (GtkSourceCompletion *completion,
 					      completion->priv->info_visible);
 	}
 	
-	gtk_widget_show (GTK_WIDGET (completion->priv->window));
-	gtk_widget_grab_focus (GTK_WIDGET (completion->priv->view));
-
-	if (completion->priv->select_on_show)
-	{
-		select_first_proposal (completion);
-	}
+	g_signal_emit (completion, signals[POPUP], 0);
 	
 	return TRUE;
 }
@@ -2083,7 +2142,7 @@ gtk_source_completion_finish (GtkSourceCompletion *completion)
 	/* Hiding the completion window will trigger the actual finish */
 	if (GTK_WIDGET_VISIBLE (completion->priv->window))
 	{
-		gtk_source_completion_finish_real (completion);
+		g_signal_emit (completion, signals[FINISH], 0);
 	}
 }
 
diff --git a/gtksourceview/gtksourcecompletion.h b/gtksourceview/gtksourcecompletion.h
index cbec1eb..00b3ba2 100644
--- a/gtksourceview/gtksourcecompletion.h
+++ b/gtksourceview/gtksourcecompletion.h
@@ -57,8 +57,11 @@ struct _GtkSourceCompletionClass
 {
 	GObjectClass parent_class;
 
-	gboolean (* proposal_activated)		(GtkSourceCompletion         *completion,
-						 GtkSourceCompletionProposal *proposal);
+	gboolean 	(* proposal_activated)		(GtkSourceCompletion         *completion,
+	                                                 GtkSourceCompletionProvider *provider,
+							 GtkSourceCompletionProposal *proposal);
+	void 		(* popup)			(GtkSourceCompletion         *completion);
+	void		(* finish)			(GtkSourceCompletion         *completion);
 };
 
 GType		 gtk_source_completion_get_type			(void) G_GNUC_CONST;
diff --git a/gtksourceview/gtksourcecompletionitem.c b/gtksourceview/gtksourcecompletionitem.c
index ff50ee0..a315cd2 100644
--- a/gtksourceview/gtksourcecompletionitem.c
+++ b/gtksourceview/gtksourcecompletionitem.c
@@ -29,18 +29,6 @@ G_DEFINE_TYPE_WITH_CODE (GtkSourceCompletionItem,
 			 G_IMPLEMENT_INTERFACE (GTK_TYPE_SOURCE_COMPLETION_PROPOSAL,
 			 			gtk_source_completion_proposal_iface_init))
 
-static gboolean
-gtk_source_completion_proposal_activate_impl (GtkSourceCompletionProposal *self,
-					      GtkSourceBuffer		  *buffer)
-{
-	GtkSourceCompletionItem *item = GTK_SOURCE_COMPLETION_ITEM (self);
-
-	gtk_source_completion_utils_replace_current_word (buffer,
-							  item->priv->label,
-							  -1);
-	return TRUE;
-}
-
 static const gchar *
 gtk_source_completion_proposal_get_label_impl (GtkSourceCompletionProposal *self)
 {
@@ -65,9 +53,6 @@ gtk_source_completion_proposal_iface_init (gpointer g_iface,
 {
 	GtkSourceCompletionProposalIface *iface = (GtkSourceCompletionProposalIface *)g_iface;
 	
-	/* Default activate handler */
-	iface->activate = gtk_source_completion_proposal_activate_impl;
-	
 	/* Interface data getter implementations */
 	iface->get_label = gtk_source_completion_proposal_get_label_impl;
 	iface->get_icon = gtk_source_completion_proposal_get_icon_impl;
diff --git a/gtksourceview/gtksourcecompletionproposal.c b/gtksourceview/gtksourcecompletionproposal.c
index 8e5d3cc..02ab307 100644
--- a/gtksourceview/gtksourcecompletionproposal.c
+++ b/gtksourceview/gtksourcecompletionproposal.c
@@ -72,19 +72,7 @@ gtk_source_completion_proposal_init (GtkSourceCompletionProposalIface *iface)
 	iface->get_info = gtk_source_completion_proposal_get_info_default;
 	
 	if (!initialized)
-	{
-		signals[ACTIVATE] = 
-			g_signal_new ("activate",
-			      G_TYPE_FROM_INTERFACE (iface),
-			      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
-			      G_STRUCT_OFFSET (GtkSourceCompletionProposalIface, activate),
-			      g_signal_accumulator_true_handled, 
-			      NULL,
-			      _gtksourceview_marshal_BOOLEAN__OBJECT, 
-			      G_TYPE_BOOLEAN,
-			      1,
-			      GTK_TYPE_SOURCE_BUFFER);
-		
+	{	
 		initialized = TRUE;
 	}
 }
@@ -166,29 +154,3 @@ gtk_source_completion_proposal_get_info (GtkSourceCompletionProposal *proposal)
 	g_return_val_if_fail (GTK_IS_SOURCE_COMPLETION_PROPOSAL (proposal), NULL);
 	return GTK_SOURCE_COMPLETION_PROPOSAL_GET_INTERFACE (proposal)->get_info (proposal);
 }
-
-/**
- * gtk_source_completion_proposal_activate:
- * @proposal: The #GtkSourceCompletionProposal
- * @buffer: The #GtkSourceBuffer
- * 
- * This emits the "activate" signal on @proposal. This function is generally 
- * called when @proposal is activated from the completion window. 
- * Implementations should take action in the default handler of the signal.
- *
- * Returns: %TRUE if @proposal was activated.
- */
-gboolean
-gtk_source_completion_proposal_activate (GtkSourceCompletionProposal *proposal,
-					 GtkSourceBuffer	     *buffer)
-{
-	gboolean ret = FALSE;
-
-	g_return_val_if_fail (GTK_IS_SOURCE_COMPLETION_PROPOSAL (proposal), FALSE);
-	
-	g_signal_emit (proposal, signals[ACTIVATE], 0, buffer, &ret);
-
-	return ret;
-}
-
-
diff --git a/gtksourceview/gtksourcecompletionproposal.h b/gtksourceview/gtksourcecompletionproposal.h
index 34aa4a5..1775751 100644
--- a/gtksourceview/gtksourcecompletionproposal.h
+++ b/gtksourceview/gtksourcecompletionproposal.h
@@ -26,7 +26,6 @@
 
 #include <glib-object.h>
 #include <gdk-pixbuf/gdk-pixbuf.h>
-#include <gtksourceview/gtksourcebuffer.h>
 
 G_BEGIN_DECLS
 
@@ -42,10 +41,6 @@ struct _GtkSourceCompletionProposalIface
 {
 	GTypeInterface parent;
 	
-	/* Signals */
-	gboolean	 (*activate)	(GtkSourceCompletionProposal *proposal,
-					 GtkSourceBuffer	     *buffer);
-	
 	/* Interface functions */
 	const gchar 	*(*get_label)	(GtkSourceCompletionProposal *proposal);
 	GdkPixbuf	*(*get_icon)	(GtkSourceCompletionProposal *proposal);
@@ -59,9 +54,6 @@ const gchar		*gtk_source_completion_proposal_get_label	(GtkSourceCompletionPropo
 GdkPixbuf		*gtk_source_completion_proposal_get_icon	(GtkSourceCompletionProposal *proposal);
 const gchar		*gtk_source_completion_proposal_get_info	(GtkSourceCompletionProposal *proposal);
 
-gboolean		 gtk_source_completion_proposal_activate	(GtkSourceCompletionProposal *proposal,
-									 GtkSourceBuffer             *buffer);
-
 G_END_DECLS
 
 #endif /* __GTK_SOURCE_COMPLETION_PROPOSAL_H__ */
diff --git a/gtksourceview/gtksourcecompletionprovider.c b/gtksourceview/gtksourcecompletionprovider.c
index 8494b10..6d9a08e 100644
--- a/gtksourceview/gtksourcecompletionprovider.c
+++ b/gtksourceview/gtksourcecompletionprovider.c
@@ -32,6 +32,10 @@
 
 
 #include <gtksourceview/gtksourcecompletionprovider.h>
+#include <gtksourceview/gtksourcecompletion.h>
+#include <gtksourceview/gtksourceview.h>
+
+#include "gtksourcecompletionutils.h"
 
 /* Default implementations */
 static const gchar *
@@ -86,6 +90,24 @@ gtk_source_completion_provider_update_info_default (GtkSourceCompletionProvider
 {
 }
 
+static gboolean
+gtk_source_completion_provider_activate_proposal_default (GtkSourceCompletionProvider *provider,
+                                                          GtkSourceCompletionProposal *proposal)
+{
+	GtkSourceCompletion *completion;
+	GtkSourceView *view;
+	GtkSourceBuffer *buffer;
+	
+	completion = gtk_source_completion_get_from_provider (provider);
+	view = gtk_source_completion_get_view (completion);
+	buffer = GTK_SOURCE_BUFFER (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)));
+	
+	gtk_source_completion_utils_replace_current_word (buffer,
+	                                                  gtk_source_completion_proposal_get_label (proposal),
+	                                                  -1);
+	return TRUE;
+}
+
 static void 
 gtk_source_completion_provider_base_init (GtkSourceCompletionProviderIface *iface)
 {
@@ -103,6 +125,8 @@ gtk_source_completion_provider_base_init (GtkSourceCompletionProviderIface *ifac
 	iface->get_info_widget = gtk_source_completion_provider_get_info_widget_default;
 	iface->update_info = gtk_source_completion_provider_update_info_default;
 	
+	iface->activate_proposal = gtk_source_completion_provider_activate_proposal_default;
+
 	if (!initialized)
 	{
 		initialized = TRUE;
@@ -290,3 +314,13 @@ gtk_source_completion_provider_update_info (GtkSourceCompletionProvider *provide
 	
 	GTK_SOURCE_COMPLETION_PROVIDER_GET_INTERFACE (provider)->update_info (provider, proposal, info);
 }
+
+gboolean
+gtk_source_completion_provider_activate_proposal (GtkSourceCompletionProvider *provider,
+                                                  GtkSourceCompletionProposal *proposal)
+{
+	g_return_val_if_fail (GTK_IS_SOURCE_COMPLETION_PROVIDER (provider), FALSE);
+	g_return_val_if_fail (GTK_IS_SOURCE_COMPLETION_PROPOSAL (proposal), FALSE);
+	
+	return GTK_SOURCE_COMPLETION_PROVIDER_GET_INTERFACE (provider)->activate_proposal (provider, proposal);
+}
diff --git a/gtksourceview/gtksourcecompletionprovider.h b/gtksourceview/gtksourcecompletionprovider.h
index 614d4f3..7053f6d 100644
--- a/gtksourceview/gtksourcecompletionprovider.h
+++ b/gtksourceview/gtksourcecompletionprovider.h
@@ -59,6 +59,9 @@ struct _GtkSourceCompletionProviderIface
 	void		 (*update_info)		(GtkSourceCompletionProvider *provider,
 						 GtkSourceCompletionProposal *proposal,
 						 GtkSourceCompletionInfo     *info);
+
+	gboolean	 (*activate_proposal)	(GtkSourceCompletionProvider *provider,
+						 GtkSourceCompletionProposal *proposal);
 };
 
 GType		 gtk_source_completion_provider_get_type	(void);
@@ -84,6 +87,9 @@ void 		 gtk_source_completion_provider_update_info	(GtkSourceCompletionProvider
 								 GtkSourceCompletionProposal *proposal,
 								 GtkSourceCompletionInfo     *info);
 
+gboolean	 gtk_source_completion_provider_activate_proposal (GtkSourceCompletionProvider *provider,
+								   GtkSourceCompletionProposal *proposal);
+
 G_END_DECLS
 
 #endif
diff --git a/gtksourceview/gtksourceview-marshal.list b/gtksourceview/gtksourceview-marshal.list
index 1aa3273..f61f9c7 100644
--- a/gtksourceview/gtksourceview-marshal.list
+++ b/gtksourceview/gtksourceview-marshal.list
@@ -7,3 +7,4 @@ VOID:STRING
 BOOLEAN:POINTER
 BOOLEAN:VOID
 BOOLEAN:OBJECT
+BOOLEAN:OBJECT,OBJECT



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