/* Chrysalide - Outil d'analyse de fichiers binaires * panel.c - gestion des éléments réactifs spécifiques aux panneaux * * Copyright (C) 2012-2014 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide 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. * * Chrysalide 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 "panel.h" #include #include #include "panel-int.h" #include "../../common/extstr.h" #include "../../core/params.h" #include "../../gtkext/gtkdockable-int.h" /* Initialise la classe des éléments réactifs de l'éditeur. */ static void g_panel_item_class_init(GPanelItemClass *); /* Initialise une instance d'élément réactif pour l'éditeur. */ static void g_panel_item_init(GPanelItem *); /* Procède à l'initialisation de l'interface de rassemblement. */ static void g_panel_item_dockable_interface_init(GtkDockableInterface *); /* Fournit le nom court du composant encapsulable. */ static const char *gtk_panel_item_get_name(const GPanelItem *); /* Fournit le nom long du composant encapsulable. */ static const char *gtk_panel_item_get_desc(const GPanelItem *); /* Fournit le composant graphique intégrable dans un ensemble. */ static GtkWidget *gtk_panel_item_get_widget(GPanelItem *); /* Construit la chaîne d'accès à un élément de configuration. */ static char *gtk_panel_item_build_configuration_key(const GPanelItem *, const char *); /* Indique le type défini pour un élément destiné à un panneau. */ G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM, G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_panel_item_dockable_interface_init)) /****************************************************************************** * * * Paramètres : klass = classe à initialiser. * * * * Description : Initialise la classe des éléments réactifs de l'éditeur. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_panel_item_class_init(GPanelItemClass *klass) { g_signal_new("dock-request", G_TYPE_PANEL_ITEM, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GPanelItemClass, dock_request), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_signal_new("undock-request", G_TYPE_PANEL_ITEM, G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GPanelItemClass, undock_request), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); } /****************************************************************************** * * * Paramètres : item = instance à initialiser. * * * * Description : Initialise une instance d'élément réactif pour l'éditeur. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_panel_item_init(GPanelItem *item) { DL_LIST_ITEM_INIT(&item->link); item->personality = PIP_INVALID; } /****************************************************************************** * * * Paramètres : iface = interface GTK à initialiser. * * * * Description : Procède à l'initialisation de l'interface de rassemblement. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface) { iface->can_search = false; iface->can_be_closed = true; iface->get_name = (get_dockable_name_fc)gtk_panel_item_get_name; iface->get_desc = (get_dockable_desc_fc)gtk_panel_item_get_desc; iface->get_widget = (get_dockable_widget_fc)gtk_panel_item_get_widget; iface->update_filtered = (update_filtered_data_fc)NULL; } /****************************************************************************** * * * Paramètres : personality = nature du panneau à mettre en place. * * name = nom associé à l'élément. * * lname = description longue du panneau. * * widget = composant à présenter à l'affichage. * * startup = chargement au démarrage ? * * path = chemin vers la place idéale pour le futur panneau. * * * * Description : Crée un élément de panneau réactif. * * * * Retour : Adresse de la structure mise en place. * * * * Remarques : - * * * ******************************************************************************/ GPanelItem *g_panel_item_new(PanelItemPersonality personality, const char *name, const char *lname, GtkWidget *widget, bool startup, const char *path) { GPanelItem *result; /* Structure à retourner */ GEditorItem *parent; /* Autre version de l'élément */ result = g_object_new(G_TYPE_PANEL_ITEM, NULL); parent = G_EDITOR_ITEM(result); parent->name = name; parent->widget = widget; assert(personality > PIP_INVALID && personality < PIP_COUNT); result->personality = personality; result->lname = lname; result->dock_at_startup = startup; result->path = strdup(path); return result; } /****************************************************************************** * * * Paramètres : item = instance GTK dont l'interface est à consulter. * * * * Description : Fournit le nom court du composant encapsulable. * * * * Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * * * * Remarques : - * * * ******************************************************************************/ static const char *gtk_panel_item_get_name(const GPanelItem *item) { return G_EDITOR_ITEM(item)->name; } /****************************************************************************** * * * Paramètres : item = instance GTK dont l'interface est à consulter. * * * * Description : Fournit le nom long du composant encapsulable. * * * * Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * * * * Remarques : - * * * ******************************************************************************/ static const char *gtk_panel_item_get_desc(const GPanelItem *item) { return item->lname; } /****************************************************************************** * * * Paramètres : item = instance GTK dont l'interface est à consulter. * * * * Description : Fournit le composant graphique intégrable dans un ensemble. * * * * Retour : Composant graphique prêt à emploi. * * * * Remarques : - * * * ******************************************************************************/ static GtkWidget *gtk_panel_item_get_widget(GPanelItem *item) { return G_EDITOR_ITEM(item)->widget; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * attrib = élément de configuration à inclure dans le résultat.* * * * Description : Construit la chaîne d'accès à un élément de configuration. * * * * Retour : Chaîne de caractères à libérer après usage. * * * * Remarques : - * * * ******************************************************************************/ static char *gtk_panel_item_build_configuration_key(const GPanelItem *item, const char *attrib) { char *result; /* Construction à renvoyer */ const char *name; /* Nom court du panneau */ name = g_editor_item_get_name(G_EDITOR_ITEM(item)); asprintf(&result, "gui.panels.%s.%s", name, attrib); result = strrpl(result, " ", "_"); result = strlower(result); return result; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * config = configuration à compléter. * * * * Description : Met en place les bases de la configuration du panneau. * * * * Retour : Bilan de l'opération. * * * * Remarques : - * * * ******************************************************************************/ bool gtk_panel_item_setup_configuration(const GPanelItem *item, GGenConfig *config) { bool result; /* Bilan à retourner */ char *key; /* Clef d'accès à un paramètre */ GCfgParam *param; /* Paramètre chargé */ result = true; key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); param = g_generic_config_create_param(config, key, CPT_BOOLEAN, item->dock_at_startup); if (param == NULL) { result = false; goto gpisc_exit; } free(key); key = gtk_panel_item_build_configuration_key(item, "path"); param = g_generic_config_create_param(config, key, CPT_STRING, item->path); if (param == NULL) result = false; gpisc_exit: free(key); return result; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * config = configuration à charger. * * * * Description : Charge un panneau sur les bases de la configuration fournie. * * * * Retour : true, par conformité avec browse_all_item_panels(). * * * * Remarques : - * * * ******************************************************************************/ bool gtk_panel_item_apply_configuration(GPanelItem *item, GGenConfig *config) { char *key; /* Clef d'accès à un paramètre */ const char *new_path; /* Nouveau chemin de placement */ bool status; /* Statut de l'encapsulation */ key = gtk_panel_item_build_configuration_key(item, "path"); if (g_generic_config_get_value(config, key, &new_path)) { free(item->path); item->path = strdup(new_path); } free(key); key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); if (g_generic_config_get_value(config, key, &status)) { item->dock_at_startup = status; if (item->dock_at_startup) g_signal_emit_by_name(item, "dock-request"); } free(key); return true; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * * * Description : Fournit une indication sur la personnalité du panneau. * * * * Retour : Identifiant lié à la nature du panneau. * * * * Remarques : - * * * ******************************************************************************/ PanelItemPersonality gtk_panel_item_get_personality(const GPanelItem *item) { return item->personality; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * * * Description : Fournit le chemin d'accès à utiliser pour les encapsulations.* * * * Retour : Chemin d'accès défini. * * * * Remarques : - * * * ******************************************************************************/ const char *gtk_panel_item_get_path(const GPanelItem *item) { return item->path; } /****************************************************************************** * * * Paramètres : item = instance GTK à consulter. * * path = nouvelle emplacement d'inclusion. * * * * Description : Définit le chemin d'accès à utiliser pour les encapsulations.* * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void gtk_panel_item_set_path(GPanelItem *item, const char *path) { char *key; /* Clef d'accès à un paramètre */ free(item->path); item->path = strdup(path); key = gtk_panel_item_build_configuration_key(item, "path"); g_generic_config_set_value(get_main_configuration(), key, item->path); free(key); } /****************************************************************************** * * * Paramètres : item = instance GTK dont l'interface est à consulter. * * * * Description : Indique la définition d'un éventuel raccourci clavier. * * * * Retour : Description d'un raccourci ou NULL si aucun de défini. * * * * Remarques : - * * * ******************************************************************************/ const char *gtk_panel_item_get_key_bindings(const GPanelItem *item) { return G_PANEL_ITEM_GET_CLASS(item)->bindings; } /****************************************************************************** * * * Paramètres : item = composant à présenter à l'affichage. * * * * Description : Place un panneau dans l'ensemble affiché. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_panel_item_dock(GPanelItem *item) { assert(!item->docked); g_signal_emit_by_name(item, "dock-request"); if (G_PANEL_ITEM_GET_CLASS(item)->ack_dock != NULL) G_PANEL_ITEM_GET_CLASS(item)->ack_dock(item); } /****************************************************************************** * * * Paramètres : item = composant d'affichage à mettre à jour. * * status = nouvel état d'encapsulation. * * * * Description : Définit si le composant repose sur un support de l'éditeur. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_panel_item_set_dock_status(GPanelItem *item, bool status) { char *key; /* Clef d'accès à un paramètre */ item->docked = status; item->dock_at_startup = status; key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); g_generic_config_set_value(get_main_configuration(), key, item->dock_at_startup); free(key); } /****************************************************************************** * * * Paramètres : item = composant d'affichage à consulter. * * * * Description : Indique si le composant repose sur un support de l'éditeur. * * * * Retour : true si le composant est bien incrusté quelque part. * * * * Remarques : - * * * ******************************************************************************/ bool g_panel_item_is_docked(const GPanelItem *item) { return item->docked; } /****************************************************************************** * * * Paramètres : item = composant à retirer de l'affichage. * * * * Description : Supprime un panneau de l'ensemble affiché. * * * * Retour : - * * * * Remarques : - * * * ******************************************************************************/ void g_panel_item_undock(GPanelItem *item) { assert(item->docked); g_signal_emit_by_name(item, "undock-request"); if (G_PANEL_ITEM_GET_CLASS(item)->ack_undock != NULL) G_PANEL_ITEM_GET_CLASS(item)->ack_undock(item); }