SF.net SVN: geany-plugins:[2191] trunk/geany-plugins/debugger/src

cesspit at users.sourceforge.net cesspit at xxxxx
Sat Sep 3 20:16:45 UTC 2011


Revision: 2191
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2191&view=rev
Author:   cesspit
Date:     2011-09-03 20:16:45 +0000 (Sat, 03 Sep 2011)
Log Message:
-----------
debugger: breaks tree layout change

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/bptree.c
    trunk/geany-plugins/debugger/src/bptree.h
    trunk/geany-plugins/debugger/src/breakpoints.c
    trunk/geany-plugins/debugger/src/dconfig.c
    trunk/geany-plugins/debugger/src/dconfig.h
    trunk/geany-plugins/debugger/src/stree.c

Modified: trunk/geany-plugins/debugger/src/bptree.c
===================================================================
--- trunk/geany-plugins/debugger/src/bptree.c	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/bptree.c	2011-09-03 20:16:45 UTC (rev 2191)
@@ -39,22 +39,27 @@
 #include "breakpoints.h"
 #include "bptree.h"
 #include "utils.h"
+#include "dconfig.h"
 
+#include "xpm/breakpoint.xpm"
+#include "xpm/breakpoint_disabled.xpm"
+#include "xpm/breakpoint_condition.xpm"
+
 /* columns minumum width in characters */
-#define MW_ENABLED		3
-#define MW_HITSCOUNT	3
 #define MW_CONDITION	20
-#define MW_FILE			0
-#define MW_LINE			4
+#define MW_FILE			20
 
+#define ICON_PADDING	10
+
 /* Tree view columns */
 enum
 {
-   ENABLED,
+   ICON,
+   FILEPATH,
+   CONDITION,
    HITSCOUNT,
-   CONDITION,
-   FILEPATH,
    LINE,
+   ENABLED,
    N_COLUMNS
 };
 
@@ -62,7 +67,7 @@
 static GtkWidget		*scrolled_window = NULL;
 static GtkWidget		*tree = NULL;
 static GtkTreeModel		*model = NULL;
-static GtkListStore		*store = NULL;
+static GtkTreeStore		*store = NULL;
 
 /* column cell renderes */
 static GtkCellRenderer	*enable_renderer;
@@ -72,18 +77,110 @@
 /* tells to checkbox click handler whether page is in readonly mode (debug running) */
 static gboolean readonly = FALSE;
 
+/* hash table to keep file nodes in the tree */
+static GHashTable *files;
+
+/* pixbufers */
+GdkPixbuf *file_pixbuf = NULL;
+GdkPixbuf *break_pixbuf = NULL;
+GdkPixbuf *break_disabled_pixbuf = NULL;
+GdkPixbuf *break_condition_pixbuf = NULL;
+
 /* callback handler */
 move_to_line_cb on_break_clicked = NULL;
 
 /* 
+ * traversed comparing functions
+ */
+static gboolean compare_path_references(gpointer key, gpointer value, gpointer user_data)
+{
+	GtkTreeRowReference *being_clicked = (GtkTreeRowReference*)user_data;
+	GtkTreeRowReference *compared = (GtkTreeRowReference*)value;
+	
+	return !gtk_tree_path_compare (
+		gtk_tree_row_reference_get_path(being_clicked),
+		gtk_tree_row_reference_get_path(compared)
+	);
+		
+}
+
+/* 
+ * checks file ENABLED column if all childs are enabled and unchecks otherwise
+ */
+static void update_file_node(GtkTreeIter *file_iter)
+{
+	GtkTreeIter child;
+	gboolean check = TRUE;
+	if(gtk_tree_model_iter_children(model, &child, file_iter))
+	{
+		do
+		{
+			gboolean enabled;
+			gtk_tree_model_get (
+				model,
+				&child,
+				ENABLED, &enabled,
+				-1);
+				
+			if (!enabled)
+			{
+				check = FALSE;
+				break;
+			}
+		}
+		while(gtk_tree_model_iter_next(model, &child));
+	}
+
+	gtk_tree_store_set(store, file_iter, ENABLED, check, -1);
+}
+
+/* 
+ * GtkTreeView cell renderer functions that do not render and make ineditable file rows
+ */
+void on_render(GtkTreeViewColumn *tree_column, GtkCellRenderer *cell, GtkTreeModel *tree_model,
+	GtkTreeIter *iter, gpointer data)
+{
+	GtkTreePath *path = gtk_tree_model_get_path(model, iter);
+	if (data)
+	{
+		if (gtk_tree_path_get_depth(path) == 1)
+		{
+			g_object_set(cell, "text", "", NULL);
+			g_object_set(cell, "editable", FALSE, NULL);
+		}
+		else
+		{
+			g_object_set(cell, "editable", TRUE, NULL);
+		}
+	}
+	else
+	{
+		if (gtk_tree_path_get_depth(path) == 1)
+		{
+			g_object_set(cell, "visible", FALSE, NULL);
+		}
+		else
+		{
+			g_object_set(cell, "visible", TRUE, NULL);
+		}
+	}
+	gtk_tree_path_free(path);
+}
+
+/* 
  * GtkTreeView event handlers
  */
 
 /*
  * double click
  */
