From d487ea54850c85ea22df22af3b21b57d9ad0fd2f Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 16 Jan 2012 01:29:18 +0000
Subject: Updated menus on view change.

git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@227 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
---
 ChangeLog                      | 31 +++++++++++++++
 src/editor.c                   | 17 ++++----
 src/gtkext/gtkbufferview-int.h |  3 --
 src/gtkext/gtkbufferview.c     | 10 ++---
 src/gtkext/gtkdockstation.c    | 13 +++++-
 src/gtkext/gtkdockstation.h    |  4 ++
 src/gtkext/gtkviewpanel-int.h  |  3 ++
 src/gtkext/gtkviewpanel.c      | 89 ++++++++++++++++++++++++++++++++++++++++++
 src/gtkext/gtkviewpanel.h      | 12 ++++++
 src/gui/editem.c               | 23 ++++++++++-
 src/gui/editem.h               |  5 ++-
 src/gui/menus/menubar.c        | 47 +++++++++++++++++-----
 src/gui/menus/view.c           | 89 ++++++++++++++++++++++++++++++------------
 src/gui/menus/view.h           |  8 +++-
 src/gui/panels/panel.c         | 20 ++++++++--
 src/gui/panels/panel.h         |  2 +-
 16 files changed, 314 insertions(+), 62 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0c2c5d3..9926314 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,34 @@
+12-01-16  Cyrille Bagard <nocbos@gmail.com>
+
+	* src/editor.c:
+	Update editor on view change.
+
+	* src/gtkext/gtkbufferview.c:
+	* src/gtkext/gtkbufferview-int.h:
+	Move the rendering guidelines in the base view widget.
+
+	* src/gtkext/gtkdockstation.c:
+	* src/gtkext/gtkdockstation.h:
+	Add a signal to notify tab changes.
+
+	* src/gtkext/gtkviewpanel.c:
+	* src/gtkext/gtkviewpanel.h:
+	* src/gtkext/gtkviewpanel-int.h:
+	Move the rendering guidelines in the base view widget.
+
+	* src/gui/editem.c:
+	* src/gui/editem.h:
+	Fix a tiny bug and provide the current view panel.
+
+	* src/gui/menus/menubar.c:
+	* src/gui/menus/view.c:
+	* src/gui/menus/view.h:
+	Update menus on view change.
+
+	* src/gui/panels/panel.c:
+	* src/gui/panels/panel.h:
+	Connect the "switch-widget" signal to each created dock station.
+
 12-01-14  Cyrille Bagard <nocbos@gmail.com>
 
 	* src/arch/immediate.c:
diff --git a/src/editor.c b/src/editor.c
index 284b16c..936b9a1 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -143,7 +143,7 @@ void update_debug_menu_items(GObject *, gboolean);
 
 
 /* Réagit au changement d'onglet d'un panneau quelconque. */
-static void on_dock_item_switch(GtkDockPanel *, GDockItem *, GObject *);
+static void on_dock_item_switch(GtkDockPanel *, GtkWidget *, GObject *);
 
 /* Met en concordance les menus avec l'édition courante. */
 static void refresh_editor_menus(GObject *, GOpenidaBinary *, GtkBinView *);
@@ -263,6 +263,8 @@ GtkWidget *create_editor(void)
     /* Intégration des menus */
 
     editem = g_menu_bar_new(ref, accgroup);
+    register_editor_item(editem);
+
     menuboard = g_editor_item_get_widget(editem);
     gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0);
 
