summaryrefslogtreecommitdiff
path: root/src/editor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-06-13 14:05:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-06-13 14:05:50 (GMT)
commitecb9ecc486049fe3bec6ecaeeb27f08f67bf0ef0 (patch)
treec4d84575960583ad61981adef6ed8f958ef9d817 /src/editor.c
parentfc8324b66dee0abf0a5e5e3cc570e1aed96b80c8 (diff)
Made the GUI offer to change the view of the current analyzed binary.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@73 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/editor.c')
-rw-r--r--src/editor.c133
1 files changed, 86 insertions, 47 deletions
diff --git a/src/editor.c b/src/editor.c
index 7185e3f..8c28e68 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -47,7 +47,6 @@
#include "gtkext/easygtk.h"
#include "gtkext/gtkbinview.h"
#include "gtkext/gtkdockpanel.h"
-#include "gtkext/gtksnippet.h"
#include "format/exe_format.h"
#include "format/mangling/demangler.h"
#include "plugins/pglist.h"
@@ -87,12 +86,8 @@ void mcb_file_save_project_as(GtkMenuItem *, gpointer);
/* Charge un projet récent et met à jour la liste. */
void mcb_open_recent_project(GtkMenuItem *, gpointer);
-
-/* Réagit avec le menu "Affichage -> Vue textuelle". */
-void mcb_view_as_text(GtkCheckMenuItem *, gpointer);
-
-/* Réagit avec le menu "Affichage -> Vue graphique". */
-void mcb_view_as_graph(GtkCheckMenuItem *, gpointer);
+/* Réagit avec le menu "Affichage -> Vue xxx". */
+void mcb_view_change_support(GtkRadioMenuItem *, GObject *);
/* Réagit avec le menu "Affichage -> Adresse virtuelle". */
void mcb_view_vaddress(GtkCheckMenuItem *, gpointer);
@@ -136,6 +131,10 @@ void update_debug_menu_items(GObject *, gboolean);
+
+
+
+
void open_last_file(GObject *ref);
@@ -248,7 +247,7 @@ GtkWidget *create_editor(void)
GtkWidget *snippet;
GtkWidget *statusbar1;
- GtkWidget *binview;
+ GtkWidget *view;
GtkWidget *panel;
@@ -324,12 +323,14 @@ GtkWidget *create_editor(void)
menubar = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
- submenuitem = qck_create_radio_menu_item(NULL, NULL, NULL, _("Text view"), G_CALLBACK(mcb_view_as_text), result);
+ submenuitem = qck_create_radio_menu_item(NULL, NULL, NULL, _("Text view"), G_CALLBACK(mcb_view_change_support), result);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_BLOCK));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem));
- submenuitem = qck_create_radio_menu_item(NULL, NULL, rgroup, _("Graph view"), G_CALLBACK(mcb_view_as_graph), result);
+ submenuitem = qck_create_radio_menu_item(NULL, NULL, rgroup, _("Graph view"), G_CALLBACK(mcb_view_change_support), result);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
submenuitem = qck_create_menu_separator();
@@ -443,10 +444,12 @@ GtkWidget *create_editor(void)
dpanel = gtk_dock_panel_new();
+ g_object_set_data(G_OBJECT(result), "binpanel", dpanel);
gtk_widget_show(dpanel);
gtk_paned_pack1(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
+#if 0
scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwindow2), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
@@ -458,16 +461,18 @@ GtkWidget *create_editor(void)
gtk_dock_panel_add_item(dpanel, ditem);
- binview = gtk_binview_new();
- g_object_set_data(G_OBJECT(result), "binview", binview);
+ view = gtk_graph_view_new();
+ g_object_set_data(G_OBJECT(result), "grahview", view);
//gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), binview);
//gtk_container_add(GTK_CONTAINER(scrolledwindow2), binview);
+ view = gtk_binview_new();
+ g_object_set_data(G_OBJECT(result), "binview", view);
snippet = gtk_snippet_new();
g_object_set_data(G_OBJECT(result), "snippet", snippet);
- gtk_widget_show(binview);
+ gtk_widget_show(view);
/*
snippet = gtk_text_view_new ();
*/
@@ -475,20 +480,20 @@ GtkWidget *create_editor(void)
/*gtk_container_add (GTK_CONTAINER (scrolledwindow2), snippet);*/
//gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), snippet);
- gtk_container_add(GTK_CONTAINER(binview), snippet);
+ gtk_container_add(GTK_CONTAINER(view), snippet);
//binview = gtk_fixed_new();
- gtk_widget_show(binview);
+ gtk_widget_show(view);
//g_object_set_data(G_OBJECT(result), "binview", binview);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), binview);
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolledwindow2), view);
//gtk_container_add(GTK_CONTAINER(scrolledwindow2), binview);
-
+#endif
@@ -712,14 +717,12 @@ void mcb_open_recent_project(GtkMenuItem *menuitem, gpointer data)
}
-
-
/******************************************************************************
* *
* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
+* ref = adresse de l'espace de référencement global. *
* *
-* Description : Réagit avec le menu "Affichage -> Vue textuelle". *
+* Description : Réagit avec le menu "Affichage -> Vue xxx". *
* *
* Retour : - *
* *
@@ -727,39 +730,36 @@ void mcb_open_recent_project(GtkMenuItem *menuitem, gpointer data)
* *
******************************************************************************/
-void mcb_view_as_text(GtkCheckMenuItem *menuitem, gpointer data)
+void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref)
{
- gboolean active; /* Etat de sélection du menu */
-
- active = gtk_check_menu_item_get_active(menuitem);
-
- printf("View as text ? %d\n", active);
+ GSList *group; /* Liste de menus radio */
+ GSList *iter; /* Boucle de parcours */
+ BinaryView view; /* Nouvelle vue à présenter */
+ openida_binary *binary; /* Edition courante */
+ GtkWidget *panel; /* Nouveau support à utiliser */
+ GtkDockPanel *dpanel; /* Support de panneaux */
+ GtkDockItem *ditem; /* Panneau avec ses infos. */
+ /* On ne traite qu'une seule fois ! */
+ if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return;
-}
+ group = gtk_radio_menu_item_get_group(menuitem);
+ for (iter = group; iter != NULL; iter = g_slist_next(iter))
+ {
+ if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(iter->data))) continue;
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* data = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Affichage -> Vue graphique". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view"));
-void mcb_view_as_graph(GtkCheckMenuItem *menuitem, gpointer data)
-{
- gboolean active; /* Etat de sélection du menu */
+ binary = (openida_binary *)g_object_get_data(ref, "current_binary");
+ panel = get_view_for_openida_project_binary(get_current_openida_project(), binary, view);
- active = gtk_check_menu_item_get_active(menuitem);
+ dpanel = GTK_DOCK_PANEL(g_object_get_data(ref, "binpanel"));
+ ditem = gtk_dock_panel_item_from_name(dpanel, openida_binary_to_string(binary));
- printf("View as graph ? %d\n", active);
+ gtk_dock_panel_replace_item_content(dpanel, ditem, panel);
+ }
}
@@ -936,6 +936,7 @@ void mcb_select_sections(GtkMenuItem *menuitem, gpointer data)
void reload_menu_project(GObject *ref)
{
+#if 0
GtkWidget *menuitem; /* Menu principal à compléter */
GtkWidget *menubar; /* Support pour éléments */
GList *list; /* Liste des éléments en place */
@@ -973,7 +974,7 @@ void reload_menu_project(GObject *ref)
}
gtk_widget_set_sensitive(menuitem, count > 0);
-
+#endif
}
@@ -1206,12 +1207,50 @@ void update_debug_menu_items(GObject *ref, gboolean stopped)
void open_last_file(GObject *ref)
{
+
+ GtkWidget *scrolledwindow;
+
+
+ GtkWidget *snippet;
+
+
+
+ GtkDockPanel *dpanel; /* Support de panneaux */
+ GtkDockItem *ditem; /* Panneau avec ses infos. */
+
openida_binary *binary;
+ openida_project *project;
+
+ GtkWidget *view; /* Affichage du code binaire */
+
+
binary = load_binary_file("/tmp/hello");
- gtk_snippet_set_rendering_lines(GTK_SNIPPET(g_object_get_data(ref, "snippet")), get_openida_binary_lines(binary));
+
+ if (binary == NULL)
+ {
+ /* TODO : log ... */
+ return;
+ }
+
+
+ project = get_current_openida_project();
+
+ attach_binary_to_openida_project(project, binary);
+
+ view = get_view_for_openida_project_binary(project, binary, BVW_BLOCK);
+
+
+
+
+ dpanel = GTK_DOCK_PANEL(g_object_get_data(ref, "binpanel"));
+
+ ditem = gtk_dock_item_new(openida_binary_to_string(binary), view);
+ gtk_dock_panel_add_item(dpanel, ditem);
+
+
g_object_set_data(ref, "current_binary", binary);