diff options
Diffstat (limited to 'src/editor.c')
-rw-r--r-- | src/editor.c | 133 |
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); |