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

cesspit at users.sourceforge.net cesspit at xxxxx
Tue Sep 13 21:28:14 UTC 2011


Revision: 2196
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=2196&view=rev
Author:   cesspit
Date:     2011-09-13 21:28:14 +0000 (Tue, 13 Sep 2011)
Log Message:
-----------
debugger: gdb error proper handling, removed char wrapped mode in messagex textview (to prevent lags when resizing), target page layout changed

Modified Paths:
--------------
    trunk/geany-plugins/debugger/src/Makefile.am
    trunk/geany-plugins/debugger/src/dbm_gdb.c
    trunk/geany-plugins/debugger/src/debug.c
    trunk/geany-plugins/debugger/src/plugin.c
    trunk/geany-plugins/debugger/src/tabs.c
    trunk/geany-plugins/debugger/src/tpage.c
    trunk/geany-plugins/debugger/src/tpage.h

Added Paths:
-----------
    trunk/geany-plugins/debugger/src/envtree.c
    trunk/geany-plugins/debugger/src/envtree.h

Modified: trunk/geany-plugins/debugger/src/Makefile.am
===================================================================
--- trunk/geany-plugins/debugger/src/Makefile.am	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/Makefile.am	2011-09-13 21:28:14 UTC (rev 2196)
@@ -31,6 +31,8 @@
 	debug_module.h     \
 	dpaned.c     \
 	dpaned.h     \
+	envtree.c     \
+	envtree.h     \
 	gui.h     \
 	gui.c     \
 	keys.c     \

Modified: trunk/geany-plugins/debugger/src/dbm_gdb.c
===================================================================
--- trunk/geany-plugins/debugger/src/dbm_gdb.c	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/dbm_gdb.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -344,6 +344,8 @@
 	}
 	else if (g_str_has_prefix (line, "^error"))
 	{
+		dbg_cbs->set_stopped();
+
 		/* removing read callback (will pulling all output left manually) */
 		g_source_remove(gdb_id_out);
 

Modified: trunk/geany-plugins/debugger/src/debug.c
===================================================================
--- trunk/geany-plugins/debugger/src/debug.c	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/debug.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -846,6 +846,7 @@
 static void on_debugger_error (const gchar* message)
 {
 	dialogs_show_msgbox(GTK_MESSAGE_ERROR, "%s", message);
+	debug_stop();
 }
 
 /* callbacks structure to pass to debugger module */
@@ -945,7 +946,6 @@
 	vadj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(tab_messages));
 	
 	debugger_messages_textview =  gtk_text_view_new();
-	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(debugger_messages_textview), GTK_WRAP_CHAR);
 	gtk_text_view_set_editable (GTK_TEXT_VIEW (debugger_messages_textview), FALSE);
 	gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(tab_messages), debugger_messages_textview);
 	