-void on_row_double_click(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
+static void on_row_double_click(GtkTreeView *tree_view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data)
 {
+	if (1 == gtk_tree_path_get_depth(path))
+	{
+		return;
+	}
+	
 	GtkTreeIter iter;
 	gtk_tree_model_get_iter (
 		 model,
@@ -92,10 +189,19 @@
     
     gchar *file;
 	int line;
+	
+	GtkTreeIter parent_iter;
+	gtk_tree_model_iter_parent(model, &parent_iter, &iter);
+	
 	gtk_tree_model_get (
 		model,
+		&parent_iter,
+		FILEPATH, &file,
+        -1);
+
+	gtk_tree_model_get (
+		model,
 		&iter,
-		FILEPATH, &file,
 		LINE, &line,
         -1);
         
@@ -118,14 +224,22 @@
 		 &iter,
 		 tree_path);
 	
-    gchar *file;
+	GtkTreeIter parent_iter;
+	gtk_tree_model_iter_parent(model, &parent_iter, &iter);
+
+	gchar *file;
+	gtk_tree_model_get (
+		model,
+		&parent_iter,
+		FILEPATH, &file,
+		-1);
+	
 	int line;
 	gchar* oldcondition;
 	gtk_tree_model_get (
 		model,
 		&iter,
 		CONDITION, &oldcondition,
-		FILEPATH, &file,
 		LINE, &line,
         -1);
         
@@ -154,14 +268,22 @@
 		 &iter,
 		 tree_path);
 
-    gchar *file;
+	GtkTreeIter parent_iter;
+	gtk_tree_model_iter_parent(model, &parent_iter, &iter);
+
+	gchar *file;
+	gtk_tree_model_get (
+		model,
+		&parent_iter,
+		FILEPATH, &file,
+		-1);
+
 	int line;
 	gint oldcount;
 	gtk_tree_model_get (
 		model,
 		&iter,
 		HITSCOUNT, &oldcount,
-		FILEPATH, &file,
 		LINE, &line,
         -1);
         
@@ -183,25 +305,95 @@
 	
 	GtkTreeIter  iter;
     GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
-
+	
 	gtk_tree_model_get_iter (
-		 model,
-		 &iter,
-		 tree_path);
-
-    gchar *file;
-	int line;
-	gtk_tree_model_get (
 		model,
 		&iter,
-		FILEPATH, &file,
-		LINE, &line,
-        -1);
-        
-	breaks_switch(file, line);
-	
+		tree_path);
+    
+	gboolean current_state = gtk_cell_renderer_toggle_get_active(cell_renderer);
+
+    /* check if this is a file row */
+    GtkTreeRowReference *path_reference = gtk_tree_row_reference_new(model, tree_path);
+    if(g_hash_table_find(files, compare_path_references, (gpointer)path_reference))
+    {
+		GtkTreeIter child;
+		gtk_tree_model_iter_children(model, &child, &iter);
+
+		gchar *file;
+		gtk_tree_model_get (
+			model,
+			&iter,
+			FILEPATH, &file,
+			-1);
+		
+		dconfig_set_modifyable(FALSE);
+		do
+		{
+			gboolean enabled;
+			gtk_tree_model_get (
+				model,
+				&child,
+				ENABLED, &enabled,
+				-1);
+			
+			if (!current_state ^ enabled)
+			{
+				int line;
+				gtk_tree_model_get (
+					model,
+					&child,
+					LINE, &line,
+					-1);
+				breaks_switch(file, line);
+			}
+		}
+		while(gtk_tree_model_iter_next(model, &child));
+
+		gtk_tree_store_set(store, &iter, ENABLED, !current_state, -1);
+
+		g_free(file);
+
+		dconfig_set_modifyable(TRUE);
+		dconfig_set_changed();
+	}
+	else
+	{
+		GtkTreeIter parent_iter;
+		gtk_tree_model_iter_parent(model, &parent_iter, &iter);
+
+		gchar *file;
+		int line;
+		gboolean parent_enabed;
+
+		gtk_tree_model_get (
+			model,
+			&parent_iter,
+			FILEPATH, &file,
+			ENABLED, &parent_enabed,
+			-1);
+
+		gtk_tree_model_get (
+			model,
+			&iter,
+			LINE, &line,
+			-1);
+			
+		breaks_switch(file, line);
+		
+		if (current_state && parent_enabed)
+		{
+			gtk_tree_store_set(store, &parent_iter, ENABLED, FALSE, -1);
+		}
+		else if (!current_state && !parent_enabed)
+		{
+			update_file_node(&parent_iter);
+		}
+		
+		g_free(file);
+	}
+
 	gtk_tree_path_free(tree_path);