@@ -463,7 +465,7 @@ GtkWidget *create_editor(void)
     {
         GtkWidget *support;
 
-        support = init_panels2();
+        support = init_panels2(G_CALLBACK(on_dock_item_switch), ref);
         gtk_box_pack_start(GTK_BOX(vbox1), support, TRUE, TRUE, 0);
 
         load_main_panels();
@@ -1416,14 +1418,11 @@ void update_debug_menu_items(GObject *ref, gboolean stopped)
 *                                                                             *
 ******************************************************************************/
 
-static void on_dock_item_switch(GtkDockPanel *panel, GDockItem *item, GObject *ref)
+static void on_dock_item_switch(GtkDockPanel *panel, GtkWidget *widget, GObject *ref)
 {
-    GtkWidget *widget;                      /* Support réel à traiter      */
     GOpenidaBinary *old_binary;             /* Ancien binaire édité        */
     GOpenidaBinary *binary;                 /* Binaire en cours d'édition  */
 
-    widget = g_dock_item_get_panel(item);
-
     if (GTK_IS_SCROLLED_WINDOW(widget))
         widget = gtk_bin_get_child(GTK_BIN(widget));
 
@@ -1439,15 +1438,15 @@ static void on_dock_item_switch(GtkDockPanel *panel, GDockItem *item, GObject *r
 
         if (old_binary != binary)
         {
-            notify_panels_of_binary_change(binary);
+            //notify_panels_of_binary_change(binary);
             change_editor_items_current_binary(ref, binary);
         }
 
         change_editor_items_current_view(ref, GTK_VIEW_PANEL(widget));
 
-        refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget));
+        //refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget));
 
-        notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false);
+        //notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false);
 
     }
 
diff --git a/src/gtkext/gtkbufferview-int.h b/src/gtkext/gtkbufferview-int.h
index 31b911e..db27b9e 100644
--- a/src/gtkext/gtkbufferview-int.h
+++ b/src/gtkext/gtkbufferview-int.h
@@ -40,9 +40,6 @@ struct _GtkBufferView
     GCodeBuffer *buffer;                    /* Code sous forme de texte    */
     GBufferView *buffer_view;               /* Affichage de cette forme    */
 
-    bool *display_addr;                     /* Affichage des adresses ?    */
-    bool *display_code;                     /* Affichage du code binaire ? */
-
     gint line_height;                       /* Hauteur maximale des lignes */
     gint left_margin;                       /* Marge gauche + espace       */
     gint left_text;                         /* Début d'impression du code  */
diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c
index 6a2e93d..3e58500 100644
--- a/src/gtkext/gtkbufferview.c
+++ b/src/gtkext/gtkbufferview.c
@@ -181,7 +181,8 @@ static void gtk_buffer_view_size_request(GtkWidget *widget, GtkRequisition *requ
     if (view->buffer_view != NULL)
         g_buffer_view_get_size(view->buffer_view,
                                &requisition->width, &requisition->height,
-                               *view->display_addr, *view->display_code);
+                               *GTK_VIEW_PANEL(view)->display_addr,
+                               *GTK_VIEW_PANEL(view)->display_code);
 
 }
 
@@ -225,7 +226,7 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo
     view = GTK_BUFFER_VIEW(widget);
 
     g_buffer_view_get_size(view->buffer_view, &width, &height,
-                           *view->display_addr, *view->display_code);
+                           *panel->display_addr, *panel->display_code);
 
     gtk_view_panel_compute_allocation(panel, &valloc);
 
@@ -324,7 +325,7 @@ static gboolean gtk_buffer_view_expose(GtkWidget *widget, GdkEventExpose *event)
 
     if (view->buffer_view != NULL)
         g_buffer_view_draw(view->buffer_view, event, pview->gc, fake_x, fake_y,
-                           *view->display_addr, *view->display_code);
+                           *pview->display_addr, *pview->display_code);
 
     gdk_window_end_paint(drawable);
 
@@ -383,9 +384,6 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GCodeBuffer *buffer, boo
 
     view->buffer_view = g_buffer_view_new(view->buffer);
 
-    view->display_addr = addr;
-    view->display_code = code;
-
     //gdk_threads_enter();
 
     /* Taille des marges */
diff --git a/src/gtkext/gtkdockstation.c b/src/gtkext/gtkdockstation.c
index afea11d..4b837bc 100644
--- a/src/gtkext/gtkdockstation.c
+++ b/src/gtkext/gtkdockstation.c
@@ -29,6 +29,7 @@
 
 
 #include "easygtk.h"
+#include "iodamarshal.h"
 
 
 