Added: trunk/geany-plugins/debugger/src/envtree.c
===================================================================
--- trunk/geany-plugins/debugger/src/envtree.c	                        (rev 0)
+++ trunk/geany-plugins/debugger/src/envtree.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -0,0 +1,485 @@
+/*
+ *      envtree.c
+ *      
+ *      Copyright 2010 Alexander Petukhov <devel(at)apetukhov.ru>
+ *      
+ *      This program is free software; you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation; either version 2 of the License, or
+ *      (at your option) any later version.
+ *      
+ *      This program is distributed in the hope that it will be useful,
+ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *      GNU General Public License for more details.
+ *      
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ *      MA 02110-1301, USA.
+ */
+
+/*
+ * 		Working with the evironment variables tree view.
+ */
+
+#include <string.h>
+
+#include "geanyplugin.h"
+extern GeanyFunctions	*geany_functions;
+extern GeanyPlugin		*geany_plugin;
+
+#include <gdk/gdkkeysyms.h>
+
+#include "dconfig.h"
+
+/* environment variables tree view columns */
+enum
+{
+   NAME,
+   VALUE,
+   LAST_VISIBLE,
+   N_COLUMNS
+};
+
+static GtkListStore *store;
+static GtkTreeModel *model;
+static GtkWidget *tree;
+
+/* flag shows that the page is readonly (debug is running) */
+static gboolean page_read_only = FALSE;
+
+/* flag shows we entered new env variable name and now entering its value */
+static gboolean entering_new_var = FALSE;
+
+/* reference to the env tree view empty row */
+static GtkTreeRowReference *empty_row = NULL;
+
+static GtkTreePath *being_edited_value = NULL;
+
+/* env variable name cloumn */
+static GtkTreeViewColumn *column_name = NULL;
+static GtkCellRenderer *renderer_name = NULL;
+
+/* env variable value cloumn */
+static GtkTreeViewColumn *column_value = NULL;
+static GtkCellRenderer *renderer_value = NULL;
+
+/*
+ * adds empty row to env tree view 
+ */
+static void add_empty_row()
+{
+	if (empty_row)
+		gtk_tree_row_reference_free(empty_row);
+	
+	GtkTreeIter empty;
+	gtk_list_store_append (store, &empty);
+	gtk_list_store_set (store, &empty,
+		NAME, "",
+		VALUE, "",
+		-1);
+
+	/* remeber reference */
+	GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &empty);
+	empty_row = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
+	gtk_tree_path_free(path);
+}
+
+/*
+ * delete selected rows from env variables page 
+ */
+static void delete_selected_rows()
+{
+	/* path to select after deleting finishes */
+	GtkTreeRowReference *reference_to_select = NULL;
+
+	/* empty row path */
+	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
+
+	/* get selected rows */
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+	GList *rows = gtk_tree_selection_get_selected_rows(selection, &model);
+
+	/* check whether only empty row was selected */
+	if (1 != gtk_tree_selection_count_selected_rows(selection) ||
+	    gtk_tree_path_compare((GtkTreePath*)rows->data, empty_path))
+	{
+		/* get references to the selected rows and find out what to
+		select after deletion */
+		GList *references = NULL;
+		GList *iter = rows;
+		while (iter)
+		{
+			GtkTreePath *path = (GtkTreePath*)iter->data;
+			if (!reference_to_select)
+			{
+				/* select upper sibling of the upper
+				selected row that has unselected upper sibling */
+				GtkTreePath *sibling = gtk_tree_path_copy(path);
+				if(gtk_tree_path_prev(sibling))
+				{
+					if (!gtk_tree_selection_path_is_selected(selection, sibling))
+						reference_to_select = gtk_tree_row_reference_new(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)), sibling);
+				}
+				else if (gtk_tree_path_next(sibling), gtk_tree_path_compare(path, sibling))
+					reference_to_select = gtk_tree_row_reference_new(gtk_tree_view_get_model(GTK_TREE_VIEW(tree)), sibling);
+			}
+			
+			if (gtk_tree_path_compare(path, empty_path))
+				references = g_list_append(references, gtk_tree_row_reference_new(model, path));
+			
+			iter = iter->next;
+		}
+		
+		/* if all (with or without empty row) was selected - set empty row
+		as a path to be selected after deleting */
+		if (!reference_to_select)
+			reference_to_select = gtk_tree_row_reference_copy (empty_row);
+
+		iter = references;
+		while (iter)
+		{
+			GtkTreeRowReference *reference = (GtkTreeRowReference*)iter->data;
+			GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
+
+			GtkTreeIter titer;
+			gtk_tree_model_get_iter(model, &titer, path);
+			gtk_list_store_remove(store, &titer);
+
+			iter = iter->next;
+		}
+
+		/* set selection */
+		gtk_tree_selection_unselect_all(selection);
+		GtkTreePath *path = gtk_tree_row_reference_get_path(reference_to_select);
+		gtk_tree_selection_select_path(selection, path);
+		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(tree), path, NULL, TRUE, 0.5, 0.5);
+
+		/* free references list */
+		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
+		g_list_free (references);
+	}
+	
+	/* free selection reference */
+	gtk_tree_row_reference_free(reference_to_select);
+
+	/* free rows list */
+	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
+	g_list_free (rows);
+}
+
+/*
+ * env tree key pressed handler 
+ */
+static gboolean on_envtree_keypressed(GtkWidget *widget, GdkEvent  *event, gpointer user_data)
+{
+	/* do not allow deleting while debugging */
+	if(page_read_only)
+		return FALSE;
+	
+	/* handling only Delete button pressing
+	that means "delete selected rows" */
+	guint keyval = ((GdkEventKey*)event)->keyval;
+	
+	if (GDK_Delete == keyval)
+	{
+		delete_selected_rows();
+		dconfig_set_changed();
+	}
+
+	return GDK_Tab == keyval;
+}
+
+/*
+ * env tree view value column render function 
+ */
+static void on_render_value(GtkTreeViewColumn *tree_column,
+	 GtkCellRenderer *cell,
+	 GtkTreeModel *tree_model,
+	 GtkTreeIter *iter,
+	 gpointer data)
+{
+	/* do not allow to edit value in read only mode */
+	if (page_read_only)
+	{
+		g_object_set (cell, "editable", FALSE, NULL);
+	}
+	else
+	{
+		/* do not allow to edit value for empty row */
+		GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
+		gboolean empty = !gtk_tree_path_compare(path, gtk_tree_row_reference_get_path(empty_row));
+		g_object_set (cell, "editable", entering_new_var || !empty, NULL);
+		gtk_tree_path_free(path);
+	}
+}
+
+/*
+ * env tree view value changed handler 
+ */
+static void on_value_changed(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data)
+{
+	GtkTreeIter  iter;
+	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
+    
+	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+
+	gtk_tree_model_get_iter (
+		 model,
+		 &iter,
+		 tree_path);
+	
+	gchar *striped = g_strstrip(g_strdup(new_text));
+	
+	if (!strlen(striped))
+	{
+		/* if new value is empty string, if it's a new row - do nothig
+		 otheerwise - offer to delete a variable */
+		if (empty)
+			gtk_list_store_set(store, &iter, NAME, "", -1);
+		else
+		{
+			if (dialogs_show_question(_("Delete variable?")))
+			{
+				delete_selected_rows();
+				dconfig_set_changed();
+
+				gtk_widget_grab_focus(tree);
+			}
+		}
+	}
+	else
+	{
+		/* if old variable - change value, otherwise - add another empty row below */
+		gchar* oldvalue;
+		gtk_tree_model_get (
+			model,
+			&iter,
+			VALUE, &oldvalue,
+		   -1);
+
+		if (strcmp(oldvalue, striped))
+		{
+			gtk_list_store_set(store, &iter, VALUE, striped, -1);
+			if (empty)
+				add_empty_row();
+			
+			g_object_set (renderer_value, "editable", FALSE, NULL);
+			dconfig_set_changed();
+		}
+		
+		g_free(oldvalue);
+	}
+	
+	if (empty)
+		entering_new_var = FALSE;
+
+	gtk_tree_path_free(tree_path);
+	g_free(striped);
+
+	gtk_tree_path_free(being_edited_value);
+}
+
+/*
+ * env tree view value editing started
+ */
+static void on_value_editing_started(GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *path, gpointer user_data)
+{
+	being_edited_value = gtk_tree_path_new_from_string(path);
+}
+
+/*
+ * env tree view value editing cancelled (Escape pressed)
+ */
+static void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_data)
+{
+	/* check whether escape was pressed when editing
+	new variable value cell */
+	if(!gtk_tree_path_compare(being_edited_value, gtk_tree_row_reference_get_path(empty_row)))
+	{
+		/* if so - clear name sell */
+		GtkTreeIter iter;
+		gtk_tree_model_get_iter(model, &iter, being_edited_value);
+		
+		gtk_list_store_set (
+			store,
+			&iter,
+			NAME, "",
+		   -1);
+
+		entering_new_var = FALSE;
+	}
+
+	g_object_set (renderer_value, "editable", FALSE, NULL);
+
+	gtk_tree_path_free(being_edited_value);
+}
+
+/*
+ * env tree view name changed hadler 
+ */
+static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data)
+{
+	GtkTreeIter  iter;
+	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
+    
+	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+
+	gtk_tree_model_get_iter (
+		 model,
+		 &iter,
+		 tree_path);
+	
+	gchar* oldvalue;
+	gtk_tree_model_get (
+		model,
+		&iter,
+		NAME, &oldvalue,
+       -1);
+    
+	gchar *striped = g_strstrip(g_strdup(new_text));
+
+	if (!strlen(striped))
+	{
+		/* if name is empty - offer to delete variable */
+		if (!empty && dialogs_show_question(_("Delete variable?")))
+		{
+			delete_selected_rows();
+			dconfig_set_changed();
+
+			gtk_widget_grab_focus(tree);
+		}
+	}
+	else if (strcmp(oldvalue, striped))
+    {
+		gtk_list_store_set(store, &iter, NAME, striped, -1);
+		if (empty)
+		{
+			/* if it was a new row - move cursor to a value cell */
+			entering_new_var = TRUE;
+			gtk_tree_view_set_cursor_on_cell(GTK_TREE_VIEW(tree), tree_path, column_value, renderer_value, TRUE);
+		}
+		if (!empty)
+		{
+			dconfig_set_changed();
+		}
+	}
+	
+	gtk_tree_path_free(tree_path);
+	g_free(oldvalue);
+	g_free(striped);
+}
+
+/*
+ * create env tree view and return a widget 
+ */
+GtkWidget* envtree_init()
+{
+	store = gtk_list_store_new (
+		N_COLUMNS,
+		G_TYPE_STRING,
+		G_TYPE_STRING,
+		G_TYPE_STRING);
+	model = GTK_TREE_MODEL(store);
+	tree = gtk_tree_view_new_with_model (model);
+	
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree), TRUE);
+	g_signal_connect(G_OBJECT(tree), "key-press-event", G_CALLBACK (on_envtree_keypressed), NULL);
+
+	renderer_name = gtk_cell_renderer_text_new ();
+	g_object_set (renderer_name, "editable", TRUE, NULL);
+	g_signal_connect (G_OBJECT (renderer_name), "edited", G_CALLBACK (on_name_changed), NULL);
+	column_name = gtk_tree_view_column_new_with_attributes (_("Name"), renderer_name, "text", NAME, NULL);
+	gtk_tree_view_column_set_resizable (column_name, TRUE);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column_name);
+
+	renderer_value = gtk_cell_renderer_text_new ();
+	column_value = gtk_tree_view_column_new_with_attributes (_("Value"), renderer_value, "text", VALUE, NULL);
+	g_signal_connect (G_OBJECT (renderer_value), "edited", G_CALLBACK (on_value_changed), NULL);
+	g_signal_connect (G_OBJECT (renderer_value), "editing-started", G_CALLBACK (on_value_editing_started), NULL);
+	g_signal_connect (G_OBJECT (renderer_value), "editing-canceled", G_CALLBACK (on_value_editing_cancelled), NULL);
+	gtk_tree_view_column_set_cell_data_func(column_value, renderer_value, on_render_value, NULL, NULL);
+	gtk_tree_view_column_set_resizable (column_value, TRUE);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column_value);
+
+	/* Last invisible column */
+	GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+	GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", LAST_VISIBLE, NULL);
+	gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+
+	/* add empty row */
+	add_empty_row();
+
+	/* set multiple selection */
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+	gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
+
+	return tree;
+}
+
+/*
+ * deallocate data 
+ */
+void envtree_destroy()
+{
+	gtk_tree_row_reference_free(empty_row);
+}
+
+/*
+ * clear tree 
+ */
+void envtree_clear()
+{
+	gtk_list_store_clear(store);
+	add_empty_row();
+}
+
+/*
+ * get list of environment variables
+ */
+GList* envpage_get_environment()
+{
+	GList *env = NULL;
+	
+	GtkTreeIter iter;
+	gtk_tree_model_get_iter_first(model, &iter);
+	do
+	{
+		gchar *name, *value;
+		gtk_tree_model_get (
+			model,
+			&iter,
+			NAME, &name,
+			VALUE, &value,
+		   -1);
+
+		 if (strlen(name))
+		 {
+			env = g_list_append(env, name);
+			env = g_list_append(env, value);
+		 }
+	}
+	while (gtk_tree_model_iter_next(model, &iter));
+	
+	return env;
+}
+
+/*
+ * disable interacting for the time of debugging
+ */
+void envtree_set_readonly(gboolean readonly)
+{
+	g_object_set (renderer_name, "editable", !readonly, NULL);
+	page_read_only = readonly;
+}
+
+/*
+ * add environment variable
+ */
+void envtree_add_environment(const gchar *name, const gchar *value)
+{
+	GtkTreeIter iter;
+	gtk_list_store_prepend(store, &iter);
+	gtk_list_store_set(store, &iter, NAME, name, VALUE, value, -1);
+}


