// http://libros.es.gnome.org/librognome/librognome/librognome/x6592.html
#include <gtk/gtk.h>

GtkWidget *create_window ();
void create_tags (GtkTextBuffer * buffer);
void on_button_clear_clicked (GtkButton * button, gpointer user_data);
void on_button_cut_clicked (GtkButton * button, gpointer user_data);
void on_button_copy_clicked (GtkButton * button, gpointer user_data);
void on_button_paste_clicked (GtkButton * button, gpointer user_data);
void on_button_bold_clicked (GtkButton * button, gpointer user_data);
void on_button_underline_clicked (GtkButton * button, gpointer user_data);
void on_button_strike_clicked (GtkButton * button, gpointer user_data);
void on_button_color_clicked (GtkButton * button, gpointer user_data);

int
main (int argc, char *argv[])
{
    GtkWidget *window;

    gtk_init (&argc, &argv);
    window = create_window ();
    gtk_widget_show_all (window);

    gtk_main ();
    return 0;
}

GtkWidget *create_window ()
{
    GtkWidget *window;
    GtkWidget *vbox_main;
    GtkWidget *handlebox;
    GtkWidget *toolbar;
    GtkWidget *button_clear;
    GtkWidget *button_cut;
    GtkWidget *button_copy;
    GtkWidget *button_paste;
    GtkWidget *button_bold;
    GtkWidget *button_underline;
    GtkWidget *button_strike;
    GtkWidget *button_color;
    GtkWidget *scrolledwindow;
    GtkWidget *textview;
    GtkTextBuffer *buffer;

    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "Mini editor de texto");
    gtk_window_set_default_size (GTK_WINDOW (window), 400, 500);

    vbox_main = gtk_vbox_new (FALSE, 0);
    gtk_container_add (GTK_CONTAINER (window), vbox_main);

    handlebox = gtk_handle_box_new ();
    gtk_box_pack_start (GTK_BOX (vbox_main), handlebox, FALSE, FALSE, 0);

    toolbar = gtk_toolbar_new ();
    gtk_container_add (GTK_CONTAINER (handlebox), toolbar);

    button_clear = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),"gtk-clear",NULL,NULL, NULL, NULL, -1);
    button_cut = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-cut",NULL, NULL, NULL, NULL, -1);
    button_copy = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-copy",NULL,NULL, NULL, NULL, -1);
    button_paste = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-paste",NULL,NULL, NULL, NULL, -1);
    gtk_toolbar_append_space (GTK_TOOLBAR (toolbar));
    button_bold = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar), "gtk-bold",NULL,NULL, NULL, NULL, -1);
    button_underline = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),"gtk-underline",NULL,NULL, NULL, NULL, -1);
    button_strike = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),"gtk-strikethrough",NULL,NULL, NULL, NULL, -1);
    button_color = gtk_toolbar_insert_stock (GTK_TOOLBAR (toolbar),"gtk-select-color",NULL,NULL, NULL, NULL, -1);

    scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
    gtk_box_pack_start (GTK_BOX (vbox_main), scrolledwindow, TRUE,TRUE, 0);

    textview = gtk_text_view_new ();
    gtk_container_add (GTK_CONTAINER (scrolledwindow), textview);

    buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
    create_tags (buffer);

    g_signal_connect ((gpointer) window, "delete_event",G_CALLBACK (gtk_main_quit), NULL);
    g_signal_connect ((gpointer) button_clear, "clicked",G_CALLBACK (on_button_clear_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_cut, "clicked",G_CALLBACK (on_button_cut_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_copy, "clicked",G_CALLBACK (on_button_copy_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_paste, "clicked",G_CALLBACK (on_button_paste_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_bold, "clicked",G_CALLBACK (on_button_bold_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_underline, "clicked",G_CALLBACK (on_button_underline_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_strike, "clicked",G_CALLBACK (on_button_strike_clicked),(gpointer) textview);
    g_signal_connect ((gpointer) button_color, "clicked",G_CALLBACK (on_button_color_clicked),(gpointer) textview);
    return window;
}

void on_button_clear_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_delete_selection (textbuffer, TRUE, TRUE);
}

void on_button_cut_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_cut_clipboard (textbuffer,gtk_clipboard_get (GDK_NONE), TRUE);
}

void on_button_copy_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_copy_clipboard (textbuffer,gtk_clipboard_get (GDK_NONE));
}

void on_button_paste_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_paste_clipboard (textbuffer,gtk_clipboard_get (GDK_NONE),NULL, TRUE);
}

void on_button_bold_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;
    GtkTextIter start, end;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end);
    gtk_text_buffer_apply_tag_by_name (textbuffer, "bold", &start,&end);
}

void on_button_underline_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;
    GtkTextIter start, end;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end);
    gtk_text_buffer_apply_tag_by_name (textbuffer, "underline", &start, &end);
}


void on_button_strike_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;
    GtkTextIter start, end;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end);
    gtk_text_buffer_apply_tag_by_name (textbuffer, "strike", &start,&end);
}

void
on_button_color_clicked (GtkButton * button, gpointer user_data)
{
    GtkTextBuffer *textbuffer = NULL;
    GtkTextIter start, end;

    g_assert (GTK_IS_TEXT_VIEW (user_data));
    textbuffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (user_data));
    gtk_text_buffer_get_selection_bounds (textbuffer, &start, &end);
    gtk_text_buffer_apply_tag_by_name (textbuffer, "color", &start,&end);
}

void create_tags (GtkTextBuffer * buffer)
{
    g_assert (GTK_IS_TEXT_BUFFER (buffer));

    gtk_text_buffer_create_tag (buffer, "bold","weight", PANGO_WEIGHT_BOLD, NULL);
    gtk_text_buffer_create_tag (buffer, "underline","underline", PANGO_UNDERLINE_SINGLE,NULL);
    gtk_text_buffer_create_tag (buffer, "strike", "strikethrough",TRUE, NULL);
    gtk_text_buffer_create_tag (buffer, "color", "foreground", "blue",NULL);
}