SF.net SVN: geany:[3034] branches/symbol-tree

ntrel at users.sourceforge.net ntrel at xxxxx
Thu Oct 2 12:06:20 UTC 2008


Revision: 3034
          http://geany.svn.sourceforge.net/geany/?rev=3034&view=rev
Author:   ntrel
Date:     2008-10-02 12:06:20 +0000 (Thu, 02 Oct 2008)

Log Message:
-----------
Apply patch (with minor formatting fixes) from Conrad Steenberg
(gnocci-man) to show methods as children of classes in the symbol
list, and for other tag types to group children by their parents
(thanks; 2083110).

Modified Paths:
--------------
    branches/symbol-tree/ChangeLog
    branches/symbol-tree/THANKS
    branches/symbol-tree/src/about.c
    branches/symbol-tree/src/symbols.c

Modified: branches/symbol-tree/ChangeLog
===================================================================
--- branches/symbol-tree/ChangeLog	2008-10-02 11:54:16 UTC (rev 3033)
+++ branches/symbol-tree/ChangeLog	2008-10-02 12:06:20 UTC (rev 3034)
@@ -1,3 +1,13 @@
+2008-10-02  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * Create symbol-tree branch.
+ * src/about.c, src/symbols.c, THANKS:
+   Apply patch (with minor formatting fixes) from Conrad Steenberg
+   (gnocci-man) to show methods as children of classes in the symbol
+   list, and for other tag types to group children by their parents
+   (thanks; 2083110).
+
+
 2008-10-01  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>
 
  * HACKING, doc/Makefile.am:

Modified: branches/symbol-tree/THANKS
===================================================================
--- branches/symbol-tree/THANKS	2008-10-02 11:54:16 UTC (rev 3033)
+++ branches/symbol-tree/THANKS	2008-10-02 12:06:20 UTC (rev 3034)
@@ -49,6 +49,7 @@
 Timothy Boronczyk <tboronczyk(at)gmail(dot)com> - scroll_stop_at_last_line GUI pref patch
 Jason Oster <parasytic(at)users(dot)sourceforge(dot)net> - various patches
 Andrew Rowland <weibullguy(at)charter(dot)net> - R filetype patch
+Conrad Steenberg <gnocci-man(at)users(dot)sourceforge(dot)net> - symbol tree patch
 
 Translators:
 ------------

Modified: branches/symbol-tree/src/about.c
===================================================================
--- branches/symbol-tree/src/about.c	2008-10-02 11:54:16 UTC (rev 3033)
+++ branches/symbol-tree/src/about.c	2008-10-02 12:06:20 UTC (rev 3034)
@@ -78,7 +78,7 @@
 
 static const gchar *contributors =
 "Alexander Rodin, Andrew Rowland, Anh Phạm, blackdog, Bo Lorentsen, Bob Doan, Catalin Marinas, "
-"Christoph Berg, Daniel Richard G., Dave Moore, Dirk Weber, Felipe Pena, François Cami, "
+"Christoph Berg, Conrad Steenberg, Daniel Richard G., Dave Moore, Dirk Weber, Felipe Pena, François Cami, "
 "Giuseppe Torelli, Guillaume Hoffmann, Jason Oster, Jean-François Wauthy, Jeff Pohlmeyer, "
 "John Gabriele, Josef Whiter, Kevin Ellwood, Kristoffer A. Tjernås, Marko Peric, Matti Mårds, "
 "Peter Strand, Pierre Joye, Rob van der Linde, Robert McGinley, S Jagannathan, Saleem Abdulrasool, "