@@ -61,6 +62,13 @@ G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_VBOX)
 
 static void gtk_dock_station_class_init(GtkDockStationClass *class)
 {
+    g_signal_new("switch-widget",
+                 GTK_TYPE_DOCK_STATION,
+                 G_SIGNAL_RUN_LAST,
+                 G_STRUCT_OFFSET(GtkDockStationClass, switch_widget),
+                 NULL, NULL,
+                 g_cclosure_user_marshal_VOID__OBJECT,
+                 G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
 
 }
 
@@ -175,7 +183,7 @@ static gboolean gtk_dock_station_switch_panel(GtkNotebook *notebook, GtkNotebook
 
     gtk_dock_panel_update_title(GTK_DOCK_STATION(data), widget, caption);
 
-    //g_signal_emit_by_name(GTK_DOCK_PANEL(data), "switch-item", ditem);
+    g_signal_emit_by_name(GTK_DOCK_STATION(data), "switch-widget", widget);
 
     return TRUE;
 
@@ -214,6 +222,9 @@ void gtk_dock_panel_add_widget(GtkDockStation *station, GtkWidget *widget, const
 
     gtk_dock_panel_update_title(station, widget, caption);
 
+    if (gtk_notebook_get_n_pages(station->notebook) == 1)
+        g_signal_emit_by_name(station, "switch-widget", widget);
+
 }
 
 
diff --git a/src/gtkext/gtkdockstation.h b/src/gtkext/gtkdockstation.h
index c92f43d..41adacc 100644
--- a/src/gtkext/gtkdockstation.h
+++ b/src/gtkext/gtkdockstation.h
@@ -59,6 +59,10 @@ struct _GtkDockStationClass
 {
     GtkVBoxClass parent_class;              /* Présence obligatoire en 1er */
 
+    /* Signaux */
+
+    void (* switch_widget) (GtkDockStation *, GtkWidget *);
+
 };
 
 
diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h
index 6ef3567..79f6f4c 100644
--- a/src/gtkext/gtkviewpanel-int.h
+++ b/src/gtkext/gtkviewpanel-int.h
@@ -56,6 +56,9 @@ struct _GtkViewPanel
     attach_binary_fc attach;                /* Association avec un binaire */
     scroll_fc scroll;                       /* Défilement du contenu       */
 
+    bool *display_addr;                     /* Affichage des adresses ?    */
+    bool *display_code;                     /* Affichage du code binaire ? */
+
 };
 
 /* Composant d'affichage générique (classe) */
diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c
index 7ffeccc..9ccf209 100644
--- a/src/gtkext/gtkviewpanel.c
+++ b/src/gtkext/gtkviewpanel.c
@@ -339,6 +339,9 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b
     g_object_ref(G_OBJECT(binary));
     panel->binary = binary;
 
+    panel->display_addr = addr;
+    panel->display_code = code;
+
     panel->attach(panel, binary, addr, code);
 
 }
@@ -348,6 +351,92 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b
 *                                                                             *
 *  Paramètres  : panel = composant GTK à consulter.                           *
 *                                                                             *