-	g_free(file);
 }
 
 /*
@@ -211,17 +403,17 @@
 {
     guint keyval = ((GdkEventKey*)event)->keyval;
 
-	if (keyval == GDK_Delete)
+	/* get selected rows */
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
+	GList *rows = gtk_tree_selection_get_selected_rows(selection, &model);
+
+	if (keyval == GDK_Delete && rows && g_list_length(rows))
 	{
 		/* "delete selected rows" */
 
 		/* path to select after deleteing finishes */
 		GtkTreeRowReference *reference_to_select = NULL;
 
-		/* get selected rows */
-		GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(widget));
-		GList *rows = gtk_tree_selection_get_selected_rows(selection, &model);
-		
 		/* get references to rows to keep references actual when altering model */
 		GList *references = NULL;
 		GList *iter = rows;
@@ -229,22 +421,11 @@
 		{
 			GtkTreePath *path = (GtkTreePath*)iter->data;
 			references = g_list_append(references, gtk_tree_row_reference_new(model, path));
-
-			/*
-			 * set reference to select after deletion - upper sibling of the
-			 * first row to delete that has upper sibling
-			 */
-			if (!reference_to_select && gtk_tree_path_prev(path))
-				reference_to_select = gtk_tree_row_reference_new(model, path);
-				
 			iter = iter->next;
 		}
