Revision: 1179 http://svn.sourceforge.net/geany/?rev=1179&view=rev Author: ntrel Date: 2007-01-13 05:25:05 -0800 (Sat, 13 Jan 2007)
Log Message: ----------- Move utils_compare_symbol(), GeanySymbol, recreate_tag_list() to symbols.c.
Modified Paths: -------------- trunk/ChangeLog trunk/src/geany.h trunk/src/symbols.c trunk/src/symbols.h trunk/src/ui_utils.c trunk/src/utils.c trunk/src/utils.h
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/ChangeLog 2007-01-13 13:25:05 UTC (rev 1179) @@ -3,6 +3,10 @@ * src/main.c, src/socket.c, po/POTFILES.in: Print an error message (instead of debug message) when a command-line file cannot be loaded. + * src/utils.c, src/utils.h, src/geany.h, src/symbols.c, + src/ui_utils.c, src/symbols.h: + Move utils_compare_symbol(), GeanySymbol, recreate_tag_list() + to symbols.c.
2007-01-12 Nick Treleaven nick.treleaven@btinternet.com
Modified: trunk/src/geany.h =================================================================== --- trunk/src/geany.h 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/geany.h 2007-01-13 13:25:05 UTC (rev 1179) @@ -187,15 +187,6 @@ MyApp *app;
-// small struct to track tag name and type together -typedef struct GeanySymbol -{ - gchar *str; - gint type; - gint line; -} GeanySymbol; - - enum { GEANY_IMAGE_SMALL_CROSS,
Modified: trunk/src/symbols.c =================================================================== --- trunk/src/symbols.c 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/symbols.c 2007-01-13 13:25:05 UTC (rev 1179) @@ -24,12 +24,14 @@ #include "geany.h"
#include <ctype.h> +#include <string.h>
#include "symbols.h" #include "utils.h" #include "filetypes.h" #include "encodings.h" #include "document.h" +#include "treeviews.h"
const guint TM_GLOBAL_TYPE_MASK = @@ -176,75 +178,6 @@ }
-const GList *symbols_get_tag_list(gint idx, guint tag_types) -{ - static GList *tag_names = NULL; - - if (idx >= 0 && doc_list[idx].is_valid && doc_list[idx].tm_file && - doc_list[idx].tm_file->tags_array) - { - TMTag *tag; - guint i; - GeanySymbol *symbol; - gboolean doc_is_utf8 = FALSE; - gchar *utf8_name; - const gchar *cosep = - symbols_get_context_separator(FILETYPE_ID(doc_list[idx].file_type)); - - if (tag_names) - { - GList *tmp; - for (tmp = tag_names; tmp; tmp = g_list_next(tmp)) - { - g_free(((GeanySymbol*)tmp->data)->str); - g_free(tmp->data); - } - g_list_free(tag_names); - tag_names = NULL; - } - - // do this comparison only once - if (utils_str_equal(doc_list[idx].encoding, "UTF-8")) doc_is_utf8 = TRUE; - - for (i = 0; i < (doc_list[idx].tm_file)->tags_array->len; ++i) - { - tag = TM_TAG((doc_list[idx].tm_file)->tags_array->pdata[i]); - if (tag == NULL) - return NULL; - - if (tag->type & tag_types) - { - if (! doc_is_utf8) utf8_name = encodings_convert_to_utf8_from_charset(tag->name, - -1, doc_list[idx].encoding, TRUE); - else utf8_name = tag->name; - if ((tag->atts.entry.scope != NULL) && isalpha(tag->atts.entry.scope[0])) - { - symbol = g_new0(GeanySymbol, 1); - symbol->str = g_strdup_printf("%s%s%s [%ld]", tag->atts.entry.scope, cosep, - utf8_name, tag->atts.entry.line); - symbol->type = tag->type; - symbol->line = tag->atts.entry.line; - tag_names = g_list_prepend(tag_names, symbol); - } - else - { - symbol = g_new0(GeanySymbol, 1); - symbol->str = g_strdup_printf("%s [%ld]", utf8_name, tag->atts.entry.line); - symbol->type = tag->type; - symbol->line = tag->atts.entry.line; - tag_names = g_list_prepend(tag_names, symbol); - } - if (! doc_is_utf8) g_free(utf8_name); - } - } - tag_names = g_list_sort(tag_names, (GCompareFunc) utils_compare_symbol); - return tag_names; - } - else - return NULL; -} - - GString *symbols_get_macro_list() { guint j, i; @@ -330,3 +263,187 @@ { g_strfreev(html_entities); } + + +// small struct to track tag name and type together +typedef struct GeanySymbol +{ + gchar *str; + gint type; + gint line; +} GeanySymbol; + + +/* wrapper function to let strcmp work with GeanySymbol struct */ +static gint compare_symbol(const GeanySymbol *a, const GeanySymbol *b) +{ + if (a == NULL || b == NULL) return 0; + + return strcmp(a->str, b->str); +} + + +static const GList * +get_tag_list(gint idx, guint tag_types) +{ + static GList *tag_names = NULL; + + if (idx >= 0 && doc_list[idx].is_valid && doc_list[idx].tm_file && + doc_list[idx].tm_file->tags_array) + { + TMTag *tag; + guint i; + GeanySymbol *symbol; + gboolean doc_is_utf8 = FALSE; + gchar *utf8_name; + const gchar *cosep = + symbols_get_context_separator(FILETYPE_ID(doc_list[idx].file_type)); + + if (tag_names) + { + GList *tmp; + for (tmp = tag_names; tmp; tmp = g_list_next(tmp)) + { + g_free(((GeanySymbol*)tmp->data)->str); + g_free(tmp->data); + } + g_list_free(tag_names); + tag_names = NULL; + } + + // do this comparison only once + if (utils_str_equal(doc_list[idx].encoding, "UTF-8")) doc_is_utf8 = TRUE; + + for (i = 0; i < (doc_list[idx].tm_file)->tags_array->len; ++i) + { + tag = TM_TAG((doc_list[idx].tm_file)->tags_array->pdata[i]); + if (tag == NULL) + return NULL; + + if (tag->type & tag_types) + { + if (! doc_is_utf8) utf8_name = encodings_convert_to_utf8_from_charset(tag->name, + -1, doc_list[idx].encoding, TRUE); + else utf8_name = tag->name; + if ((tag->atts.entry.scope != NULL) && isalpha(tag->atts.entry.scope[0])) + { + symbol = g_new0(GeanySymbol, 1); + symbol->str = g_strdup_printf("%s%s%s [%ld]", tag->atts.entry.scope, cosep, + utf8_name, tag->atts.entry.line); + symbol->type = tag->type; + symbol->line = tag->atts.entry.line; + tag_names = g_list_prepend(tag_names, symbol); + } + else + { + symbol = g_new0(GeanySymbol, 1); + symbol->str = g_strdup_printf("%s [%ld]", utf8_name, tag->atts.entry.line); + symbol->type = tag->type; + symbol->line = tag->atts.entry.line; + tag_names = g_list_prepend(tag_names, symbol); + } + if (! doc_is_utf8) g_free(utf8_name); + } + } + tag_names = g_list_sort(tag_names, (GCompareFunc) compare_symbol); + return tag_names; + } + else + return NULL; +} + + +gboolean symbols_recreate_tag_list(gint idx) +{ + GList *tmp; + const GList *tags; + GtkTreeIter iter; + GtkTreeModel *model; + + tags = get_tag_list(idx, tm_tag_max_t); + if (doc_list[idx].tm_file == NULL || tags == NULL) return FALSE; + + gtk_tree_store_clear(doc_list[idx].tag_store); + // unref the store to speed up the filling(from TreeView Tutorial) + model = gtk_tree_view_get_model(GTK_TREE_VIEW(doc_list[idx].tag_tree)); + g_object_ref(model); // Make sure the model stays with us after the tree view unrefs it + gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), NULL); // Detach model from view + + treeviews_init_tag_list(idx); + for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp)) + { + switch (((GeanySymbol*)tmp->data)->type) + { + case tm_tag_prototype_t: + case tm_tag_method_t: + case tm_tag_function_t: + { + if (tv.tag_function.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_function)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_macro_t: + case tm_tag_macro_with_arg_t: + { + if (tv.tag_macro.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_macro)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_class_t: + { + if (tv.tag_class.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_class)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_member_t: + case tm_tag_field_t: + { + if (tv.tag_member.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_member)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_typedef_t: + case tm_tag_enum_t: + case tm_tag_union_t: + case tm_tag_struct_t: + case tm_tag_interface_t: + { + if (tv.tag_struct.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_struct)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_variable_t: + { + if (tv.tag_variable.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_variable)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + case tm_tag_namespace_t: + case tm_tag_package_t: + { + if (tv.tag_namespace.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_namespace)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + break; + } + default: + { + if (tv.tag_other.stamp == -1) break; + gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_other)); + gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); + } + } + } + gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), model); // Re-attach model to view + g_object_unref(model); + gtk_tree_view_expand_all(GTK_TREE_VIEW(doc_list[idx].tag_tree)); + return TRUE; +} + +
Modified: trunk/src/symbols.h =================================================================== --- trunk/src/symbols.h 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/symbols.h 2007-01-13 13:25:05 UTC (rev 1179) @@ -46,4 +46,6 @@
void symbols_finalize();
+gboolean symbols_recreate_tag_list(gint idx); + #endif
Modified: trunk/src/ui_utils.c =================================================================== --- trunk/src/ui_utils.c 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/ui_utils.c 2007-01-13 13:25:05 UTC (rev 1179) @@ -199,101 +199,6 @@ }
-static gboolean recreate_tag_list(gint idx) -{ - GList *tmp; - const GList *tags; - GtkTreeIter iter; - GtkTreeModel *model; - - tags = symbols_get_tag_list(idx, tm_tag_max_t); - if (doc_list[idx].tm_file == NULL || tags == NULL) return FALSE; - - doc_list[idx].has_tags = TRUE; - gtk_tree_store_clear(doc_list[idx].tag_store); - // unref the store to speed up the filling(from TreeView Tutorial) - model = gtk_tree_view_get_model(GTK_TREE_VIEW(doc_list[idx].tag_tree)); - g_object_ref(model); // Make sure the model stays with us after the tree view unrefs it - gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), NULL); // Detach model from view - - treeviews_init_tag_list(idx); - for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp)) - { - switch (((GeanySymbol*)tmp->data)->type) - { - case tm_tag_prototype_t: - case tm_tag_method_t: - case tm_tag_function_t: - { - if (tv.tag_function.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_function)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_macro_t: - case tm_tag_macro_with_arg_t: - { - if (tv.tag_macro.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_macro)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_class_t: - { - if (tv.tag_class.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_class)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_member_t: - case tm_tag_field_t: - { - if (tv.tag_member.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_member)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_typedef_t: - case tm_tag_enum_t: - case tm_tag_union_t: - case tm_tag_struct_t: - case tm_tag_interface_t: - { - if (tv.tag_struct.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_struct)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_variable_t: - { - if (tv.tag_variable.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_variable)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - case tm_tag_namespace_t: - case tm_tag_package_t: - { - if (tv.tag_namespace.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_namespace)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - break; - } - default: - { - if (tv.tag_other.stamp == -1) break; - gtk_tree_store_append(doc_list[idx].tag_store, &iter, &(tv.tag_other)); - gtk_tree_store_set(doc_list[idx].tag_store, &iter, 0, ((GeanySymbol*)tmp->data)->str, -1); - } - } - } - gtk_tree_view_set_model(GTK_TREE_VIEW(doc_list[idx].tag_tree), model); // Re-attach model to view - g_object_unref(model); - gtk_tree_view_expand_all(GTK_TREE_VIEW(doc_list[idx].tag_tree)); - return TRUE; -} - - // update = rescan the tags for document[idx].filename void ui_update_tag_list(gint idx, gboolean update) { @@ -304,6 +209,7 @@ { GtkTreeIter iter; GtkTreeStore *store = gtk_tree_store_new(1, G_TYPE_STRING); + app->default_tag_tree = gtk_tree_view_new(); treeviews_prepare_taglist(app->default_tag_tree, store); gtk_tree_store_append(store, &iter, NULL); @@ -331,29 +237,18 @@ g_object_ref((gpointer)doc_list[idx].tag_tree); // to hold it after removing }
- if (recreate_tag_list(idx)) - { - gtk_widget_set_sensitive(app->tagbar, TRUE); - gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree); - } - else - { // no tags - gtk_widget_set_sensitive(app->tagbar, FALSE); - gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree); - } + doc_list[idx].has_tags = symbols_recreate_tag_list(idx); } + + if (doc_list[idx].has_tags) + { + gtk_widget_set_sensitive(app->tagbar, TRUE); + gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree); + } else - { // update == FALSE - if (doc_list[idx].has_tags) - { - gtk_widget_set_sensitive(app->tagbar, TRUE); - gtk_container_add(GTK_CONTAINER(app->tagbar), doc_list[idx].tag_tree); - } - else - { - gtk_widget_set_sensitive(app->tagbar, FALSE); - gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree); - } + { + gtk_widget_set_sensitive(app->tagbar, FALSE); + gtk_container_add(GTK_CONTAINER(app->tagbar), app->default_tag_tree); } }
Modified: trunk/src/utils.c =================================================================== --- trunk/src/utils.c 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/utils.c 2007-01-13 13:25:05 UTC (rev 1179) @@ -1064,15 +1064,6 @@ }
-/* wrapper function to let strcmp work with GeanySymbol struct */ -gint utils_compare_symbol(const GeanySymbol *a, const GeanySymbol *b) -{ - if (a == NULL || b == NULL) return 0; - - return strcmp(a->str, b->str); -} - - gchar *utils_get_hex_from_color(GdkColor *color) { gchar *buffer = g_malloc0(9);
Modified: trunk/src/utils.h =================================================================== --- trunk/src/utils.h 2007-01-13 12:42:12 UTC (rev 1178) +++ trunk/src/utils.h 2007-01-13 13:25:05 UTC (rev 1179) @@ -108,8 +108,6 @@
void utils_replace_filename(gint idx);
-gint utils_compare_symbol(const GeanySymbol *a, const GeanySymbol *b); - gchar *utils_get_hex_from_color(GdkColor *color);
gchar *utils_get_current_file_dir();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.