+*  Description : Indique si les adresses doivent apparaître dans le rendu.    *
+*                                                                             *
+*  Retour      : Consigne d'affichage.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel)
+{
+    return *panel->display_addr;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                state = nouvel état à prendre en compte.                     *
+*                                                                             *
+*  Description : Définit si les adresses doivent apparaître dans le rendu.    *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void gtk_view_panel_set_addresses_display(const GtkViewPanel *panel, bool state)
+{
+    if (*panel->display_addr != state)
+    {
+        *panel->display_addr = state;
+        gtk_widget_queue_draw(GTK_WIDGET(panel));
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                                                                             *
+*  Description : Indique si le code doit apparaître dans le rendu.            *
+*                                                                             *
+*  Retour      : Consigne d'affichage.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool gtk_view_panel_get_code_display(const GtkViewPanel *panel)
+{
+    return *panel->display_code;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                state = nouvel état à prendre en compte.                     *
+*                                                                             *
+*  Description : Définit si le code doit apparaître dans le rendu.            *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void gtk_view_panel_set_code_display(const GtkViewPanel *panel, bool state)
+{
+    if (*panel->display_code != state)
+    {
+        *panel->display_code = state;
+        gtk_widget_queue_draw(GTK_WIDGET(panel));
+    }
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : panel = composant GTK à consulter.                           *
+*                                                                             *
 *  Description : Fournit le binaire associé à la représentation.              *
 *                                                                             *
 *  Retour      : Représentation de contenu binaire.                           *
diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h
index d2b69af..6edee69 100644
--- a/src/gtkext/gtkviewpanel.h
+++ b/src/gtkext/gtkviewpanel.h
@@ -53,6 +53,18 @@ GType gtk_view_panel_get_type(void);
 /* Associe à un panneau d'affichage un binaire chargé. */
 void gtk_view_panel_attach_binary(GtkViewPanel *, GOpenidaBinary *, bool *, bool *);
 
+/* Indique si les adresses doivent apparaître dans le rendu. */
+bool gtk_view_panel_get_addresses_display(const GtkViewPanel *);
+
+/* Définit si les adresses doivent apparaître dans le rendu. */
+void gtk_view_panel_set_addresses_display(const GtkViewPanel *, bool);
+
+/* Indique si le code doit apparaître dans le rendu. */
+bool gtk_view_panel_get_code_display(const GtkViewPanel *);
+
+/* Définit si le code doit apparaître dans le rendu. */
+void gtk_view_panel_set_code_display(const GtkViewPanel *, bool);
+
 /* Fournit le binaire associé à la représentation. */
 GOpenidaBinary *gtk_view_panel_get_binary(const GtkViewPanel *);
 
diff --git a/src/gui/editem.c b/src/gui/editem.c
index ac3461c..4afd7bd 100644
--- a/src/gui/editem.c
+++ b/src/gui/editem.c
@@ -2,7 +2,7 @@
 /* OpenIDA - Outil d'analyse de fichiers binaires
  * editem.c - gestion des différents éléments réactifs de l'éditeurs
  *
- * Copyright (C) 2010-2011 Cyrille Bagard
+ * Copyright (C) 2010-2012 Cyrille Bagard
  *
  *  This file is part of OpenIDA.
  *
@@ -113,6 +113,25 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
 }
 
 
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : item = instance à consulter.                                 *
+*                                                                             *
+*  Description : Fournit l'affichage de binaire courant.                      *
+*                                                                             *
+*  Retour      : Instance en place ou NULL si aucune.                         *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *item)
+{
+    return g_object_get_data(item->ref, "current_view");
+
+}
+
+
 
 /* ---------------------------------------------------------------------------------- */
 /*                              MANIPULATION D'ENSEMBLES                              */
@@ -184,7 +203,7 @@ void change_editor_items_current_view(GObject *ref, GtkViewPanel *view)
     g_object_set_data(ref, "current_view", view);
 
     editem_list_for_each(iter, _editem_list)
-        if (iter->update_binary != NULL)
+        if (iter->update_view != NULL)
             iter->update_view(iter, view);
 
 }
diff --git a/src/gui/editem.h b/src/gui/editem.h
index 267a679..40be0c7 100644
--- a/src/gui/editem.h
+++ b/src/gui/editem.h
@@ -2,7 +2,7 @@
 /* OpenIDA - Outil d'analyse de fichiers binaires
  * editem.h - prototypes pour la gestion des différents éléments réactifs de l'éditeurs
  *
- * Copyright (C) 2010-2011 Cyrille Bagard
+ * Copyright (C) 2010-2012 Cyrille Bagard
  *
  *  This file is part of OpenIDA.
  *
@@ -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 l'affichage de binaire courant. */
+GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *);
+
 
 
 /* ---------------------------- MANIPULATION D'ENSEMBLES ---------------------------- */
diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c
index 62a3cbe..a847d40 100644
--- a/src/gui/menus/menubar.c
+++ b/src/gui/menus/menubar.c
@@ -38,6 +38,11 @@ struct _GMenuBar
 {
     GEditorItem parent;                     /* A laisser en premier        */
 
+    GtkWidget *file;                        /* Menu "Fichier"              */
+    GtkWidget *view;                        /* Menu "Affichage"            */
+    GtkWidget *debug;                       /* Menu "Débogage"             */
+    GtkWidget *help;                        /* Menu "Aide"                 */
+
 };
 
 
@@ -55,6 +60,9 @@ static void g_menu_bar_class_init(GMenuBarClass *);
 /* Initialise une instance de la barre de menus pour l'éditeur. */
 static void g_menu_bar_init(GMenuBar *);
 
+/* Lance une actualisation du fait d'un changement de vue. */
+static void update_menu_bar_for_view(GMenuBar *, GtkViewPanel *);
+
 
 
 /* Indique le type défini pour la barre de menus de la fenêtre principale. */
@@ -102,6 +110,8 @@ static void g_menu_bar_init(GMenuBar *bar)
     item->widget = gtk_menu_bar_new();
     gtk_widget_show(item->widget);
 
+    item->update_view = (update_item_view_fc)update_menu_bar_for_view;
+
 }
 
 
@@ -122,7 +132,6 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
 {
     GMenuBar *result;                       /* Structure à retourner       */
     GEditorItem *item;                      /* Autre version de l'élément  */
-    GtkWidget *menuitem;                    /* Elément de menu             */
 
     result = g_object_new(G_TYPE_MENU_BAR, NULL);
 
@@ -135,24 +144,44 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
 
     /* Fichier */
 
-    menuitem = build_menu_file(ref, accgroup);
-    gtk_container_add(GTK_CONTAINER(item->widget), menuitem);
+    result->file = build_menu_file(ref, accgroup);
+    gtk_container_add(GTK_CONTAINER(item->widget), result->file);
 
     /* Affichage */
 
-    menuitem = build_menu_view(ref, accgroup);
-    gtk_container_add(GTK_CONTAINER(item->widget), menuitem);
+    result->view = build_menu_view(ref, accgroup, result);
+    gtk_container_add(GTK_CONTAINER(item->widget), result->view);
 
     /* Débogage */
 
-    menuitem = build_menu_debug(ref, accgroup);
-    gtk_container_add(GTK_CONTAINER(item->widget), menuitem);
+    result->debug = build_menu_debug(ref, accgroup);
+    gtk_container_add(GTK_CONTAINER(item->widget), result->debug);
 
     /* Aide */
 
-    menuitem = build_menu_help(ref, accgroup);
-    gtk_container_add(GTK_CONTAINER(item->widget), menuitem);
+    result->help = build_menu_help(ref, accgroup);
+    gtk_container_add(GTK_CONTAINER(item->widget), result->help);
 
     return G_EDITOR_ITEM(result);
 
 }
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : bar  = barre de menus à actualiser.                          *
+*                view = nouveau panneau d'affichage actif.                    *
+*                                                                             *
+*  Description : Lance une actualisation du fait d'un changement de vue.      *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void update_menu_bar_for_view(GMenuBar *bar, GtkViewPanel *view)
+{
+    update_menu_view_for_view(bar->view, view, bar);
+
+}
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index d68ffa4..85e65f7 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -33,10 +33,10 @@
 
 
 /* Réagit avec le menu "Affichage -> Adresse virtuelle". */
-void mcb_view_vaddress(GtkCheckMenuItem *, gpointer);
+static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *);
 
 /* Réagit avec le menu "Affichage -> code binaire". */
-void mcb_view_code(GtkCheckMenuItem *, gpointer);
+static void mcb_view_code(GtkCheckMenuItem *, GMenuBar *);
 
 
 
@@ -44,6 +44,7 @@ void mcb_view_code(GtkCheckMenuItem *, gpointer);
 *                                                                             *
 *  Paramètres  : ref      = espace de référencement global.                   *
 *                accgroup = groupe d'accélérateurs pour les menus.            *
+*                bar      = barre de menu parente.                            *
 *                                                                             *
 *  Description : Construit le menu "Fichier".                                 *
 *                                                                             *
@@ -53,7 +54,7 @@ void mcb_view_code(GtkCheckMenuItem *, gpointer);
 *                                                                             *
 ******************************************************************************/
 
-GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup)
+GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
 {
     GtkWidget *result;                      /* Support à retourner         */
     GtkWidget *menubar;                     /* Support pour éléments       */
@@ -68,10 +69,12 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup)
     submenuitem = qck_create_menu_separator();
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    submenuitem = qck_create_check_menu_item(NULL, NULL, _("Virtual address"), G_CALLBACK(mcb_view_vaddress), result);
+    submenuitem = qck_create_check_menu_item(G_OBJECT(result), "addr", _("Virtual address"),
+                                             G_CALLBACK(mcb_view_addresses), bar);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
-    submenuitem = qck_create_check_menu_item(NULL, NULL, _("Binary code"), G_CALLBACK(mcb_view_code), result);
+    submenuitem = qck_create_check_menu_item(G_OBJECT(result), "code", _("Binary code"),
+                                             G_CALLBACK(mcb_view_code), bar);
     gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
 
     submenuitem = qck_create_menu_separator();