-
-		/* free rows list */
-		g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
-		g_list_free (rows);
-
-		/* iterate through references removing them */
+		
+		/* remove break rows leaving file rowa for the next step */
+		dconfig_set_modifyable(FALSE);
 		iter = references;
 		while (iter)
 		{
@@ -252,18 +433,23 @@
 			if (gtk_tree_row_reference_valid(reference))
 			{
 				GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
-				if (1 == gtk_tree_path_get_depth(path))
+				if (gtk_tree_path_get_depth(path) > 1)
 				{
-					GtkTreeIter titer;
+					GtkTreeIter titer, piter;
 					gtk_tree_model_get_iter(model, &titer, path);
+					gtk_tree_model_iter_parent(model, &piter, &titer);
 					
 					gchar *filename = NULL;
+					gtk_tree_model_get (
+						model,
+						&piter,
+						FILEPATH, &filename,
+						-1);
+
 					gint line;
-					
 					gtk_tree_model_get (
 						model,
 						&titer,
-						FILEPATH, &filename,
 						LINE, &line,
 						-1);
 
@@ -275,9 +461,27 @@
 			
 			iter = iter->next;
 		}
+		
+		/* remove file rows and children if exist */
+		iter = references;
+		while (iter)
+		{
+			GtkTreePath *path = (GtkTreePath*)iter->data;
+			if (FALSE)//1 == gtk_tree_path_get_depth(path))
+			{
+			}
+			iter = iter->next;
+		}
 
+		/* free rows list */
+		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
+		g_list_free (references);
+
+		dconfig_set_modifyable(TRUE);
+		dconfig_set_changed(TRUE);
+
 		/* get path to select */
-		GtkTreePath *path = NULL;
+		/*GtkTreePath *path = NULL;
 		if (reference_to_select)
 			path = gtk_tree_row_reference_get_path(reference_to_select);
 		else
@@ -285,26 +489,53 @@
 			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)
+		/*if (path)
 		{
 			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);	
-		}
+		}*/
 
 		/* free references list */
 		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
 		g_list_free (references);
 	}
 
+	/* free rows list */
+	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free (rows);
 
 	return FALSE;
 }
 
 /*
+ * update existing breakpoint icon
+ * arguments:
+ * 		bp - breakpoint to update
+ */
+void bptree_update_break_icon(breakpoint* bp)
+{
+	GdkPixbuf *pixbuf;
+	if (!bp->enabled)
+	{
+		pixbuf = break_disabled_pixbuf;
+	}
+	else if (bp->hitscount || strlen(bp->condition))
+	{
+		pixbuf = break_condition_pixbuf;
+	}
+	else
+	{
+		pixbuf = break_pixbuf;
+	}
+
+	gtk_tree_store_set (store, &bp->iter, ICON, pixbuf, -1);
+}
+
+/*
  * Interface functions
  */
 
@@ -318,14 +549,28 @@
 	/* save double click callback */
 	on_break_clicked = cb;
 	
+	/* crete hash table for file nodes */
+	files = g_hash_table_new_full(
+		g_str_hash,
+		g_str_equal,
+		(GDestroyNotify)g_free,
+		(GDestroyNotify)gtk_tree_row_reference_free
+	);
+	
+	file_pixbuf = gdk_pixbuf_new_from_xpm_data(breakpoint_xpm);
+	break_pixbuf = gdk_pixbuf_new_from_xpm_data(breakpoint_xpm);
+	break_disabled_pixbuf = gdk_pixbuf_new_from_xpm_data(breakpoint_disabled_xpm);
+	break_condition_pixbuf = gdk_pixbuf_new_from_xpm_data(breakpoint_condition_xpm);
+
 	/* create tree view */
-	store = gtk_list_store_new (
+	store = gtk_tree_store_new (
 		N_COLUMNS,
-		G_TYPE_BOOLEAN,
-		G_TYPE_INT,
+		GDK_TYPE_PIXBUF,
 		G_TYPE_STRING,
 		G_TYPE_STRING,
-		G_TYPE_INT);
+		G_TYPE_INT,
+		G_TYPE_INT,
+		G_TYPE_BOOLEAN);
 	model = GTK_TREE_MODEL(store);
 	tree = gtk_tree_view_new_with_model (model);
 	
@@ -334,8 +579,6 @@
 	/* multiple selection */
 	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
 	gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
-	/* interlaced rows colors */
-	g_object_set(tree, "rules-hint", TRUE, NULL);
 	
 	/* connect signals */
 	g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK (on_key_pressed), NULL);
@@ -347,51 +590,68 @@
 	
 	int	char_width = get_char_width(tree);
 
