SF.net SVN: geany-plugins:[2193] trunk/geany-plugins/debugger/src/bptree.c

cesspit at users.sourceforge.net cesspit at xxxxx
Sun Sep 4 11:16:11 UTC 2011


Revision: 2193
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2193&view=rev
Author:   cesspit
Date:     2011-09-04 11:16:10 +0000 (Sun, 04 Sep 2011)
Log Message:
-----------
debugger: breakpoints tree fixes

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/bptree.c

Modified: trunk/geany-plugins/debugger/src/bptree.c
===================================================================
--- trunk/geany-plugins/debugger/src/bptree.c	2011-09-03 20:21:10 UTC (rev 2192)
+++ trunk/geany-plugins/debugger/src/bptree.c	2011-09-04 11:16:10 UTC (rev 2193)
@@ -105,6 +105,47 @@
 }
 
 /* 
+ * gets tree row reference for an unsected row at the same depth
+ */
+GtkTreeRowReference* get_unselected_sibling(GtkTreePath *path)
+{
+	GtkTreeRowReference *sibling = NULL;
+	
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+
+	/* move down find first unselected sibling */
+	GtkTreeIter titer;
+	gtk_tree_model_get_iter(model, &titer, path);
+	while (gtk_tree_model_iter_next(model, &titer))
+	{
+		if (!gtk_tree_selection_iter_is_selected(selection, &titer))
+		{
+			GtkTreePath *sibling_path = gtk_tree_model_get_path(model, &titer);
+			sibling = gtk_tree_row_reference_new(model, sibling_path);
+			gtk_tree_path_free(sibling_path);
+			break;
+		}
+	}
+
+	if (!sibling)
+	{
+		/* move up find first unselected sibling */
+		GtkTreePath *sibling_path = gtk_tree_path_copy(path);
+		while (gtk_tree_path_prev(sibling_path))
+		{
+			if (!gtk_tree_selection_path_is_selected(selection, sibling_path))
+			{
+				sibling = gtk_tree_row_reference_new(model, sibling_path);
+				break;
+			}
+		}
+		gtk_tree_path_free(sibling_path);
+	}
+
+	return sibling;
+}
+
+/* 
  * checks file ENABLED column if all childs are enabled and unchecks otherwise
  */
 static void update_file_node(GtkTreeIter *file_iter)
@@ -404,18 +445,35 @@
     guint keyval = ((GdkEventKey*)event)->keyval;
 
 	/* get selected rows */
-	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
 	GList *rows = gtk_tree_selection_get_selected_rows(selection, &model);
+	rows = g_list_sort(rows, (GCompareFunc)gtk_tree_path_compare);
 
 	if (keyval == GDK_Delete && rows && g_list_length(rows))
 	{
 		/* "delete selected rows" */
 
-		/* path to select after deleteing finishes */
-		//GtkTreeRowReference *reference_to_select = NULL;
-
 		/* get references to rows to keep references actual when altering model */
 		GList *references = NULL;
+
+		/* get new selection */
+		GtkTreeRowReference *new_selection = NULL;
+		GtkTreePath *first_path = (GtkTreePath*)rows->data;
+		if (gtk_tree_path_get_depth(first_path) > 1)
+		{
+			new_selection = get_unselected_sibling(first_path);
+		}
+		if (!new_selection)
+		{
+			GtkTreePath *file_path = gtk_tree_path_copy(first_path);
+			if (gtk_tree_path_get_depth(file_path) > 1)
+			{
+				gtk_tree_path_up(file_path);
+			}
+			new_selection = get_unselected_sibling(file_path);
+			gtk_tree_path_free(file_path);
+		}
+		
 		GList *iter = rows;
 		while (iter)
 		{
@@ -424,7 +482,7 @@
 			iter = iter->next;
 		}
 		
-		/* remove break rows leaving file rowa for the next step */
+		/* remove break rows leaving file rows for the next step */
 		dconfig_set_modifyable(FALSE);
 		iter = references;
 		while (iter)
@@ -440,18 +498,10 @@
 					gtk_tree_model_iter_parent(model, &piter, &titer);
 					
 					gchar *filename = NULL;
-					gtk_tree_model_get (
-						model,
-						&piter,
-						FILEPATH, &filename,
-						-1);
+					gtk_tree_model_get(model, &piter, FILEPATH, &filename, -1);
 
 					gint line;
-					gtk_tree_model_get (
-						model,
-						&titer,
-						LINE, &line,
-						-1);
+					gtk_tree_model_get(model, &titer, LINE, &line, -1);
 
 					breaks_remove(filename, line);
 					
@@ -466,10 +516,55 @@
 		iter = references;
 		while (iter)
 		{
-			//GtkTreePath *path = (GtkTreePath*)iter->data;
-			if (FALSE)//1 == gtk_tree_path_get_depth(path))
+			GtkTreeRowReference *reference = (GtkTreeRowReference*)iter->data;
+			if (gtk_tree_row_reference_valid(reference))
 			{
+				GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
+				if (1 == gtk_tree_path_get_depth(path))
+				{
+					GtkTreeIter child, parent;
+					gtk_tree_model_get_iter(model, &parent, path);
+
+					gchar *filename = NULL;
+					gtk_tree_model_get(model, &parent, FILEPATH, &filename, -1);
+
+					GList *child_references = NULL;
+					if(gtk_tree_model_iter_children(model, &child, &parent))
+					{
+						/* collect all child nodes references */
+						do
+						{
+							GtkTreePath *child_path = gtk_tree_model_get_path(model, &child);
+							child_references = g_list_append(child_references, gtk_tree_row_reference_new(model, child_path));
+							gtk_tree_path_free(child_path);
+						}
+						while(gtk_tree_model_iter_next(model, &child));
+					}
+
+					/* traverse through refernces, removing breakpoints */
+					GList *citer = child_references;
+					while(citer)
+					{
+						GtkTreePath *child_path = gtk_tree_row_reference_get_path((GtkTreeRowReference*)citer->data);
+						GtkTreeIter child_iter;
+						gtk_tree_model_get_iter(model, &child_iter, child_path);
+						
+						gint line;
+						gtk_tree_model_get(model, &child_iter, LINE, &line, -1);
+
+						breaks_remove(filename, line);
+
+						citer = citer->next;
+					}
+					
+					/* free children references list */
+					g_list_foreach (child_references, (GFunc)gtk_tree_row_reference_free, NULL);
+					g_list_free (child_references);
+
+					g_free(filename);
+				}
 			}
+			
 			iter = iter->next;
 		}
 
@@ -480,28 +575,18 @@
 		dconfig_set_modifyable(TRUE);
 		dconfig_set_changed(TRUE);
 
-		/* get path to select */
-		/*GtkTreePath *path = NULL;
-		if (reference_to_select)
-			path = gtk_tree_row_reference_get_path(reference_to_select);
-		else
+		if (new_selection)
 		{
-			GtkTreeIter tree_iter;
-			gtk_tree_model_get_iter_first(model, &tree_iter);
-			path = gtk_tree_model_get_path(model, &tree_iter);
-		}*/
-		
-		/* set selection if any */
-		/*if (path)
-		{
+			/* get path to select */
+			GtkTreePath *path = NULL;
+			path = gtk_tree_row_reference_get_path(new_selection);
+
 			gtk_tree_selection_select_path(selection, path);
 			gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(widget), path, NULL, TRUE, 0.5, 0.5);