@@ -84,8 +87,52 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup)
 
 /******************************************************************************
 *                                                                             *
+*  Paramètres  : widget = menu principal à actualiser.                        *
+*                view   = nouveau panneau d'affichage actif.                  *
+*                bar    = barre de menu parente.                              *
+*                                                                             *
+*  Description : Lance une actualisation du fait d'un changement de vue.      *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar *bar)
+{
+    GtkWidget *submenuitem;                 /* Sous-élément de menu        */
+    bool status;                            /* Consigne d'affichage        */
+
+    /* Adresses virtuelles */
+
+    submenuitem = g_object_get_data(G_OBJECT(widget), "addr");
+
+    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_addresses), bar);
+
+    status = gtk_view_panel_get_addresses_display(view);
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
+
+    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_addresses), bar);
+
+    /* Code binaire */
+
+    submenuitem = g_object_get_data(G_OBJECT(widget), "code");
+
+    g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_code), bar);
+
+    status = gtk_view_panel_get_code_display(view);
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status);
+
+    g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_code), bar);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
 *  Paramètres  : menuitem = élément de menu ayant basculé.                    *
-*                data     = adresse de l'espace de référencement global.      *
+*                bar      = barre de menu parente.                            *
 *                                                                             *
 *  Description : Réagit avec le menu "Affichage -> Adresse virtuelle".        *
 *                                                                             *
