summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-01-23 01:05:58 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-01-23 01:05:58 (GMT)
commitd761eddfd4b5a27620aaa5e67a0e2e2bc5d55cb1 (patch)
treedc0d69813fef1b982c3a0fbdc25a00a6183b0852
parentd487ea54850c85ea22df22af3b21b57d9ad0fd2f (diff)
Added menus to change the current displayed view. Do not try the source view.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@228 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
-rw-r--r--ChangeLog26
-rw-r--r--po/fr.po6
-rw-r--r--src/editor.c76
-rw-r--r--src/gtkext/gtkdockstation.c40
-rw-r--r--src/gtkext/gtkdockstation.h3
-rw-r--r--src/gtkext/gtkgraphview.c382
-rw-r--r--src/gtkext/gtkgraphview.h9
-rw-r--r--src/gtkext/gtkviewpanel.c3
-rw-r--r--src/gui/editem.c19
-rw-r--r--src/gui/editem.h3
-rw-r--r--src/gui/menus/view.c81
11 files changed, 444 insertions, 204 deletions
diff --git a/ChangeLog b/ChangeLog
index 9926314..313c06d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,31 @@
12-01-16 Cyrille Bagard <nocbos@gmail.com>
+ * po/fr.po:
+ Update translations for the View menu.
+
+ * src/editor.c:
+ Remove old code in favour of view.
+
+ * src/gtkext/gtkdockstation.c:
+ * src/gtkext/gtkdockstation.h:
+ Allow to change the active widget.
+
+ * src/gtkext/gtkgraphview.c:
+ * src/gtkext/gtkgraphview.h:
+ Update the graph view code.
+
+ * src/gtkext/gtkviewpanel.c:
+ Prevent a crash if a view is not attaching its binary.
+
+ * src/gui/editem.c:
+ * src/gui/editem.h:
+ Provide the current binary.
+
+ * src/gui/menus/view.c:
+ Add menus to change the current displayed view.
+
+12-01-16 Cyrille Bagard <nocbos@gmail.com>
+
* src/editor.c:
Update editor on view change.
diff --git a/po/fr.po b/po/fr.po
index 913145f..276b6a1 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -476,15 +476,15 @@ msgstr "Affichage"
#: src/editor.c:326
msgid "Text view"
-msgstr ""
+msgstr "Vue binaire"
#: src/editor.c:333
msgid "Graph view"
-msgstr ""
+msgstr "Vue graphique"
#: src/editor.c:340
msgid "Source code"
-msgstr ""
+msgstr "Code source"
#: src/editor.c:357
msgid "Toolbar"
diff --git a/src/editor.c b/src/editor.c
index 936b9a1..01ba64a 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -90,9 +90,6 @@ void mcb_file_save_project_as(GtkMenuItem *, gpointer);
/* Charge un projet récent et met à jour la liste. */
void mcb_open_recent_project(GtkMenuItem *, GObject *);
-/* Réagit avec le menu "Affichage -> Vue xxx". */
-void mcb_view_change_support(GtkRadioMenuItem *, GObject *);
-
/* Affiche la boîte d'ajout d'un binaire au projet courant. */
void mcb_project_add_binary(GtkMenuItem *, gpointer);
@@ -316,25 +313,6 @@ GtkWidget *create_editor(void)
menubar = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
- submenuitem = qck_create_radio_menu_item(ref, "textview", NULL, _("Text view"), G_CALLBACK(mcb_view_change_support), result);
- add_accelerator_to_menu_item(submenuitem, "F2", accgroup);
- 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(ref, "graphview", rgroup, _("Graph view"), G_CALLBACK(mcb_view_change_support), result);
- add_accelerator_to_menu_item(submenuitem, "F3", accgroup);
- g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH));
- 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(ref, "sourceview", rgroup, _("Source code"), G_CALLBACK(mcb_view_change_support), result);
- add_accelerator_to_menu_item(submenuitem, "F4", accgroup);
- g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_SOURCE));
- gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
-
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -887,57 +865,6 @@ void mcb_open_recent_project(GtkMenuItem *menuitem, GObject *ref)
}
-/******************************************************************************
-* *
-* Paramètres : menuitem = élément de menu ayant basculé. *
-* ref = adresse de l'espace de référencement global. *
-* *
-* Description : Réagit avec le menu "Affichage -> Vue xxx". *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref)
-{
- GSList *group; /* Liste de menus radio */
- GSList *iter; /* Boucle de parcours */
- BinaryView view; /* Nouvelle vue à présenter */
- GOpenidaBinary *binary; /* Edition courante */
- GtkViewPanel *pview; /* Afficheur effectif de code */
- GtkWidget *panel; /* Nouveau support à utiliser */
- GDockItem *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;
-
- view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view"));
-
- binary = (GOpenidaBinary *)g_object_get_data(ref, "current_binary");
- panel = get_view_for_openida_project_binary(get_current_openida_project(), binary, view, &pview);
-
- ditem = gtk_dock_panel_get_item_from_binary(get_current_openida_project(), binary);
-
- g_dock_item_set_panel(ditem, panel);
-
- change_editor_items_current_view(ref, pview);
-
- notify_panels_of_view_change(pview, true);
-
- }
-
-}
-
-
-
/******************************************************************************
@@ -1469,6 +1396,7 @@ static void on_dock_item_switch(GtkDockPanel *panel, GtkWidget *widget, GObject
static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinView *view)
{
+#if 0
GtkCheckMenuItem *menuitem; /* Menu à coche à traiter */
/* Affichage : type de vue */
@@ -1495,7 +1423,7 @@ static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinVie
menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview"));
g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref);
-
+#endif
}
diff --git a/src/gtkext/gtkdockstation.c b/src/gtkext/gtkdockstation.c
index 4b837bc..3e33f2b 100644
--- a/src/gtkext/gtkdockstation.c
+++ b/src/gtkext/gtkdockstation.c
@@ -228,6 +228,46 @@ void gtk_dock_panel_add_widget(GtkDockStation *station, GtkWidget *widget, const
}
+/******************************************************************************
+* *
+* Paramètres : station = plateforme GTK à compléter. *
+* widget = nouvel élément à intégrer. *
+* *
+* Description : Change le contenu de l'onglet courant uniquement. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void gtk_dock_panel_change_active_widget(GtkDockStation *station, GtkWidget *widget)
+{
+ gint index; /* Indice de l'onglet actif */
+ GtkWidget *old; /* Ancien composant */
+ GtkWidget *label; /* Etiquette d'onglet */
+
+ index = gtk_notebook_get_current_page(station->notebook);
+
+ g_signal_handlers_disconnect_by_func(station->notebook,
+ G_CALLBACK(gtk_dock_station_switch_panel), station);
+
+ old = gtk_notebook_get_nth_page(station->notebook, index);
+ label = gtk_notebook_get_tab_label(station->notebook, old);
+
+ gtk_widget_ref(old);
+ gtk_widget_ref(label);
+
+ gtk_notebook_remove_page(station->notebook, index);
+ gtk_notebook_insert_page(station->notebook, widget, label, index);
+
+ gtk_widget_unref(label);
+
+ g_signal_connect(station->notebook, "switch-page",
+ G_CALLBACK(gtk_dock_station_switch_panel), station);
+
+}
+
/******************************************************************************
* *
diff --git a/src/gtkext/gtkdockstation.h b/src/gtkext/gtkdockstation.h
index 41adacc..a15667a 100644
--- a/src/gtkext/gtkdockstation.h
+++ b/src/gtkext/gtkdockstation.h
@@ -75,6 +75,9 @@ GtkWidget *gtk_dock_station_new(void);
/* Ajoute un paquet d'informations à l'affichage centralisé. */
void gtk_dock_panel_add_widget(GtkDockStation *, GtkWidget *, const char *);
+/* Change le contenu de l'onglet courant uniquement. */
+void gtk_dock_panel_change_active_widget(GtkDockStation *, GtkWidget *);
+
/* Met à jour, si besoin est, le titre de l'affichage concentré. */
void gtk_dock_panel_update_title(GtkDockStation *, GtkWidget *, const char *);
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index 6e7b85a..ff020d4 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* gtkgraphview.c - affichage de morceaux de code sous forme graphique
*
- * Copyright (C) 2009-2010 Cyrille Bagard
+ * Copyright (C) 2009-2012 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -24,47 +24,36 @@
#include "gtkgraphview.h"
-#include "gtkbinview-int.h"
#include "gtkblockview.h"
-#include "../format/format.h"
-#include "../graph/layout.h"
-
-
-#include <malloc.h>
+#include "gtkviewpanel-int.h"
-/* Représentation de code binaire sous forme graphique (instace) */
+/* Composant d'affichage sous forme graphique (instance) */
struct _GtkGraphView
{
- GtkBinView parent; /* A laisser en premier */
+ GtkViewPanel parent; /* A laisser en premier */
GtkFixed *support; /* Support des vues en bloc */
- GtkRequisition requisition; /* Espace requis d'affichage */
-
- vmpa_t start; /* Début de la portion vue */
- vmpa_t end; /* Fin de la portion affichée */
+ GtkRequisition requisition; /* Espace requis d'affichage */ /* A garder ?? */
- GtkBinView **childs; /* Liste des sous-blocs */
+ GtkBlockView **childs; /* Liste des sous-blocs */
size_t childs_count; /* Taille de cette liste */
- size_t ready; /* Construction complète */
- GMutex *mutex; /* Accès à la variable */
- GCond *cond; /* Attente de changement */
-
GtkLinkRenderer **links; /* Liste des liens graphiques */
size_t links_count; /* Nombre de ces liens */
};
-/* Représentation de code binaire sous forme graphique (classe) */
+/* Composant d'affichage sous forme graphique (classe) */
struct _GtkGraphViewClass
{
- GtkBinViewClass parent; /* A laisser en premier */
+ GtkViewPanelClass parent; /* A laisser en premier */
};
+
/* Initialise la classe générique des graphiques de code. */
static void gtk_graph_view_class_init(GtkGraphViewClass *);
@@ -80,30 +69,13 @@ static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *);
/* Met à jour l'affichage de la vue sous forme graphique. */
static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *);
-/* Supprime tout contenu de l'afficheur de code en graphique. */
-static void gtk_graph_view_reset(GtkGraphView *);
-
/* Réagit à un défilement quelconque. */
static void gtk_graph_view_scroll(GtkGraphView *);
-/* Définit les lignes du graphique de représentation. */
-static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *);
-
-/* Réagit à la sélection externe d'une adresse. */
-static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t);
-
-/* Indique la position d'affichage d'une adresse donnée. */
-static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *);
-
-/* Définit la liste complète des éléments du futur graphique. */
-static GtkBinView **gtk_graph_view_load_nodes(GtkGraphView *, GOpenidaBinary *, GRenderingLine *, GRenderingLine *);
-
-/* Prend note de la fin d'une construction d'une visualisation. */
-static void notify_graph_view(GtkBinView *, GtkGraphView *);
/* Détermine le type du composant d'affichage en graphique. */
-G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_BIN_VIEW)
+G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_VIEW_PANEL)
/******************************************************************************
@@ -145,18 +117,18 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
static void gtk_graph_view_init(GtkGraphView *view)
{
GtkViewPanel *viewpanel; /* Instance parente #1 */
- GtkBinView *binview; /* Instance parente #2 */
+ //GtkBinView *binview; /* Instance parente #2 */
GdkColor white; /* Couleur de fond normale */
viewpanel = GTK_VIEW_PANEL(view);
viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll;
- binview = GTK_BIN_VIEW(view);
+ //binview = GTK_BIN_VIEW(view);
- binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines;
- binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address;
- binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
+ //binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines;
+ //binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address;
+ //binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
view->support = GTK_FIXED(gtk_fixed_new());
gtk_fixed_set_has_window(view->support, TRUE);
@@ -171,8 +143,8 @@ static void gtk_graph_view_init(GtkGraphView *view)
gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0);
- view->mutex = g_mutex_new();
- view->cond = g_cond_new();
+ //view->mutex = g_mutex_new();
+ //view->cond = g_cond_new();
}
@@ -195,8 +167,9 @@ static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requi
GtkGraphView *view; /* Autre vision du composant */
fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+ fixed_class = g_type_class_peek_parent(fixed_class);
- GTK_WIDGET_CLASS(fixed_class)->size_request(GTK_FIXED(widget), requisition);
+ GTK_WIDGET_CLASS(fixed_class)->size_request(widget, requisition);
view = GTK_GRAPH_VIEW(widget);
@@ -229,8 +202,9 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
/* Mise à jour GTK */
fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+ fixed_class = g_type_class_peek_parent(fixed_class);
- GTK_WIDGET_CLASS(fixed_class)->size_allocate(GTK_FIXED(widget), allocation);
+ GTK_WIDGET_CLASS(fixed_class)->size_allocate(widget, allocation);
panel = GTK_VIEW_PANEL(widget);
@@ -274,6 +248,55 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
/******************************************************************************
* *
+* Paramètres : widget = composant GTK à redessiner. *
+* event = informations liées à l'événement. *
+* view = support maître à consulter. *
+* *
+* Description : Met à jour l'affichage de la vue sous forme graphique. *
+* *
+* Retour : FALSE pour poursuivre la propagation de l'événement. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view)
+{
+ size_t i; /* Boucle de parcours */
+
+ for (i = 0; i < view->links_count; i++)
+ gtk_link_renderer_draw(view->links[i],
+ GDK_DRAWABLE(widget->window),
+ GTK_VIEW_PANEL(view)->gc);
+
+ return FALSE;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à mettre à jour. *
+* *
+* Description : Réagit à un défilement quelconque. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_scroll(GtkGraphView *view)
+{
+ gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support),
+ -GTK_VIEW_PANEL(view)->hadjustment->value,
+ -GTK_VIEW_PANEL(view)->vadjustment->value);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Crée un nouveau composant pour l'affichage en graphique. *
@@ -284,7 +307,7 @@ static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *alloc
* *
******************************************************************************/
-GtkWidget* gtk_graph_view_new(void)
+GtkWidget *gtk_graph_view_new(void)
{
return g_object_new(GTK_TYPE_GRAPH_VIEW, NULL);
@@ -296,34 +319,211 @@ GtkWidget* gtk_graph_view_new(void)
+
/******************************************************************************
* *
-* Paramètres : widget = composant GTK à redessiner. *
-* event = informations liées à l'événement. *
-* view = support maître à consulter. *
+* Paramètres : view = composant GTK à mettre à jour. *
+* widget = composant GTK à insérer. *
+* x = abscisse du point d'insertion. *
+* y = ordonnée du point d'insertion. *
* *
-* Description : Met à jour l'affichage de la vue sous forme graphique. *
+* Description : Place une vue sous forme de bloc dans le graphique. *
* *
-* Retour : FALSE pour poursuivre la propagation de l'événement. *
+* Retour : Plutôt que de redéfinir *toutes* les méthodes de *
+* GtkContainer, on étend ! *
* *
* Remarques : - *
* *
******************************************************************************/
-static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view)
+void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y)
{
- size_t i; /* Boucle de parcours */
+ gtk_fixed_put(view->support, widget, x, y);
- for (i = 0; i < view->links_count; i++)
- gtk_link_renderer_draw(view->links[i],
- GDK_DRAWABLE(widget->window),
- GTK_VIEW_PANEL(view)->gc);
+}
- return FALSE;
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à mettre à jour. *
+* links = liens graphiques entre les blocs à intégrer. *
+* count = quantité de ces liens graphiques. *
+* *
+* Description : Définit les liens graphiques à présenter avec la vue. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void gtk_graph_view_attach_links(GtkGraphView *view, GtkLinkRenderer **links, size_t count)
+{
+ view->links = links;
+ view->links_count = count;
}
+
+
+
+
+
+
+
+
+
+
+#if 0
+
+#include "gtkbinview-int.h"
+#include "gtkblockview.h"
+#include "../format/format.h"
+#include "../graph/layout.h"
+
+
+#include <malloc.h>
+
+
+
+/* Représentation de code binaire sous forme graphique (instace) */
+struct _GtkGraphView
+{
+ GtkBinView parent; /* A laisser en premier */
+ GtkFixed *support; /* Support des vues en bloc */
+
+ GtkRequisition requisition; /* Espace requis d'affichage */
+
+ vmpa_t start; /* Début de la portion vue */
+ vmpa_t end; /* Fin de la portion affichée */
+
+ GtkBinView **childs; /* Liste des sous-blocs */
+ size_t childs_count; /* Taille de cette liste */
+
+ size_t ready; /* Construction complète */
+ GMutex *mutex; /* Accès à la variable */
+ GCond *cond; /* Attente de changement */
+
+ GtkLinkRenderer **links; /* Liste des liens graphiques */
+ size_t links_count; /* Nombre de ces liens */
+
+};
+
+/* Représentation de code binaire sous forme graphique (classe) */
+struct _GtkGraphViewClass
+{
+ GtkBinViewClass parent; /* A laisser en premier */
+
+};
+
+
+/* Initialise la classe générique des graphiques de code. */
+static void gtk_graph_view_class_init(GtkGraphViewClass *);
+
+/* Initialise une instance d'afficheur de code en graphique. */
+static void gtk_graph_view_init(GtkGraphView *);
+
+/* Supprime tout contenu de l'afficheur de code en graphique. */
+static void gtk_graph_view_reset(GtkGraphView *);
+
+/* Définit les lignes du graphique de représentation. */
+static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *);
+
+/* Réagit à la sélection externe d'une adresse. */
+static void gtk_graph_view_define_main_address(GtkGraphView *, vmpa_t);
+
+/* Indique la position d'affichage d'une adresse donnée. */
+static bool gtk_graph_view_get_address_coordinates(const GtkGraphView *, vmpa_t, gint *, gint *);
+
+/* Définit la liste complète des éléments du futur graphique. */
+static GtkBinView **gtk_graph_view_load_nodes(GtkGraphView *, GOpenidaBinary *, GRenderingLine *, GRenderingLine *);
+
+/* Prend note de la fin d'une construction d'une visualisation. */
+static void notify_graph_view(GtkBinView *, GtkGraphView *);
+
+
+/* Détermine le type du composant d'affichage en graphique. */
+G_DEFINE_TYPE(GtkGraphView, gtk_graph_view, GTK_TYPE_BIN_VIEW)
+
+
+/******************************************************************************
+* *
+* Paramètres : klass = classe GTK à initialiser. *
+* *
+* Description : Initialise la classe générique des graphiques de code. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
+{
+ GtkWidgetClass *widget_class; /* Classe version Widget */
+
+ widget_class = (GtkWidgetClass *)klass;
+
+ widget_class->size_request = gtk_graph_view_size_request;
+ widget_class->size_allocate = gtk_graph_view_size_allocate;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = instance GTK à initialiser. *
+* *
+* Description : Initialise une instance d'afficheur de code en graphique. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_init(GtkGraphView *view)
+{
+ GtkViewPanel *viewpanel; /* Instance parente #1 */
+ GtkBinView *binview; /* Instance parente #2 */
+ GdkColor white; /* Couleur de fond normale */
+
+ viewpanel = GTK_VIEW_PANEL(view);
+
+ viewpanel->scroll = (scroll_fc)gtk_graph_view_scroll;
+
+ binview = GTK_BIN_VIEW(view);
+
+ binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines;
+ binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address;
+ binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
+
+ view->support = GTK_FIXED(gtk_fixed_new());
+ gtk_fixed_set_has_window(view->support, TRUE);
+
+ g_signal_connect(G_OBJECT(view->support), "expose-event",
+ G_CALLBACK(gtk_graph_view_expose), view);
+
+ gtk_widget_show(GTK_WIDGET(view->support));
+
+ gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(view->support)), &white);
+ gtk_widget_modify_bg(GTK_WIDGET(view->support), GTK_STATE_NORMAL, &white);
+
+ gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0);
+
+ view->mutex = g_mutex_new();
+ view->cond = g_cond_new();
+
+}
+
+
+
+
+
+
+
+
/******************************************************************************
* *
* Paramètres : view = instance GTK à réinitialiser. *
@@ -379,25 +579,6 @@ static void gtk_graph_view_reset(GtkGraphView *view)
-/******************************************************************************
-* *
-* Paramètres : view = composant GTK à mettre à jour. *
-* *
-* Description : Réagit à un défilement quelconque. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-static void gtk_graph_view_scroll(GtkGraphView *view)
-{
- gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support),
- -GTK_VIEW_PANEL(view)->hadjustment->value,
- -GTK_VIEW_PANEL(view)->vadjustment->value);
-
-}
/******************************************************************************
@@ -660,46 +841,5 @@ static void notify_graph_view(GtkBinView *view, GtkGraphView *parent)
}
-/******************************************************************************
-* *
-* Paramètres : view = composant GTK à mettre à jour. *
-* widget = composant GTK à insérer. *
-* x = abscisse du point d'insertion. *
-* y = ordonnée du point d'insertion. *
-* *
-* Description : Place une vue sous forme de bloc dans le graphique. *
-* *
-* Retour : Plutôt que de redéfinir *toutes* les méthodes de *
-* GtkContainer, on étend ! *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y)
-{
- gtk_fixed_put(view->support, widget, x, y);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : view = composant GTK à mettre à jour. *
-* links = liens graphiques entre les blocs à intégrer. *
-* count = quantité de ces liens graphiques. *
-* *
-* Description : Définit les liens graphiques à présenter avec la vue. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void gtk_graph_view_attach_links(GtkGraphView *view, GtkLinkRenderer **links, size_t count)
-{
- view->links = links;
- view->links_count = count;
-}
+#endif
diff --git a/src/gtkext/gtkgraphview.h b/src/gtkext/gtkgraphview.h
index 3706343..9e66fe8 100644
--- a/src/gtkext/gtkgraphview.h
+++ b/src/gtkext/gtkgraphview.h
@@ -2,7 +2,7 @@
/* OpenIDA - Outil d'analyse de fichiers binaires
* gtkgraphview.h - prototypes pour l'affichage de morceaux de code sous forme graphique
*
- * Copyright (C) 2009 Cyrille Bagard
+ * Copyright (C) 2009-2012 Cyrille Bagard
*
* This file is part of OpenIDA.
*
@@ -40,19 +40,18 @@
#define GTK_GRAPH_VIEW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_GRAPH_VIEW, GtkGraphViewClass))
-
+/* Composant d'affichage sous forme graphique (instance) */
typedef struct _GtkGraphView GtkGraphView;
-
+/* Composant d'affichage sous forme graphique (classe) */
typedef struct _GtkGraphViewClass GtkGraphViewClass;
-
/* Détermine le type du composant d'affichage en graphique. */
GType gtk_graph_view_get_type(void);
/* Crée un nouveau composant pour l'affichage en graphique. */
-GtkWidget* gtk_graph_view_new(void);
+GtkWidget *gtk_graph_view_new(void);
/* Place une vue sous forme de bloc dans le graphique. */
void gtk_graph_view_put(GtkGraphView *, GtkWidget *, gint, gint);
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 9ccf209..9aba036 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -342,7 +342,8 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b
panel->display_addr = addr;
panel->display_code = code;
- panel->attach(panel, binary, addr, code);
+ if (panel->attach != NULL) /* REMME ? */
+ panel->attach(panel, binary, addr, code);
}
diff --git a/src/gui/editem.c b/src/gui/editem.c
index 4afd7bd..0516f4d 100644
--- a/src/gui/editem.c
+++ b/src/gui/editem.c
@@ -117,6 +117,25 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
* *
* Paramètres : item = instance à consulter. *
* *
+* Description : Fournit le gestionnaire du binaire courant. *
+* *
+* Retour : Instance en place ou NULL si aucune. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GOpenidaBinary *g_editor_item_get_current_binary(const GEditorItem *item)
+{
+ return g_object_get_data(item->ref, "current_binary");
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* *
* Description : Fournit l'affichage de binaire courant. *
* *
* Retour : Instance en place ou NULL si aucune. *
diff --git a/src/gui/editem.h b/src/gui/editem.h
index 40be0c7..286013c 100644
--- a/src/gui/editem.h
+++ b/src/gui/editem.h
@@ -58,6 +58,9 @@ GType g_editor_item_get_type(void);
/* Fournit le composant GTK associé à l'élément réactif. */
GtkWidget *g_editor_item_get_widget(const GEditorItem *);
+/* Fournit le gestionnaire du binaire courant. */
+GOpenidaBinary *g_editor_item_get_current_binary(const GEditorItem *);
+
/* Fournit l'affichage de binaire courant. */
GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *);
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index 85e65f7..273b41b 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -28,10 +28,16 @@
#include <i18n.h>
+#include "../editem-int.h"
+#include "../../project.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdockstation.h"
+/* Réagit avec le menu "Affichage -> Vue xxx". */
+static void mcb_view_change_support(GtkRadioMenuItem *, GMenuBar *);
+
/* Réagit avec le menu "Affichage -> Adresse virtuelle". */
static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *);
@@ -59,6 +65,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
GtkWidget *result; /* Support à retourner */
GtkWidget *menubar; /* Support pour éléments */
GtkWidget *submenuitem; /* Sous-élément de menu */
+ GSList *rgroup; /* Groupe des boutons radio */
result = gtk_menu_item_new_with_mnemonic(_("_View"));
gtk_widget_show(result);
@@ -66,6 +73,28 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
menubar = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar);
+ submenuitem = qck_create_radio_menu_item(ref, "textview", NULL, _("Text view"),
+ G_CALLBACK(mcb_view_change_support), bar);
+ add_accelerator_to_menu_item(submenuitem, "F2", accgroup);
+ 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(ref, "graphview", rgroup, _("Graph view"),
+ G_CALLBACK(mcb_view_change_support), bar);
+ add_accelerator_to_menu_item(submenuitem, "F3", accgroup);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH));
+ 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(ref, "sourceview", rgroup, _("Source code"),
+ G_CALLBACK(mcb_view_change_support), bar);
+ add_accelerator_to_menu_item(submenuitem, "F4", accgroup);
+ g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_SOURCE));
+ gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -134,6 +163,58 @@ void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar *
* Paramètres : menuitem = élément de menu ayant basculé. *
* bar = barre de menu parente. *
* *
+* Description : Réagit avec le menu "Affichage -> Vue xxx". *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar)
+{
+ GSList *group; /* Liste de menus radio */
+ GSList *iter; /* Boucle de parcours */
+ BinaryView view; /* Nouvelle vue à présenter */
+ GtkViewPanel *vpanel; /* Afficheur effectif de code */
+ GtkWidget *station; /* Base du remplacement */
+ GOpenidaBinary *binary; /* Edition courante */
+ GtkWidget *scroll; /* Nouveau support à utiliser */
+
+ /* 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;
+
+ view = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view"));
+
+ vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
+ station = gtk_widget_get_parent(GTK_WIDGET(vpanel)); /* ScrollWindow */
+ station = gtk_widget_get_parent(station); /* NoteBook */
+ station = gtk_widget_get_parent(station); /* DockStation */
+
+ binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar));
+ scroll = get_view_for_openida_project_binary(get_current_openida_project(),
+ binary, view, &vpanel);
+
+ gtk_dock_panel_change_active_widget(GTK_DOCK_STATION(station), scroll);
+
+ change_editor_items_current_view(G_EDITOR_ITEM(bar)->ref, vpanel);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : menuitem = élément de menu ayant basculé. *
+* bar = barre de menu parente. *
+* *
* Description : Réagit avec le menu "Affichage -> Adresse virtuelle". *
* *
* Retour : - *