2 * This file is a part of hildon
4 * Copyright (C) 2005, 2006 Nokia Corporation, all rights reserved.
6 * Contact: Michael Dominic Kostrzewa <michael.kostrzewa@nokia.com>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public License
10 * as published by the Free Software Foundation; version 2.1 of
11 * the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
26 * SECTION:hildon-font-selection-dialog
27 * @short_description: A widget used to allow users to select a font
28 * with certain properties.
30 * Font selection can be made using this widget. Users can select font name,
31 * size, style, etc. Users can also preview text in the selected font.
43 #include <gdk/gdkkeysyms.h>
45 #include "hildon-font-selection-dialog.h"
46 #include "hildon-caption.h"
47 #include "hildon-color-button.h"
48 #include "hildon-font-selection-dialog-private.h"
50 /* These are what we use as the standard font sizes, for the size list */
52 static const guint16 font_sizes[] =
54 6, 8, 10, 12, 16, 24, 32
73 PROP_STRIKETHROUGH_SET,
80 /* combo box active row indicator -2--inconsistent, -1--undefined
81 * please make sure that you use settings_init settings_apply
82 * and settings_destroy, dont even try to touch this structure
83 * without using the three above interface functions, of course
84 * if you know what you are doing, do as you please ;-)*/
87 HildonFontSelectionDialog *fsd; /* pointer to our font selection dialog */
89 gint family; /* combo box indicator */
90 gint size; /* combo box indicator */
91 GdkColor *color; /* free after read the setting */
92 gboolean color_inconsist;
93 gint weight; /* bit mask */
94 gint style; /* bit mask */
95 gint underline; /* bit mask */
96 gint strikethrough; /* bit mask */
97 gint position; /* combo box indicator */
99 } HildonFontSelectionDialogSettings;
102 hildon_font_selection_dialog_preview_key_press (GtkWidget *widget,
107 cmp_families (const void *a,
111 hildon_font_selection_dialog_show_preview (HildonFontSelectionDialog *fontsel);
113 static PangoAttrList*
114 hildon_font_selection_dialog_create_attrlist (HildonFontSelectionDialog *fontsel,
119 hildon_font_selection_dialog_show_available_positionings (HildonFontSelectionDialogPrivate *priv);
122 hildon_font_selection_dialog_show_available_fonts (HildonFontSelectionDialog *fontsel);
125 hildon_font_selection_dialog_show_available_sizes (HildonFontSelectionDialogPrivate *priv);
128 hildon_font_selection_dialog_class_init (HildonFontSelectionDialogClass *klass);
131 hildon_font_selection_dialog_init (HildonFontSelectionDialog *fontseldiag);
134 hildon_font_selection_dialog_finalize (GObject *object);
137 hildon_font_selection_dialog_construct_notebook (HildonFontSelectionDialog *fontsel);
140 color_modified_cb (HildonColorButton *button,
145 add_preview_text_attr (PangoAttrList *list,
146 PangoAttribute *attr,
151 toggle_clicked (GtkButton *button,
154 static GtkDialogClass* parent_class = NULL;
156 #define _(String) dgettext("hildon-libs", String)
158 #define SUPERSCRIPT_RISE 3333
160 #define SUBSCRIPT_LOW -3333
167 * hildon_font_selection_dialog_get_type:
169 * Initializes and returns the type of a hildon font selection dialog
171 * @Returns: GType of #HildonFontSelectionDialog
174 hildon_font_selection_dialog_get_type (void)
176 static GType font_selection_dialog_type = 0;
178 if (! font_selection_dialog_type) {
179 static const GTypeInfo fontsel_diag_info = {
180 sizeof(HildonFontSelectionDialogClass),
181 NULL, /* base_init */
182 NULL, /* base_finalize */
183 (GClassInitFunc) hildon_font_selection_dialog_class_init,
184 NULL, /* class_finalize */
185 NULL, /* class_data */
186 sizeof(HildonFontSelectionDialog),
188 (GInstanceInitFunc) hildon_font_selection_dialog_init,
191 font_selection_dialog_type =
192 g_type_register_static (GTK_TYPE_DIALOG,
193 "HildonFontSelectionDialog",
194 &fontsel_diag_info, 0);
197 return font_selection_dialog_type;
201 hildon_font_selection_dialog_get_property (GObject *object,
209 HildonFontSelectionDialogPrivate *priv =
210 HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE(object);
217 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_font_type));
218 if(i >= 0 && i < priv->n_families)
219 g_value_set_string(value,
220 pango_font_family_get_name (priv->families[i]));
222 g_value_set_string (value, "Sans");
223 /* FIXME Bad hardcoding here */
226 case PROP_FAMILY_SET:
227 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_font_type));
228 if(i >= 0 && i < priv->n_families)
229 g_value_set_boolean (value, TRUE);
231 g_value_set_boolean (value, FALSE);
235 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_font_size));
236 if(i >= 0 && i < G_N_ELEMENTS (font_sizes))
237 g_value_set_int (value, font_sizes[i]);
239 g_value_set_int (value, 16);
243 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_font_size));
244 if(i >= 0 && i < G_N_ELEMENTS (font_sizes))
245 g_value_set_boolean (value, TRUE);
247 g_value_set_boolean (value, FALSE);
251 hildon_color_button_get_color
252 (HILDON_COLOR_BUTTON (priv->font_color_button), &color);
253 g_value_set_boxed (value, (gconstpointer) &color);
257 g_value_set_boolean (value, priv->color_set);
261 g_value_set_boolean (value,
262 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (priv->chk_bold)));
266 g_value_set_boolean (value,
267 ! gtk_toggle_button_get_inconsistent
268 (GTK_TOGGLE_BUTTON (priv->chk_bold)));
272 g_value_set_boolean (value,
273 gtk_toggle_button_get_active
274 (GTK_TOGGLE_BUTTON (priv->chk_italic)));
277 case PROP_ITALIC_SET:
278 g_value_set_boolean (value,
279 ! gtk_toggle_button_get_inconsistent
280 (GTK_TOGGLE_BUTTON (priv->chk_italic)));
284 g_value_set_boolean (value,
285 gtk_toggle_button_get_active
286 (GTK_TOGGLE_BUTTON (priv->chk_underline)));
289 case PROP_UNDERLINE_SET:
290 g_value_set_boolean (value,
291 ! gtk_toggle_button_get_inconsistent
292 (GTK_TOGGLE_BUTTON (priv->chk_underline)));
295 case PROP_STRIKETHROUGH:
296 g_value_set_boolean(value,
297 gtk_toggle_button_get_active
298 (GTK_TOGGLE_BUTTON (priv->chk_strikethrough)));
301 case PROP_STRIKETHROUGH_SET:
302 g_value_set_boolean(value,
303 ! gtk_toggle_button_get_inconsistent
304 (GTK_TOGGLE_BUTTON (priv->chk_strikethrough)));
308 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_positioning));
309 if(i == 1) /* super */
310 g_value_set_int (value, 1);
311 else if(i == 2)/* sub */
312 g_value_set_int (value, -1);
314 g_value_set_int (value, 0);
317 case PROP_FONT_SCALING:
318 g_value_set_double (value, priv->font_scaling);
321 case PROP_POSITION_SET:
322 i = gtk_combo_box_get_active (GTK_COMBO_BOX (priv->cbx_positioning));
324 g_value_set_boolean (value, TRUE);
326 g_value_set_boolean (value, FALSE);
329 case PROP_PREVIEW_TEXT:
330 g_value_set_string (value,
331 hildon_font_selection_dialog_get_preview_text (HILDON_FONT_SELECTION_DIALOG (object)));
335 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
341 hildon_font_selection_dialog_set_property (GObject *object,
349 GdkColor *color = NULL;
352 HildonFontSelectionDialogPrivate *priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (object);
355 black.red = black.green = black.blue = 0;
360 str = g_value_get_string (value);
361 for(i = 0; i < priv->n_families; i++)
363 if (strcmp (str, pango_font_family_get_name (priv->families[i]))
366 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->cbx_font_type), i);
372 case PROP_FAMILY_SET:
373 b = g_value_get_boolean (value);
375 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->cbx_font_type), -1);
379 size = g_value_get_int (value);
380 for(i = 0; i < G_N_ELEMENTS (font_sizes); i++)
382 if(size == font_sizes[i])
384 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->cbx_font_size), i);
391 b = g_value_get_boolean (value);
393 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->cbx_font_size), -1);
397 color = (GdkColor *) g_value_get_boxed (value);
399 hildon_color_button_set_color (HILDON_COLOR_BUTTON
400 (priv->font_color_button),
403 hildon_color_button_set_color (HILDON_COLOR_BUTTON
404 (priv->font_color_button),
409 priv->color_set = g_value_get_boolean (value);
410 if(! priv->color_set)
412 /* set color to black, but block our signal handler */
413 g_signal_handler_block ((gpointer) priv->font_color_button,
414 priv->color_modified_signal_handler);
416 hildon_color_button_set_color (HILDON_COLOR_BUTTON
417 (priv->font_color_button),
420 g_signal_handler_unblock ((gpointer) priv->font_color_button,
421 priv->color_modified_signal_handler);
426 /* this call will make sure that we dont get extra clicked signal */
427 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON(priv->chk_bold), FALSE);
428 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(priv->chk_bold), g_value_get_boolean (value));
432 gtk_toggle_button_set_inconsistent (GTK_TOGGLE_BUTTON (priv->chk_bold),! g_value_get_boolean(value));
436 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(priv->chk_italic),
438 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->chk_italic),
439 g_value_get_boolean(value));
442 case PROP_ITALIC_SET:
443 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(priv->chk_italic),
444 !g_value_get_boolean(value));
448 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON
449 (priv->chk_underline),
451 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->chk_underline),
452 g_value_get_boolean(value));
455 case PROP_UNDERLINE_SET:
456 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON(priv->chk_underline),
457 !g_value_get_boolean(value));
460 case PROP_STRIKETHROUGH:
461 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON
462 (priv->chk_strikethrough),
464 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(priv->chk_strikethrough),
465 g_value_get_boolean(value));
468 case PROP_STRIKETHROUGH_SET:
469 gtk_toggle_button_set_inconsistent(GTK_TOGGLE_BUTTON
470 (priv->chk_strikethrough),
471 !g_value_get_boolean(value));
475 i = g_value_get_int(value);
477 gtk_combo_box_set_active(GTK_COMBO_BOX(priv->cbx_positioning), 1);
479 gtk_combo_box_set_active(GTK_COMBO_BOX(priv->cbx_positioning), 2);
481 gtk_combo_box_set_active(GTK_COMBO_BOX(priv->cbx_positioning), 0);
484 case PROP_FONT_SCALING:
485 priv->font_scaling = g_value_get_double(value);
488 case PROP_POSITION_SET:
489 b = g_value_get_boolean(value);
491 gtk_combo_box_set_active(GTK_COMBO_BOX(priv->cbx_positioning), -1);
494 case PROP_PREVIEW_TEXT:
495 hildon_font_selection_dialog_set_preview_text(
496 HILDON_FONT_SELECTION_DIALOG(object),
497 g_value_get_string(value));
501 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
507 hildon_font_selection_dialog_class_init (HildonFontSelectionDialogClass *klass)
509 GObjectClass *gobject_class;
511 parent_class = g_type_class_peek_parent (klass);
512 gobject_class = G_OBJECT_CLASS (klass);
514 gobject_class->finalize = hildon_font_selection_dialog_finalize;
515 gobject_class->get_property = hildon_font_selection_dialog_get_property;
516 gobject_class->set_property = hildon_font_selection_dialog_set_property;
518 /* Install properties to the class */
521 * HildonFontSelectionDialog:family:
525 g_object_class_install_property (gobject_class, PROP_FAMILY,
526 g_param_spec_string ("family",
527 "Font family", "String defines"
528 " the font family", "Sans",
532 * HildonFontSelectionDialog:family-set:
534 * Is font family set or inconsistent.
536 g_object_class_install_property (gobject_class, PROP_FAMILY_SET,
537 g_param_spec_boolean ("family-set",
538 "family inconsistent state",
539 "Whether the family property"
540 " is inconsistent", FALSE,
541 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
544 * HildonFontSelectionDialog:size:
548 g_object_class_install_property (gobject_class, PROP_SIZE,
549 g_param_spec_int ("size",
556 * HildonFontSelectionDialog:size-set:
558 * Is font size set or inconsistent.
560 g_object_class_install_property (gobject_class, PROP_SIZE_SET,
561 g_param_spec_boolean ("size-set",
562 "size inconsistent state",
563 "Whether the size property"
564 " is inconsistent", FALSE,
565 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
568 * HildonFontSelectionDialog:color:
570 * GdkColor for the text.
572 g_object_class_install_property (gobject_class, PROP_COLOR,
573 g_param_spec_boxed ("color",
575 "gdk color for the text",
580 * HildonFontSelectionDialog:color-set:
582 * Is font color set or inconsistent.
584 g_object_class_install_property (gobject_class, PROP_COLOR_SET,
585 g_param_spec_boolean ("color-set",
586 "color inconsistent state",
587 "Whether the color property"
588 " is inconsistent", FALSE,
589 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
592 * HildonFontSelectionDialog:color-set:
594 * Is font set as bold.
596 g_object_class_install_property (gobject_class, PROP_BOLD,
597 g_param_spec_boolean ("bold",
599 "Whether the text is bold",
604 * HildonFontSelectionDialog:color-set:
606 * Is font bold status set or inconsistent.
608 g_object_class_install_property (gobject_class, PROP_BOLD_SET,
609 g_param_spec_boolean ("bold-set",
610 "bold inconsistent state",
612 " is inconsistent", FALSE,
613 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
616 * HildonFontSelectionDialog:italic:
618 * Is font set as italic.
620 g_object_class_install_property (gobject_class, PROP_ITALIC,
621 g_param_spec_boolean ("italic",
623 "Whether the text is italic",
628 * HildonFontSelectionDialog:italic-set:
630 * Is font italic status set or inconsistent.
632 g_object_class_install_property (gobject_class, PROP_ITALIC_SET,
633 g_param_spec_boolean ("italic-set",
634 "italic inconsistent state",
636 " is inconsistent", FALSE,
637 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
640 * HildonFontSelectionDialog:underline:
642 * Is the font underlined.
644 g_object_class_install_property (gobject_class, PROP_UNDERLINE,
645 g_param_spec_boolean ("underline",
647 "Whether the text is underlined",
652 * HildonFontSelectionDialog:underline:
654 * Is font underline status set or inconsistent.
656 g_object_class_install_property (gobject_class, PROP_UNDERLINE_SET,
657 g_param_spec_boolean ("underline-set",
658 "underline inconsistent state",
659 "Whether the underline"
660 " is inconsistent", FALSE,
661 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
664 * HildonFontSelectionDialog:strikethrough:
666 * Is the font striken-through.
668 g_object_class_install_property (gobject_class, PROP_STRIKETHROUGH,
669 g_param_spec_boolean ("strikethrough",
670 "strikethroughed text",
671 "Whether the text is strikethroughed",
676 * HildonFontSelectionDialog:strikethrough-set:
678 * Is the font strikenthrough status set.
680 g_object_class_install_property (gobject_class, PROP_STRIKETHROUGH_SET,
681 g_param_spec_boolean ("strikethrough-set",
682 "strikethrough inconsistent state",
683 "Whether the strikethrough"
684 " is inconsistent", FALSE,
685 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
688 * HildonFontSelectionDialog:position:
690 * The font positioning versus baseline.
692 g_object_class_install_property (gobject_class, PROP_POSITION,
693 g_param_spec_int ("position",
695 "Font position super or subscript",
700 * HildonFontSelectionDialog:position-set:
702 * Is the font positioning set.
704 g_object_class_install_property (gobject_class, PROP_POSITION_SET,
705 g_param_spec_boolean ("position-set",
706 "position inconsistent state",
707 "Whether the position"
708 " is inconsistent", FALSE,
709 G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
712 * HildonFontSelectionDialog:font-scaling:
714 * The font scaling factor applied to the preview dialog.
716 g_object_class_install_property (gobject_class, PROP_FONT_SCALING,
717 g_param_spec_double ("font-scaling",
719 "Font scaling for the preview dialog",
724 * HildonFontSelectionDialog:preview-text:
726 * The text used for the preview dialog.
728 g_object_class_install_property (gobject_class, PROP_PREVIEW_TEXT,
729 g_param_spec_string("preview-text",
731 "the text in preview dialog, which does"
732 "not include the reference text",
736 g_type_class_add_private (klass,
737 sizeof (struct _HildonFontSelectionDialogPrivate));
741 hildon_font_selection_dialog_init (HildonFontSelectionDialog *fontseldiag)
743 HildonFontSelectionDialogPrivate *priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fontseldiag);
744 GtkWidget *preview_button;
747 priv->notebook = GTK_NOTEBOOK (gtk_notebook_new ());
749 hildon_font_selection_dialog_construct_notebook (fontseldiag);
751 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (fontseldiag)->vbox),
752 GTK_WIDGET (priv->notebook), TRUE, TRUE, 0);
754 /* Add dialog buttons */
755 gtk_dialog_add_button (GTK_DIALOG (fontseldiag),
756 _("ecdg_bd_font_dialog_ok"),
759 preview_button = gtk_button_new_with_label (_("ecdg_bd_font_dialog_preview"));
760 gtk_box_pack_start (GTK_BOX(GTK_DIALOG (fontseldiag)->action_area),
761 preview_button, FALSE, TRUE, 0);
763 g_signal_connect_swapped (preview_button, "clicked",
765 (hildon_font_selection_dialog_show_preview),
767 gtk_widget_show(preview_button);
769 gtk_dialog_add_button (GTK_DIALOG (fontseldiag),
770 _("ecdg_bd_font_dialog_cancel"),
771 GTK_RESPONSE_CANCEL);
773 /*Set default preview text*/
774 priv->preview_text = g_strdup (_("ecdg_fi_preview_font_preview_text"));
776 gtk_window_set_title (GTK_WINDOW (fontseldiag), _("ecdg_ti_font"));
777 /*here is the line to make sure that notebook has the default focus*/
778 gtk_container_set_focus_child (GTK_CONTAINER (GTK_DIALOG (fontseldiag)->vbox),
779 GTK_WIDGET (priv->notebook));
783 hildon_font_selection_dialog_construct_notebook (HildonFontSelectionDialog *fontsel)
786 GtkWidget *vbox_tab[3];
787 GtkWidget *font_color_box;
788 GtkWidget *caption_control;
791 HildonFontSelectionDialogPrivate *priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fontsel);
794 for (i = 0; i < 3; i++)
795 vbox_tab[i] = gtk_vbox_new (TRUE, 0);
797 group = GTK_SIZE_GROUP (gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL));
799 /* Build the first page of the GtkNotebook: font style */
800 priv->cbx_font_type = gtk_combo_box_new_text ();
801 hildon_font_selection_dialog_show_available_fonts (fontsel);
802 caption_control = hildon_caption_new (group,
803 _("ecdg_fi_font_font"),
806 HILDON_CAPTION_OPTIONAL);
808 gtk_box_pack_start (GTK_BOX (vbox_tab[0]), caption_control, FALSE, FALSE, 0);
810 priv->cbx_font_size = gtk_combo_box_new_text ();
811 hildon_font_selection_dialog_show_available_sizes (priv);
812 caption_control = hildon_caption_new (group,
813 _("ecdg_fi_font_size"),
816 HILDON_CAPTION_OPTIONAL);
818 gtk_box_pack_start (GTK_BOX (vbox_tab[0]), caption_control, FALSE, FALSE, 0);
820 font_color_box = gtk_hbox_new (FALSE, 0);
821 priv->font_color_button = hildon_color_button_new ();
822 priv->color_set = FALSE;
823 priv->font_scaling = 1.0;
824 priv->color_modified_signal_handler =
825 g_signal_connect (G_OBJECT (priv->font_color_button), "notify::color",
826 G_CALLBACK (color_modified_cb), (gpointer) priv);
828 gtk_box_pack_start (GTK_BOX (font_color_box), priv->font_color_button, FALSE, FALSE, 0);
831 hildon_caption_new (group, _("ecdg_fi_font_colour_selector"),
833 NULL, HILDON_CAPTION_OPTIONAL);
835 gtk_box_pack_start (GTK_BOX (vbox_tab[0]), caption_control, FALSE, FALSE, 0);
837 /* Build the second page of the GtkNotebook: font formatting */
838 priv->chk_bold = gtk_check_button_new ();
839 caption_control = hildon_caption_new (group,
840 _("ecdg_fi_font_bold"),
843 HILDON_CAPTION_OPTIONAL);
845 gtk_box_pack_start (GTK_BOX (vbox_tab[1]), caption_control, FALSE, FALSE, 0);
846 g_signal_connect (G_OBJECT (priv->chk_bold), "clicked",
847 G_CALLBACK(toggle_clicked), NULL);
849 priv->chk_italic = gtk_check_button_new ();
850 caption_control = hildon_caption_new (group, _("ecdg_fi_font_italic"),
852 NULL, HILDON_CAPTION_OPTIONAL);
854 gtk_box_pack_start (GTK_BOX (vbox_tab[1]), caption_control, FALSE, FALSE, 0);
855 g_signal_connect(G_OBJECT(priv->chk_italic), "clicked",
856 G_CALLBACK(toggle_clicked), NULL);
858 priv->chk_underline = gtk_check_button_new();
860 hildon_caption_new (group, _("ecdg_fi_font_underline"),
861 priv->chk_underline, NULL,
862 HILDON_CAPTION_OPTIONAL);
864 gtk_box_pack_start (GTK_BOX (vbox_tab[1]), caption_control, FALSE, FALSE, 0);
865 g_signal_connect (G_OBJECT(priv->chk_underline), "clicked",
866 G_CALLBACK (toggle_clicked), NULL);
868 /* Build the third page of the GtkNotebook: other font properties */
869 priv->chk_strikethrough = gtk_check_button_new ();
870 caption_control = hildon_caption_new(group, _("ecdg_fi_font_strikethrough"),
871 priv->chk_strikethrough, NULL,
872 HILDON_CAPTION_OPTIONAL);
874 gtk_box_pack_start (GTK_BOX (vbox_tab[2]), caption_control, FALSE, FALSE, 0);
875 g_signal_connect (G_OBJECT(priv->chk_strikethrough), "clicked",
876 G_CALLBACK (toggle_clicked), NULL);
878 priv->cbx_positioning = gtk_combo_box_new_text ();
879 hildon_font_selection_dialog_show_available_positionings (priv);
881 hildon_caption_new(group, _("ecdg_fi_font_special"),
882 priv->cbx_positioning, NULL,
883 HILDON_CAPTION_OPTIONAL);
885 g_object_unref (group);
887 gtk_box_pack_start (GTK_BOX (vbox_tab[2]), caption_control, FALSE, FALSE, 0);
889 /* Populate notebook */
890 gtk_notebook_insert_page (priv->notebook, vbox_tab[0], NULL, 0);
891 gtk_notebook_insert_page (priv->notebook, vbox_tab[1], NULL, 1);
892 gtk_notebook_insert_page (priv->notebook, vbox_tab[2], NULL, 2);
894 gtk_notebook_set_tab_label_text (priv->notebook, vbox_tab[0],
895 _("ecdg_ti_font_dialog_style"));
896 gtk_notebook_set_tab_label_text (priv->notebook, vbox_tab[1],
897 _("ecdg_ti_font_dialog_format"));
898 gtk_notebook_set_tab_label_text (priv->notebook, vbox_tab[2],
899 _("ecdg_ti_font_dialog_other"));
901 gtk_widget_show_all (GTK_WIDGET (priv->notebook));
905 color_modified_cb (HildonColorButton *button,
909 HildonFontSelectionDialogPrivate *priv = (HildonFontSelectionDialogPrivate *) fsd_priv;
912 priv->color_set = TRUE;
916 hildon_font_selection_dialog_finalize (GObject *object)
918 HildonFontSelectionDialogPrivate *priv;
919 HildonFontSelectionDialog *fontsel;
921 g_assert (HILDON_IS_FONT_SELECTION_DIALOG (object));
922 fontsel = HILDON_FONT_SELECTION_DIALOG (object);
924 priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fontsel);
927 if (priv->preview_text != NULL) {
928 g_free (priv->preview_text);
929 priv->preview_text = NULL;
932 if (priv->families != NULL) {
933 g_free (priv->families);
934 priv->families = NULL;
937 if (G_OBJECT_CLASS (parent_class)->finalize)
938 G_OBJECT_CLASS (parent_class)->finalize (object);
942 cmp_families (const void *a,
946 pango_font_family_get_name (* (PangoFontFamily **) a);
949 pango_font_family_get_name (* (PangoFontFamily **) b);
951 return g_utf8_collate (a_name, b_name);
954 /* Exits the preview dialog with GTK_RESPONSE_CANCEL if Esc key
956 * FIXME This should be handled automatically */
958 hildon_font_selection_dialog_preview_key_press (GtkWidget *widget,
965 if (event->keyval == GDK_Escape)
967 gtk_dialog_response (GTK_DIALOG (widget), GTK_RESPONSE_CANCEL);
975 add_preview_text_attr (PangoAttrList *list,
976 PangoAttribute *attr,
980 attr->start_index = start;
981 attr->end_index = start + len;
982 pango_attr_list_insert (list, attr);
985 static PangoAttrList*
986 hildon_font_selection_dialog_create_attrlist (HildonFontSelectionDialog *fontsel,
991 PangoAttribute *attr;
993 gboolean family_set, size_set, color_set, bold, bold_set,
994 italic, italic_set, underline, underline_set,
995 strikethrough, strikethrough_set, position_set;
996 GdkColor *color = NULL;
997 gchar *family = NULL;
998 gdouble font_scaling = 1.0;
1000 list = pango_attr_list_new ();
1002 g_object_get (G_OBJECT (fontsel),
1003 "family", &family, "family-set", &family_set,
1004 "size", &size, "size-set", &size_set,
1005 "color", &color, "color-set", &color_set,
1006 "bold", &bold, "bold-set", &bold_set,
1007 "italic", &italic, "italic-set", &italic_set,
1008 "underline", &underline, "underline-set", &underline_set,
1009 "strikethrough", &strikethrough, "strikethrough-set",
1010 &strikethrough_set, "position", &position,
1011 "position-set", &position_set,
1012 "font-scaling", &font_scaling,
1018 attr = pango_attr_family_new (family);
1019 add_preview_text_attr (list, attr, start_index, len);
1026 attr = pango_attr_size_new (size * PANGO_SCALE);
1027 add_preview_text_attr (list, attr, start_index, len);
1033 attr = pango_attr_foreground_new (color->red, color->green, color->blue);
1034 add_preview_text_attr (list, attr, start_index, len);
1038 gdk_color_free (color);
1044 attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
1046 attr = pango_attr_weight_new (PANGO_WEIGHT_NORMAL);
1048 add_preview_text_attr(list, attr, start_index, len);
1055 attr = pango_attr_style_new (PANGO_STYLE_ITALIC);
1057 attr = pango_attr_style_new (PANGO_STYLE_NORMAL);
1059 add_preview_text_attr(list, attr, start_index, len);
1066 attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
1068 attr = pango_attr_underline_new (PANGO_UNDERLINE_NONE);
1070 add_preview_text_attr(list, attr, start_index, len);
1074 if (strikethrough_set)
1077 attr = pango_attr_strikethrough_new (TRUE);
1079 attr = pango_attr_strikethrough_new (FALSE);
1081 add_preview_text_attr(list, attr, start_index, len);
1090 attr = pango_attr_rise_new (SUPERSCRIPT_RISE);
1093 attr = pango_attr_rise_new (SUBSCRIPT_LOW);
1096 attr = pango_attr_rise_new (0);
1100 add_preview_text_attr (list, attr, start_index, len);
1103 /* font scaling for preview */
1106 attr = pango_attr_scale_new(font_scaling);
1107 add_preview_text_attr(list, attr, 0, len + start_index);
1114 hildon_font_selection_dialog_show_preview (HildonFontSelectionDialog *fontsel)
1116 HildonFontSelectionDialogPrivate *priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fontsel);
1118 gboolean family_set, size_set;
1119 PangoAttribute *attr;
1120 PangoAttrList *list;
1121 GtkWidget *preview_dialog;
1122 GtkWidget *preview_label;
1124 gboolean position_set = FALSE;
1126 gboolean show_ref = FALSE;
1130 g_object_get (G_OBJECT (fontsel), "position-set", &position_set, NULL);
1133 g_object_get (G_OBJECT (fontsel), "position", &position, NULL);
1134 if (position == 1 || position == -1)
1138 /* preview dialog init */
1140 gtk_dialog_new_with_buttons (_("ecdg_ti_preview_font"), NULL,
1142 GTK_DIALOG_DESTROY_WITH_PARENT |
1143 GTK_DIALOG_NO_SEPARATOR,
1144 _("ecdg_bd_font_dialog_ok"),
1145 GTK_RESPONSE_ACCEPT,
1148 str = (show_ref) ? g_strconcat (_("ecdg_fi_preview_font_preview_reference"), priv->preview_text, 0) :
1149 g_strdup (priv->preview_text);
1151 preview_label = gtk_label_new (str);
1152 gtk_label_set_line_wrap (GTK_LABEL(preview_label), TRUE);
1159 /* set keypress handler (ESC hardkey) */
1160 g_signal_connect (G_OBJECT (preview_dialog), "key-press-event",
1161 G_CALLBACK(hildon_font_selection_dialog_preview_key_press),
1165 list = (show_ref) ? hildon_font_selection_dialog_create_attrlist (fontsel,
1166 strlen (_("ecdg_fi_preview_font_preview_reference")),
1167 strlen (priv->preview_text)) :
1168 hildon_font_selection_dialog_create_attrlist (fontsel, 0, strlen(priv->preview_text));
1170 g_object_get (G_OBJECT (fontsel), "family", &str, "family-set",
1171 &family_set, "size", &size, "size-set", &size_set,
1174 /* A smallish hack to add scrollbar when font size is really big */
1176 if (size_set && size > 24) {
1177 GtkScrolledWindow *scrolled = GTK_SCROLLED_WINDOW (gtk_scrolled_window_new (NULL, NULL));
1178 gtk_scrolled_window_set_policy (scrolled, GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
1179 gtk_scrolled_window_add_with_viewport (scrolled, GTK_WIDGET (preview_label));
1180 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(preview_dialog)->vbox), GTK_WIDGET (scrolled));
1181 gtk_widget_set_size_request (GTK_WIDGET (scrolled), -1, 400);
1183 gtk_container_add (GTK_CONTAINER (GTK_DIALOG(preview_dialog)->vbox), GTK_WIDGET (preview_label));
1185 /* make reference text to have the same fontface and size */
1188 attr = pango_attr_family_new (str);
1189 add_preview_text_attr (list, attr, 0, strlen (_("ecdg_fi_preview_font_preview_reference")));
1199 attr = pango_attr_size_new (size * PANGO_SCALE);
1200 add_preview_text_attr (list, attr, 0, strlen (_("ecdg_fi_preview_font_preview_reference")));
1203 gtk_label_set_attributes (GTK_LABEL (preview_label), list);
1204 pango_attr_list_unref (list);
1206 /*And show the dialog*/
1207 gtk_window_set_transient_for (GTK_WINDOW (preview_dialog),
1208 GTK_WINDOW (fontsel));
1210 gtk_widget_show_all (preview_dialog);
1211 gtk_dialog_set_default_response (GTK_DIALOG (preview_dialog), GTK_RESPONSE_OK);
1213 GtkBox *action_area = (GtkBox *) GTK_DIALOG (preview_dialog)->action_area;
1214 GtkWidget *button = ((GtkBoxChild *) ((GSList *) action_area->children)->data)->widget;
1215 gtk_widget_grab_focus (button);
1217 gtk_dialog_run (GTK_DIALOG (preview_dialog));
1218 gtk_widget_destroy (preview_dialog);
1222 is_internal_font (const gchar * name)
1224 /* FIXME Extremally BAD BAD BAD way of doing things */
1226 return strcmp(name, "DeviceSymbols") == 0
1227 || strcmp(name, "Nokia Smiley" ) == 0
1228 || strcmp(name, "NewCourier" ) == 0
1229 || strcmp(name, "NewTimes" ) == 0
1230 || strcmp(name, "SwissA" ) == 0
1231 || strcmp(name, "Nokia Sans" ) == 0
1232 || strcmp(name, "Nokia Sans Cn") == 0;
1236 filter_out_internal_fonts (PangoFontFamily **families,
1240 int n; /* counts valid fonts */
1241 const gchar * name = NULL;
1243 for(i = 0, n = 0; i < * n_families; i++){
1245 name = pango_font_family_get_name (families[i]);
1247 if(!is_internal_font(name))
1250 if (i!=n){ /* there are filtered out families */
1251 families[n] = families[i]; /* shift the current family */
1254 n++; /* count one more valid */
1256 } /* foreach font family */
1262 hildon_font_selection_dialog_show_available_fonts (HildonFontSelectionDialog *fontsel)
1267 HildonFontSelectionDialogPrivate *priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fontsel);
1270 pango_context_list_families (gtk_widget_get_pango_context
1271 (GTK_WIDGET (fontsel)), &priv->families,
1274 filter_out_internal_fonts (priv->families, &priv->n_families);
1276 qsort (priv->families, priv->n_families, sizeof(PangoFontFamily *), cmp_families);
1278 for (i = 0; i < priv->n_families; i++)
1280 const gchar *name = pango_font_family_get_name (priv->families[i]);
1281 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->cbx_font_type), name);
1286 hildon_font_selection_dialog_show_available_positionings (HildonFontSelectionDialogPrivate *priv)
1288 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->cbx_positioning), _("ecdg_va_font_printpos_1"));
1289 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->cbx_positioning), _("ecdg_va_font_printpos_2"));
1290 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->cbx_positioning), _("ecdg_va_font_printpos_3"));
1293 /* Loads the sizes from a pre-allocated table */
1295 hildon_font_selection_dialog_show_available_sizes (HildonFontSelectionDialogPrivate *priv)
1302 for (i = 0; i < G_N_ELEMENTS (font_sizes); i++)
1304 size_str = g_strdup_printf ("%i%s",
1306 _("ecdg_va_font_size_trailer"));
1308 gtk_combo_box_append_text (GTK_COMBO_BOX (priv->cbx_font_size), size_str);
1314 toggle_clicked (GtkButton *button,
1317 GtkToggleButton *t_b = GTK_TOGGLE_BUTTON (button);
1319 /* we have to remove the inconsistent state ourselves */
1320 if (gtk_toggle_button_get_inconsistent (t_b))
1322 gtk_toggle_button_set_inconsistent (t_b, FALSE);
1323 gtk_toggle_button_set_active (t_b, FALSE);
1328 * hildon_font_selection_dialog_new:
1329 * @parent: the parent window
1330 * @title: the title of font selection dialog
1332 * If NULL is passed for title, then default title
1333 * "Font" will be used.
1335 * Returns: a new #HildonFontSelectionDialog
1338 hildon_font_selection_dialog_new (GtkWindow *parent,
1341 HildonFontSelectionDialog *fontseldiag;
1343 fontseldiag = g_object_new (HILDON_TYPE_FONT_SELECTION_DIALOG,
1344 "has-separator", FALSE, NULL);
1347 gtk_window_set_title (GTK_WINDOW (fontseldiag), title);
1350 gtk_window_set_transient_for (GTK_WINDOW (fontseldiag), parent);
1352 return GTK_WIDGET (fontseldiag);
1356 * hildon_font_selection_dialog_get_preview_text:
1357 * @fsd: the font selection dialog
1359 * Gets the text in preview dialog, which does not include the
1360 * reference text. The returned string must be freed by the user.
1362 * Returns: a string pointer
1365 hildon_font_selection_dialog_get_preview_text (HildonFontSelectionDialog * fsd)
1367 /* FIXME Return a const pointer? */
1368 HildonFontSelectionDialogPrivate *priv;
1370 g_return_val_if_fail (HILDON_IS_FONT_SELECTION_DIALOG (fsd), FALSE);
1372 priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fsd);
1375 return g_strdup (priv->preview_text);
1379 * hildon_font_selection_dialog_set_preview_text:
1380 * @fsd: the font selection dialog
1381 * @text: the text to be displayed in the preview dialog
1383 * The default preview text is
1384 * "The quick brown fox jumped over the lazy dogs"
1387 hildon_font_selection_dialog_set_preview_text (HildonFontSelectionDialog *fsd,
1390 HildonFontSelectionDialogPrivate *priv = NULL;
1392 g_return_if_fail (HILDON_IS_FONT_SELECTION_DIALOG (fsd));
1393 g_return_if_fail (text);
1395 priv = HILDON_FONT_SELECTION_DIALOG_GET_PRIVATE (fsd);
1398 g_free (priv->preview_text);
1399 priv->preview_text = g_strdup (text);
1400 g_object_notify (G_OBJECT (fsd), "preview-text");