[anjuta] bgo#670149 - Automatically add a callback when user double-clicks a signal in the glade signal edito



commit 150117849a274ac0cf5c7661468784f70183b2a5
Author: Marco Diego AurÃlio Mesquita <marcodiegomesquita gmail com>
Date:   Fri Feb 24 14:18:51 2012 +0100

    bgo#670149 - Automatically add a callback when user double-clicks a signal in the glade signal editor

 libanjuta/interfaces/libanjuta.idl         |   15 ++++
 plugins/glade/plugin.c                     |   71 ++++++++++++++++---
 plugins/language-support-cpp-java/plugin.c |  101 ++++++++++++++++++++--------
 3 files changed, 148 insertions(+), 39 deletions(-)
---
diff --git a/libanjuta/interfaces/libanjuta.idl b/libanjuta/interfaces/libanjuta.idl
index a26e947..9408cdc 100644
--- a/libanjuta/interfaces/libanjuta.idl
+++ b/libanjuta/interfaces/libanjuta.idl
@@ -1295,6 +1295,21 @@ interface IAnjutaEditor
 	void   ::glade_member_add (gchar *widget_typename, gchar *widget_name, gchar *filename);
 
 	/**
+	 * IAnjutaEditor::glade-member-add:
+	 * @widget_typename: Name of the type of the widget.
+	 * @signal_name: Name of the signal.
+	 * @handler_name: Name of the signal handler.
+	 * @object: Name of the object to be passed.
+	 * @swap: The "swap" signal property.
+	 * @after: The "after" signal property.
+	 * @filename: Path for the .ui file that generated the signal.
+	 * @obj: Self
+	 *
+	 * This signal is emitted when code for a widget must be generated.
+	 */
+	void   ::glade_callback_add (gchar *widget_typename, gchar *signal_name, gchar *handler_name, gchar *object, gboolean swap, gboolean after, gchar *filename);
+
+	/**
 	 * IAnjutaEditor::code-added:
 	 * @position: The iter position where @ch is added.
 	 * @code: The code that has been added.
diff --git a/plugins/glade/plugin.c b/plugins/glade/plugin.c
index 7cb600c..31884e9 100644
--- a/plugins/glade/plugin.c
+++ b/plugins/glade/plugin.c
@@ -106,11 +106,55 @@ value_removed_current_editor (AnjutaPlugin *plugin,
 }
 
 static void
+signal_editor_signal_activated_cb (GladeSignalEditor* seditor, 
+                                   GladeSignal *signal,
+                                   GladePlugin *plugin)
+{
+	IAnjutaEditor* current_editor;
+    GladeWidget *gwidget = glade_signal_editor_get_widget (seditor);
+    GladeProject *project = glade_widget_get_project (gwidget);
+    gchar *path = glade_project_get_path (project);
+	
+    IAnjutaDocumentManager *docman;
+    IAnjutaDocument *doc;
+
+    docman = anjuta_shell_get_interface (ANJUTA_PLUGIN (plugin)->shell,
+                                         IAnjutaDocumentManager, NULL);
+    if (!docman)
+        return;
+
+	doc = ianjuta_document_manager_get_current_document (docman, NULL);
+	if(!doc)
+		return;
+
+	current_editor = IANJUTA_EDITOR (doc);
+
+    if(!current_editor)
+        return;
+
+    if (!IANJUTA_IS_EDITOR (doc))
+        return;
+
+    g_signal_emit_by_name (G_OBJECT (current_editor), "glade-callback-add",
+                                                      G_OBJECT_TYPE_NAME (glade_widget_get_object (gwidget)),
+                                                      glade_signal_get_name (signal),
+                                                      glade_signal_get_handler (signal),
+                                                      glade_signal_get_userdata (signal),
+                                                      glade_signal_get_swapped (signal)?"1":"0",
+                                                      glade_signal_get_after (signal)?"1":"0",
+                                                      path);
+}
+
+static void
 on_signal_editor_created (GladeApp* app,
                           GladeSignalEditor* seditor,
                           gpointer data)
 {
 	glade_signal_editor_enable_dnd (seditor, TRUE);
+
+	g_signal_connect (seditor, "signal-activated",
+	                  G_CALLBACK (signal_editor_signal_activated_cb),
+	                  data);
 }
 
 static void
@@ -333,37 +377,40 @@ glade_plugin_add_project (GladePlugin *glade_plugin, GladeProject *project)
 
 	priv->file_count++;
 
-	ianjuta_document_manager_add_document (docman, IANJUTA_DOCUMENT(view), NULL);
+	ianjuta_document_manager_add_document (docman, IANJUTA_DOCUMENT (view), NULL);
 }
 
 static void
 add_glade_member (GladeWidget		 *widget,
 				  AnjutaPlugin       *plugin)
 {
+	IAnjutaEditor* current_editor;
 	IAnjutaDocumentManager *docman;
 	GladeProject *project = glade_widget_get_project (widget);
 	gchar *path = glade_project_get_path (project);
 	gchar *widget_name = glade_widget_get_name (widget);
 	gchar *widget_typename = G_OBJECT_TYPE_NAME (glade_widget_get_object(widget));
-	GList *docs;
-	GList *item;
+	IAnjutaDocument *doc;
 
 	docman = anjuta_shell_get_interface (ANJUTA_PLUGIN (plugin)->shell,
 										 IAnjutaDocumentManager, NULL);
 	if (!docman)
 		return;
 
-	docs = ianjuta_document_manager_get_doc_widgets (docman, NULL);
-	if (!docs) return;
+	doc = ianjuta_document_manager_get_current_document (docman, NULL);
+	if(!doc)
+		return;
 
-	for (item = docs; item != NULL; item = g_list_next (item))
-	{
-		IAnjutaDocument *curr_doc = IANJUTA_DOCUMENT(item->data);
-		if (!IANJUTA_IS_EDITOR (curr_doc)) continue;
+	current_editor = IANJUTA_EDITOR (doc);
 
-		g_signal_emit_by_name (G_OBJECT (curr_doc), "glade-member-add",
-							   widget_typename, widget_name, path);
-	}
+	if(!current_editor)
+		return;
+
+    if (!IANJUTA_IS_EDITOR (doc))
+		return;
+
+	g_signal_emit_by_name (G_OBJECT (current_editor), "glade-member-add",
+													  widget_typename, widget_name, path);
 }
 
 static void
diff --git a/plugins/language-support-cpp-java/plugin.c b/plugins/language-support-cpp-java/plugin.c
index 9aa6758..d9bbebf 100644
--- a/plugins/language-support-cpp-java/plugin.c
+++ b/plugins/language-support-cpp-java/plugin.c
@@ -351,32 +351,36 @@ initialize_indentation_params (CppJavaPlugin *plugin)
 
 /* Glade support */
 