-	/* enabled */
-	header = _("Enabled");
-	enable_renderer = gtk_cell_renderer_toggle_new ();
-	g_signal_connect (G_OBJECT(enable_renderer), "toggled", G_CALLBACK(on_activeness_changed), NULL);
-	column = create_column(header, enable_renderer, FALSE,
-		get_header_string_width(header, MW_ENABLED, char_width),
-		 "active", ENABLED);
+	/* icon, file */
+	header = _("File");
+	GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+	column = gtk_tree_view_column_new();
+	
+	gtk_tree_view_column_pack_end(column, renderer, TRUE);
+	gtk_tree_view_column_set_attributes(column, renderer, "text", FILEPATH, NULL);	
+	
+	GtkCellRenderer *icon_renderer = gtk_cell_renderer_pixbuf_new ();
+	g_object_set(icon_renderer, "follow-state", TRUE, NULL);
+	gtk_tree_view_column_pack_end(column, icon_renderer, FALSE);
+	gtk_tree_view_column_set_attributes(column, icon_renderer, "pixbuf", ICON, NULL);	
+	gtk_tree_view_column_set_cell_data_func(column, icon_renderer, on_render, NULL, NULL);
+	
+	gtk_tree_view_column_set_spacing(column, char_width);
+	gtk_tree_view_column_set_expand(column, TRUE);
+
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+
+	/* 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);
+	column = create_column(header, condition_renderer, TRUE,
+		get_header_string_width(header, MW_CONDITION, char_width),
+		"text", CONDITION);
+	gtk_tree_view_column_set_cell_data_func(column, condition_renderer, on_render, (gpointer)TRUE, NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+	
 	/* hits count */
 	header = _("Hit count");
 	hcount_renderer = gtk_cell_renderer_spin_new ();
 	GtkAdjustment* adj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 100000.0, 1.0, 2.0, 2.0));
 	g_object_set (hcount_renderer,
-		"editable", TRUE,
 		"adjustment", adj,
         "digits", 0, NULL);
 	g_signal_connect (G_OBJECT (hcount_renderer), "edited", G_CALLBACK (on_hitscount_changed), NULL);
 	column = create_column(header, hcount_renderer, FALSE,
-		get_header_string_width(header, MW_HITSCOUNT, char_width),
+		0,
 		"text", HITSCOUNT);
+	gtk_tree_view_column_set_cell_data_func(column, hcount_renderer, on_render, (gpointer)TRUE, NULL);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
-	/* 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);
-	column = create_column(header, condition_renderer, FALSE,
-		get_header_string_width(header, MW_CONDITION, char_width),
-		"text", CONDITION);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
-	/* file */
-	header = _("File");
-	GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-	column = create_column(header, renderer, TRUE,
-		get_header_string_width(header, MW_FILE, char_width),
-		"text", FILEPATH);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+	
 	/* line */
 	header = _("Line");
 	renderer = gtk_cell_renderer_text_new ();
 	column = create_column(header, renderer, FALSE,
-		get_header_string_width(header, MW_LINE, char_width),
+		0,
 		"text", LINE);
+	gtk_tree_view_column_set_visible(column, FALSE);
 	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
 
+	/* enabled */
+	header = _("Enabled");
+	enable_renderer = gtk_cell_renderer_toggle_new ();
+	g_signal_connect (G_OBJECT(enable_renderer), "toggled", G_CALLBACK(on_activeness_changed), NULL);
+	column = create_column(header, enable_renderer, FALSE,
+		0,
+		 "active", ENABLED);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+
 	scrolled_window = gtk_scrolled_window_new (NULL, NULL);
 	gtk_widget_show (scrolled_window);
 	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
@@ -403,36 +663,50 @@
 }
 
 /*
+ * destroy breaks tree and associated data
+ * arguments:
+ */
+void bptree_destroy()
+{
+	g_hash_table_destroy(files);
+
+	g_object_unref(file_pixbuf);
+	g_object_unref(break_pixbuf);
+	g_object_unref(break_disabled_pixbuf);
+	g_object_unref(break_condition_pixbuf);
+}
+
+/*
  * enable/disable break
  * arguments:
- * 		iter 	- tree view iterator
- * 		enabled - value
+ * 		bp 	- breakpoint
  */
