123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643 |
- // included by gt_demo.pas
- (* 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.
- *
- *)
- var
- text_window,
- text_egg_window : PGtkWidget;
- procedure easter_egg_callback (button : PGtkWidget;
- data : gpointer); forward; cdecl;
- const
- gray50_width = 2;
- gray50_height = 2;
- gray50_bits: array [0..1] of char = (#2, #1);
- procedure create_tags (buffer : PGtkTextBuffer);
- var
- stipple : PGdkBitmap;
- begin
- (* 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 affected by an earlier tag will override the earlier
- * tag. You can modify tag priorities with
- * gtk_text_tag_set_priority().
- *)
- gtk_text_buffer_create_tag (buffer, 'heading',
- 'weight', [ PANGO_WEIGHT_BOLD,
- 'size', 15 * PANGO_SCALE,
- NULL] );
- gtk_text_buffer_create_tag (buffer, 'italic',
- 'style', [PANGO_STYLE_ITALIC, NULL]);
- gtk_text_buffer_create_tag (buffer, 'bold',
- 'weight', [ PANGO_WEIGHT_BOLD, NULL] );
- gtk_text_buffer_create_tag (buffer, 'big',
- (* points times the PANGO_SCALE factor *)
- 'size', [ 20 * PANGO_SCALE, NULL] );
- gtk_text_buffer_create_tag (buffer, 'xx-small',
- 'scale',[ PANGO_SCALE_XX_SMALL, NULL] );
- gtk_text_buffer_create_tag (buffer, 'x-large',
- 'scale', [ PANGO_SCALE_X_LARGE, NULL] );
- gtk_text_buffer_create_tag (buffer, 'monospace',
- 'family', [ 'monospace', NULL]);
- gtk_text_buffer_create_tag (buffer, 'blue_foreground',
- 'foreground', [ 'blue', NULL] );
- gtk_text_buffer_create_tag (buffer, 'red_background',
- 'background', [ 'red', NULL] );
- stipple := gdk_bitmap_create_from_data (NULL,
- gray50_bits, gray50_width,
- gray50_height);
- gtk_text_buffer_create_tag (buffer, 'background_stipple',
- 'background_stipple',[ stipple, NULL] );
- gtk_text_buffer_create_tag (buffer, 'foreground_stipple',
- 'foreground_stipple', [stipple, NULL]);
- g_object_unref (pGObject(stipple));
- gtk_text_buffer_create_tag (buffer, 'big_gap_before_line',
- 'pixels_above_lines', [30, NULL]);
- gtk_text_buffer_create_tag (buffer, 'big_gap_after_line',
- 'pixels_below_lines', [30, NULL]);
- gtk_text_buffer_create_tag (buffer, 'double_spaced_line',
- 'pixels_inside_wrap', [10, NULL]);
- gtk_text_buffer_create_tag (buffer, 'not_editable',
- 'editable', [FALSE, NULL]);
- gtk_text_buffer_create_tag (buffer, 'word_wrap',
- 'wrap_mode', [GTK_WRAP_WORD, NULL]);
- gtk_text_buffer_create_tag (buffer, 'char_wrap',
- 'wrap_mode', [GTK_WRAP_CHAR, NULL]);
- gtk_text_buffer_create_tag (buffer, 'no_wrap',
- 'wrap_mode', [GTK_WRAP_NONE, NULL]);
- gtk_text_buffer_create_tag (buffer, 'center',
- 'justification', [GTK_JUSTIFY_CENTER, NULL]);
- gtk_text_buffer_create_tag (buffer, 'right_justify',
- 'justification', [GTK_JUSTIFY_RIGHT, NULL]);
- gtk_text_buffer_create_tag (buffer, 'wide_margins',
- 'left_margin', [50, 'right_margin', 50,
- NULL]);
- gtk_text_buffer_create_tag (buffer, 'strikethrough',
- 'strikethrough', [TRUE, NULL]);
- gtk_text_buffer_create_tag (buffer, 'underline',
- 'underline', [PANGO_UNDERLINE_SINGLE, NULL]);
- gtk_text_buffer_create_tag (buffer, 'double_underline',
- 'underline', [PANGO_UNDERLINE_DOUBLE, NULL]);
- gtk_text_buffer_create_tag (buffer, 'superscript',
- 'rise', [10 * PANGO_SCALE, (* 10 pixels *)
- 'size', 8 * PANGO_SCALE, (* 8 points *)
- NULL]);
- gtk_text_buffer_create_tag (buffer, 'subscript',
- 'rise', [-10 * PANGO_SCALE, (* 10 pixels *)
- 'size', 8 * PANGO_SCALE, (* 8 points *)
- NULL]);
- gtk_text_buffer_create_tag (buffer, 'rtl_quote',
- 'wrap_mode', [ GTK_WRAP_WORD,
- 'direction', GTK_TEXT_DIR_RTL,
- 'indent', 30,
- 'left_margin', 20,
- 'right_margin', 20,
- NULL]);
- end;
- procedure insert_text (buffer : PGtkTextBuffer);
- var
- iter,
- text_start,
- text_end : TGtkTextIter;
- pixbuf,
- scaled : PGdkPixbuf;
- filename : pchar;
- begin
- (* demo_find_file() looks in the the current directory first,
- * so you can run gtk-demo without installing GTK, then looks
- * in the location where the file is installed.
- *)
- pixbuf := NULL;
- filename := demo_find_file ('gtk-logo-rgb.gif', NULL);
- if filename <> NULL then
- begin
- pixbuf := gdk_pixbuf_new_from_file (filename, NULL);
- g_free (filename);
- end;
- if pixbuf = NULL then
- begin
- g_error ('Failed to load image file gtk-logo-rgb.gif'#13#10);
- exit;
- end;
- scaled := gdk_pixbuf_scale_simple (pixbuf, 32, 32, GDK_INTERP_BILINEAR);
- g_object_unref (pGObject(pixbuf));
- pixbuf := scaled;
- (* 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. '
- + 'It also supports multiple views of the same buffer; '
- + 'this demo is showing the same buffer in two places.'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Font styles. ', -1,
- 'heading');
- 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'); // test: left out last argument " NULL "
- gtk_text_buffer_insert (buffer, @iter, ', ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'bold', -1,
- 'bold');
- gtk_text_buffer_insert (buffer, @iter, ', or ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'monospace (typewriter)', -1,
- 'monospace');
- gtk_text_buffer_insert (buffer, @iter, ', or ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'big', -1,
- 'big');
- gtk_text_buffer_insert (buffer, @iter, ' text. ', -1);
- gtk_text_buffer_insert (buffer, @iter,
- 'It''s best not to hardcode specific text sizes; '
- + 'you can use relative sizes as with CSS, such as ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'xx-small', -1,
- 'xx-small');
- gtk_text_buffer_insert (buffer, @iter, ' or ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'x-large', -1,
- 'x-large');
- gtk_text_buffer_insert (buffer, @iter,
- ' to ensure that your program properly adapts if the user '
- + ' changes the default font size.'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Colors. ', -1,
- 'heading');
- gtk_text_buffer_insert (buffer, @iter, 'Colors such as ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'a blue foreground', -1,
- 'blue_foreground');
- gtk_text_buffer_insert (buffer, @iter, ' or ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'a red background', -1,
- 'red_background');
- 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, ' (select that to read it) can be used.'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Underline, strikethrough, and rise. ', -1,
- 'heading');
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'Strikethrough', -1,
- 'strikethrough');
- gtk_text_buffer_insert (buffer, @iter, ', ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'underline', -1,
- 'underline');
- gtk_text_buffer_insert (buffer, @iter, ', ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'double underline', -1,
- 'double_underline');
- gtk_text_buffer_insert (buffer, @iter, ', ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'superscript', -1,
- 'superscript');
- gtk_text_buffer_insert (buffer, @iter, ', and ', -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'subscript', -1,
- 'subscript');
- gtk_text_buffer_insert (buffer, @iter, ' are all supported.'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Images. ', -1,
- 'heading');
- gtk_text_buffer_insert (buffer, @iter, 'The buffer can have images in it: ', -1);
- gtk_text_buffer_insert_pixbuf (buffer, @iter, pixbuf);
- gtk_text_buffer_insert_pixbuf (buffer, @iter, pixbuf);
- gtk_text_buffer_insert_pixbuf (buffer, @iter, pixbuf);
- gtk_text_buffer_insert (buffer, @iter, ' for example.'#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Spacing. ', -1,
- 'heading', [NULL]);
- gtk_text_buffer_insert (buffer, @iter, 'You can adjust the amount of space before each line.'#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'This line has a whole lot of space before it.'#13#10, -1,
- 'big_gap_before_line', ['wide_margins', NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'You can also adjust the amount of space after each line; '
- + 'this line has a whole lot of space after it.'#13#10, -1,
- 'big_gap_after_line', ['wide_margins', NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'You can also adjust the amount of space between wrapped lines; '
- + 'this line has extra space between each wrapped line in the same paragraph. '
- + 'To show off wrapping, some filler text: the quick brown fox jumped over '
- + 'the lazy dog. Blah blah blah blah blah blah blah blah blah.'#13#10, -1,
- 'double_spaced_line', ['wide_margins', NULL]);
- gtk_text_buffer_insert (buffer, @iter, 'Also note that those lines have extra-wide margins.'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Editability. ', -1,
- 'heading', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'This line is ''locked down'' and can''t be edited by the user - '
- + 'just try it! You can''t delete this line.'#13#10#13#10, -1,
- 'not_editable', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Wrapping. ', -1,
- 'heading', [NULL]);
- gtk_text_buffer_insert (buffer, @iter,
- 'This line (and most of the others in this buffer) is word-wrapped, '
- + 'using the proper Unicode algorithm. Word wrap should work in all '
- + 'scripts and languages that GTK+ supports. Let''s make this a long '
- + 'paragraph to demonstrate: blah blah blah blah blah blah blah blah '
- + 'blah blah blah blah blah blah blah blah blah blah blah'#13#10#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'This line has character-based wrapping, and can wrap between '
- + 'any two character glyphs. Let''s make this a long paragraph to '
- + 'demonstrate: blah blah blah blah blah blah blah blah blah blah '
- + 'blah blah blah blah blah blah blah blah blah'#13#10#13#10, -1,
- 'char_wrap', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, PChar(
- 'This line has all wrapping turned off, so it makes the horizontal '
- + 'scrollbar appear.'#13#10#13#10#13#10), -1,
- 'no_wrap', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Justification. ', -1,
- 'heading', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- #13#10'This line has center justification.'#13#10, -1,
- 'center', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'This line has right justification.'#13#10, -1,
- 'right_justify', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- #13#10'This line has big wide margins. Text text text text text text '
- + 'text text text text text text text text text text text text text text '
- + 'text text text text text text text text text text text text text text '
- + 'text text.'#13#10, -1,'wide_margins', [NULL]);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter, 'Internationalization. ', -1,
- 'heading', [NULL]);
- gtk_text_buffer_insert (buffer, @iter,
- 'You can put all sorts of Unicode text in the buffer.'#13#10#13#10
- + 'German (Deutsch Süd) Grüß Gott'#13#10
- + 'Greek (Ελληνικά) Γειά σας'#13#10
- + 'Hebrew שלום'#13#10
- + 'Japanese (日本語)'#13#10#13#10
- + 'The widget properly handles bidirectional text, word wrapping, '
- + 'DOS/UNIX/Unicode paragraph separators, grapheme boundaries, '
- + 'and so on using the Pango internationalization framework.'#13#10, -1);
- gtk_text_buffer_insert (buffer, @iter, 'Here''s a word-wrapped quote in a right-to-left language:'#13#10, -1);
- gtk_text_buffer_insert_with_tags_by_name (buffer, @iter,
- 'وقد بدأ ثلاث من أكثر المؤسسات تقدما في '
- + 'شبكة اكسيون برامجها كمنظمات لا تسعى للربح، '
- + 'ثم تحولت في السنوات الخمس الماضية إلى مؤسسات '
- + 'مالية منظمة، وباتت جزءا من النظام المالي في '
- + 'بلدانها، ولكنها تتخصص في خدمة قطاع المشروعات الصغيرة. '
- + 'وأحد أكثر هذه المؤسسات نجاحا هو »بانكوسول« '
- + 'في بوليفيا.'#13#10#13#10, -1,
- 'rtl_quote', [NULL]);
- gtk_text_buffer_insert (buffer, @iter, 'You can put widgets in the buffer: Here''s a button: ', -1);
- gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter, ' and a menu: ', -1);
- gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter, ' and a scale: ', -1);
- gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter, ' and an animation: ', -1);
- gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter, ' finally a text entry: ', -1);
- gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter, '.'#13#10, -1);
- gtk_text_buffer_insert (buffer, @iter,
- #13#10#13#10'This demo doesn''t demonstrate all the GtkTextBuffer features; '
- + 'it leaves out, for example: invisible/hidden text (doesn''t work in GTK 2, but planned), '
- + '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, @text_start, @text_end);
- gtk_text_buffer_apply_tag_by_name (buffer, 'word_wrap', @text_start, @text_end);
- g_object_unref (pGObject(pixbuf));
- end;
- function find_anchor (iter : PGtkTextIter): gboolean; cdecl;
- begin
- while gtk_text_iter_forward_char (iter) do
- begin
- if gtk_text_iter_get_child_anchor (iter)<> NULL then
- exit (TRUE);
- end;
- end;
- procedure attach_widgets (text_view : PGtkWidget);
- var
- iter : TGtkTextIter;
- buffer : PGtkTextBuffer;
- i : integer;
- anchor : PGtkTextChildAnchor;
- widget,
- menu,
- menu_item : PGtkWidget;
- filename : pgchar;
- begin
- buffer := gtk_text_view_get_buffer (pGtkTextView(text_view));
- gtk_text_buffer_get_start_iter (buffer, @iter);
- i := 0;
- while find_anchor (@iter) do
- begin
- anchor := gtk_text_iter_get_child_anchor (@iter);
- case i of
- 0: begin
- widget := gtk_button_new_with_label ('Click Me');
- g_signal_connect (pGObject(widget), 'clicked',
- TGCallback(@easter_egg_callback),
- NULL);
- end;
- 1: begin
- menu := gtk_menu_new ();
- widget := gtk_option_menu_new ();
- menu_item := gtk_menu_item_new_with_label ('Option 1');
- gtk_menu_shell_append (pGtkMenuShell(menu), menu_item);
- menu_item := gtk_menu_item_new_with_label ('Option 2');
- gtk_menu_shell_append (pGtkMenuShell(menu), menu_item);
- menu_item := gtk_menu_item_new_with_label ('Option 3');
- gtk_menu_shell_append (pGtkMenuShell(menu), menu_item);
- gtk_option_menu_set_menu (pGtkOptionMenu(widget), menu);
- end;
- 2: begin
- widget := gtk_hscale_new (NULL);
- gtk_range_set_range (pGtkRange(widget), 0, 100);
- gtk_widget_set_size_request (widget, 70, -1);
- end;
- 3: begin
- filename := demo_find_file ('floppybuddy.gif', NULL);
- widget := gtk_image_new_from_file (filename);
- g_free (filename);
- end;
- 4: begin
- widget := gtk_entry_new ();
- end;
- else begin
- widget := NULL; (* avoids a compiler warning *)
- exit;
- end;
- end; {of case}
- if widget <> NULL then
- begin
- gtk_text_view_add_child_at_anchor (pGtkTextView(text_view), widget, anchor);
- gtk_widget_show_all (widget);
- end;
- inc(i);
- end; {of while}
- end;
- function do_textview : PGtkWidget;
- var
- vpaned,
- view1,
- view2,
- sw : PGtkWidget;
- buffer : PGtkTextBuffer;
- begin
- if text_window = NULL then
- begin
- text_window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_default_size (pGtkWindow(text_window), 450, 450);
- g_signal_connect (text_window, 'destroy',
- TGCallback(@gtk_widget_destroyed), @text_window);
- gtk_window_set_title (pGtkWindow(text_window), 'TextView');
- gtk_container_set_border_width (pGtkContainer(text_window), 0);
- vpaned := gtk_vpaned_new ();
- gtk_container_set_border_width (pGtkContainer(vpaned), 5);
- gtk_container_add (pGtkContainer(text_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 (pGtkTextView(view1));
- view2 := gtk_text_view_new_with_buffer (buffer);
- sw := gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (pGtkScrolledWindow(sw),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_paned_add1 (pGtkPaned(vpaned), sw);
- gtk_container_add (pGtkContainer(sw), view1);
- sw := gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (pGtkScrolledWindow(sw),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_paned_add2 (pGtkPaned(vpaned), sw);
- gtk_container_add (pGtkContainer(sw), view2);
- create_tags (buffer);
- insert_text (buffer);
- attach_widgets (view1);
- attach_widgets (view2);
- gtk_widget_show_all (vpaned);
- end;
- if not GTK_WIDGET_VISIBLE (text_window) then
- gtk_widget_show (text_window)
- else begin
- gtk_widget_destroy (text_window);
- text_window := NULL;
- end;
- do_textview := text_window;
- end;
- procedure recursive_attach_view (depth : integer;
- view : PGtkTextView;
- anchor : PGtkTextChildAnchor);
- var
- child_view,
- event_box,
- align : PGtkWidget;
- color : TGdkColor;
- begin
- if depth > 4 then
- exit;
- child_view := gtk_text_view_new_with_buffer (gtk_text_view_get_buffer (view));
- (* Event box is to add a black border around each child view *)
- event_box := gtk_event_box_new ();
- gdk_color_parse ('black', @color);
- gtk_widget_modify_bg (event_box, GTK_STATE_NORMAL, @color);
- align := gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_container_set_border_width (pGtkContainer(align), 1);
- gtk_container_add (pGtkContainer(event_box), align);
- gtk_container_add (pGtkContainer(align), child_view);
- gtk_text_view_add_child_at_anchor (view, event_box, anchor);
- recursive_attach_view (depth + 1, pGtkTextView(child_view), anchor);
- end;
- procedure easter_egg_callback(button : PGtkWidget;
- data : gpointer); cdecl;
- var
- sw,
- view : PGtkWidget;
- buffer : PGtkTextBuffer;
- iter : TGtkTextIter;
- anchor : PGtkTextChildAnchor;
- begin
- if text_egg_window <> NULL then
- begin
- gtk_window_present (pGtkWindow(text_egg_window));
- exit;
- end;
- buffer := gtk_text_buffer_new (NULL);
- gtk_text_buffer_get_start_iter (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter,
- 'This buffer is shared by a set of nested text views.'#13#10'Nested view:'#13#10, -1);
- anchor := gtk_text_buffer_create_child_anchor (buffer, @iter);
- gtk_text_buffer_insert (buffer, @iter,
- #13#10'Don''t do this in real applications, please.'#13#10, -1);
- view := gtk_text_view_new_with_buffer (buffer);
- recursive_attach_view (0, pGtkTextView(view), anchor);
- g_object_unref (pGObject(buffer));
- text_egg_window := gtk_window_new (GTK_WINDOW_TOPLEVEL);
- sw := gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (pGtkScrolledWindow(sw),
- GTK_POLICY_AUTOMATIC,
- GTK_POLICY_AUTOMATIC);
- gtk_container_add (pGtkContainer(text_egg_window), sw);
- gtk_container_add (pGtkContainer(sw), view);
- g_object_add_weak_pointer (pGObject(text_egg_window),
- gpointer (@text_egg_window));
- gtk_window_set_default_size (pGtkWindow(text_egg_window), 300, 400);
- gtk_widget_show_all (text_egg_window);
- end;
- // included by gt_demo.pas
|