[anjuta] bgo#670149 - Automatically add a callback when user double-clicks a signal in the glade signal edito
- From: Johannes Schmid <jhs src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] bgo#670149 - Automatically add a callback when user double-clicks a signal in the glade signal edito
- Date: Fri, 24 Feb 2012 13:19:44 +0000 (UTC)
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]