Property changes on: trunk/geany-plugins/debugger/src/envtree.c
___________________________________________________________________
Added: svn:executable
   + *

Added: trunk/geany-plugins/debugger/src/envtree.h
===================================================================
--- trunk/geany-plugins/debugger/src/envtree.h	                        (rev 0)
+++ trunk/geany-plugins/debugger/src/envtree.h	2011-09-13 21:28:14 UTC (rev 2196)
@@ -0,0 +1,27 @@
+/*
+ *      envtree.h
+ *      
+ *      Copyright 2010 Alexander Petukhov <devel(at)apetukhov.ru>
+ *      
+ *      This program is free software; you can redistribute it and/or modify
+ *      it under the terms of the GNU General Public License as published by
+ *      the Free Software Foundation; either version 2 of the License, or
+ *      (at your option) any later version.
+ *      
+ *      This program is distributed in the hope that it will be useful,
+ *      but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *      GNU General Public License for more details.
+ *      
+ *      You should have received a copy of the GNU General Public License
+ *      along with this program; if not, write to the Free Software
+ *      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ *      MA 02110-1301, USA.
+ */
+
+GtkWidget*		envtree_init();
+void			envtree_destroy();
+void			envtree_clear();
+void			envtree_set_readonly(gboolean readonly);
+void			envtree_add_environment(const gchar *name, const gchar *value);
+GList*			envpage_get_environment();


Property changes on: trunk/geany-plugins/debugger/src/envtree.h
___________________________________________________________________
Added: svn:executable
   + *

Modified: trunk/geany-plugins/debugger/src/plugin.c
===================================================================
--- trunk/geany-plugins/debugger/src/plugin.c	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/plugin.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -39,6 +39,7 @@
 #include "dconfig.h"
 #include "dpaned.h"
 #include "tabs.h"
+#include "envtree.h"
 
 /* These items are set by Geany before plugin_init() is called. */
 GeanyPlugin		*geany_plugin;
@@ -80,6 +81,7 @@
 {
 	gboolean state = gtk_toggle_button_get_active(button);
 	dpaned_set_tabbed(state);
+	tpage_pack_widgets(state);
 }
 
 /* Called by Geany to initialize the plugin.
@@ -107,6 +109,7 @@
 
 	/* init paned */
 	dpaned_init();
+	tpage_pack_widgets(dpaned_get_tabbed());
 
 	GtkWidget* vbox = btnpanel_create(on_paned_mode_changed);
 
@@ -165,6 +168,9 @@
 	/* clears debug paned data */
 	dpaned_destroy();
 