@@ -95,27 +142,23 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup)
 *                                                                             *
 ******************************************************************************/
 
-void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data)
+static void mcb_view_addresses(GtkCheckMenuItem *menuitem, GMenuBar *bar)
 {
-#if 0
-    GtkBinView *binview;                  /* Zone de code principale     */
+    GtkViewPanel *panel;                    /* Affichage courant           */
     gboolean active;                        /* Etat de sélection du menu   */
 
-    /* FIXME : "binview" -> "current_view" */
-    return;
-
-    binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview"));
+    panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
     active = gtk_check_menu_item_get_active(menuitem);
 
-    gtk_binview_show_vaddress(binview, active);
-#endif
+    gtk_view_panel_set_addresses_display(panel, active);
+
 }
 
 
 /******************************************************************************
 *                                                                             *
 *  Paramètres  : menuitem = élément de menu ayant basculé.                    *
-*                data     = adresse de l'espace de référencement global.      *
+*                bar      = barre de menu parente.                            *
 *                                                                             *
 *  Description : Réagit avec le menu "Affichage -> code binaire".             *
 *                                                                             *
@@ -125,18 +168,14 @@ void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data)
 *                                                                             *
 ******************************************************************************/
 
-void mcb_view_code(GtkCheckMenuItem *menuitem, gpointer data)
+static void mcb_view_code(GtkCheckMenuItem *menuitem, GMenuBar *bar)
 {
-#if 0
-    GtkBinView *binview;                  /* Zone de code principale     */
+    GtkViewPanel *panel;                    /* Affichage courant           */
     gboolean active;                        /* Etat de sélection du menu   */
 
-    /* FIXME : "binview" -> "current_view" */
-    return;
-
-    binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview"));
+    panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar));
     active = gtk_check_menu_item_get_active(menuitem);
 
-    gtk_binview_show_code(binview, active);
-#endif
+    gtk_view_panel_set_code_display(panel, active);
+
 }
diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h
index 4da6a11..2bdc9b6 100644
--- a/src/gui/menus/view.h
+++ b/src/gui/menus/view.h
@@ -29,9 +29,15 @@
 #include <gtk/gtk.h>
 
 
+#include "menubar.h"
+
+
 
 /* Construit le menu "Fichier". */
-GtkWidget *build_menu_view(GObject *, GtkAccelGroup *);
+GtkWidget *build_menu_view(GObject *, GtkAccelGroup *, GMenuBar *);
+
+/* Lance une actualisation du fait d'un changement de vue. */
+void update_menu_view_for_view(GtkWidget *, GtkViewPanel *, GMenuBar *);
 
 
 
diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c
index 8cc79ce..584ec09 100644
--- a/src/gui/panels/panel.c
+++ b/src/gui/panels/panel.c
@@ -37,10 +37,14 @@
 
 
 
-/* Support de fond pour les composants */
+/* Support de fond pour les composants. */
 static GtkWidget *_support;
 
-/* Liste des panneaux en place */
+/* Procédure à appeler lors des changements de panneaux. */
+static GCallback _handler;
+static gpointer _data;
+
+/* Liste des panneaux en place. */
 static GPanelItem *_panels_list = NULL;
 
 
@@ -261,6 +265,7 @@ void g_panel_item_dock(GPanelItem *item)
         gtk_container_add(GTK_CONTAINER(_support), GTK_WIDGET(class->first));
 
         station = gtk_dock_station_new();
+        g_signal_connect(station, "switch-widget", _handler, _data);
 
         gtk_widget_show(station);
         gtk_container_add(GTK_CONTAINER(class->first), station);
@@ -425,6 +430,8 @@ static void create_panel_division(GtkWidget *parent, GtkWidget *child1, const ch
     if (!GTK_IS_DOCK_STATION(child1))
     {
         station = gtk_dock_station_new();
+        g_signal_connect(station, "switch-widget", _handler, _data);
+
         gtk_widget_show(station);
         gtk_dock_panel_add_widget(GTK_DOCK_STATION(station), child1, name1);
 
@@ -435,6 +442,8 @@ static void create_panel_division(GtkWidget *parent, GtkWidget *child1, const ch
     if (!GTK_IS_DOCK_STATION(child2))
     {
         station = gtk_dock_station_new();
+        g_signal_connect(station, "switch-widget", _handler, _data);
+
         gtk_widget_show(station);
         gtk_dock_panel_add_widget(GTK_DOCK_STATION(station), child2, name2);
 
@@ -609,7 +618,8 @@ static void _g_panel_item_dock(GtkWidget *base, GEditorItem *item, const char *p
 
 /******************************************************************************
 *                                                                             *
-*  Paramètres  : -                                                            *
+*  Paramètres  : handler = procédure à réveiller en cas de changements.       *
+*                data    = donnée à faire suivre.                             *
 *                                                                             *
 *  Description : Prépare le terrain pour l'affichage central.                 *
 *                                                                             *
@@ -619,7 +629,7 @@ static void _g_panel_item_dock(GtkWidget *base, GEditorItem *item, const char *p
 *                                                                             *
 ******************************************************************************/
 
-GtkWidget *init_panels2(void)
+GtkWidget *init_panels2(GCallback handler, gpointer data)
 {
     GtkWidget *result;                      /* Support à retourner         */
 
@@ -627,6 +637,8 @@ GtkWidget *init_panels2(void)
     gtk_widget_show(result);
 
     _support = result;
+    _handler = handler;
+    _data = data;
 
     return result;
 
diff --git a/src/gui/panels/panel.h b/src/gui/panels/panel.h
index afdce93..dd9ae5e 100644
--- a/src/gui/panels/panel.h
+++ b/src/gui/panels/panel.h
@@ -63,7 +63,7 @@ void g_panel_item_dock(GPanelItem *);
 
 
 /* Prépare le terrain pour l'affichage central. */
-GtkWidget *init_panels2(void);
+GtkWidget *init_panels2(GCallback, gpointer);
 
 /* Charge les principaux panneaux de l'éditeur. */
 void load_main_panels(void);
-- 
cgit v0.11.2-87-g4458