From e56a0553f710235d829f36b1edbf3cea00148a98 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 25 Jul 2015 20:14:23 +0000 Subject: Created an (empty) panel for evolution history. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@557 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 28 +++++ src/gtkext/easygtk.c | 81 ++++++++++++ src/gtkext/easygtk.h | 3 + src/gtkext/theme.c | 1 + src/gui/panels/Makefile.am | 1 + src/gui/panels/history.c | 308 +++++++++++++++++++++++++++++++++++++++++++++ src/gui/panels/history.h | 65 ++++++++++ src/gui/panels/panel.c | 4 + src/gui/panels/symbols.c | 10 +- themes/clean.png | Bin 0 -> 741 bytes themes/icons.css | 27 ++++ themes/redo.png | Bin 0 -> 617 bytes themes/undo.png | Bin 0 -> 602 bytes 13 files changed, 523 insertions(+), 5 deletions(-) create mode 100644 src/gui/panels/history.c create mode 100644 src/gui/panels/history.h create mode 100644 themes/clean.png create mode 100644 themes/icons.css create mode 100644 themes/redo.png create mode 100644 themes/undo.png diff --git a/ChangeLog b/ChangeLog index 1463aad..5c8bbd4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +15-07-25 Cyrille Bagard + + * src/gtkext/easygtk.c: + * src/gtkext/easygtk.h: + Create a wrapper to provide buttons with images from CSS. + + * src/gtkext/theme.c: + Load an extra style from the 'icons.css' file. + + * src/gui/panels/history.c: + * src/gui/panels/history.h: + New entries: create an (empty) panel for evolution history. + + * src/gui/panels/Makefile.am: + Add the 'history.[ch]' files to libguipanels_la_SOURCES. + + * src/gui/panels/panel.c: + Update code. + + * src/gui/panels/symbols.c: + Typo. + + * themes/clean.png: + * themes/icons.css: + * themes/redo.png: + * themes/undo.png: + New entries: define a style for button pictures. + 15-07-24 Cyrille Bagard * src/analysis/binary.c: diff --git a/src/gtkext/easygtk.c b/src/gtkext/easygtk.c index fa99f38..fcbaa19 100644 --- a/src/gtkext/easygtk.c +++ b/src/gtkext/easygtk.c @@ -401,6 +401,87 @@ GtkWidget *qck_create_button_with_img(GObject *object, const char *name, const c * * * Paramètres : object = espace dédié à l'inscription de références. * * name = nom à donner au nouveau composant. * +* image = nom de l'image stockée dans GTK. * +* label = contenu de l'étiquette éventuelle associée. * +* handler = éventuelle fonction de sélection associée. * +* data = données à transmettre avec l'événement si besoin. * +* * +* Description : Crée et enregistre un composant 'GtkButton'. * +* * +* Retour : Simple bouton mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkWidget *qck_create_button_with_css_img(GObject *object, const char *name, const char *image, const char *label, GCallback handler, gpointer data) +{ + GtkWidget *result; /* Résultat à renvoyer */ + GtkWidget *picture; /* Image de représentation */ + GtkWidget *caption; /* Etiquette à coller */ + GtkWidget *hbox; /* Séparation horizontale */ + + result = gtk_button_new(); + gtk_widget_set_can_default(result, TRUE); + + /* Création des éléments internes */ + + if (image != NULL) + { + picture = gtk_image_new(); + gtk_widget_show(picture); + + gtk_widget_set_name(picture, image); + + } + + if (label != NULL) + { + caption = gtk_label_new_with_mnemonic(label); + gtk_widget_show(caption); + } + + /* Mise en place */ + + if (image != NULL && label != NULL) + { + hbox = gtk_hbox_new(FALSE, 2); + gtk_widget_show(hbox); + gtk_container_add(GTK_CONTAINER(result), hbox); + + gtk_box_pack_start(GTK_BOX(hbox), picture, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(hbox), caption, FALSE, FALSE, 0); + + } + + else if (image != NULL) + gtk_container_add(GTK_CONTAINER(result), picture); + + else /*if (label != NULL)*/ + gtk_container_add(GTK_CONTAINER(result), caption); + + /* Interactions GTK... */ + + if (G_IS_OBJECT(object) && name != NULL) + { + g_object_ref(G_OBJECT(result)); + g_object_set_data_full(object, name, result, (GDestroyNotify)g_object_unref); + } + + gtk_widget_show(result); + + if (handler != NULL) + g_signal_connect(result, "clicked", handler, data); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : object = espace dédié à l'inscription de références. * +* name = nom à donner au nouveau composant. * * caption = désignation apparaîssant sur le corps de l'objet. * * handler = éventuelle fonction de sélection associée. * * data = données à transmettre avec l'événement si besoin. * diff --git a/src/gtkext/easygtk.h b/src/gtkext/easygtk.h index 65d1127..58229af 100644 --- a/src/gtkext/easygtk.h +++ b/src/gtkext/easygtk.h @@ -62,6 +62,9 @@ GtkWidget *qck_create_button(GObject *, const char *, const char *, GCallback, g /* Crée et enregistre un composant 'GtkButton'. */ GtkWidget *qck_create_button_with_img(GObject *, const char *, const char *, GCallback, gpointer); +/* Crée et enregistre un composant 'GtkButton'. */ +GtkWidget *qck_create_button_with_css_img(GObject *, const char *, const char *, const char *, GCallback, gpointer); + /* Crée et enregistre un composant 'GtkCheckButton'. */ GtkWidget *qck_create_check_button(GObject *, const char *, const char *, GCallback, gpointer); diff --git a/src/gtkext/theme.c b/src/gtkext/theme.c index 41e0b4a..ba846bb 100644 --- a/src/gtkext/theme.c +++ b/src/gtkext/theme.c @@ -63,6 +63,7 @@ bool load_extra_gtk_theme(void) static const char *css_files[] = { "portions.css", "segments.css", + "icons.css", NULL }; diff --git a/src/gui/panels/Makefile.am b/src/gui/panels/Makefile.am index ad8c6b2..70cf597 100644 --- a/src/gui/panels/Makefile.am +++ b/src/gui/panels/Makefile.am @@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libguipanels.la libguipanels_la_SOURCES = \ bookmarks.h bookmarks.c \ glance.h glance.c \ + history.h history.c \ log.h log.c \ panel.h panel.c \ regedit.h regedit.c \ diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c new file mode 100644 index 0000000..a827961 --- /dev/null +++ b/src/gui/panels/history.c @@ -0,0 +1,308 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * history.c - panneau de la liste des évolutions d'utilisateur(s) + * + * Copyright (C) 2008-2013 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "history.h" + + +#include + + +#include + + +#include "panel-int.h" +#include "../../gtkext/easygtk.h" + + + +/* Panneau de la liste des évolutions utilisateur(s) (instance) */ +struct _GHistoryPanel +{ + GPanelItem parent; /* A laisser en premier */ + + GtkTreeView *treeview; /* Composant d'affichage */ + GtkTreeStore *store; /* Modèle de gestion */ + + GLoadedBinary *binary; /* Binaire à prendre en compte */ + +}; + +/* Panneau de la liste des évolutions utilisateur(s) (classe) */ +struct _GHistoryPanelClass +{ + GPanelItemClass parent; /* A laisser en premier */ + +}; + + +/* Colonnes de la liste des évolutions */ +typedef enum _HistoryColumn +{ + HTC_ITEM, /* Elément d'évolution */ + + HTC_PICTURE, /* Image de représentation */ + HTC_LABEL, /* Désignation humaine */ + + HTC_COUNT /* Nombre de colonnes */ + +} HistoryColumn; + + +/* Initialise la classe des panneaux de la liste des évolutions utilisateur(s). */ +static void g_history_panel_class_init(GHistoryPanelClass *); + +/* Initialise une instance de panneau d'aperçu de graphiques. */ +static void g_history_panel_init(GHistoryPanel *); + +/* Supprime toutes les références externes. */ +static void g_history_panel_dispose(GHistoryPanel *); + +/* Procède à la libération totale de la mémoire. */ +static void g_history_panel_finalize(GHistoryPanel *); + +/* Réagit à un changement d'affichage principal de contenu. */ +static void change_history_panel_current_binary(GHistoryPanel *, GLoadedBinary *); + + + +/* Indique le type définit pour un panneau d'aperçu de graphiques. */ +G_DEFINE_TYPE(GHistoryPanel, g_history_panel, G_TYPE_PANEL_ITEM); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des panneaux d'aperçu de graphiques. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_history_panel_class_init(GHistoryPanelClass *klass) +{ + GObjectClass *object; /* Autre version de la classe */ + GEditorItemClass *editem; /* Encore une autre vision... */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_history_panel_dispose; + object->finalize = (GObjectFinalizeFunc)g_history_panel_finalize; + + editem = G_EDITOR_ITEM_CLASS(klass); + + editem->update_binary = (update_item_binary_fc)change_history_panel_current_binary; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance à initialiser. * +* * +* Description : Initialise une instance de panneau d'aperçu de graphiques. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_history_panel_init(GHistoryPanel *panel) +{ + GEditorItem *base; /* Version basique d'instance */ + GObject *ref; /* Espace de référencement */ + GtkWidget *scrollwnd; /* Support défilant */ + GtkWidget *treeview; /* Affichage de la liste */ + GtkWidget *box; /* Séparation horizontale */ + GtkWidget *button; /* Bouton de cette même barre */ + + base = G_EDITOR_ITEM(panel); + + base->widget = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); + gtk_container_set_border_width(GTK_CONTAINER(base->widget), 8); + gtk_widget_show(base->widget); + + ref = G_OBJECT(base->widget); + g_object_set_data(ref, "panel", panel); + + /* Liste des éléments d'évolution */ + + scrollwnd = gtk_scrolled_window_new(NULL, NULL); + gtk_widget_show(scrollwnd); + gtk_box_pack_start(GTK_BOX(base->widget), scrollwnd, TRUE, TRUE, 0); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); + + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); + + panel->store = gtk_tree_store_new(HTC_COUNT, G_TYPE_OBJECT, CAIRO_GOBJECT_TYPE_SURFACE, G_TYPE_STRING); + + treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(panel->store)); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); + gtk_tree_view_set_enable_tree_lines(GTK_TREE_VIEW(treeview), TRUE); + + panel->treeview = GTK_TREE_VIEW(treeview); + + gtk_widget_show(treeview); + gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); + + g_object_unref(G_OBJECT(panel->store)); + + /* Eléments de contrôle inférieurs */ + + box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); + gtk_widget_set_halign(box, GTK_ALIGN_CENTER); + gtk_widget_show(box); + gtk_box_pack_start(GTK_BOX(base->widget), box, FALSE, TRUE, 0); + + button = qck_create_button_with_css_img(NULL, NULL, "img-undo", _("Undo"), + G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); + + button = qck_create_button_with_css_img(NULL, NULL, "img-redo", _("Redo"), + G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); + + button = qck_create_button_with_css_img(NULL, NULL, "img-clean", _("Clean"), + G_CALLBACK(NULL), NULL); + gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_history_panel_dispose(GHistoryPanel *panel) +{ + if (panel->binary != NULL) + g_object_unref(G_OBJECT(panel->binary)); + + G_OBJECT_CLASS(g_history_panel_parent_class)->dispose(G_OBJECT(panel)); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_history_panel_finalize(GHistoryPanel *panel) +{ + G_OBJECT_CLASS(g_history_panel_parent_class)->finalize(G_OBJECT(panel)); + +} + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* * +* Description : Crée un panneau d'affichage des symboles. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GEditorItem *g_history_panel_new(GObject *ref) +{ + GEditorItem *result; /* Structure à retourner */ + + result = g_object_new(G_TYPE_HISTORY_PANEL, NULL); + + g_panel_item_init_ext(G_PANEL_ITEM(result), ref, PANEL_HISTORY_ID, + _("Change history"), G_EDITOR_ITEM(result)->widget, "eM"); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencement global. * +* * +* Description : Construit et intègre un panneau d'affichage des symboles. * +* * +* Retour : Adresse du panneau mis en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GPanelItem *create_history_panel(GObject *ref) +{ + GEditorItem *result; /* Elément réactif à renvoyer */ + + result = g_history_panel_new(ref); + + /* Enregistre correctement le tout */ + register_editor_item(result); + + return G_PANEL_ITEM(result); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau à mettre à jour. * +* binary = nouvelle instance de binaire analysé. * +* * +* Description : Réagit à un changement d'affichage principal de contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBinary *binary) +{ + + /* TODO */ + +} diff --git a/src/gui/panels/history.h b/src/gui/panels/history.h new file mode 100644 index 0000000..5b5b83b --- /dev/null +++ b/src/gui/panels/history.h @@ -0,0 +1,65 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * history.h - prototypes pour le panneau de la liste des évolutions d'utilisateur(s) + * + * Copyright (C) 2015 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _GUI_PANELS_HISTORY_H +#define _GUI_PANELS_HISTORY_H + + +#include + + +#include "panel.h" + + + +#define PANEL_HISTORY_ID _("History") + + +#define G_TYPE_HISTORY_PANEL g_history_panel_get_type() +#define G_HISTORY_PANEL(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_history_panel_get_type(), GHistoryPanel)) +#define G_IS_HISTORY_PANEL(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_history_panel_get_type())) +#define G_HISTORY_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_HISTORY_PANEL, GHistoryPanelClass)) +#define G_IS_HISTORY_PANEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_HISTORY_PANEL)) +#define G_HISTORY_PANEL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_HISTORY_PANEL, GHistoryPanelClass)) + + +/* Panneau de la liste des évolutions utilisateur(s) (instance) */ +typedef struct _GHistoryPanel GHistoryPanel; + +/* Panneau de la liste des évolutions utilisateur(s) (classe) */ +typedef struct _GHistoryPanelClass GHistoryPanelClass; + + +/* Indique le type définit pour un panneau d'affichage des symboles. */ +GType g_history_panel_get_type(void); + +/* Crée un panneau d'affichage des symboles. */ +GEditorItem *g_history_panel_new(GObject *); + +/* Construit et intègre un panneau d'affichage des symboles. */ +GPanelItem *create_history_panel(GObject *); + + + +#endif /* _GUI_PANELS_HISTORY_H */ diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c index 41d3b0a..8a46025 100644 --- a/src/gui/panels/panel.c +++ b/src/gui/panels/panel.c @@ -32,6 +32,7 @@ #include "bookmarks.h" #include "glance.h" +#include "history.h" #include "log.h" #include "panel-int.h" #include "regedit.h" @@ -383,6 +384,9 @@ void load_main_panels(GObject *ref) item = create_symbols_panel(ref); g_panel_item_dock(item); + item = create_history_panel(ref); + g_panel_item_dock(item); + item = create_strings_panel(ref); g_panel_item_dock(item); diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c index 9b32aa5..2a9d612 100644 --- a/src/gui/panels/symbols.c +++ b/src/gui/panels/symbols.c @@ -89,10 +89,10 @@ typedef enum _SymbolsColumn } SymbolsColumn; -/* Initialise la classe des panneaux d'aperçu de graphiques. */ +/* Initialise la classe des panneaux d'affichage des symboles. */ static void g_symbols_panel_class_init(GSymbolsPanelClass *); -/* Initialise une instance de panneau d'aperçu de graphiques. */ +/* Initialise une instance de panneau d'affichage des symboles. */ static void g_symbols_panel_init(GSymbolsPanel *); /* Supprime toutes les références externes. */ @@ -160,7 +160,7 @@ static bool is_symbol_filtered(GSymbolsPanel *, const GBinSymbol *); /* ---------------------------------------------------------------------------------- */ -/* Indique le type définit pour un panneau d'aperçu de graphiques. */ +/* Indique le type définit pour un panneau d'affichage des symboles. */ G_DEFINE_TYPE(GSymbolsPanel, g_symbols_panel, G_TYPE_PANEL_ITEM); @@ -168,7 +168,7 @@ G_DEFINE_TYPE(GSymbolsPanel, g_symbols_panel, G_TYPE_PANEL_ITEM); * * * Paramètres : klass = classe à initialiser. * * * -* Description : Initialise la classe des panneaux d'aperçu de graphiques. * +* Description : Initialise la classe des panneaux d'affichage des symboles. * * * * Retour : - * * * @@ -219,7 +219,7 @@ static void g_symbols_panel_class_init(GSymbolsPanelClass *klass) * * * Paramètres : panel = instance à initialiser. * * * -* Description : Initialise une instance de panneau d'aperçu de graphiques. * +* Description : Initialise une instance de panneau d'affichage des symboles. * * * * Retour : - * * * diff --git a/themes/clean.png b/themes/clean.png new file mode 100644 index 0000000..f8f8c78 Binary files /dev/null and b/themes/clean.png differ diff --git a/themes/icons.css b/themes/icons.css new file mode 100644 index 0000000..4986ab2 --- /dev/null +++ b/themes/icons.css @@ -0,0 +1,27 @@ + +#img-undo { + + background-image: url("undo.png"); + background-repeat: space; + + padding-right: 10px; + +} + +#img-redo { + + background-image: url("redo.png"); + background-repeat: space; + + padding-right: 10px; + +} + +#img-clean { + + background-image: url("clean.png"); + background-repeat: space; + + padding-right: 10px; + +} diff --git a/themes/redo.png b/themes/redo.png new file mode 100644 index 0000000..9fb3199 Binary files /dev/null and b/themes/redo.png differ diff --git a/themes/undo.png b/themes/undo.png new file mode 100644 index 0000000..55b8c34 Binary files /dev/null and b/themes/undo.png differ -- cgit v0.11.2-87-g4458