4 * PCB, interactive printed circuit board design
5 * Copyright (C) 1994,1995,1996 Thomas Nau
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 /* This module, gui-utils.c, was written by Bill Wilson and the functions
24 * here are Copyright (C) 2004 by Bill Wilson. These functions are utility
25 * functions which are taken from my other GPL'd projects gkrellm and
26 * gstocks and are copied here for the Gtk PCB port.
34 #include <gdk/gdkkeysyms.h>
36 #ifdef HAVE_LIBDMALLOC
40 /* Not a gui function, but no better place to put it...
43 dup_string (gchar
** dst
, const gchar
* src
)
45 if ((dst
== NULL
) || ((*dst
== NULL
) && (src
== NULL
)))
49 if (src
&& !strcmp (*dst
, src
))
53 *dst
= g_strdup (src
);
58 free_glist_and_data (GList
** list_head
)
62 if (*list_head
== NULL
)
64 for (list
= *list_head
; list
; list
= list
->next
)
67 g_list_free (*list_head
);
73 ghid_is_modifier_key_sym (gint ksym
)
75 if (ksym
== GDK_Shift_R
|| ksym
== GDK_Shift_L
76 || ksym
== GDK_Control_R
|| ksym
== GDK_Control_L
)
83 ghid_modifier_keys_state (GdkModifierType
* state
)
87 gboolean shift
, control
, mod1
;
88 GHidPort
*out
= &ghid_port
;
91 gdk_window_get_pointer (gtk_widget_get_window (out
->drawing_area
),
96 shift
= (mask
& GDK_SHIFT_MASK
);
97 control
= (mask
& GDK_CONTROL_MASK
);
98 mod1
= (mask
& GDK_MOD1_MASK
);
100 if (shift
&& !control
&& !mod1
)
102 else if (!shift
&& control
&& !mod1
)
103 mk
= CONTROL_PRESSED
;
104 else if (!shift
&& !control
&& mod1
)
106 else if (shift
&& control
&& !mod1
)
107 mk
= SHIFT_CONTROL_PRESSED
;
108 else if (shift
&& !control
&& mod1
)
109 mk
= SHIFT_MOD1_PRESSED
;
110 else if (!shift
&& control
&& mod1
)
111 mk
= CONTROL_MOD1_PRESSED
;
112 else if (shift
&& control
&& mod1
)
113 mk
= SHIFT_CONTROL_MOD1_PRESSED
;
121 ghid_button_state (GdkModifierType
* state
)
123 GdkModifierType mask
;
125 gboolean button1
, button2
, button3
;
126 GHidPort
*out
= &ghid_port
;
129 gdk_window_get_pointer (gtk_widget_get_window (out
->drawing_area
),
134 button1
= (mask
& GDK_BUTTON1_MASK
);
135 button2
= (mask
& GDK_BUTTON2_MASK
);
136 button3
= (mask
& GDK_BUTTON3_MASK
);
139 bs
= BUTTON1_PRESSED
;
141 bs
= BUTTON2_PRESSED
;
143 bs
= BUTTON3_PRESSED
;
145 bs
= NO_BUTTON_PRESSED
;
151 ghid_draw_area_update (GHidPort
* port
, GdkRectangle
* rect
)
153 gdk_window_invalidate_rect (gtk_widget_get_window (port
->drawing_area
),
159 ghid_get_color_name (GdkColor
* color
)
164 name
= g_strdup ("#000000");
166 name
= g_strdup_printf ("#%2.2x%2.2x%2.2x",
167 (color
->red
>> 8) & 0xff,
168 (color
->green
>> 8) & 0xff,
169 (color
->blue
>> 8) & 0xff);
174 ghid_map_color_string (char *color_string
, GdkColor
* color
)
176 static GdkColormap
*colormap
= NULL
;
177 GHidPort
*out
= &ghid_port
;
179 if (!color
|| !out
->top_window
)
181 if (colormap
== NULL
)
182 colormap
= gtk_widget_get_colormap (out
->top_window
);
183 if (color
->red
|| color
->green
|| color
->blue
)
184 gdk_colormap_free_colors (colormap
, color
, 1);
185 gdk_color_parse (color_string
, color
);
186 gdk_color_alloc (colormap
, color
);
191 ghid_entry_get_text (GtkWidget
* entry
)
196 s
= (gchar
*) gtk_entry_get_text (GTK_ENTRY (entry
));
197 while (*s
== ' ' || *s
== '\t')
205 ghid_check_button_connected (GtkWidget
* box
,
212 void (*cb_func
) (GtkToggleButton
*, gpointer
),
213 gpointer data
, gchar
* string
)
219 b
= gtk_check_button_new_with_label (string
);
220 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (b
), active
);
221 if (box
&& pack_start
)
222 gtk_box_pack_start (GTK_BOX (box
), b
, expand
, fill
, pad
);
223 else if (box
&& !pack_start
)
224 gtk_box_pack_end (GTK_BOX (box
), b
, expand
, fill
, pad
);
227 g_signal_connect (b
, "clicked", G_CALLBACK (cb_func
), data
);
233 ghid_button_connected (GtkWidget
* box
, GtkWidget
** button
,
234 gboolean pack_start
, gboolean expand
, gboolean fill
,
235 gint pad
, void (*cb_func
) (gpointer
), gpointer data
,
242 b
= gtk_button_new_with_label (string
);
243 if (box
&& pack_start
)
244 gtk_box_pack_start (GTK_BOX (box
), b
, expand
, fill
, pad
);
245 else if (box
&& !pack_start
)
246 gtk_box_pack_end (GTK_BOX (box
), b
, expand
, fill
, pad
);
249 g_signal_connect (b
, "clicked", G_CALLBACK (cb_func
), data
);
255 ghid_coord_entry (GtkWidget
* box
, GtkWidget
** coord_entry
, Coord value
,
256 Coord low
, Coord high
, enum ce_step_size step_size
,
257 gint width
, void (*cb_func
) (GHidCoordEntry
*, gpointer
),
258 gpointer data
, gboolean right_align
, gchar
* string
)
260 GtkWidget
*hbox
= NULL
, *label
, *entry_widget
;
261 GHidCoordEntry
*entry
;
265 hbox
= gtk_hbox_new (FALSE
, 0);
266 gtk_box_pack_start (GTK_BOX (box
), hbox
, FALSE
, FALSE
, 2);
270 entry_widget
= ghid_coord_entry_new (low
, high
, value
, Settings
.grid_unit
, step_size
);
272 *coord_entry
= entry_widget
;
274 gtk_widget_set_size_request (entry_widget
, width
, -1);
275 entry
= GHID_COORD_ENTRY (entry_widget
);
277 data
= (gpointer
) entry
;
279 g_signal_connect (G_OBJECT (entry_widget
), "value_changed",
280 G_CALLBACK (cb_func
), data
);
283 if (right_align
&& string
)
285 label
= gtk_label_new (string
);
286 gtk_misc_set_alignment (GTK_MISC (label
), 1.0, 0.5);
287 gtk_box_pack_start (GTK_BOX (box
), label
, TRUE
, TRUE
, 2);
289 gtk_box_pack_start (GTK_BOX (box
), entry_widget
, FALSE
, FALSE
, 2);
290 if (!right_align
&& string
)
292 label
= gtk_label_new (string
);
293 gtk_misc_set_alignment (GTK_MISC (label
), 0, 0.5);
294 gtk_box_pack_start (GTK_BOX (box
), label
, TRUE
, TRUE
, 2);
300 ghid_spin_button (GtkWidget
* box
, GtkWidget
** spin_button
, gfloat value
,
301 gfloat low
, gfloat high
, gfloat step0
, gfloat step1
,
302 gint digits
, gint width
,
303 void (*cb_func
) (GtkSpinButton
*, gpointer
), gpointer data
, gboolean right_align
,
306 GtkWidget
*hbox
= NULL
, *label
, *spin_but
;
312 hbox
= gtk_hbox_new (FALSE
, 0);
313 gtk_box_pack_start (GTK_BOX (box
), hbox
, FALSE
, FALSE
, 2);
316 adj
= (GtkAdjustment
*) gtk_adjustment_new (value
,
317 low
, high
, step0
, step1
, 0.0);
318 spin_but
= gtk_spin_button_new (adj
, 0.5, digits
);
320 *spin_button
= spin_but
;
322 gtk_widget_set_size_request (spin_but
, width
, -1);
323 spin
= GTK_SPIN_BUTTON (spin_but
);
324 gtk_spin_button_set_numeric (spin
, TRUE
);
326 data
= (gpointer
) spin
;
328 g_signal_connect (G_OBJECT (spin_but
), "value_changed",
329 G_CALLBACK (cb_func
), data
);
332 if (right_align
&& string
)
334 label
= gtk_label_new (string
);
335 gtk_misc_set_alignment (GTK_MISC (label
), 1.0, 0.5);
336 gtk_box_pack_start (GTK_BOX (box
), label
, TRUE
, TRUE
, 2);
338 gtk_box_pack_start (GTK_BOX (box
), spin_but
, FALSE
, FALSE
, 2);
339 if (!right_align
&& string
)
341 label
= gtk_label_new (string
);
342 gtk_misc_set_alignment (GTK_MISC (label
), 0, 0.5);
343 gtk_box_pack_start (GTK_BOX (box
), label
, TRUE
, TRUE
, 2);
349 ghid_table_coord_entry (GtkWidget
* table
, gint row
, gint column
,
350 GtkWidget
** coord_entry
, Coord value
,
351 Coord low
, Coord high
, enum ce_step_size step_size
,
352 gint width
, void (*cb_func
) (GHidCoordEntry
*, gpointer
),
353 gpointer data
, gboolean right_align
, gchar
* string
)
355 GtkWidget
*label
, *entry_widget
;
356 GHidCoordEntry
*entry
;
361 entry_widget
= ghid_coord_entry_new (low
, high
, value
, Settings
.grid_unit
, step_size
);
363 *coord_entry
= entry_widget
;
365 gtk_widget_set_size_request (entry_widget
, width
, -1);
366 entry
= GHID_COORD_ENTRY (entry_widget
);
368 data
= (gpointer
) entry
;
370 g_signal_connect (G_OBJECT (entry
), "value_changed",
371 G_CALLBACK (cb_func
), data
);
375 gtk_table_attach_defaults (GTK_TABLE (table
), entry_widget
,
376 column
+ 1, column
+ 2, row
, row
+ 1);
379 label
= gtk_label_new (string
);
380 gtk_misc_set_alignment (GTK_MISC (label
), 1.0, 0.5);
381 gtk_table_attach_defaults (GTK_TABLE (table
), label
,
382 column
, column
+ 1, row
, row
+ 1);
387 gtk_table_attach_defaults (GTK_TABLE (table
), entry_widget
,
388 column
, column
+ 1, row
, row
+ 1);
391 label
= gtk_label_new (string
);
392 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
393 gtk_table_attach_defaults (GTK_TABLE (table
), label
,
394 column
+ 1, column
+ 2, row
, row
+ 1);
401 ghid_table_spin_button (GtkWidget
* table
, gint row
, gint column
,
402 GtkWidget
** spin_button
, gfloat value
,
403 gfloat low
, gfloat high
, gfloat step0
, gfloat step1
,
404 gint digits
, gint width
,
405 void (*cb_func
) (GtkSpinButton
*, gpointer
), gpointer data
,
406 gboolean right_align
, gchar
* string
)
408 GtkWidget
*label
, *spin_but
;
415 adj
= (GtkAdjustment
*) gtk_adjustment_new (value
,
416 low
, high
, step0
, step1
, 0.0);
417 spin_but
= gtk_spin_button_new (adj
, 0.5, digits
);
420 *spin_button
= spin_but
;
422 gtk_widget_set_size_request (spin_but
, width
, -1);
423 spin
= GTK_SPIN_BUTTON (spin_but
);
424 gtk_spin_button_set_numeric (spin
, TRUE
);
426 data
= (gpointer
) spin
;
428 g_signal_connect (G_OBJECT (spin_but
), "value_changed",
429 G_CALLBACK (cb_func
), data
);
433 gtk_table_attach_defaults (GTK_TABLE (table
), spin_but
,
434 column
+ 1, column
+ 2, row
, row
+ 1);
437 label
= gtk_label_new (string
);
438 gtk_misc_set_alignment (GTK_MISC (label
), 1.0, 0.5);
439 gtk_table_attach_defaults (GTK_TABLE (table
), label
,
440 column
, column
+ 1, row
, row
+ 1);
445 gtk_table_attach_defaults (GTK_TABLE (table
), spin_but
,
446 column
, column
+ 1, row
, row
+ 1);
449 label
= gtk_label_new (string
);
450 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
451 gtk_table_attach_defaults (GTK_TABLE (table
), label
,
452 column
+ 1, column
+ 2, row
, row
+ 1);
458 ghid_range_control (GtkWidget
* box
, GtkWidget
** scale_res
,
459 gboolean horizontal
, GtkPositionType pos
,
460 gboolean set_draw_value
, gint digits
, gboolean pack_start
,
461 gboolean expand
, gboolean fill
, guint pad
, gfloat value
,
462 gfloat low
, gfloat high
, gfloat step0
, gfloat step1
,
463 void (*cb_func
) (), gpointer data
)
468 adj
= (GtkAdjustment
*) gtk_adjustment_new (value
,
469 low
, high
, step0
, step1
, 0.0);
472 scale
= gtk_hscale_new (GTK_ADJUSTMENT (adj
));
474 scale
= gtk_vscale_new (GTK_ADJUSTMENT (adj
));
475 gtk_scale_set_value_pos (GTK_SCALE (scale
), pos
);
476 gtk_scale_set_draw_value (GTK_SCALE (scale
), set_draw_value
);
477 gtk_scale_set_digits (GTK_SCALE (scale
), digits
);
479 /* Increments don't make sense, use -1,1 because that does closest to
480 | what I want: scroll down decrements slider value.
482 gtk_range_set_increments (GTK_RANGE (scale
), -1, 1);
485 gtk_box_pack_start (GTK_BOX (box
), scale
, expand
, fill
, pad
);
487 gtk_box_pack_end (GTK_BOX (box
), scale
, expand
, fill
, pad
);
490 data
= (gpointer
) adj
;
492 g_signal_connect (G_OBJECT (adj
), "value_changed",
493 G_CALLBACK (cb_func
), data
);
499 ghid_scrolled_vbox (GtkWidget
* box
, GtkWidget
** scr
,
500 GtkPolicyType h_policy
, GtkPolicyType v_policy
)
502 GtkWidget
*scrolled
, *vbox
;
504 scrolled
= gtk_scrolled_window_new (NULL
, NULL
);
505 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled
),
507 gtk_box_pack_start (GTK_BOX (box
), scrolled
, TRUE
, TRUE
, 0);
508 vbox
= gtk_vbox_new (FALSE
, 0);
509 gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (scrolled
),
516 /* frame_border_width - border around outside of frame.
517 | vbox_pad - pad between widgets to be packed in returned vbox.
518 | vbox_border_width - border between returned vbox and frame.
521 ghid_framed_vbox (GtkWidget
* box
, gchar
* label
, gint frame_border_width
,
522 gboolean frame_expand
, gint vbox_pad
,
523 gint vbox_border_width
)
528 frame
= gtk_frame_new (label
);
529 gtk_container_set_border_width (GTK_CONTAINER (frame
), frame_border_width
);
530 gtk_box_pack_start (GTK_BOX (box
), frame
, frame_expand
, frame_expand
, 0);
531 vbox
= gtk_vbox_new (FALSE
, vbox_pad
);
532 gtk_container_set_border_width (GTK_CONTAINER (vbox
), vbox_border_width
);
533 gtk_container_add (GTK_CONTAINER (frame
), vbox
);
538 ghid_framed_vbox_end (GtkWidget
* box
, gchar
* label
, gint frame_border_width
,
539 gboolean frame_expand
, gint vbox_pad
,
540 gint vbox_border_width
)
545 frame
= gtk_frame_new (label
);
546 gtk_container_set_border_width (GTK_CONTAINER (frame
), frame_border_width
);
547 gtk_box_pack_end (GTK_BOX (box
), frame
, frame_expand
, frame_expand
, 0);
548 vbox
= gtk_vbox_new (FALSE
, vbox_pad
);
549 gtk_container_set_border_width (GTK_CONTAINER (vbox
), vbox_border_width
);
550 gtk_container_add (GTK_CONTAINER (frame
), vbox
);
555 ghid_category_vbox (GtkWidget
* box
, const gchar
* category_header
,
557 gint box_pad
, gboolean pack_start
, gboolean bottom_pad
)
559 GtkWidget
*vbox
, *vbox1
, *hbox
, *label
;
562 vbox
= gtk_vbox_new (FALSE
, 0);
564 gtk_box_pack_start (GTK_BOX (box
), vbox
, FALSE
, FALSE
, 0);
566 gtk_box_pack_end (GTK_BOX (box
), vbox
, FALSE
, FALSE
, 0);
570 label
= gtk_label_new (NULL
);
571 s
= g_strconcat ("<span weight=\"bold\">", category_header
,
573 gtk_label_set_markup (GTK_LABEL (label
), s
);
574 gtk_misc_set_alignment (GTK_MISC (label
), 0.0, 0.5);
575 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, header_pad
);
579 hbox
= gtk_hbox_new (FALSE
, 0);
580 gtk_box_pack_start (GTK_BOX (vbox
), hbox
, FALSE
, FALSE
, 0);
581 label
= gtk_label_new (" ");
582 gtk_box_pack_start (GTK_BOX (hbox
), label
, FALSE
, FALSE
, 0);
583 vbox1
= gtk_vbox_new (FALSE
, box_pad
);
584 gtk_box_pack_start (GTK_BOX (hbox
), vbox1
, TRUE
, TRUE
, 0);
588 label
= gtk_label_new ("");
589 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, 0);
595 ghid_scrolled_selection (GtkTreeView
* treeview
, GtkWidget
* box
,
596 GtkSelectionMode s_mode
,
597 GtkPolicyType h_policy
, GtkPolicyType v_policy
,
598 void (*func_cb
) (GtkTreeSelection
*, gpointer
), gpointer data
)
600 GtkTreeSelection
*selection
;
603 if (!box
|| !treeview
)
606 scrolled
= gtk_scrolled_window_new (NULL
, NULL
);
607 gtk_box_pack_start (GTK_BOX (box
), scrolled
, TRUE
, TRUE
, 0);
608 gtk_container_add (GTK_CONTAINER (scrolled
), GTK_WIDGET (treeview
));
609 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled
),
611 selection
= gtk_tree_view_get_selection (treeview
);
612 gtk_tree_selection_set_mode (selection
, s_mode
);
614 g_signal_connect (G_OBJECT (selection
), "changed",
615 G_CALLBACK (func_cb
), data
);
620 ghid_notebook_page (GtkWidget
* tabs
, char *name
, gint pad
, gint border
)
625 vbox
= gtk_vbox_new (FALSE
, pad
);
626 gtk_container_set_border_width (GTK_CONTAINER (vbox
), border
);
628 label
= gtk_label_new (name
);
629 gtk_notebook_append_page (GTK_NOTEBOOK (tabs
), vbox
, label
);
635 ghid_framed_notebook_page (GtkWidget
* tabs
, char *name
, gint border
,
636 gint frame_border
, gint vbox_pad
, gint vbox_border
)
640 vbox
= ghid_notebook_page (tabs
, name
, 0, border
);
641 vbox
= ghid_framed_vbox (vbox
, NULL
, frame_border
, TRUE
,
642 vbox_pad
, vbox_border
);
647 ghid_dialog_report (gchar
* title
, gchar
* message
)
651 GtkWidget
*content_area
;
653 GtkWidget
*vbox
, *vbox1
;
657 GHidPort
*out
= &ghid_port
;
661 top_win
= out
->top_window
;
662 dialog
= gtk_dialog_new_with_buttons (title
? title
: "PCB",
663 GTK_WINDOW (top_win
),
664 GTK_DIALOG_DESTROY_WITH_PARENT
,
665 GTK_STOCK_OK
, GTK_RESPONSE_NONE
,
667 g_signal_connect_swapped (GTK_OBJECT (dialog
), "response",
668 G_CALLBACK (gtk_widget_destroy
),
669 GTK_OBJECT (dialog
));
670 gtk_window_set_wmclass (GTK_WINDOW (dialog
), "PCB_Dialog", "PCB");
672 content_area
= gtk_dialog_get_content_area (GTK_DIALOG (dialog
));
674 vbox
= gtk_vbox_new (FALSE
, 0);
675 gtk_container_set_border_width (GTK_CONTAINER (vbox
), 8);
676 gtk_box_pack_start (GTK_BOX (content_area
), vbox
, FALSE
, FALSE
, 0);
678 label
= gtk_label_new (message
);
679 gtk_label_set_justify (GTK_LABEL (label
), GTK_JUSTIFY_LEFT
);
681 for (nlines
= 0, s
= message
; *s
; ++s
)
686 vbox1
= ghid_scrolled_vbox (vbox
, &scrolled
,
687 GTK_POLICY_NEVER
, GTK_POLICY_AUTOMATIC
);
688 gtk_widget_set_size_request (scrolled
, -1, 300);
689 gtk_box_pack_start (GTK_BOX (vbox1
), label
, FALSE
, FALSE
, 0);
692 gtk_box_pack_start (GTK_BOX (vbox
), label
, FALSE
, FALSE
, 0);
694 gtk_widget_show_all (dialog
);
699 ghid_label_set_markup (GtkWidget
* label
, const gchar
* text
)
702 gtk_label_set_markup (GTK_LABEL (label
), text
? text
: "");
707 text_view_append (GtkWidget
* view
, gchar
* s
)
710 GtkTextBuffer
*buffer
;
713 buffer
= gtk_text_view_get_buffer (GTK_TEXT_VIEW (view
));
714 gtk_text_buffer_get_end_iter (buffer
, &iter
);
715 /* gtk_text_iter_forward_to_end(&iter); */
717 if (strncmp (s
, "<b>", 3) == 0)
718 gtk_text_buffer_insert_with_tags_by_name (buffer
, &iter
,
719 s
+ 3, -1, "bold", NULL
);
720 else if (strncmp (s
, "<i>", 3) == 0)
721 gtk_text_buffer_insert_with_tags_by_name (buffer
, &iter
,
722 s
+ 3, -1, "italic", NULL
);
723 else if (strncmp (s
, "<h>", 3) == 0)
724 gtk_text_buffer_insert_with_tags_by_name (buffer
, &iter
,
725 s
+ 3, -1, "heading", NULL
);
726 else if (strncmp (s
, "<c>", 3) == 0)
727 gtk_text_buffer_insert_with_tags_by_name (buffer
, &iter
,
728 s
+ 3, -1, "center", NULL
);
729 else if (strncmp (s
, "<ul>", 4) == 0)
730 gtk_text_buffer_insert_with_tags_by_name (buffer
, &iter
,
731 s
+ 4, -1, "underline", NULL
);
733 gtk_text_buffer_insert (buffer
, &iter
, s
, -1);
735 mark
= gtk_text_buffer_create_mark (buffer
, NULL
, &iter
, FALSE
);
736 gtk_text_view_scroll_to_mark (GTK_TEXT_VIEW (view
), mark
,
738 gtk_text_buffer_delete_mark (buffer
, mark
);
742 ghid_text_view_append (GtkWidget
* view
, gchar
* string
)
749 && ((*(s
+ 2) == '>' && !*(s
+ 3)) || (*(s
+ 3) == '>' && !*(s
+ 4))))
757 s
= g_strconcat (tag
, string
, NULL
);
758 text_view_append (view
, s
);
764 text_view_append (view
, string
);
768 ghid_text_view_append_strings (GtkWidget
* view
, gchar
** string
,
775 for (i
= 0; i
< n_strings
; ++i
)
779 && ((*(s
+ 2) == '>' && !*(s
+ 3))
780 || (*(s
+ 3) == '>' && !*(s
+ 4))))
785 #if defined(ENABLE_NLS)
786 s
= gettext (string
[i
]);
792 t
= g_strconcat (tag
, s
, NULL
);
793 text_view_append (view
, t
);
799 text_view_append (view
, s
);
805 ghid_scrolled_text_view (GtkWidget
* box
,
807 GtkPolicyType h_policy
, GtkPolicyType v_policy
)
809 GtkWidget
*scrolled
, *view
;
810 GtkTextBuffer
*buffer
;
812 scrolled
= gtk_scrolled_window_new (NULL
, NULL
);
813 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled
),
815 gtk_box_pack_start (GTK_BOX (box
), scrolled
, TRUE
, TRUE
, 0);
817 view
= gtk_text_view_new ();
818 gtk_text_view_set_editable (GTK_TEXT_VIEW (view
), FALSE
);
819 buffer
= gtk_text_view_get_buffer (GTK_TEXT_VIEW (view
));
820 gtk_text_buffer_create_tag (buffer
, "heading",
821 "weight", PANGO_WEIGHT_BOLD
,
822 "size", 14 * PANGO_SCALE
, NULL
);
823 gtk_text_buffer_create_tag (buffer
, "italic",
824 "style", PANGO_STYLE_ITALIC
, NULL
);
825 gtk_text_buffer_create_tag (buffer
, "bold",
826 "weight", PANGO_WEIGHT_BOLD
, NULL
);
827 gtk_text_buffer_create_tag (buffer
, "center",
828 "justification", GTK_JUSTIFY_CENTER
, NULL
);
829 gtk_text_buffer_create_tag (buffer
, "underline",
830 "underline", PANGO_UNDERLINE_SINGLE
, NULL
);
832 gtk_container_add (GTK_CONTAINER (scrolled
), view
);