+	/* clears anv tree data */
+	envtree_destroy();
+	
 	/* release other allocated strings and objects */
 	gtk_widget_destroy(hbox);
 }

Modified: trunk/geany-plugins/debugger/src/tabs.c
===================================================================
--- trunk/geany-plugins/debugger/src/tabs.c	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/tabs.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -140,10 +140,10 @@
 			label = _("Call Stack");
 			break;
 		case TID_TERMINAL:
-			label = _("Debug terminal");
+			label = _("Debug Terminal");
 			break;
 		case TID_MESSAGES:
-			label = _("Debugger messages");
+			label = _("Debugger Messages");
 			break;
 	}
 	return label;

Modified: trunk/geany-plugins/debugger/src/tpage.c
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.c	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/tpage.c	2011-09-13 21:28:14 UTC (rev 2196)
@@ -24,8 +24,8 @@
  */
 
 #include <string.h>
+
 #include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
 
 #include <sys/stat.h>
 
@@ -42,377 +42,242 @@
 #include "dconfig.h"
 #include "tpage.h"
 #include "tabs.h"
+#include "envtree.h"
+#include "gui.h"
 
 /* boxes margins */
-#define SPACING 5
+#define SPACING 7
 
-/* environment variables tree view columns minumum width in characters */
-#define MW_NAME	15
-#define MW_VALUE	0
+/* root boxes border width */
+#define ROOT_BORDER_WIDTH 10
 
-/* environment variables tree view columns */
-enum
-{
-   NAME,
-   VALUE,
-   LAST_VISIBLE,
-   N_COLUMNS
-};
+/* root boxes border width */
+#define BROWSE_BUTTON_WIDTH 65
 
-/* flag shows that the page is readonly (debug is running) */
-gboolean page_read_only = FALSE;
+/* widgets */
 
-/* flag shows we entered new env variable name and now entering its value */
-gboolean entering_new_var = FALSE;
+/* target */
+static GtkWidget *target_label = NULL;
+static GtkWidget *target_name = NULL;
+static GtkWidget *target_button_browse = NULL;
 
-/* reference to the env tree view empty row */
-static GtkTreeRowReference *empty_row = NULL;
+/* debugger type */
+static GtkWidget *debugger_label =	NULL;
+static GtkWidget *debugger_cmb =	NULL;
 
-/* target name textentry */
-static GtkWidget *targetname =		NULL;
+/* argments */
+static GtkWidget *args_frame = NULL;
+static GtkWidget *args_textview = NULL;
 
-/* browse target button */
-static GtkWidget *button_browse =	NULL;
+/* environment variables */
+static GtkWidget *env_frame = NULL;
 
-/* env variables tree view */
-static GtkWidget *envtree =			NULL;
-static GtkTreeModel *model =		NULL;
-static GtkListStore *store =		NULL;
+/* widgets array for reference management when moving to another container */
+static GtkWidget **widgets[] = {
+	&target_label, &target_name, &target_button_browse,
+	&debugger_label, &debugger_cmb,
+	&args_frame,
+	&env_frame,
+	NULL
+};
 
-static GtkTreePath *being_edited_value = NULL;
-
-/* debugger type combo box */
-static GtkWidget *cmb_debugger =	NULL;
-
-/* debugger messages text view */
-GtkWidget *textview = NULL;
-
-/* env variable name cloumn */
-GtkTreeViewColumn *column_name = NULL;
-GtkCellRenderer *renderer_name = NULL;
-
-/* env variable value cloumn */
-GtkTreeViewColumn *column_value = NULL;
-GtkCellRenderer *renderer_value = NULL;
-
 /*
  * tells config to update when target arguments change 
  */
-void on_arguments_changed(GtkTextBuffer *textbuffer, gpointer user_data)
+static void on_arguments_changed(GtkTextBuffer *textbuffer, gpointer user_data)
 {
 	dconfig_set_changed();
 }
 
 /*
- * delete selected rows from env variables page 
+ * target browse button clicked handler
  */
-void delete_selected_rows()
+static void on_target_browse_clicked(GtkButton *button, gpointer   user_data)
 {
-	/* path to select after deleting finishes */
-	GtkTreeRowReference *reference_to_select = NULL;
-
-	/* empty row path */
-	GtkTreePath *empty_path = gtk_tree_row_reference_get_path(empty_row);
-
-	/* get selected rows */
-	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(envtree));
-	GList *rows = gtk_tree_selection_get_selected_rows(selection, &model);
-
-	/* check whether only empty row was selected */
-	if (1 != gtk_tree_selection_count_selected_rows(selection) ||
-	    gtk_tree_path_compare((GtkTreePath*)rows->data, empty_path))
-	{
-		/* get references to the selected rows and find out what to
-		select after deletion */
-		GList *references = NULL;
-		GList *iter = rows;
-		while (iter)
-		{
-			GtkTreePath *path = (GtkTreePath*)iter->data;
-			if (!reference_to_select)
-			{
-				/* select upper sibling of the upper
-				selected row that has unselected upper sibling */
-				GtkTreePath *sibling = gtk_tree_path_copy(path);
-				if(gtk_tree_path_prev(sibling))
-				{
-					if (!gtk_tree_selection_path_is_selected(selection, sibling))
-						reference_to_select = gtk_tree_row_reference_new(gtk_tree_view_get_model(GTK_TREE_VIEW(envtree)), sibling);
-				}
-				else if (gtk_tree_path_next(sibling), gtk_tree_path_compare(path, sibling))
-					reference_to_select = gtk_tree_row_reference_new(gtk_tree_view_get_model(GTK_TREE_VIEW(envtree)), sibling);
-			}
-			
-			if (gtk_tree_path_compare(path, empty_path))
-				references = g_list_append(references, gtk_tree_row_reference_new(model, path));
-			
-			iter = iter->next;
-		}
-		
-		/* if all (with or without empty row) was selected - set empty row
-		as a path to be selected after deleting */
-		if (!reference_to_select)
-			reference_to_select = gtk_tree_row_reference_copy (empty_row);
-
-		iter = references;
-		while (iter)
-		{
-			GtkTreeRowReference *reference = (GtkTreeRowReference*)iter->data;
-			GtkTreePath *path = gtk_tree_row_reference_get_path(reference);
-
-			GtkTreeIter titer;
-			gtk_tree_model_get_iter(model, &titer, path);
-			gtk_list_store_remove(store, &titer);
-
-			iter = iter->next;
-		}
-
-		/* set selection */
-		gtk_tree_selection_unselect_all(selection);
-		GtkTreePath *path = gtk_tree_row_reference_get_path(reference_to_select);
-		gtk_tree_selection_select_path(selection, path);
-		gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(envtree), path, NULL, TRUE, 0.5, 0.5);
-
-		/* free references list */
-		g_list_foreach (references, (GFunc)gtk_tree_row_reference_free, NULL);
-		g_list_free (references);
-	}
+	GtkWidget *dialog;
+	dialog = gtk_file_chooser_dialog_new (_("Choose target file"),
+					  NULL,
+					  GTK_FILE_CHOOSER_ACTION_OPEN,
+					  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+					  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
+					  NULL);
 	
