/* Chrysalide - Outil d'analyse de fichiers binaires
 * named.c - préparation de composants à l'affichage avec leurs noms
 *
 * Copyright (C) 2020 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 Chrysalide.  If not, see .
 */
#include "named.h"
#include 
#include 
#include "named-int.h"
#include "../glibext/named-int.h"
/* ---------------------- PREPARATION VIS A VIS DE L'EXTERIEUR ---------------------- */
/* Procède à l'initialisation de l'afficheur générique. */
static void gtk_built_named_widget_class_init(GtkBuiltNamedWidgetClass *);
/* Procède à l'initialisation d'une préparation pour affichage. */
static void gtk_built_named_widget_init(GtkBuiltNamedWidget *);
/* Procède à l'initialisation de l'interface de composant nommé. */
static void gtk_built_named_widget_named_interface_init(GNamedWidgetInterface *);
/* Supprime toutes les références externes. */
static void gtk_built_named_widget_dispose(GtkBuiltNamedWidget *);
/* Procède à la libération totale de la mémoire. */
static void gtk_built_named_widget_finalize(GtkBuiltNamedWidget *);
/* -------------------------- INTERFACE DE COMPOSANT NOMME -------------------------- */
/* Fournit le désignation associée à un composant nommé. */
static char *gtk_built_named_widget_get_name(const GtkBuiltNamedWidget *, bool);
/* Fournit le composant associé à un composant nommé. */
static GtkWidget *gtk_built_named_widget_get_widget(const GtkBuiltNamedWidget *);
/* ---------------------------------------------------------------------------------- */
/*                        PREPARATION VIS A VIS DE L'EXTERIEUR                        */
/* ---------------------------------------------------------------------------------- */
/* Détermine le type des préparations de composant pour affichage avec noms. */
G_DEFINE_TYPE_WITH_CODE(GtkBuiltNamedWidget, gtk_built_named_widget, G_TYPE_OBJECT,
                        G_IMPLEMENT_INTERFACE(G_TYPE_NAMED_WIDGET, gtk_built_named_widget_named_interface_init));
/******************************************************************************
*                                                                             *
*  Paramètres  : class = classe GTK à initialiser.                            *
*                                                                             *
*  Description : Procède à l'initialisation de l'afficheur générique.         *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static void gtk_built_named_widget_class_init(GtkBuiltNamedWidgetClass *class)
{
    GObjectClass *object;                   /* Plus haut niveau équivalent */
    object = G_OBJECT_CLASS(class);
    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_built_named_widget_dispose;
    object->finalize = (GObjectFinalizeFunc)gtk_built_named_widget_finalize;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = composant GTK à initialiser.                        *