Modified: branches/symbol-tree/src/symbols.c
===================================================================
--- branches/symbol-tree/src/symbols.c	2008-10-02 11:54:16 UTC (rev 3033)
+++ branches/symbol-tree/src/symbols.c	2008-10-02 12:06:20 UTC (rev 3034)
@@ -843,15 +843,19 @@
 
 gboolean symbols_recreate_tag_list(GeanyDocument *doc, gint sort_mode)
 {
-	GList *tmp;
+	GList *tmp, *skipped = NULL;
 	const GList *tags;
 	GtkTreeIter iter;
 	static gint prev_sort_mode = SYMBOLS_SORT_BY_NAME;
 	filetype_id ft_id;
+	gint num_parents = 0, do_skipped = FALSE, num_skipped = 0;
+	GHashTable *parent_hash;
+	const gchar *separator;
 
 	g_return_val_if_fail(doc != NULL, FALSE);
 
 	ft_id = FILETYPE_ID(doc->file_type);
+	separator = symbols_get_context_separator(ft_id);
 
 	if (sort_mode == SYMBOLS_SORT_USE_PREVIOUS)
 		sort_mode = prev_sort_mode;
@@ -868,17 +872,22 @@
 	gtk_tree_view_set_model(GTK_TREE_VIEW(doc->priv->tag_tree), NULL);
 	/* Clear all contents */
 	gtk_tree_store_clear(doc->priv->tag_store);
+	/* Create a hash table to keep track of parents */
+	parent_hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL,
+		g_free);
 
 	init_tag_list(doc);