-	/* free selection reference */
-	gtk_tree_row_reference_free(reference_to_select);
+	gchar path[FILENAME_MAX];
 
-	/* free rows list */
-	g_list_foreach (rows, (GFunc)gtk_tree_path_free, NULL);
-	g_list_free (rows);
-}
-
-/*
- * env tree key pressed handler 
- */
-gboolean on_envtree_keypressed(GtkWidget *widget, GdkEvent  *event, gpointer user_data)
-{
-	/* do not allow deleting while debugging */
-	if(page_read_only)
-		return FALSE;
+	const gchar *prevfile = gtk_entry_get_text(GTK_ENTRY(target_name));
+	gchar *prevdir = g_path_get_dirname(prevfile);
+	if (strcmp(".", prevdir))
+		strcpy(path, prevdir);
+	else
+		strcpy(path, g_path_get_dirname(DOC_FILENAME(document_get_current())));		
+	g_free(prevdir);
 	
-	/* handling only Delete button pressing
-	that means "delete selected rows" */
-	guint keyval = ((GdkEventKey*)event)->keyval;
+	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), path);
 	
-	if (GDK_Delete == keyval)
+	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
 	{
-		delete_selected_rows();
+		gchar *filename;
+		filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
+		gtk_entry_set_text(GTK_ENTRY(target_name), filename);
+		g_free (filename);
+		
 		dconfig_set_changed();
 	}
-
-	return GDK_Tab == keyval;
+	gtk_widget_destroy (dialog);
 }
 
 /*
- * adds empty row to env tree view 
+ * packs widgets into page depending one tabbed mode state 
  */
-static void add_empty_row()
+void tpage_pack_widgets(gboolean tabbed)
 {
-	if (empty_row)
-		gtk_tree_row_reference_free(empty_row);
+	/* root box */
+	GtkWidget *root = NULL, *oldroot = NULL;
+	GList *children = gtk_container_get_children(GTK_CONTAINER(tab_target));
+	if (children)
+	{
+		oldroot = (GtkWidget*)children->data;
+		
+		/* unparent widgets */
+		int i = 0;
+		while (widgets[i])
+		{
+			g_object_ref(*widgets[i]);
+			gtk_container_remove(GTK_CONTAINER(gtk_widget_get_parent(*widgets[i])), *widgets[i]);
+			i++;
+		}
+		
+		g_list_free(children);
+	}
 	
-	GtkTreeIter empty;
-	gtk_list_store_append (store, &empty);
-	gtk_list_store_set (store, &empty,
-		NAME, "",
-		VALUE, "",
-		-1);
+	if (tabbed)
+	{
+		root = gtk_vbox_new(FALSE, SPACING);
+		gtk_container_set_border_width(GTK_CONTAINER(root), ROOT_BORDER_WIDTH);
+	
+		/* filename */
+		GtkWidget *hbox = gtk_hbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(root), hbox, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), target_label, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), target_name, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), target_button_browse, FALSE, FALSE, 0);
+		
+		/* lower hbox */
+		hbox = gtk_hbox_new(TRUE, SPACING);
+		gtk_box_pack_start(GTK_BOX(root), hbox, TRUE, TRUE, 0);
 
-	/* remeber reference */
-	GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &empty);
-	empty_row = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
-	gtk_tree_path_free(path);
-}
+		/* lower left and right vboxes */
+		GtkWidget *lbox = gtk_vbox_new(FALSE, SPACING);
+		GtkWidget *rbox = gtk_vbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(hbox), lbox, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), rbox, TRUE, TRUE, 0);
 
-/*
- * env tree view value column render function 
- */
-void on_render_value(GtkTreeViewColumn *tree_column,
-	 GtkCellRenderer *cell,
-	 GtkTreeModel *tree_model,
-	 GtkTreeIter *iter,
-	 gpointer data)
-{
-	/* do not allow to edit value in read only mode */
-	if (page_read_only)
-		g_object_set (cell, "editable", FALSE, NULL);
+		/* environment */
+		gtk_box_pack_start(GTK_BOX(lbox), env_frame, TRUE, TRUE, 0);
+
+		/* arguments */
+		gtk_box_pack_start(GTK_BOX(rbox), args_frame, TRUE, TRUE, 0);
+		/* debugger type */
+		hbox = gtk_hbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(hbox), debugger_label, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), debugger_cmb, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(rbox), hbox, FALSE, FALSE, 0);
+	}
 	else
 	{
-		/* do not allow to edit value for empty row */
-		GtkTreePath *path = gtk_tree_model_get_path(tree_model, iter);
-		gboolean empty = !gtk_tree_path_compare(path, gtk_tree_row_reference_get_path(empty_row));
-		g_object_set (cell, "editable", entering_new_var || !empty, NULL);
-		gtk_tree_path_free(path);
-	}
-}
+		root = gtk_hbox_new(TRUE, SPACING);
+		gtk_container_set_border_width(GTK_CONTAINER(root), ROOT_BORDER_WIDTH);
 
-/*
- * env tree view value changed hadler 
- */
-static void on_value_changed(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data)
-{
-	GtkTreeIter  iter;
-	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
-    
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
+		GtkWidget *lbox = gtk_vbox_new(FALSE, SPACING);
+		GtkWidget *rbox = gtk_vbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(root), lbox, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(root), rbox, TRUE, TRUE, 0);
 