-void bptree_set_enabled(GtkTreeIter iter, gboolean enabled)
+void bptree_set_enabled(breakpoint *bp)
 {
-  gtk_list_store_set(store, &iter, ENABLED, enabled, -1);
+  gtk_tree_store_set(store, &(bp->iter), ENABLED, bp->enabled, -1);
+  bptree_update_break_icon(bp);
 }
 
 /*
  * set breaks hits count
  * arguments:
- * 		iter 	- tree view iterator
- * 		hitscount - value
+ * 		bp 	- breakpoint
  */
-void bptree_set_hitscount(GtkTreeIter iter, int hitscount)
+void bptree_set_hitscount(breakpoint *bp)
 {
-  gtk_list_store_set(store, &iter, HITSCOUNT, hitscount, -1);
+  gtk_tree_store_set(store, &(bp->iter), HITSCOUNT, bp->hitscount, -1);
+  bptree_update_break_icon(bp);
 }
 
 /*
  * set breaks condition
  * arguments:
- * 		iter 	- tree view iterator
- * 		condition - value
+ * 		bp 	- breakpoint
  */
-void bptree_set_condition(GtkTreeIter iter, gchar* condition)
+void bptree_set_condition(breakpoint* bp)
 {
-  gtk_list_store_set(store, &iter, CONDITION, condition, -1);
+  gtk_tree_store_set(store, &(bp->iter), CONDITION, bp->condition, -1);
+  bptree_update_break_icon(bp);
 }
 
 /*
@@ -441,12 +715,12 @@
  * 		iter 	- tree view iterator
  * return value	- breaks condition
  */
