diff options
| author | Cyrille Bagard <nocbos@gmail.com> | 2009-09-13 23:11:24 (GMT) | 
|---|---|---|
| committer | Cyrille Bagard <nocbos@gmail.com> | 2009-09-13 23:11:24 (GMT) | 
| commit | 1c4da24a1d4b96d58fee08e2be21198b22e7eef6 (patch) | |
| tree | a0723bd1948395413fa5a7a37a9405567e32c015 /src/editor.c | |
| parent | 18134387d5cb025703af8e1d07e0152784e31efc (diff) | |
Improved the editor window refreshing when several binaries are loaded.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@114 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/editor.c')
| -rw-r--r-- | src/editor.c | 129 | 
1 files changed, 117 insertions, 12 deletions
| diff --git a/src/editor.c b/src/editor.c index c026426..942e6f4 100644 --- a/src/editor.c +++ b/src/editor.c @@ -45,10 +45,11 @@  #include "gtkext/easygtk.h"  #include "gtkext/gtkextstatusbar.h"  #include "gtkext/gtkbinview.h" +#include "gtkext/gtkblockview.h"  #include "gtkext/gtkdockpanel.h"  #include "debug/debuggers.h" -#include "panel/panels.h" +#include "panels/panel.h" @@ -135,11 +136,11 @@ void update_debug_menu_items(GObject *, gboolean); +/* Réagit au changement d'onglet d'un panneau quelconque. */ +static void on_dock_item_switch(GtkDockPanel *, GtkDockItem *, GObject *); - - - - +/* Met en concordance les menus avec l'édition courante. */ +static void refresh_editor_menus(GObject *, GOpenidaBinary *, GtkBinView *); @@ -267,13 +268,13 @@ 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_change_support), result); +    submenuitem = qck_create_radio_menu_item(ref, "textview", 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_change_support), result); +    submenuitem = qck_create_radio_menu_item(ref, "graphview", 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); @@ -383,6 +384,12 @@ GtkWidget *create_editor(void)      g_object_set_data(G_OBJECT(result), "binpanel", dpanel);      gtk_widget_show(dpanel); + + +    g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref); + + +      gtk_paned_pack1(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);  #if 0 @@ -440,11 +447,13 @@ GtkWidget *create_editor(void)      dpanel = gtk_dock_panel_new();      gtk_widget_show(dpanel); +    g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref); +      gtk_paned_pack2(GTK_PANED(hpaned1), dpanel, TRUE, TRUE); -    ditem = gtk_dock_item_new(_("Symbols"), get_panel(PNT_SYMBOLS)); -    gtk_dock_panel_add_item(dpanel, ditem); +    place_all_panels_in_editor(dpanel); +      ditem = gtk_dock_item_new(_("Registers"), get_panel(PNT_REGISTERS));      gtk_dock_panel_add_item(dpanel, ditem); @@ -452,8 +461,6 @@ GtkWidget *create_editor(void) - -      /* Panneau inférieur */ @@ -785,7 +792,9 @@ void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref)          title = g_openida_binary_to_string(binary);          ditem = gtk_dock_panel_item_from_name(dpanel, strrchr(title, '/') + 1); -        gtk_dock_panel_replace_item_content(dpanel, ditem, panel); +        gtk_dock_item_set_panel(ditem, panel); + +        notify_panels_of_view_change(binview, true);      } @@ -1223,3 +1232,99 @@ void update_debug_menu_items(GObject *ref, gboolean stopped)      gtk_widget_set_sensitive(submenuitem, stopped);  } + + + + + + + + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : panel = panneau de support des éléments concerné.            * +*                item  = nouvel élément présenté à l'affichage.               * +*                ref   = adresse de l'espace de référencement global.         * +*                                                                             * +*  Description : Réagit au changement d'onglet d'un panneau quelconque.       * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void on_dock_item_switch(GtkDockPanel *panel, GtkDockItem *item, GObject *ref) +{ +    GtkWidget *widget;                      /* Support réel à traiter      */ +    GOpenidaBinary *binary;                 /* Binaire en cours d'édition  */ + +    widget = gtk_dock_item_get_panel(item); + +    if (GTK_IS_SCROLLED_WINDOW(widget)) +        widget = gtk_bin_get_child(GTK_BIN(widget)); + +    if (GTK_IS_VIEWPORT(widget)) +        widget = gtk_bin_get_child(GTK_BIN(widget)); + +    if (GTK_IS_BIN_VIEW(widget)) +    { +        binary = gtk_bin_view_get_binary(GTK_BIN_VIEW(widget)); + +        g_object_set_data(ref, "current_binary", binary); +        g_object_set_data(ref, "binview", widget); + +        refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget)); + +        notify_panels_of_view_change(GTK_BIN_VIEW(widget), false); + +    } + +} + + +/****************************************************************************** +*                                                                             * +*  Paramètres  : ref    = adresse de l'espace de référencement global.        * +*                binary = représentation de contenu binaire active.           * +*                view   = type de visualisation courante.                     * +*                                                                             * +*  Description : Met en concordance les menus avec l'édition courante.        * +*                                                                             * +*  Retour      : -                                                            * +*                                                                             * +*  Remarques   : -                                                            * +*                                                                             * +******************************************************************************/ + +static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinView *view) +{ +    GtkCheckMenuItem *menuitem;             /* Menu à coche à traiter      */ + +    /* Affichage : type de vue */ + +    menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview")); +    g_signal_handlers_disconnect_by_func(menuitem, G_CALLBACK(mcb_view_change_support), ref); + +    menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview")); +    g_signal_handlers_disconnect_by_func(menuitem, G_CALLBACK(mcb_view_change_support), ref); + +    if (GTK_IS_BLOCK_VIEW(view)) +    { +        menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview")); +        gtk_check_menu_item_set_active(menuitem, TRUE); +    } +    else +    { +        menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview")); +        gtk_check_menu_item_set_active(menuitem, TRUE); +    } + +    menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview")); +    g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref); + +    menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview")); +    g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref); + +} | 