*                                                                             *
*  Description : Procède à l'initialisation d'une préparation pour affichage. *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static void gtk_built_named_widget_init(GtkBuiltNamedWidget *widget)
{
    widget->builder = NULL;
    widget->name = NULL;
    widget->lname = NULL;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : iface = interface GLib à initialiser.                        *
*                                                                             *
*  Description : Procède à l'initialisation de l'interface de composant nommé.*
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static void gtk_built_named_widget_named_interface_init(GNamedWidgetInterface *iface)
{
    iface->get_name = (get_named_widget_name_fc)gtk_built_named_widget_get_name;
    iface->get_widget = (get_named_widget_widget_fc)gtk_built_named_widget_get_widget;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = instance d'objet GLib à traiter.                    *
*                                                                             *
*  Description : Supprime toutes les références externes.                     *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static void gtk_built_named_widget_dispose(GtkBuiltNamedWidget *widget)
{
    g_clear_object(&widget->builder);
    G_OBJECT_CLASS(gtk_built_named_widget_parent_class)->dispose(G_OBJECT(widget));
}
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = instance d'objet GLib à traiter.                    *
*                                                                             *
*  Description : Procède à la libération totale de la mémoire.                *
*                                                                             *
*  Retour      : -                                                            *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static void gtk_built_named_widget_finalize(GtkBuiltNamedWidget *widget)
{
    if (widget->name != NULL)
        free(widget->name);
    if (widget->lname != NULL)
        free(widget->lname);
    G_OBJECT_CLASS(gtk_built_named_widget_parent_class)->finalize(G_OBJECT(widget));
}
/******************************************************************************
*                                                                             *
*  Paramètres  : name  = nom associé à l'élément.                             *
*                lname = description longue du panneau.                       *
*                path  = chemin vers la description d'un composant graphique. *
*                                                                             *
*  Description : Crée une préparation pour l'affichage d'un composant nommé.  *
*                                                                             *
*  Retour      : Adresse de la structure mise en place.                       *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
GtkBuiltNamedWidget *gtk_built_named_widget_new(const char *name, const char *lname, const char *path)
{
    GtkBuiltNamedWidget *result;            /* Instance à retourner        */
    result = g_object_new(GTK_TYPE_BUILT_NAMED_WIDGET, NULL);
    result->name = strdup(name);
    result->lname = strdup(lname);
    result->builder = gtk_builder_new_from_resource(path);
    return result;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : name  = nom associé à l'élément.                             *
*                lname = description longue du panneau.                       *
*                resid = indentificant d'une ressource pour un composant.     *
*                                                                             *
*  Description : Crée une préparation pour l'affichage d'un composant nommé.  *
*                                                                             *
*  Retour      : Adresse de la structure mise en place.                       *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
GtkBuiltNamedWidget *gtk_built_named_widget_new_for_panel(const char *name, const char *lname, const char *resid)
{
    GtkBuiltNamedWidget *result;            /* Instance à retourner        */
    char *path;                             /* Chemin d'accès à constituer */
    asprintf(&path, "/org/chrysalide/gui/panels/%s.ui", resid);
    result = gtk_built_named_widget_new(name, lname, path);
    free(path);
    return result;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = préparation de composant à consulter.               *
*                                                                             *
*  Description : Fournit le constructeur facilitant l'affichage.              *
*                                                                             *
*  Retour      : Constructeur mis en place.                                   *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
GtkBuilder *gtk_built_named_widget_get_builder(const GtkBuiltNamedWidget *widget)
{
    GtkBuilder *result;                     /* Constructeur à retourner    */
    result = widget->builder;
    if (result)
        g_object_ref(G_OBJECT(result));
    return result;
}
/* ---------------------------------------------------------------------------------- */
/*                            INTERFACE DE COMPOSANT NOMME                            */
/* ---------------------------------------------------------------------------------- */
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = composant nommé à consulter.                        *
*                lname  = précise s'il s'agit d'une version longue ou non.    *
*                                                                             *
*  Description : Fournit le désignation associée à un composant nommé.        *
*                                                                             *
*  Retour      : Description courante.                                        *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static char *gtk_built_named_widget_get_name(const GtkBuiltNamedWidget *widget, bool lname)
{
    char *result;                           /* Désignation à retourner     */
    if (lname)
        result = strdup(widget->lname);
    else
        result = strdup(widget->name);
    return result;
}
/******************************************************************************
*                                                                             *
*  Paramètres  : widget = composant nommé à consulter.                        *
*                                                                             *
*  Description : Fournit le composant associé à un composant nommé.           *
*                                                                             *
*  Retour      : Composant graphique GTK.                                     *
*                                                                             *
*  Remarques   : -                                                            *
*                                                                             *
******************************************************************************/
static GtkWidget *gtk_built_named_widget_get_widget(const GtkBuiltNamedWidget *widget)
{
    GtkWidget *result;                      /* Composant GTK à renvoyer    */
    result = GTK_WIDGET(gtk_builder_get_object(widget->builder, "box"));
    g_object_ref(G_OBJECT(result));
    if (gtk_widget_get_parent(result))
        gtk_widget_unparent(result);
    return result;
}