-	gtk_tree_model_get_iter (
-		 model,
-		 &iter,
-		 tree_path);
-	
-	gchar *striped = g_strstrip(g_strdup(new_text));
-	
-	if (!strlen(striped))
-	{
-		/* if new value is empty string, if it's a new row - do nothig
-		 otheerwise - offer to delete a variable */
-		if (empty)
-			gtk_list_store_set(store, &iter, NAME, "", -1);
-		else
-		{
-			if (dialogs_show_question(_("Delete variable?")))
-			{
-				delete_selected_rows();
-				dconfig_set_changed();
+		/* environment */
+		gtk_box_pack_start(GTK_BOX(lbox), env_frame, TRUE, TRUE, 0);
 
-				gtk_widget_grab_focus(envtree);
-			}
-		}
+		/* target */
+		GtkWidget *hbox = gtk_hbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(hbox), target_label, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), target_name, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), target_button_browse, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(rbox), hbox, FALSE, FALSE, 0);
+		/* arguments */
+		gtk_box_pack_start(GTK_BOX(rbox), args_frame, TRUE, TRUE, 0);
+		/* debugger type */
+		hbox = gtk_hbox_new(FALSE, SPACING);
+		gtk_box_pack_start(GTK_BOX(hbox), debugger_label, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(hbox), debugger_cmb, TRUE, TRUE, 0);
+		gtk_box_pack_start(GTK_BOX(rbox), hbox, FALSE, FALSE, 0);
 	}
-	else
-	{
-		/* if old variable - change value, otherwise - add another empty row below */
-		gchar* oldvalue;
-		gtk_tree_model_get (
-			model,
-			&iter,
-			VALUE, &oldvalue,
-		   -1);
 
-		if (strcmp(oldvalue, striped))
+	if (oldroot)
+	{
+		int i = 0;
+		while (widgets[i])
 		{
-			gtk_list_store_set(store, &iter, VALUE, striped, -1);
-			if (empty)
-				add_empty_row();
-			
-			g_object_set (renderer_value, "editable", FALSE, NULL);
-			dconfig_set_changed();
+			g_object_unref(*widgets[i]);
+			i++;
 		}
-		
-		g_free(oldvalue);
+		gtk_container_remove(GTK_CONTAINER(tab_target), oldroot);
 	}
-	
-	if (empty)
-		entering_new_var = FALSE;
 
-	gtk_tree_path_free(tree_path);
-	g_free(striped);
-
-	gtk_tree_path_free(being_edited_value);
+	gtk_container_add(GTK_CONTAINER(tab_target), root);
+	gtk_widget_show_all(tab_target);
 }
 
 /*
- * env tree view value editing started
+ * create widgets 
  */
-void on_value_editing_started(GtkCellRenderer *renderer, GtkCellEditable *editable, gchar *path, gpointer user_data)
+static void tpage_create_widgets()
 {
-	being_edited_value = gtk_tree_path_new_from_string(path);
-}
+	/* target */
+	target_label = gtk_label_new(_("Target:"));
+	target_name = gtk_entry_new ();
+	gtk_entry_set_editable(GTK_ENTRY(target_name), FALSE);
+	target_button_browse = create_stock_button(GTK_STOCK_OPEN, _("Browse"));
+	gtk_widget_set_size_request(target_button_browse, BROWSE_BUTTON_WIDTH, 0);
+	g_signal_connect(G_OBJECT(target_button_browse), "clicked", G_CALLBACK (on_target_browse_clicked), NULL);
 
-/*
- * env tree view value editing cancelled (Escape pressed)
- */
-void on_value_editing_cancelled(GtkCellRenderer *renderer, gpointer user_data)
-{
-	/* check whether escape was pressed when editing
-	new variable value cell */
-	if(!gtk_tree_path_compare(being_edited_value, gtk_tree_row_reference_get_path(empty_row)))
+	/* debugger */
+	debugger_label = gtk_label_new(_("Debugger:")); 
+	debugger_cmb = gtk_combo_box_new_text();
+	GList *modules = debug_get_modules();
+	GList *iter = modules;
+	while (iter)
 	{
-		/* if so - clear name sell */
-		GtkTreeIter iter;
-		gtk_tree_model_get_iter(model, &iter, being_edited_value);
-		
-		gtk_list_store_set (
-			store,
-			&iter,
-			NAME, "",
-		   -1);
-
-		entering_new_var = FALSE;
+		gtk_combo_box_append_text(GTK_COMBO_BOX(debugger_cmb), (gchar*)iter->data);
+		iter = iter->next;
 	}
+	g_list_free(modules);
+	gtk_combo_box_set_active(GTK_COMBO_BOX(debugger_cmb), 0);
 
-	g_object_set (renderer_value, "editable", FALSE, NULL);
+	/* arguments */
+	args_frame = gtk_frame_new(_("Command Line Arguments"));
+	GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
+	gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+	args_textview = gtk_text_view_new ();
+	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(args_textview), GTK_WRAP_CHAR);
+	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(args_textview));
+	g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK (on_arguments_changed), NULL);
+	gtk_container_add(GTK_CONTAINER(hbox), args_textview);
+	gtk_container_add(GTK_CONTAINER(args_frame), hbox);
 
-	gtk_tree_path_free(being_edited_value);
+	/* environment */
+	env_frame = gtk_frame_new(_("Environment Variables"));
+	hbox = gtk_hbox_new(FALSE, 0);
+	gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
+	GtkWidget *tree = envtree_init();
+	gtk_container_add(GTK_CONTAINER(hbox), tree);
+	gtk_container_add(GTK_CONTAINER(env_frame), hbox);
 }
 
 /*
- * env tree view name changed hadler 
- */
-static void on_name_changed(GtkCellRendererText *renderer, gchar *path, gchar *new_text, gpointer user_data)
-{
-	GtkTreeIter  iter;
-	GtkTreePath *tree_path = gtk_tree_path_new_from_string (path);
-    
-	gboolean empty = !gtk_tree_path_compare(tree_path, gtk_tree_row_reference_get_path(empty_row));
-
-	gtk_tree_model_get_iter (
-		 model,
-		 &iter,
-		 tree_path);
-	
-	gchar* oldvalue;
-	gtk_tree_model_get (
-		model,
-		&iter,
-		NAME, &oldvalue,
-       -1);
-    
-	gchar *striped = g_strstrip(g_strdup(new_text));
-
-	if (!strlen(striped))
-	{
-		/* if name is empty - offer to delete variable */
-		if (!empty && dialogs_show_question(_("Delete variable?")))
-		{
-			delete_selected_rows();
-			dconfig_set_changed();
-
-			gtk_widget_grab_focus(envtree);
-		}
-	}
-	else if (strcmp(oldvalue, striped))
-    {
-		gtk_list_store_set(store, &iter, NAME, striped, -1);
-		if (empty)
-		{
-			/* if it was a new row - move cursor to a value cell */
-			entering_new_var = TRUE;
-			gtk_tree_view_set_cursor_on_cell(GTK_TREE_VIEW(envtree), tree_path, column_value, renderer_value, TRUE);
-		}
-		if (!empty)
-		{
-			dconfig_set_changed();
-		}
-	}
-	
-	gtk_tree_path_free(tree_path);
-	g_free(oldvalue);
-	g_free(striped);
-}
-
-/*
  * set target 
  */
 void tpage_set_target(const gchar *newvalue)
 {
-	gtk_entry_set_text(GTK_ENTRY(targetname), newvalue);
+	gtk_entry_set_text(GTK_ENTRY(target_name), newvalue);
 }
 
 /*
@@ -425,7 +290,7 @@
 	{
 		module = 0;
 	}
-	gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_debugger), module);
+	gtk_combo_box_set_active(GTK_COMBO_BOX(debugger_cmb), module);
 }
 
 /*
@@ -433,7 +298,7 @@
  */
 void tpage_set_commandline(const gchar *newvalue)
 {
-	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
+	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(args_textview));
 	gtk_text_buffer_set_text(buffer, newvalue, -1);
 }
 