-static void
-init_file_type (CppJavaPlugin* lang_plugin)
+static CppFileType
+get_filetype (GFile *file)
 {
-	GFile* file = ianjuta_file_get_file (IANJUTA_FILE (lang_plugin->current_editor),
-	                                     NULL);
-
 	if (file)
 	{
 		gchar* mime_type = anjuta_util_get_file_mime_type (file);
 		if (mime_type)
 		{
 			if (g_str_equal (mime_type, "text/x-csrc"))
-				lang_plugin->filetype = LS_FILE_C;
+				return LS_FILE_C;
 			else if (g_str_equal (mime_type, "text/x-chdr"))
-				lang_plugin->filetype = LS_FILE_CHDR;
+				return LS_FILE_CHDR;
 			else if (g_str_equal (mime_type, "text/x-c++src"))
-				lang_plugin->filetype = LS_FILE_CPP;
+				return LS_FILE_CPP;
 			else if (g_str_equal (mime_type, "text/x-c++hdr"))
-				lang_plugin->filetype = LS_FILE_CPPHDR;
+				return LS_FILE_CPPHDR;
 			else
-				lang_plugin->filetype = LS_FILE_OTHER;
-			g_free (mime_type);
-			return;
+				return LS_FILE_OTHER;
 		}
 	}
-	lang_plugin->filetype = LS_FILE_OTHER;
+	return LS_FILE_OTHER;
+}
+
+static void
+init_file_type (CppJavaPlugin* lang_plugin)
+{
+	GFile* file = ianjuta_file_get_file (IANJUTA_FILE (lang_plugin->current_editor),
+	                                     NULL);
+
+	lang_plugin->filetype = get_filetype (file);
 }
 
 static gboolean
