// 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);
}