-	for (tmp = (GList*)tags; tmp; tmp = g_list_next(tmp))
+
+	for (tmp = (GList*)tags; tmp && num_skipped < 20;)
 	{
-		gchar buf[100];
+		gchar buf[100] = "", buf2[100] = "";
 		const GeanySymbol *symbol = (GeanySymbol*)tmp->data;
-		GtkTreeIter *parent = NULL;
+		GtkTreeIter *parent = NULL, *parent_search = NULL, *parent_search_short = NULL;
+		GtkTreeIter *parent_icon = NULL, *child = NULL;
 		GdkPixbuf *icon = NULL;
+		gint add_parent = FALSE, add_child = FALSE, skip = FALSE;
+		const gchar *final_name = symbol->str;
 
-		g_snprintf(buf, sizeof(buf), "%s [%d]", symbol->str, symbol->line);
-
 		switch (symbol->type)
 		{
 			case tm_tag_prototype_t:
@@ -887,6 +896,9 @@
 			{
 				if (tv_iters.tag_function.stamp == -1) break;
 				parent = &(tv_iters.tag_function);
+				parent_icon = &(tv_iters.tag_function);
+				if (ft_id != GEANY_FILETYPES_DIFF)
+					add_child = TRUE;
 				break;
 			}
 			case tm_tag_macro_t:
@@ -900,6 +912,9 @@
 			{
 				if (tv_iters.tag_class.stamp == -1) break;
 				parent = &(tv_iters.tag_class);
+				parent_icon = &(tv_iters.tag_class);
+				add_parent = TRUE;
+				add_child = TRUE;
 				break;
 			}
 			case tm_tag_member_t:
@@ -907,12 +922,15 @@
 			{
 				if (tv_iters.tag_member.stamp == -1) break;
 				parent = &(tv_iters.tag_member);
+				parent_icon = &(tv_iters.tag_member);
+				add_parent = TRUE;
+				add_child = TRUE;
 				break;
 			}
 			case tm_tag_typedef_t:
 			case tm_tag_enum_t:
 			{
-				/** TODO separate C-like types here also */
+				/* TODO separate C-like types here also */
 				if (ft_id == GEANY_FILETYPES_HAXE)
 				{
 					if (tv_iters.tag_type.stamp == -1) break;
@@ -926,12 +944,17 @@
 			{
 				if (tv_iters.tag_struct.stamp == -1) break;
 				parent = &(tv_iters.tag_struct);
+				parent_icon = &(tv_iters.tag_struct);
+				add_parent = TRUE;
+				add_child = TRUE;
 				break;
 			}
 			case tm_tag_variable_t:
 			{
 				if (tv_iters.tag_variable.stamp == -1) break;
 				parent = &(tv_iters.tag_variable);
+				parent_icon = &(tv_iters.tag_variable);
+				add_child = TRUE;
 				break;
 			}
 			case tm_tag_namespace_t:
@@ -939,30 +962,117 @@
 			{
 				if (tv_iters.tag_namespace.stamp == -1) break;
 				parent = &(tv_iters.tag_namespace);
+				parent_icon = &(tv_iters.tag_namespace);
+				add_child = TRUE;
+				add_parent = TRUE;
 				break;
 			}
 			default:
 			{
 				if (tv_iters.tag_other.stamp == -1) break;
 				parent = &(tv_iters.tag_other);
+				parent_icon = &(tv_iters.tag_variable);
+				add_child = TRUE;
 			}
 		}
 
 		if (parent)
-		{
-			gtk_tree_model_get(GTK_TREE_MODEL(doc->priv->tag_store), parent,
-		 	                   SYMBOLS_COLUMN_ICON, &icon, -1);
-			gtk_tree_store_append(doc->priv->tag_store, &iter, parent);
-			gtk_tree_store_set(doc->priv->tag_store, &iter,
-		 	                  SYMBOLS_COLUMN_ICON, icon,
-                              SYMBOLS_COLUMN_NAME, buf,
-                              SYMBOLS_COLUMN_LINE, symbol->line, -1);
+		{	/* Split the string to obtain parent child names */
+			gchar **name_elems = g_strsplit(symbol->str, separator, 10);
+			const gchar *child_name = NULL;
+			gchar *parent_name = buf2;
+			gchar *end_ptr = parent_name;
+			gint ne; /* number of name_elements */
 
+			buf2[0]='\0';
+			parent_search_short = NULL;
+			for (ne = 0; name_elems[ne]; ne++)
+			{
+				child_name = name_elems[ne];
+				if (name_elems[ne+1])
+				{
+					if (ne > 0)
+						end_ptr = g_stpcpy(end_ptr, separator);
+					end_ptr = g_stpcpy(end_ptr, name_elems[ne]);
+					parent_search_short =
+						(GtkTreeIter *)g_hash_table_lookup(parent_hash, (gpointer)name_elems[ne]);
+				}
+			}
+
+			child = &iter;
+			if (!parent_icon)
+				parent_icon = parent;
+
+			gtk_tree_model_get(GTK_TREE_MODEL(doc->priv->tag_store), parent_icon,
+				SYMBOLS_COLUMN_ICON, &icon, -1);
+			if (add_child)
+			{
+				if (parent_name)
+				{
+					parent_search = (GtkTreeIter *)g_hash_table_lookup(parent_hash, (gpointer)parent_name);
+					if (parent_search)
+						parent = parent_search;
+					else if (parent_search_short)
+						parent = parent_search_short;
+
+					if (child_name)
+						final_name = child_name;
+					else
+						final_name = symbol->str;
+				}
+				if (ne > 1 && !parent_search && !parent_search_short)
+				{ /* Want to add child but parent not found */
+					GList *newstart;
+					tmp = g_list_previous(tmp);
+					newstart = g_list_remove(tmp, (gconstpointer) symbol);
+					newstart = g_list_append(tmp, (gpointer) symbol);
+					skip = TRUE;
+					num_skipped++;
+				}
+			}
+
+			if (!skip || do_skipped)
+			{
+				num_skipped = 0;
+				if (add_parent)
+				{
+					GtkTreeIter *new_iter = g_new0(GtkTreeIter, 1);
+					g_hash_table_insert(parent_hash, symbol->str, new_iter);
+					child = new_iter;
+					num_parents++;
+				}
+
+				g_snprintf(buf, sizeof(buf), "%s [%d]", final_name, symbol->line);
+				gtk_tree_store_append(doc->priv->tag_store, child, parent);
+				gtk_tree_store_set(doc->priv->tag_store, child,
+					SYMBOLS_COLUMN_ICON, icon,
+					SYMBOLS_COLUMN_NAME, buf,
+					SYMBOLS_COLUMN_LINE, symbol->line, -1);
+			}
+			else
+			{ /* Put in skipped list */
+/*
+				skipped = g_list_append(skipped, (gpointer)symbol);
+*/
+			}
+
 			if (G_LIKELY(G_IS_OBJECT(icon)))
 				g_object_unref(icon);
+			g_strfreev(name_elems);
 		}
+
+		if (! do_skipped && !g_list_next(tmp))
+		{ /* Start adding skipped items */
+			do_skipped = TRUE;
+			tmp = g_list_first(skipped);
+		}
+		else
+			tmp = g_list_next(tmp);
 	}
+
 	hide_empty_rows(doc->priv->tag_store);
+	g_hash_table_destroy(parent_hash);
+
 	/* Re-attach model to view */
 	gtk_tree_view_set_model(GTK_TREE_VIEW(doc->priv->tag_tree),
 		GTK_TREE_MODEL(doc->priv->tag_store));


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list