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