/*
  Menu avancé
  http://www.gtk-fr.org/wakka.php?wiki=LesMenus
  gcc `pkg-config --cflags --libs gtk+-2.0` -o 25b 25b.c &&./25b
*/

#include <stdlib.h>
#include <gtk/gtk.h>

void OnQuitter(GtkWidget* widget, gpointer data);
void OnAbout(GtkWidget* widget, gpointer data);
void OnRadio(GtkWidget* widget, gpointer data);
void OnTearoff(GtkWidget* widget, gpointer data);
void OnCheck(GtkWidget* widget, gpointer data);

static GtkWidget *pRadioLabel;
static GtkWidget *pCheckLabel;
static GtkWidget *pTearoffLabel;

int main(int argc, char **argv)
{
    GtkWidget *pWindow;
    GtkWidget *pVBox;
    GtkWidget *pVBox2;
    GtkWidget *pMenuBar;
    GtkWidget *pMenu;
    GtkWidget *pMenuItem;
    GSList *pList;
    gchar *sTempLabel;

    gtk_init(&argc, &argv);

    /* Creation de la fenetre */
    pWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(pWindow), "GtkMenu");
    gtk_window_set_default_size(GTK_WINDOW(pWindow), 320, 200);
    g_signal_connect(G_OBJECT(pWindow), "destroy", G_CALLBACK(gtk_main_quit), NULL);

    /* Creation de la GtkVBox */
    pVBox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(pWindow), pVBox);

    /**** Creation du menu ****/

    /* ETAPE 1 */
    pMenuBar = gtk_menu_bar_new();
    /** Premier sous-menu **/
    /* ETAPE 2 */
    pMenu = gtk_menu_new();
    /* ETAPE 3 */

    /* GtkTearoffMenuItem */
    pMenuItem = gtk_tearoff_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    g_signal_connect(G_OBJECT(pMenuItem),"activate",G_CALLBACK(OnTearoff),(gpointer)pMenu);

    /* GtkImageMenuItem */
    pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_NEW,NULL);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN,NULL);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE,NULL);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_CLOSE,NULL);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    /* GtkSeparatorItem */
    pMenuItem = gtk_separator_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    /* GtkRadioMenuItem */
    pMenuItem = gtk_radio_menu_item_new_with_label(NULL, "Radio 1");
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem));
    /* Il est inutile ici d'utiliser le signal "toggled" */
    g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnRadio), NULL);

    pMenuItem = gtk_radio_menu_item_new_with_label(pList, "Radio 2");
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem));
    g_signal_connect(G_OBJECT(pMenuItem) ,"activate", G_CALLBACK(OnRadio), NULL);

    pMenuItem = gtk_radio_menu_item_new_with_label(pList, "Radio 3");
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    pList = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(pMenuItem));
    g_signal_connect(G_OBJECT(pMenuItem) ,"activate", G_CALLBACK(OnRadio), NULL);

    /* GtkSeparatorItem */
    pMenuItem = gtk_separator_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    /* GtkCheckMenuItem */
    pMenuItem = gtk_check_menu_item_new_with_label("Check");
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    g_signal_connect(G_OBJECT(pMenuItem),"toggled",G_CALLBACK(OnCheck),(gpointer)pMenu);

    /* GtkSeparatorItem */
    pMenuItem = gtk_separator_menu_item_new();
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    pMenuItem = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT,NULL);
    g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnQuitter), (GtkWidget*) pWindow);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);

    /* ETAPE 4 */
    pMenuItem = gtk_menu_item_new_with_label("Fichier");
    /* ETAPE 5 */
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu);
    /* ETAPE 6 */
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem);

    /** Deuxieme sous-menu **/
    /* ETAPE 2 */
    pMenu = gtk_menu_new();
    /* ETAPE 3 */
    pMenuItem = gtk_menu_item_new_with_label("A propos de...");
    g_signal_connect(G_OBJECT(pMenuItem), "activate", G_CALLBACK(OnAbout), (GtkWidget*) pWindow);
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenu), pMenuItem);
    /* ETAPE 4 */
    pMenuItem = gtk_menu_item_new_with_label("?");
    /* ETAPE 5 */
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(pMenuItem), pMenu);
    /* ETAPE 6 */
    gtk_menu_shell_append(GTK_MENU_SHELL(pMenuBar), pMenuItem);

    /* Creation de la deuxieme GtkVBox (pour les labels) */
    pVBox2 = gtk_vbox_new(FALSE, 0);

    pRadioLabel = gtk_label_new("Radio 1 est actif");
    gtk_box_pack_start(GTK_BOX(pVBox2), pRadioLabel, TRUE, TRUE, 0);

    sTempLabel = g_locale_to_utf8("Check est décoché", -1, NULL, NULL, NULL);
    pCheckLabel = gtk_label_new(sTempLabel);
    g_free(sTempLabel);
    gtk_box_pack_start(GTK_BOX(pVBox2), pCheckLabel, TRUE, TRUE, 0);

    //sTempLabel = g_locale_to_utf8("Menu attaché", -1, NULL, NULL, NULL);
    //pTearoffLabel = gtk_label_new(sTempLabel);
    //g_free(sTempLabel);
    pTearoffLabel = gtk_label_new("Menu attaché");

    gtk_box_pack_start(GTK_BOX(pVBox2), pTearoffLabel, TRUE, TRUE, 0);

    /* Ajout du menu a la fenetre */
    gtk_box_pack_start(GTK_BOX(pVBox), pMenuBar, FALSE, FALSE, 0);
    /* Ajout des labels a la fenetre */
    gtk_box_pack_start(GTK_BOX(pVBox), pVBox2, TRUE, TRUE, 0);

    gtk_widget_show_all(pWindow);

    gtk_main();

    return EXIT_SUCCESS;
}