-gchar* bptree_get_condition(GtkTreeIter iter)
+gchar* bptree_get_condition(breakpoint *bp)
 {
     gchar *condition;
 	gtk_tree_model_get (
 		model,
-		&iter,
+		&(bp->iter),
 		CONDITION, &condition,
         -1);
 
@@ -481,16 +755,52 @@
  */
 void bptree_add_breakpoint(breakpoint* bp)
 {
+	GtkTreeIter file_iter;
+	GtkTreeRowReference *file_reference = (GtkTreeRowReference*)g_hash_table_lookup(files, bp->file);
+	if (!file_reference)
+	{
+		gtk_tree_store_prepend (store, &file_iter, NULL);
+		gtk_tree_store_set (store, &file_iter,
+						FILEPATH, bp->file,
+						-1);
+
+		GtkTreePath *file_path = gtk_tree_model_get_path(model, &file_iter);
+		file_reference = gtk_tree_row_reference_new(model, file_path);
+		gtk_tree_path_free(file_path);
+
+		g_hash_table_insert(files, (gpointer)g_strdup(bp->file),(gpointer)file_reference);
+	}
+	else
+	{
+		gtk_tree_model_get_iter(model, &file_iter, gtk_tree_row_reference_get_path(file_reference));
+	}
+	
+	/* lookup where to insert new row */
+	GtkTreeIter child, *sibling = NULL;
+	if(gtk_tree_model_iter_children(model, &child, &file_iter))
+	{
+		do
+		{
+			int line;
+			gtk_tree_model_get (
+				model,
+				&child,
+				LINE, &line,
+				-1);
+			if (line > bp->line)
+			{
+				sibling = &child;
+				break;
+			}
+		}
+		while(gtk_tree_model_iter_next(model, &child));
+	}
+	
 	GtkTreeIter iter;
-	gtk_list_store_prepend (store, &iter);
-	gtk_list_store_set (store, &iter,
-                    ENABLED, bp->enabled,
-                    HITSCOUNT, bp->hitscount,
-                    CONDITION, bp->condition,
-                    FILEPATH, bp->file,
-                    LINE, bp->line,
-                    -1);
+	gtk_tree_store_insert_before(store, &iter, &file_iter, sibling);
     bp->iter = iter;
+    
+    bptree_update_breakpoint(bp);
 }
 
 /*
@@ -500,15 +810,19 @@
  */
 void bptree_update_breakpoint(breakpoint* bp)
 {
-	char file_and_line[FILENAME_MAX + 10];
-	sprintf(file_and_line, "%s:%i", bp->file, bp->line);
-	gtk_list_store_set (store, &bp->iter,
+	gchar *location = g_strdup_printf(_("line %i"), bp->line);
+	
+	gtk_tree_store_set (store, &bp->iter,
                     ENABLED, bp->enabled,
                     HITSCOUNT, bp->hitscount,
                     CONDITION, bp->condition,
-                    FILEPATH, bp->file,
+                    FILEPATH, location,
                     LINE, bp->line,
                     -1);
+	
+	bptree_update_break_icon(bp);
+
+    g_free(location);
 }
 
 /*
@@ -518,5 +832,30 @@
  */
 void bptree_remove_breakpoint(breakpoint* bp)
 {
-	gtk_list_store_remove(store, &(bp->iter));	
+	GtkTreeIter file;
+	gtk_tree_model_iter_parent(model, &file, &(bp->iter));
+	
+	gtk_tree_store_remove(store, &(bp->iter));
+
+	if (!gtk_tree_model_iter_n_children(model, &file))
+	{
+		gtk_tree_store_remove(store, &file);
+	}
 }
+
+/*
+ * updates all file ENABLED checkboxes base on theit children states
+ * arguments:
+ */
+void bptree_update_file_nodes()
+{
+	GtkTreeIter file;
+	if(gtk_tree_model_iter_children(model, &file, NULL))
+	{
+		do
+		{
+			update_file_node(&file);
+		}
+		while(gtk_tree_model_iter_next(model, &file));
+	}
+}

Modified: trunk/geany-plugins/debugger/src/bptree.h
===================================================================
--- trunk/geany-plugins/debugger/src/bptree.h	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/bptree.h	2011-09-03 20:16:45 UTC (rev 2191)
@@ -20,12 +20,14 @@
  */
 
 gboolean		bptree_init(move_to_line_cb callback);
+void			bptree_destroy();
 GtkWidget*		bptree_get_widget();
 void 			bptree_add_breakpoint(breakpoint* bp);
 void 			bptree_update_breakpoint(breakpoint* bp);
 void 			bptree_remove_breakpoint(breakpoint* bp);
-void 			bptree_set_condition(GtkTreeIter iter, gchar* condition);
-void 			bptree_set_hitscount(GtkTreeIter iter, int hitscount);
-void 			bptree_set_enabled(GtkTreeIter iter, gboolean enabled);
-gchar*			bptree_get_condition(GtkTreeIter iter);
+void 			bptree_set_condition(breakpoint* bp);
+void 			bptree_set_hitscount(breakpoint* bp);
+void 			bptree_set_enabled(breakpoint* bp);
+gchar*			bptree_get_condition(breakpoint* bp);
 void 			bptree_set_readonly(gboolean readonly);
+void			bptree_update_file_nodes();

Modified: trunk/geany-plugins/debugger/src/breakpoints.c
===================================================================
--- trunk/geany-plugins/debugger/src/breakpoints.c	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/breakpoints.c	2011-09-03 20:16:45 UTC (rev 2191)
@@ -191,7 +191,7 @@
 {
 	if (success)
 	{
-		bptree_set_hitscount(bp->iter, bp->hitscount);
+		bptree_set_hitscount(bp);
 		markers_remove_breakpoint(bp);
 		markers_add_breakpoint(bp);
 		/* mark config for saving */
@@ -212,7 +212,7 @@
 	if (success)
 	{
 		/* set condition in breaks tree */
-		bptree_set_condition(bp->iter, bp->condition);
+		bptree_set_condition(bp);
 		markers_remove_breakpoint(bp);
 		markers_add_breakpoint(bp);
 		/* mark config for saving */
@@ -221,7 +221,7 @@
 	else
 	{
 		/* revert to old condition (taken from tree) */
-		gchar* oldcondition = bptree_get_condition(bp->iter);
+		gchar* oldcondition = bptree_get_condition(bp);
 		strcpy(bp->condition, oldcondition);
 		g_free(oldcondition);
 		/* show error message */
@@ -242,7 +242,7 @@
 	markers_add_breakpoint(bp);
 
 	/* set checkbox in breaks tree */
-	bptree_set_enabled(bp->iter, bp->enabled);
+	bptree_set_enabled(bp);
 
 	/* mark config for saving */
 	dconfig_set_changed();
@@ -316,6 +316,9 @@
 	
 	/* free storage */
 	g_hash_table_destroy(files);
+	
+	/* destroy breaks tree data */
+	bptree_destroy();
 }
 
 /*

Modified: trunk/geany-plugins/debugger/src/dconfig.c
===================================================================
--- trunk/geany-plugins/debugger/src/dconfig.c	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/dconfig.c	2011-09-03 20:16:45 UTC (rev 2191)
@@ -38,6 +38,7 @@
 #include "wtree.h"
 #include "breakpoints.h"
 #include "tpage.h"
+#include "bptree.h"
 
 #define CONFIG_NAME ".debugger"
 
@@ -57,7 +58,7 @@
 static GCond *cond;
 static GThread *saving_thread;
 static gboolean config_changed = FALSE;
-static gboolean loading_or_cleaning = FALSE;
+static gboolean modifyable = FALSE;
 
 /* the folder, config has been loaded from */
 static gchar *current_folder = NULL;
@@ -109,11 +110,19 @@
 }
 
 /*
+ * set "modifyable" flag that shows that a background thread have to save config
+ */
+void dconfig_set_modifyable(gboolean newstate)
+{
+	modifyable = newstate;
+}
+
+/*
  * set "changed" flag to save it on "saving_thread" thread
  */
 void dconfig_set_changed()
 {
-	if (!loading_or_cleaning)
+	if (!modifyable)
 	{
 		g_mutex_lock(change_config_mutex);
 		config_changed = TRUE;
@@ -167,7 +176,7 @@
  */
 gboolean dconfig_load(gchar *folder)
 {
-	loading_or_cleaning = TRUE;
+	modifyable = TRUE;
 	g_mutex_lock(change_config_mutex);
 
 	tpage_clear();
@@ -186,7 +195,7 @@
 	{
 		config_changed = FALSE;
 
-		loading_or_cleaning = FALSE;
+		modifyable = FALSE;
 		g_mutex_unlock(change_config_mutex);
 
 		return FALSE;
@@ -265,10 +274,12 @@
 			}
 		}
 	}
+	
+	bptree_update_file_nodes();
 
 	config_changed = FALSE;
 
-	loading_or_cleaning = FALSE;
+	modifyable = FALSE;
 	g_mutex_unlock(change_config_mutex);
 	
 	return TRUE;

Modified: trunk/geany-plugins/debugger/src/dconfig.h
===================================================================
--- trunk/geany-plugins/debugger/src/dconfig.h	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/dconfig.h	2011-09-03 20:16:45 UTC (rev 2191)
@@ -26,5 +26,6 @@
 gboolean 	dconfig_load(gchar *folder);
 
 void		dconfig_set_changed();
+void		dconfig_set_modifyable(gboolean newstate);
 
 

Modified: trunk/geany-plugins/debugger/src/stree.c
===================================================================
--- trunk/geany-plugins/debugger/src/stree.c	2011-09-01 17:57:49 UTC (rev 2190)
+++ trunk/geany-plugins/debugger/src/stree.c	2011-09-03 20:16:45 UTC (rev 2191)
@@ -36,10 +36,6 @@
 
 #include "xpm/frame_current.xpm"
 
-#include "geanyplugin.h"
-extern GeanyFunctions	*geany_functions;
-extern GeanyPlugin		*geany_plugin;
-
 /* columns minumum width in characters */
 #define MW_ADRESS	10
 #define MW_FUNCTION	10

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