diff options
author | Havoc Pennington <hp@src.gnome.org> | 2000-11-13 06:08:51 +0000 |
---|---|---|
committer | Havoc Pennington <hp@src.gnome.org> | 2000-11-13 06:08:51 +0000 |
commit | 1ddb7f30f641a3d6ab9d734707e3582ad2a5dd61 (patch) | |
tree | 4887faacab851d8ebb1d84dc3bd7a8ad7b194027 | |
parent | 9adcd8a4b8c961196c0bad6ca47bdfde8e6ce078 (diff) | |
download | gtk+-1ddb7f30f641a3d6ab9d734707e3582ad2a5dd61.tar.gz |
Forgot to add this file
-rw-r--r-- | demos/gtk-demo/textview.c | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/demos/gtk-demo/textview.c b/demos/gtk-demo/textview.c new file mode 100644 index 0000000000..d6ee7b4254 --- /dev/null +++ b/demos/gtk-demo/textview.c @@ -0,0 +1,275 @@ +/* Text Widget + * + * The GtkTextView widget displays a GtkTextBuffer. One GtkTextBuffer + * can be displayed by multiple GtkTextViews. This demo has two views + * displaying a single buffer, and shows off the widget's text + * formatting features. + * + */ + +#include <gtk/gtk.h> + +/* Don't copy this bad example; inline RGB data is always a better + * idea than inline XPMs. + */ +static char * book_open_xpm[] = { +"16 16 4 1", +" c None s None", +". c black", +"X c #808080", +"o c white", +" ", +" .. ", +" .Xo. ... ", +" .Xoo. ..oo. ", +" .Xooo.Xooo... ", +" .Xooo.oooo.X. ", +" .Xooo.Xooo.X. ", +" .Xooo.oooo.X. ", +" .Xooo.Xooo.X. ", +" .Xooo.oooo.X. ", +" .Xoo.Xoo..X. ", +" .Xo.o..ooX. ", +" .X..XXXXX. ", +" ..X....... ", +" .. ", +" "}; + +#define gray50_width 2 +#define gray50_height 2 +static char gray50_bits[] = { + 0x02, 0x01 +}; + +/* FIXME once TextTag is a GObject remove these awful hacks ;-) */ +#define g_object_set gtk_object_set +#undef G_OBJECT +#define G_OBJECT(x) ((void*)x) + +static void +create_tags (GtkTextBuffer *buffer) +{ + GtkTextTag *tag; + GdkBitmap *stipple; + + /* Create a bunch of tags. Note that it's also possible to + * create tags with gtk_text_tag_new() then add them to the + * tag table for the buffer, gtk_text_buffer_create_tag() is + * just a convenience function. Also note that you don't have + * to give tags a name; pass NULL for the name to create an + * anonymous tag. + * + * In any real app, another useful optimization would be to create + * a GtkTextTagTable in advance, and reuse the same tag table for + * all the buffers with the same tag set, instead of creating + * new copies of the same tags for every buffer. + * + * Tags are assigned default priorities in order of addition to the + * tag table. That is, tags created later that affect the same + * text property as an earlier tag will override the earlier tag. + * You can modify tag priorities with gtk_text_tag_set_priority(). + */ + + tag = gtk_text_buffer_create_tag (buffer, "italic"); + g_object_set (G_OBJECT (tag), "font", "sans italic", NULL); + + tag = gtk_text_buffer_create_tag (buffer, "bold"); + g_object_set (G_OBJECT (tag), "font", "sans bold", NULL); + + tag = gtk_text_buffer_create_tag (buffer, "big"); + g_object_set (G_OBJECT (tag), "font", "sans 120", NULL); + + tag = gtk_text_buffer_create_tag (buffer, "blue_foreground"); + g_object_set (G_OBJECT (tag), "foreground", "blue", NULL); + + tag = gtk_text_buffer_create_tag (buffer, "red_background"); + g_object_set (G_OBJECT (tag), "background", "red", NULL); + + stipple = gdk_bitmap_create_from_data (NULL, + gray50_bits, gray50_width, + gray50_height); + + tag = gtk_text_buffer_create_tag (buffer, "background_stipple"); + g_object_set (G_OBJECT (tag), "background_stipple", stipple, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "foreground_stipple"); + g_object_set (G_OBJECT (tag), "foreground_stipple", stipple, NULL); + + g_object_unref (G_OBJECT (stipple)); + + tag = gtk_text_buffer_create_tag (buffer, "big_gap_before_line"); + g_object_set (G_OBJECT (tag), "pixels_above_lines", 30, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "big_gap_after_line"); + g_object_set (G_OBJECT (tag), "pixels_below_lines", 30, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "double_spaced_line"); + g_object_set (G_OBJECT (tag), "pixels_inside_wrap", 10, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "not_editable"); + g_object_set (G_OBJECT (tag), "editable", FALSE, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "word_wrap"); + g_object_set (G_OBJECT (tag), "wrap_mode", GTK_WRAPMODE_WORD, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "char_wrap"); + g_object_set (G_OBJECT (tag), "wrap_mode", GTK_WRAPMODE_CHAR, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "no_wrap"); + g_object_set (G_OBJECT (tag), "wrap_mode", GTK_WRAPMODE_NONE, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "center"); + g_object_set (G_OBJECT (tag), "justify", GTK_JUSTIFY_CENTER, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "right_justify"); + g_object_set (G_OBJECT (tag), "justify", GTK_JUSTIFY_RIGHT, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "wide_margins"); + g_object_set (G_OBJECT (tag), + "left_margin", 50, "right_margin", 50, + NULL); + + tag = gtk_text_buffer_create_tag (buffer, "strikethrough"); + g_object_set (G_OBJECT (tag), "strikethrough", TRUE, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "underline"); + g_object_set (G_OBJECT (tag), "underline", PANGO_UNDERLINE_SINGLE, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "double_underline"); + g_object_set (G_OBJECT (tag), "underline", PANGO_UNDERLINE_DOUBLE, NULL); + + tag = gtk_text_buffer_create_tag (buffer, "superscript"); + g_object_set (G_OBJECT (tag), + "offset", 10, + "font", "Sans 8", + NULL); + + tag = gtk_text_buffer_create_tag (buffer, "subscript"); + g_object_set (G_OBJECT (tag), + "offset", -10, + "font", "Sans 8", + NULL); +} + +static void +insert_text (GtkTextBuffer *buffer) +{ + GtkTextIter iter; + GtkTextIter start, end; + + /* get start of buffer; each insertion will revalidate the + * iterator to point to just after the inserted text. + */ + gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0); + + gtk_text_buffer_insert (buffer, &iter, "The text widget can display text with all kinds of nifty attributes.\n", -1); + + gtk_text_buffer_insert (buffer, &iter, "For example, you can have ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "italic", -1, + "italic", NULL); + gtk_text_buffer_insert (buffer, &iter, ", ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "bold", -1, + "bold", NULL); + gtk_text_buffer_insert (buffer, &iter, ", or ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "huge", -1, + "big", NULL); + gtk_text_buffer_insert (buffer, &iter, " text. ", -1); + + gtk_text_buffer_insert (buffer, &iter, "Also, colors such as ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "a blue foreground", -1, + "blue_foreground", NULL); + gtk_text_buffer_insert (buffer, &iter, " or ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "a red background", -1, + "red_background", NULL); + gtk_text_buffer_insert (buffer, &iter, " or even ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "a stippled red background", -1, + "red_background", + "background_stipple", + NULL); + + gtk_text_buffer_insert (buffer, &iter, " or ", -1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, + "a stippled blue foreground on solid red background", -1, + "blue_foreground", + "red_background", + "foreground_stipple", + NULL); + gtk_text_buffer_insert (buffer, &iter, " can be used.\n", -1); + + + + + gtk_text_buffer_insert (buffer, &iter, "This demo doesn't even demonstrate all the GtkTextBuffer features; it leaves out, for example: invisible/hidden text, tab stops, application-drawn areas on the sides of the widget for displaying breakpoints and such...", -1); + + /* Apply word_wrap tag to whole buffer */ + gtk_text_buffer_get_bounds (buffer, &start, &end); + gtk_text_buffer_apply_tag_by_name (buffer, "word_wrap", &start, &end); +} + +void +do_textview (void) +{ + static GtkWidget *window = NULL; + + if (!window) + { + GtkWidget *vpaned; + GtkWidget *view1; + GtkWidget *view2; + GtkWidget *frame; + GtkTextBuffer *buffer; + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + + gtk_signal_connect (GTK_OBJECT (window), "destroy", + GTK_SIGNAL_FUNC(gtk_widget_destroyed), + &window); + + gtk_window_set_title (GTK_WINDOW (window), "TextView"); + gtk_container_set_border_width (GTK_CONTAINER (window), 0); + + vpaned = gtk_vpaned_new (); + gtk_container_set_border_width (GTK_CONTAINER(vpaned), 5); + gtk_container_add (GTK_CONTAINER (window), vpaned); + + /* For convenience, we just use the autocreated buffer from + * the first text view; you could also create the buffer + * by itself with gtk_text_buffer_new(), then later create + * a view widget. + */ + view1 = gtk_text_view_new (); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view1)); + view2 = gtk_text_view_new_with_buffer (buffer); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_widget_set_usize (frame, 300, 200); + gtk_paned_add1 (GTK_PANED (vpaned), frame); + + gtk_container_add (GTK_CONTAINER (frame), view1); + + frame = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME(frame), GTK_SHADOW_IN); + gtk_widget_set_usize (frame, 300, 200); + gtk_paned_add2 (GTK_PANED (vpaned), frame); + + gtk_container_add (GTK_CONTAINER (frame), view2); + + create_tags (buffer); + insert_text (buffer); + + gtk_widget_show_all (vpaned); + } + + if (!GTK_WIDGET_VISIBLE (window)) + gtk_widget_show (window); + else + gtk_widget_destroy (window); +} + |