void OnRadio(GtkWidget* widget, gpointer data)
{
    const gchar *sRadioName;
    gchar *sLabel;

    /* Recuperer le label du bouton radio active */
    sRadioName = gtk_label_get_label(GTK_LABEL(GTK_BIN(widget)->child));

    sLabel = g_strdup_printf("%s est actif",sRadioName);
    gtk_label_set_label(GTK_LABEL(pRadioLabel), sLabel);
    g_free(sLabel);
}

void OnCheck(GtkWidget* widget, gpointer data)
{
    gboolean bCoche;
    gchar *sLabel;
    gchar *sLabelUtf8;

    /* Savoir si le GtkCheckMenuItem est coche ou non */
    bCoche = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(widget));

    if(bCoche)
        sLabel = g_strdup("Check est coché");
    else
        sLabel = g_strdup("Check est décoché");

    sLabelUtf8 = g_locale_to_utf8(sLabel, -1, NULL, NULL, NULL);

    gtk_label_set_label(GTK_LABEL(pCheckLabel), sLabelUtf8);
    g_free(sLabel);
    g_free(sLabelUtf8);
}

void OnTearoff(GtkWidget* widget, gpointer data)
{
    gboolean bDetache;
    gchar *sLabel;
    gchar *sLabelUtf8;

    /* Savoir si le menu est detache ou non */
     bDetache = gtk_menu_get_tearoff_state(GTK_MENU(data));

    if(bDetache)
        sLabel = g_strdup("Menu détaché");
    else
        sLabel = g_strdup("Menu attaché");

    sLabelUtf8 = g_locale_to_utf8(sLabel, -1, NULL, NULL, NULL);

    gtk_label_set_label(GTK_LABEL(pTearoffLabel), sLabelUtf8);
    g_free(sLabel);
    g_free(sLabelUtf8);
}

void OnQuitter(GtkWidget* widget, gpointer data)
{
    GtkWidget *pQuestion;

    pQuestion = gtk_message_dialog_new(GTK_WINDOW(data),
        GTK_DIALOG_MODAL,
        GTK_MESSAGE_QUESTION,
        GTK_BUTTONS_YES_NO,
        "Voulez vous vraiment\n"
        "quitter le programme?");

    switch(gtk_dialog_run(GTK_DIALOG(pQuestion)))
    {
        case GTK_RESPONSE_YES:
            gtk_main_quit();
            break;
        case GTK_RESPONSE_NONE:
        case GTK_RESPONSE_NO:
            gtk_widget_destroy(pQuestion);
            break;
    }
}

void OnAbout(GtkWidget* widget, gpointer data)
{
    GtkWidget *pAbout;

    pAbout = gtk_message_dialog_new (GTK_WINDOW(data),
        GTK_DIALOG_MODAL,
        GTK_MESSAGE_INFO,
        GTK_BUTTONS_OK,
        "Cours GTK+ 2.0\n"
        "http://www.gtk-fr.org");

    gtk_dialog_run(GTK_DIALOG(pAbout));

    gtk_widget_destroy(pAbout);
}