@@ -442,9 +307,7 @@
  */
 void tpage_add_environment(const gchar *name, const gchar *value)
 {
-	GtkTreeIter iter;
-	gtk_list_store_prepend(store, &iter);
-	gtk_list_store_set(store, &iter, NAME, name, VALUE, value, -1);
+	envtree_add_environment(name, value);
 }
 
 /*
@@ -453,63 +316,25 @@
 void tpage_clear()
 {
 	/* target */
-	gtk_entry_set_text(GTK_ENTRY(targetname), "");
+	gtk_entry_set_text(GTK_ENTRY(target_name), "");
 	
 	/* reset debugger type */
-	gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_debugger), 0);
+	gtk_combo_box_set_active(GTK_COMBO_BOX(debugger_cmb), 0);
 
 	/* arguments */
-	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
+	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(args_textview));
 	gtk_text_buffer_set_text(buffer, "", -1);
 
 	/* environment variables */
-	gtk_list_store_clear(store);
-	add_empty_row();
+	envtree_clear();
 }
 
 /*
- * target browse button clicked handler
+ * get target file names
  */
-void on_target_browse_clicked(GtkButton *button, gpointer   user_data)
-{
-	GtkWidget *dialog;
-	dialog = gtk_file_chooser_dialog_new (_("Choose target file"),
-					  NULL,
-					  GTK_FILE_CHOOSER_ACTION_OPEN,
-					  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-					  GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
-					  NULL);
-	
-	gchar path[FILENAME_MAX];
-
-	const gchar *prevfile = gtk_entry_get_text(GTK_ENTRY(targetname));
-	gchar *prevdir = g_path_get_dirname(prevfile);
-	if (strcmp(".", prevdir))
-		strcpy(path, prevdir);
-	else
-		strcpy(path, g_path_get_dirname(DOC_FILENAME(document_get_current())));		
-	g_free(prevdir);
-	
-	gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER (dialog), path);
-	
-	if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
-	{
-		gchar *filename;
-		filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
-		gtk_entry_set_text(GTK_ENTRY(targetname), filename);
-		g_free (filename);
-		
-		dconfig_set_changed();
-	}
-	gtk_widget_destroy (dialog);
-}
-
-/*
- * get target file name
- */
 gchar* tpage_get_target()
 {
-	return g_strdup(gtk_entry_get_text(GTK_ENTRY(targetname)));
+	return g_strdup(gtk_entry_get_text(GTK_ENTRY(target_name)));
 }
 
 /*
@@ -517,7 +342,7 @@
  */
 int tpage_get_debug_module_index()
 {
-	return gtk_combo_box_get_active(GTK_COMBO_BOX(cmb_debugger));
+	return gtk_combo_box_get_active(GTK_COMBO_BOX(debugger_cmb));
 }
 
 /*
@@ -525,7 +350,7 @@
  */
 gchar* tpage_get_debugger()
 {
-	return gtk_combo_box_get_active_text(GTK_COMBO_BOX(cmb_debugger));
+	return gtk_combo_box_get_active_text(GTK_COMBO_BOX(debugger_cmb));
 }
 
 /*
@@ -534,7 +359,7 @@
 gchar* tpage_get_commandline()
 {
 	GtkTextIter start, end;
-	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
+	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(args_textview));
 	
 	gtk_text_buffer_get_start_iter(buffer, &start);
 	gtk_text_buffer_get_end_iter(buffer, &end);
@@ -553,30 +378,7 @@
  */
 GList* tpage_get_environment()
 {
-	GList *env = NULL;
-	
-	GtkTreeIter iter;
-	GtkTreeModel *_model = gtk_tree_view_get_model(GTK_TREE_VIEW(envtree));
-	gtk_tree_model_get_iter_first(_model, &iter);
-	do
-	{
-		gchar *name, *value;
-		gtk_tree_model_get (
-			_model,
-			&iter,
-			NAME, &name,
-			VALUE, &value,
-		   -1);
-
-		 if (strlen(name))
-		 {
-			env = g_list_append(env, name);
-			env = g_list_append(env, value);
-		 }
-	}
-	while (gtk_tree_model_iter_next(_model, &iter));
-	
-	return env;
+	return envpage_get_environment();
 }
 
 /*
@@ -584,131 +386,8 @@
  */
 void tpage_init()
 {
-	tab_target = gtk_hbox_new(FALSE, 0);
-	
-	GtkWidget *lbox =		gtk_vbox_new(FALSE, SPACING);
-	GtkWidget *mbox =		gtk_vbox_new(FALSE, SPACING);
-	
-	GtkWidget *hombox =	gtk_hbox_new(TRUE, 0);
-
-	/* left box */
-	gtk_container_set_border_width(GTK_CONTAINER(lbox), SPACING);
-
-	/* Target frame */
-	GtkWidget *_frame = gtk_frame_new(_("Target"));
-	gtk_frame_set_shadow_type(GTK_FRAME(_frame), GTK_SHADOW_NONE);
-	GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
-
-	/* filename hbox */
-	GtkWidget *hbox = gtk_hbox_new(FALSE, SPACING);
-	gtk_container_set_border_width(GTK_CONTAINER(hbox), SPACING);
-
-	targetname = gtk_entry_new ();
-	gtk_entry_set_editable(GTK_ENTRY(targetname), FALSE);
-	
-	button_browse = gtk_button_new_with_label(_("Browse"));
-	g_signal_connect(G_OBJECT(button_browse), "clicked", G_CALLBACK (on_target_browse_clicked), NULL);
-	
-	gtk_box_pack_start(GTK_BOX(hbox), targetname, TRUE, TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(hbox), button_browse, FALSE, TRUE, 0);
-
-	/* pack in the vertical box */
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-	
-	/* debugger type hbox */
-	hbox = gtk_hbox_new(FALSE, SPACING);
-	gtk_container_set_border_width(GTK_CONTAINER(hbox), SPACING);
-	GtkWidget *label = gtk_label_new(_("Debugger:")); 
-	cmb_debugger = gtk_combo_box_new_text();
-
-	GList *modules = debug_get_modules();
-	GList *iter = modules;
-	while (iter)
-	{
-		gtk_combo_box_append_text(GTK_COMBO_BOX(cmb_debugger), (gchar*)iter->data);
-		iter = iter->next;
-	}
-	g_list_free(modules);
-	gtk_combo_box_set_active(GTK_COMBO_BOX(cmb_debugger), 0);
-
-	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
-	gtk_box_pack_start(GTK_BOX(hbox), cmb_debugger, TRUE, TRUE, 0);
-
-	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-
-	gtk_container_add(GTK_CONTAINER(_frame), vbox);
-
-	gtk_box_pack_start(GTK_BOX(lbox), _frame, FALSE, FALSE, 0);
-
-	/* Arguments frame */
-	_frame = gtk_frame_new(_("Arguments"));
-	hbox = gtk_vbox_new(FALSE, SPACING);
-	gtk_container_set_border_width(GTK_CONTAINER(hbox), SPACING);
-	
-	textview = gtk_text_view_new ();
-	gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(textview), GTK_WRAP_CHAR);
-
-	GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(textview));
-	g_signal_connect(G_OBJECT(buffer), "changed", G_CALLBACK (on_arguments_changed), NULL);
-	
-	gtk_box_pack_start(GTK_BOX(hbox), textview, TRUE, TRUE, 0);
-	gtk_container_add(GTK_CONTAINER(_frame), hbox);
-
-	gtk_box_pack_start(GTK_BOX(lbox), _frame, TRUE, TRUE, 0);
-	
-
-	/* Environment */
-	gtk_container_set_border_width(GTK_CONTAINER(mbox), SPACING);
-	_frame = gtk_frame_new(_("Environment variables"));
-	hbox = gtk_hbox_new(FALSE, SPACING);
-	gtk_container_set_border_width(GTK_CONTAINER(hbox), SPACING);
-
-	store = gtk_list_store_new (
-		N_COLUMNS,
-		G_TYPE_STRING,
-		G_TYPE_STRING,
-		G_TYPE_STRING);
-	
-	model = GTK_TREE_MODEL(store);
-	envtree = gtk_tree_view_new_with_model (model);
-	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(envtree), TRUE);
-	g_object_set(envtree, "rules-hint", TRUE, NULL);
-	g_signal_connect(G_OBJECT(envtree), "key-press-event", G_CALLBACK (on_envtree_keypressed), NULL);
-
-	renderer_name = gtk_cell_renderer_text_new ();
-	g_object_set (renderer_name, "editable", TRUE, NULL);
-	g_signal_connect (G_OBJECT (renderer_name), "edited", G_CALLBACK (on_name_changed), NULL);
-	column_name = gtk_tree_view_column_new_with_attributes (_("Name"), renderer_name, "text", NAME, NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column_name);
-
-	renderer_value = gtk_cell_renderer_text_new ();
-	column_name = gtk_tree_view_column_new_with_attributes (_("Value"), renderer_name, "text", VALUE, NULL);
-	g_signal_connect (G_OBJECT (renderer_value), "edited", G_CALLBACK (on_value_changed), NULL);
-	g_signal_connect (G_OBJECT (renderer_value), "editing-started", G_CALLBACK (on_value_editing_started), NULL);
-	g_signal_connect (G_OBJECT (renderer_value), "editing-canceled", G_CALLBACK (on_value_editing_cancelled), NULL);
-	gtk_tree_view_column_set_cell_data_func(column_value, renderer_value, on_render_value, NULL, NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column_value);
-
-	/* Last invisible column */
-	GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
-	GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", LAST_VISIBLE, NULL);
-	gtk_tree_view_append_column (GTK_TREE_VIEW (envtree), column);
-
-	/* add empty row */
-	add_empty_row();
-
-	/* set multiple selection */
-	GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(envtree));
-	gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE);
-
-	gtk_box_pack_start(GTK_BOX(hbox), envtree, TRUE, TRUE, 0);
-	gtk_container_add(GTK_CONTAINER(_frame), hbox);
-	gtk_box_pack_start(GTK_BOX(mbox), _frame, TRUE, TRUE, 0);
-
-
-	gtk_box_pack_start(GTK_BOX(hombox), lbox, TRUE, TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(hombox), mbox, TRUE, TRUE, 0);
-	gtk_box_pack_start(GTK_BOX(tab_target), hombox, TRUE, TRUE, 0);
+	tab_target = gtk_vbox_new(FALSE, 0);
+	tpage_create_widgets();
 }
 
 /*
@@ -716,10 +395,9 @@
  */
 void tpage_set_readonly(gboolean readonly)
 {
-	gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), !readonly);
-	g_object_set (renderer_name, "editable", !readonly, NULL);
-	gtk_widget_set_sensitive (button_browse, !readonly);
-	gtk_widget_set_sensitive (cmb_debugger, !readonly);
-	
-	page_read_only = readonly;
+	gtk_text_view_set_editable (GTK_TEXT_VIEW (args_textview), !readonly);
+	gtk_widget_set_sensitive (target_button_browse, !readonly);
+	gtk_widget_set_sensitive (debugger_cmb, !readonly);
+
+	envtree_set_readonly(readonly);
 }

Modified: trunk/geany-plugins/debugger/src/tpage.h
===================================================================
--- trunk/geany-plugins/debugger/src/tpage.h	2011-09-12 13:04:22 UTC (rev 2195)
+++ trunk/geany-plugins/debugger/src/tpage.h	2011-09-13 21:28:14 UTC (rev 2196)
@@ -38,3 +38,5 @@
 void			tpage_set_readonly(gboolean readonly);
 void			tpage_clear();
 
+void			tpage_pack_widgets(gboolean tabbed);
+

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