-			gtk_tree_path_free(path);	
-		}*/
+			gtk_tree_path_free(path);
 
-		/* free references list */
-		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
-		g_list_free (references);
+			gtk_tree_row_reference_free(new_selection);
+		}
 	}
 
 	/* free rows list */
@@ -593,6 +678,7 @@
 	/* icon, file */
 	header = _("File");
 	GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+	g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 	column = gtk_tree_view_column_new();
 	
 	gtk_tree_view_column_pack_end(column, renderer, TRUE);
@@ -612,8 +698,9 @@
 	/* condition */
 	header = _("Condition");
 	condition_renderer = gtk_cell_renderer_text_new ();
-    g_object_set (condition_renderer, "editable", TRUE, NULL);
-    g_signal_connect (G_OBJECT (condition_renderer), "edited", G_CALLBACK (on_condition_changed), NULL);
+	g_object_set (condition_renderer, "editable", TRUE, NULL);
+	g_object_set (condition_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+	g_signal_connect (G_OBJECT (condition_renderer), "edited", G_CALLBACK (on_condition_changed), NULL);
 	column = create_column(header, condition_renderer, TRUE,
 		get_header_string_width(header, MW_CONDITION, char_width),
 		"text", CONDITION);
@@ -683,8 +770,12 @@
  */
 void bptree_set_enabled(breakpoint *bp)
 {
-  gtk_tree_store_set(store, &(bp->iter), ENABLED, bp->enabled, -1);
-  bptree_update_break_icon(bp);
+	gtk_tree_store_set(store, &(bp->iter), ENABLED, bp->enabled, -1);
+	bptree_update_break_icon(bp);
+
+	GtkTreeIter parent;
+	gtk_tree_model_iter_parent(model, &parent, &(bp->iter));
+	update_file_node(&parent);
 }
 
 /*
@@ -762,6 +853,7 @@
 		gtk_tree_store_prepend (store, &file_iter, NULL);
 		gtk_tree_store_set (store, &file_iter,
 						FILEPATH, bp->file,
+						ENABLED, TRUE,
 						-1);
 
 		GtkTreePath *file_path = gtk_tree_model_get_path(model, &file_iter);
@@ -839,8 +931,13 @@
 
 	if (!gtk_tree_model_iter_n_children(model, &file))
 	{
+		g_hash_table_remove(files, (gpointer)bp->file);
 		gtk_tree_store_remove(store, &file);
 	}
+	else
+	{
+		update_file_node(&file);
+	}
 }
 
 /*

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




More information about the Plugins-Commits mailing list