@@ -463,6 +467,8 @@ language_support_generate_c_signature (const gchar* separator,
 	for (i = 0; i < query.n_params; i++)
 	{
 		const gchar* type_name = g_type_name (query.param_types[i]);
+		if (!type_name) continue;
+
 		const gchar* param_name = language_support_get_signal_parameter (type_name,
 			                                                             &names);
 	
@@ -800,12 +806,13 @@ on_glade_drop (IAnjutaEditor* editor,
 
 	IAnjutaIterable *iter;
 	iter = language_support_find_symbol (lang_plugin,
-										 IANJUTA_EDITOR (lang_plugin->current_editor),
+										 IANJUTA_EDITOR (editor),
 										 handler);
 	if (iter == NULL)
 	{
-		language_support_add_c_callback (lang_plugin, editor, iterator, split_signal_data,
-										 lang_plugin->filetype);
+		GFile *file = ianjuta_file_get_file (IANJUTA_FILE (editor), NULL);
+		CppFileType filetype = get_filetype (file);
+		language_support_add_c_callback (lang_plugin, editor, iterator, split_signal_data, filetype);
 	} else {
 		/* Symbol found, going there */
 		ianjuta_editor_goto_line (editor, ianjuta_symbol_get_int (
@@ -890,6 +897,44 @@ on_glade_member_add (IAnjutaEditor* editor, gchar* widget_typename,
 	insert_member_decl_and_init (editor, widget_name, ui_filename, lang_plugin);
 }
 
+static void
+on_glade_callback_add (IAnjutaEditor* editor, 
+					   gchar *widget_typename,
+					   gchar *signal_name,
+					   gchar *handler_name,
+					   gchar *object,
+					   gboolean swap,
+					   gboolean after,
+					   gchar* path,
+					   CppJavaPlugin* lang_plugin)
+{
+	GFile* ui_file = g_file_new_for_path (path);
+	gchar* ui_filename = g_file_get_basename (ui_file);
+
+	/* Using marker to search for compatibility */
+	gchar *mark = generate_widget_member_init_marker (ui_filename);
+	IAnjutaIterable* mark_position;
+	mark_position = language_support_get_mark_position (editor, mark);
+	if (mark_position)
+	{
+		IAnjutaIterable* end = ianjuta_editor_get_end_position (editor, NULL);
+
+		/* String format: widgettypename:signalname:handler_name:object:swap:after */
+		gchar *signal_data = g_strdup_printf("%s:%s:%s:%s:%s:%s",
+		                                     widget_typename,
+		                                     signal_name,
+		                                     handler_name,
+		                                     object,
+		                                     swap?"1":"0",
+		                                     after?"1":"0");
+
+		on_glade_drop (editor, end, signal_data, lang_plugin);
+
+		g_free(signal_data);
+	}
+	g_free(mark);
+}
+
 /* Enable/Disable language-support */
 static void
 install_support (CppJavaPlugin *lang_plugin)
@@ -907,7 +952,7 @@ install_support (CppJavaPlugin *lang_plugin)
 	lang_plugin->current_language = 
 		ianjuta_language_get_name_from_editor (lang_manager, 
 											   IANJUTA_EDITOR_LANGUAGE (lang_plugin->current_editor), NULL);
-	
+
 	DEBUG_PRINT("Language support installed for: %s",
 				lang_plugin->current_language);
 	
@@ -963,16 +1008,11 @@ install_support (CppJavaPlugin *lang_plugin)
 			                  lang_plugin);
 		}
 
-		// Since this signal is not disconnect on plugin uninstall, we have to prevent multiple connection.
-		if (!g_signal_handler_find (lang_plugin->current_editor,
-									G_SIGNAL_MATCH_FUNC,
-									0, //Signal id (ignored)
-									0, //detail (ignored)
-									0, //closure (ignored)
-									G_CALLBACK (on_glade_member_add),
-									0 //data (ignored)
-									)
-		   )
+		g_signal_connect (lang_plugin->current_editor,
+						  "glade-callback-add",
+						  G_CALLBACK (on_glade_callback_add),
+						  lang_plugin);
+
 		g_signal_connect (lang_plugin->current_editor,
 						  "glade-member-add",
 						  G_CALLBACK (on_glade_member_add),
@@ -1018,6 +1058,13 @@ uninstall_support (CppJavaPlugin *lang_plugin)
 	                                      on_glade_drop_possible, lang_plugin);
 	g_signal_handlers_disconnect_by_func (lang_plugin->current_editor,
 	                                      on_glade_drop, lang_plugin);
+	g_signal_handlers_disconnect_by_func (lang_plugin->current_editor,
+					                	  G_CALLBACK (on_glade_member_add),
+	                                      lang_plugin);
+	g_signal_handlers_disconnect_by_func (lang_plugin->current_editor,
+					                	  G_CALLBACK (on_glade_callback_add),
+	                                      lang_plugin);
+
 	if (lang_plugin->packages)
 	{
 		g_object_unref (lang_plugin->packages);



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