[anjuta] Improve c callback body generation.



commit 0fa1cb6fb910ea13654922b4f64b34c50d15042b
Author: Marco Diego Aurélio Mesquita <marcodiegomesquita gmail com>
Date:   Wed Jun 12 08:15:30 2013 -0300

    Improve c callback body generation.

 plugins/language-support-cpp-java/plugin.c         |  139 +++++++++++++-------
 .../templates/gtkapplication/src/application.c     |   14 +-
 2 files changed, 96 insertions(+), 57 deletions(-)
---
diff --git a/plugins/language-support-cpp-java/plugin.c b/plugins/language-support-cpp-java/plugin.c
index b0a763d..9b0d4d8 100644
--- a/plugins/language-support-cpp-java/plugin.c
+++ b/plugins/language-support-cpp-java/plugin.c
@@ -390,10 +390,91 @@ language_support_find_symbol (CppJavaPlugin* lang_plugin,
     return iter;
 }
 
+static gchar*
+get_text_between (IAnjutaEditor *editor, gchar *prefix, gchar *suffix)
+{
+       IAnjutaEditorCell *search_start = IANJUTA_EDITOR_CELL (
+                                                                               
ianjuta_editor_get_start_position (editor, NULL));
+       IAnjutaEditorCell *search_end = IANJUTA_EDITOR_CELL (
+                                                                               
ianjuta_editor_get_end_position (editor, NULL));
+
+       IAnjutaEditorCell *result_start;
+       IAnjutaEditorCell *result_end = NULL;
+
+       IAnjutaEditorCell *prefix_end;
+       IAnjutaEditorCell *suffix_start;
+
+       ianjuta_editor_search_forward (IANJUTA_EDITOR_SEARCH (editor),
+                                                                  prefix, FALSE,
+                                                                  search_start, search_end,
+                                                                  &result_start,
+                                                                  &result_end, NULL);
+
+       if (!result_end)
+               return NULL;
+
+       g_object_unref (result_start);
+
+       prefix_end = result_end;
+
+       ianjuta_editor_search_forward (IANJUTA_EDITOR_SEARCH (editor),
+                                                                  suffix, FALSE,
+                                                                  result_end, search_end,
+                                                                  &result_start,
+                                                                  &result_end, NULL);
+
+       suffix_start = result_start;
+
+       if (!result_end)
+               return NULL;
+
+       g_object_unref (result_end);
+
+       return ianjuta_editor_get_text (editor, prefix_end, suffix_start, NULL);
+}
+
+static gchar*
+prepare_callback_body (gchar* user_data, IAnjutaEditor* editor, gint *offset)
+{
+    if (g_strcmp0 (user_data, "(null)")) {
+        *offset = C_OFFSET + 1;
+        return g_strdup_printf("\n{\n\tGObject *%s = G_OBJECT (user_data);\n\n}\n", user_data);
+    }
+
+    gchar *macro_string = get_text_between (editor, "/* Define the private structure; ", " gets ");
+
+    if (!macro_string) {
+        *offset = C_OFFSET;
+        return g_strdup_printf ("%s", C_BODY);
+    }
+
+    gchar *prefix = g_strdup_printf ("/* Define the private structure; %s gets ", macro_string);
+    gchar *struct_string = get_text_between(editor, prefix, " */");
+    g_free (prefix);
+
+    if (!struct_string) {
+        g_free (macro_string);
+        *offset = C_OFFSET;
+        return g_strdup_printf ("%s", C_BODY);
+    }
+
+    gchar *new_body;
+    new_body = g_strdup_printf("\n{\n\t%s *self = %s(user_data);\n\t%sPrivate *priv = self->priv;\n}\n",
+                               struct_string, macro_string, struct_string);
+    *offset = C_OFFSET + 2;
+
+    g_free (macro_string);
+    g_free (struct_string);
+
+    return new_body;
+}
+
 static gboolean
 language_support_get_callback_strings (gchar** separator,
                                        gchar** body,
                                        gint* offset,
+                                       gchar* user_data,
+                                       IAnjutaEditor* editor,
                                        CppFileType filetype)
 {
     switch (filetype)
@@ -401,14 +482,13 @@ language_support_get_callback_strings (gchar** separator,
         case LS_FILE_C:
         {
             *separator = C_SEPARATOR;
-            *body = C_BODY;
-            *offset = C_OFFSET;
+            *body = prepare_callback_body (user_data, editor, offset);
             break;
         }
         case LS_FILE_CHDR:
         {
             *separator = CHDR_SEPARATOR;
-            *body = CHDR_BODY;
+            *body = g_strdup_printf ("%s", CHDR_BODY);
             *offset = CHDR_OFFSET;
             break;
         }
@@ -459,7 +539,8 @@ language_support_add_c_callback (CppJavaPlugin* lang_plugin,
     const gchar* widget = split_signal_data[0];
     const gchar* signal = split_signal_data[1];
     const gchar* handler = split_signal_data[2];
-    //const gchar* user_data = split_signal_data[3]; // Currently unused
+    const gchar* user_data = split_signal_data[3];
+
     gboolean swapped = g_str_equal (split_signal_data[4], "1");
 
     GType type = g_type_from_name (widget);
@@ -468,11 +549,9 @@ language_support_add_c_callback (CppJavaPlugin* lang_plugin,
     g_signal_query (id, &query);
 
 
-    if (!language_support_get_callback_strings (&separator, &body, &offset, filetype))
+    if (!language_support_get_callback_strings (&separator, &body, &offset, user_data, editor, filetype))
         return;
 
-
-
     GString* str = language_support_generate_c_signature (separator, widget,
                                                           query, swapped, handler);
 
@@ -519,6 +598,9 @@ language_support_add_c_callback (CppJavaPlugin* lang_plugin,
 
     if (string) g_free (string);
 
+    /* Body is a bit different form other strings and must be freed */
+    if (body) g_free (body);
+
     /* Will now set the caret position offset */
     ianjuta_editor_goto_line (editor,
                               ianjuta_editor_get_line_from_position (
@@ -759,49 +841,6 @@ on_glade_callback_add (IAnjutaEditor* editor,
     g_free(mark);
 }
 
-static gchar*
-get_text_between (IAnjutaEditor *editor, gchar *prefix, gchar *suffix)
-{
-       IAnjutaEditorCell *search_start = IANJUTA_EDITOR_CELL (
-                                                                               
ianjuta_editor_get_start_position (editor, NULL));
-       IAnjutaEditorCell *search_end = IANJUTA_EDITOR_CELL (
-                                                                               
ianjuta_editor_get_end_position (editor, NULL));
-
-       IAnjutaEditorCell *result_start;
-       IAnjutaEditorCell *result_end = NULL;
-
-       IAnjutaEditorCell *prefix_end;
-       IAnjutaEditorCell *suffix_start;
-
-       ianjuta_editor_search_forward (IANJUTA_EDITOR_SEARCH (editor),
-                                                                  prefix, FALSE,
-                                                                  search_start, search_end,
-                                                                  &result_start,
-                                                                  &result_end, NULL);
-
-       if (!result_end)
-               return NULL;
-
-    g_object_unref (result_start);
-
-       prefix_end = result_end;
-
-       ianjuta_editor_search_forward (IANJUTA_EDITOR_SEARCH (editor),
-                                                                  suffix, FALSE,
-                                                                  result_end, search_end,
-                                                                  &result_start,
-                                                                  &result_end, NULL);
-
-       suffix_start = result_start;
-
-       if (!result_end)
-               return NULL;
-
-    g_object_unref (result_end);
-
-       return ianjuta_editor_get_text (editor, prefix_end, suffix_start, NULL);
-}
-
 /* Enable/Disable language-support */
 static void
 install_support (CppJavaPlugin *lang_plugin)
diff --git a/plugins/project-wizard/templates/gtkapplication/src/application.c 
b/plugins/project-wizard/templates/gtkapplication/src/application.c
index 7f73f80..6006558 100644
--- a/plugins/project-wizard/templates/gtkapplication/src/application.c
+++ b/plugins/project-wizard/templates/gtkapplication/src/application.c
@@ -23,15 +23,12 @@
 
 G_DEFINE_TYPE ([+NameCClass+], [+NameCLower+], GTK_TYPE_APPLICATION);
 
-[+IF (=(get "HaveBuilderUI") "1")+]
-/* Define the private structure in the .c file */
-#define [+NameCUpper+]_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), [+NameCUpper+]_TYPE_APPLICATION, 
[+NameCClass+]Private))
-
+[+IF (=(get "HaveBuilderUI") "1") \+]
 struct _[+NameCClass+]Private
 {
        /* ANJUTA: Widgets declaration for [+NameHLower+].ui - DO NOT REMOVE */
 };
-[+ENDIF+]
+[+ENDIF \+]
 
 /* Create a new window loading a file */
 static void
@@ -43,7 +40,7 @@ static void
        GtkBuilder *builder;
        GError* error = NULL;
 
-       [+NameCClass+]Private *priv = [+NameCUpper+]_GET_PRIVATE(app);
+       [+NameCClass+]Private *priv = [+NameCUpper+]_APPLICATION(app)->priv;
 
        /* Load UI from file */
        builder = gtk_builder_new ();
@@ -79,6 +76,7 @@ static void
        {
                /* TODO: Add code here to open the file in the new window */
        }
+
        gtk_widget_show_all (GTK_WIDGET (window));
 }
 
@@ -105,7 +103,9 @@ static void
 static void
 [+NameCLower+]_init ([+NameCClass+] *object)
 {
-
+[+IF (=(get "HaveBuilderUI") "1") \+]
+       object->priv = G_TYPE_INSTANCE_GET_PRIVATE (object, [+NameCUpper+]_TYPE_APPLICATION, 
[+NameCClass+]Private);
+[+ENDIF \+]    
 }
 
 static void


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