1 /* GtkPrinterOptionWidget
2 * Copyright (C) 2006 Alexander Larsson <alexl@redhat.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
25 #include "gtkcheckbutton.h"
26 #include "gtkcelllayout.h"
27 #include "gtkcellrenderertext.h"
28 #include "gtkcombobox.h"
29 #include "gtkfilechooserbutton.h"
32 #include "gtkliststore.h"
33 #include "gtkradiobutton.h"
36 #include "gtktogglebutton.h"
37 #include "gtkorientable.h"
38 #include "gtkprivate.h"
40 #include "gtkprinteroptionwidget.h"
42 #define GTK_PRINTER_OPTION_WIDGET_GET_PRIVATE(o) \
43 (G_TYPE_INSTANCE_GET_PRIVATE ((o), GTK_TYPE_PRINTER_OPTION_WIDGET, GtkPrinterOptionWidgetPrivate))
45 static void gtk_printer_option_widget_finalize (GObject *object);
47 static void deconstruct_widgets (GtkPrinterOptionWidget *widget);
48 static void construct_widgets (GtkPrinterOptionWidget *widget);
49 static void update_widgets (GtkPrinterOptionWidget *widget);
51 struct GtkPrinterOptionWidgetPrivate
53 GtkPrinterOption *source;
54 gulong source_changed_handler;
61 GtkWidget *info_label;
62 GtkWidget *filechooser;
76 static guint signals[LAST_SIGNAL] = { 0 };
78 G_DEFINE_TYPE (GtkPrinterOptionWidget, gtk_printer_option_widget, GTK_TYPE_BOX)
80 static void gtk_printer_option_widget_set_property (GObject *object,
84 static void gtk_printer_option_widget_get_property (GObject *object,
88 static gboolean gtk_printer_option_widget_mnemonic_activate (GtkWidget *widget,
89 gboolean group_cycling);
92 gtk_printer_option_widget_class_init (GtkPrinterOptionWidgetClass *class)
94 GObjectClass *object_class;
95 GtkWidgetClass *widget_class;
97 object_class = (GObjectClass *) class;
98 widget_class = (GtkWidgetClass *) class;
100 object_class->finalize = gtk_printer_option_widget_finalize;
101 object_class->set_property = gtk_printer_option_widget_set_property;
102 object_class->get_property = gtk_printer_option_widget_get_property;
104 widget_class->mnemonic_activate = gtk_printer_option_widget_mnemonic_activate;
106 g_type_class_add_private (class, sizeof (GtkPrinterOptionWidgetPrivate));
109 g_signal_new ("changed",
110 G_TYPE_FROM_CLASS (class),
112 G_STRUCT_OFFSET (GtkPrinterOptionWidgetClass, changed),
114 g_cclosure_marshal_VOID__VOID,
117 g_object_class_install_property (object_class,
119 g_param_spec_object ("source",
121 P_("The PrinterOption backing this widget"),
122 GTK_TYPE_PRINTER_OPTION,
123 GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
128 gtk_printer_option_widget_init (GtkPrinterOptionWidget *widget)
130 widget->priv = GTK_PRINTER_OPTION_WIDGET_GET_PRIVATE (widget);
132 gtk_box_set_spacing (GTK_BOX (widget), 12);
136 gtk_printer_option_widget_finalize (GObject *object)
138 GtkPrinterOptionWidget *widget = GTK_PRINTER_OPTION_WIDGET (object);
139 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
143 g_object_unref (priv->source);
147 G_OBJECT_CLASS (gtk_printer_option_widget_parent_class)->finalize (object);
151 gtk_printer_option_widget_set_property (GObject *object,
156 GtkPrinterOptionWidget *widget;
158 widget = GTK_PRINTER_OPTION_WIDGET (object);
163 gtk_printer_option_widget_set_source (widget, g_value_get_object (value));
166 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
172 gtk_printer_option_widget_get_property (GObject *object,
177 GtkPrinterOptionWidget *widget = GTK_PRINTER_OPTION_WIDGET (object);
178 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
183 g_value_set_object (value, priv->source);
186 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
192 gtk_printer_option_widget_mnemonic_activate (GtkWidget *widget,
193 gboolean group_cycling)
195 GtkPrinterOptionWidget *powidget = GTK_PRINTER_OPTION_WIDGET (widget);
196 GtkPrinterOptionWidgetPrivate *priv = powidget->priv;
199 return gtk_widget_mnemonic_activate (priv->check, group_cycling);
201 return gtk_widget_mnemonic_activate (priv->combo, group_cycling);
203 return gtk_widget_mnemonic_activate (priv->entry, group_cycling);
209 emit_changed (GtkPrinterOptionWidget *widget)
211 g_signal_emit (widget, signals[CHANGED], 0);
215 gtk_printer_option_widget_new (GtkPrinterOption *source)
217 return g_object_new (GTK_TYPE_PRINTER_OPTION_WIDGET, "source", source, NULL);
221 source_changed_cb (GtkPrinterOption *source,
222 GtkPrinterOptionWidget *widget)
224 update_widgets (widget);
225 emit_changed (widget);
229 gtk_printer_option_widget_set_source (GtkPrinterOptionWidget *widget,
230 GtkPrinterOption *source)
232 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
235 g_object_ref (source);
239 g_signal_handler_disconnect (priv->source,
240 priv->source_changed_handler);
241 g_object_unref (priv->source);
244 priv->source = source;
247 priv->source_changed_handler =
248 g_signal_connect (source, "changed", G_CALLBACK (source_changed_cb), widget);
250 construct_widgets (widget);
251 update_widgets (widget);
253 g_object_notify (G_OBJECT (widget), "source");
263 combo_box_set_model (GtkWidget *combo_box)
267 store = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
268 gtk_combo_box_set_model (GTK_COMBO_BOX (combo_box), GTK_TREE_MODEL (store));
269 g_object_unref (store);
273 combo_box_set_view (GtkWidget *combo_box)
275 GtkCellRenderer *cell;
277 cell = gtk_cell_renderer_text_new ();
278 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (combo_box), cell, TRUE);
279 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (combo_box), cell,
285 combo_box_entry_new (void)
287 GtkWidget *combo_box;
288 combo_box = g_object_new (GTK_TYPE_COMBO_BOX, "has-entry", TRUE, NULL);
290 combo_box_set_model (combo_box);
292 gtk_combo_box_set_entry_text_column (GTK_COMBO_BOX (combo_box), NAME_COLUMN);
300 GtkWidget *combo_box;
301 combo_box = gtk_combo_box_new ();
303 combo_box_set_model (combo_box);
304 combo_box_set_view (combo_box);
310 combo_box_append (GtkWidget *combo,
311 const gchar *display_text,
318 model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
319 store = GTK_LIST_STORE (model);
321 gtk_list_store_append (store, &iter);
322 gtk_list_store_set (store, &iter,
323 NAME_COLUMN, display_text,
334 set_cb (GtkTreeModel *model,
339 struct ComboSet *set_data = data;
343 gtk_tree_model_get (model, iter, VALUE_COLUMN, &value, -1);
344 found = (strcmp (value, set_data->value) == 0);
348 gtk_combo_box_set_active_iter (set_data->combo, iter);
354 combo_box_set (GtkWidget *combo,
358 struct ComboSet set_data;
360 model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
362 set_data.combo = GTK_COMBO_BOX (combo);
363 set_data.value = value;
364 gtk_tree_model_foreach (model, set_cb, &set_data);
368 combo_box_get (GtkWidget *combo, gboolean *custom)
374 model = gtk_combo_box_get_model (GTK_COMBO_BOX (combo));
377 if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (combo), &iter))
379 gtk_tree_model_get (model, &iter, VALUE_COLUMN, &value, -1);
384 if (gtk_combo_box_get_has_entry (GTK_COMBO_BOX (combo)))
386 value = g_strdup (gtk_entry_get_text (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo)))));
390 if (!value || !gtk_tree_model_get_iter_first (model, &iter))
393 /* If the user entered an item from the dropdown list manually, return
394 * the non-custom option instead. */
398 gtk_tree_model_get (model, &iter, VALUE_COLUMN, &val,
399 NAME_COLUMN, &name, -1);
400 if (g_str_equal (value, name))
411 while (gtk_tree_model_iter_next (model, &iter));
419 deconstruct_widgets (GtkPrinterOptionWidget *widget)
421 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
425 gtk_widget_destroy (priv->check);
431 gtk_widget_destroy (priv->combo);
437 gtk_widget_destroy (priv->entry);
441 /* make sure entry and combo are destroyed first */
442 /* as we use the two of them to create the filechooser */
443 if (priv->filechooser)
445 gtk_widget_destroy (priv->filechooser);
446 priv->filechooser = NULL;
451 gtk_widget_destroy (priv->image);
457 gtk_widget_destroy (priv->label);
460 if (priv->info_label)
462 gtk_widget_destroy (priv->info_label);
463 priv->info_label = NULL;
468 check_toggled_cb (GtkToggleButton *toggle_button,
469 GtkPrinterOptionWidget *widget)
471 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
473 g_signal_handler_block (priv->source, priv->source_changed_handler);
474 gtk_printer_option_set_boolean (priv->source,
475 gtk_toggle_button_get_active (toggle_button));
476 g_signal_handler_unblock (priv->source, priv->source_changed_handler);
477 emit_changed (widget);
481 filesave_changed_cb (GtkWidget *button,
482 GtkPrinterOptionWidget *widget)
484 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
488 file = g_filename_from_utf8 (gtk_entry_get_text (GTK_ENTRY (priv->entry)),
489 -1, NULL, NULL, NULL);
493 /* combine the value of the chooser with the value of the entry */
494 g_signal_handler_block (priv->source, priv->source_changed_handler);
496 directory = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (priv->combo));
498 if ((g_uri_parse_scheme (file) == NULL) && (directory != NULL))
500 if (g_path_is_absolute (file))
501 uri = g_filename_to_uri (file, NULL, NULL);
507 if (file[0] == '~' && file[1] == '/')
509 path = g_build_filename (g_get_home_dir (), file + 2, NULL);
514 path = g_build_filename (directory, file, NULL);
517 uri = g_filename_to_uri (path, NULL, NULL);
524 if (g_uri_parse_scheme (file) != NULL)
525 uri = g_strdup (file);
527 uri = g_build_path ("/", gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (priv->combo)), file, NULL);
531 gtk_printer_option_set (priv->source, uri);
537 g_signal_handler_unblock (priv->source, priv->source_changed_handler);
538 emit_changed (widget);
542 filter_numeric (const gchar *val,
545 gboolean *changed_out)
549 int len = strlen (val);
550 gboolean dec_set = FALSE;
552 filtered_val = g_malloc (len + 1);
554 for (i = 0, j = 0; i < len; i++)
556 if (isdigit (val[i]))
558 filtered_val[j] = val[i];
561 else if (allow_dec && !dec_set &&
562 (val[i] == '.' || val[i] == ','))
564 /* allow one period or comma
565 * we should be checking locals
566 * but this is good enough for now
568 filtered_val[j] = val[i];
572 else if (allow_neg && i == 0 && val[0] == '-')
574 filtered_val[0] = val[0];
579 filtered_val[j] = '\0';
580 *changed_out = !(i == j);
586 combo_changed_cb (GtkWidget *combo,
587 GtkPrinterOptionWidget *widget)
589 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
591 gchar *filtered_val = NULL;
593 gboolean custom = TRUE;
595 g_signal_handler_block (priv->source, priv->source_changed_handler);
597 value = combo_box_get (combo, &custom);
599 /* Handle constraints if the user entered a custom value. */
602 switch (priv->source->type)
604 case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
605 filtered_val = filter_numeric (value, FALSE, FALSE, &changed);
607 case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
608 filtered_val = filter_numeric (value, TRUE, FALSE, &changed);
610 case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
611 filtered_val = filter_numeric (value, TRUE, TRUE, &changed);
626 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (combo)));
628 gtk_entry_set_text (entry, filtered_val);
630 value = filtered_val;
634 gtk_printer_option_set (priv->source, value);
636 g_signal_handler_unblock (priv->source, priv->source_changed_handler);
637 emit_changed (widget);
641 entry_changed_cb (GtkWidget *entry,
642 GtkPrinterOptionWidget *widget)
644 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
647 g_signal_handler_block (priv->source, priv->source_changed_handler);
648 value = gtk_entry_get_text (GTK_ENTRY (entry));
650 gtk_printer_option_set (priv->source, value);
651 g_signal_handler_unblock (priv->source, priv->source_changed_handler);
652 emit_changed (widget);
657 radio_changed_cb (GtkWidget *button,
658 GtkPrinterOptionWidget *widget)
660 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
663 g_signal_handler_block (priv->source, priv->source_changed_handler);
664 value = g_object_get_data (G_OBJECT (button), "value");
666 gtk_printer_option_set (priv->source, value);
667 g_signal_handler_unblock (priv->source, priv->source_changed_handler);
668 emit_changed (widget);
672 select_maybe (GtkWidget *widget,
675 gchar *v = g_object_get_data (G_OBJECT (widget), "value");
677 if (strcmp (value, v) == 0)
678 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
682 alternative_set (GtkWidget *box,
685 gtk_container_foreach (GTK_CONTAINER (box),
686 (GtkCallback) select_maybe,
691 alternative_append (GtkWidget *box,
694 GtkPrinterOptionWidget *widget,
699 button = gtk_radio_button_new_with_label (group, label);
700 gtk_widget_show (button);
701 gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
703 g_object_set_data (G_OBJECT (button), "value", (gpointer)value);
704 g_signal_connect (button, "toggled",
705 G_CALLBACK (radio_changed_cb), widget);
707 return gtk_radio_button_get_group (GTK_RADIO_BUTTON (button));
711 construct_widgets (GtkPrinterOptionWidget *widget)
713 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
714 GtkPrinterOption *source;
719 source = priv->source;
721 deconstruct_widgets (widget);
723 gtk_widget_set_sensitive (GTK_WIDGET (widget), TRUE);
727 priv->combo = combo_box_new ();
728 combo_box_append (priv->combo,_("Not available"), "None");
729 gtk_combo_box_set_active (GTK_COMBO_BOX (priv->combo), 0);
730 gtk_widget_set_sensitive (GTK_WIDGET (widget), FALSE);
731 gtk_widget_show (priv->combo);
732 gtk_box_pack_start (GTK_BOX (widget), priv->combo, TRUE, TRUE, 0);
734 else switch (source->type)
736 case GTK_PRINTER_OPTION_TYPE_BOOLEAN:
737 priv->check = gtk_check_button_new_with_mnemonic (source->display_text);
738 g_signal_connect (priv->check, "toggled", G_CALLBACK (check_toggled_cb), widget);
739 gtk_widget_show (priv->check);
740 gtk_box_pack_start (GTK_BOX (widget), priv->check, TRUE, TRUE, 0);
742 case GTK_PRINTER_OPTION_TYPE_PICKONE:
743 case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
744 case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
745 case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
746 case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
747 case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
748 if (source->type == GTK_PRINTER_OPTION_TYPE_PICKONE)
750 priv->combo = combo_box_new ();
754 priv->combo = combo_box_entry_new ();
756 if (source->type == GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD ||
757 source->type == GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE)
761 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->combo)));
763 gtk_entry_set_visibility (entry, FALSE);
768 for (i = 0; i < source->num_choices; i++)
769 combo_box_append (priv->combo,
770 source->choices_display[i],
772 gtk_widget_show (priv->combo);
773 gtk_box_pack_start (GTK_BOX (widget), priv->combo, TRUE, TRUE, 0);
774 g_signal_connect (priv->combo, "changed", G_CALLBACK (combo_changed_cb), widget);
776 text = g_strdup_printf ("%s:", source->display_text);
777 priv->label = gtk_label_new_with_mnemonic (text);
779 gtk_widget_show (priv->label);
782 case GTK_PRINTER_OPTION_TYPE_ALTERNATIVE:
784 priv->box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
785 gtk_widget_show (priv->box);
786 gtk_box_pack_start (GTK_BOX (widget), priv->box, TRUE, TRUE, 0);
787 for (i = 0; i < source->num_choices; i++)
788 group = alternative_append (priv->box,
789 source->choices_display[i],
794 if (source->display_text)
796 text = g_strdup_printf ("%s:", source->display_text);
797 priv->label = gtk_label_new_with_mnemonic (text);
799 gtk_widget_show (priv->label);
803 case GTK_PRINTER_OPTION_TYPE_STRING:
804 priv->entry = gtk_entry_new ();
805 gtk_entry_set_activates_default (GTK_ENTRY (priv->entry),
806 gtk_printer_option_get_activates_default (source));
807 gtk_widget_show (priv->entry);
808 gtk_box_pack_start (GTK_BOX (widget), priv->entry, TRUE, TRUE, 0);
809 g_signal_connect (priv->entry, "changed", G_CALLBACK (entry_changed_cb), widget);
811 text = g_strdup_printf ("%s:", source->display_text);
812 priv->label = gtk_label_new_with_mnemonic (text);
814 gtk_widget_show (priv->label);
818 case GTK_PRINTER_OPTION_TYPE_FILESAVE:
822 priv->filechooser = gtk_grid_new ();
823 gtk_grid_set_row_spacing (GTK_GRID (priv->filechooser), 6);
824 gtk_grid_set_column_spacing (GTK_GRID (priv->filechooser), 12);
826 /* TODO: make this a gtkfilechooserentry once we move to GTK */
827 priv->entry = gtk_entry_new ();
828 priv->combo = gtk_file_chooser_button_new (_("Select a folder"),
829 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
831 g_object_set (priv->combo, "local-only", FALSE, NULL);
832 gtk_entry_set_activates_default (GTK_ENTRY (priv->entry),
833 gtk_printer_option_get_activates_default (source));
835 label = gtk_label_new_with_mnemonic (_("_Name:"));
836 gtk_widget_set_halign (label, GTK_ALIGN_START);
837 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
838 gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->entry);
840 gtk_grid_attach (GTK_GRID (priv->filechooser), label, 0, 0, 1, 1);
841 gtk_grid_attach (GTK_GRID (priv->filechooser), priv->entry, 1, 0, 1, 1);
843 label = gtk_label_new_with_mnemonic (_("_Save in folder:"));
844 gtk_widget_set_halign (label, GTK_ALIGN_START);
845 gtk_widget_set_valign (label, GTK_ALIGN_CENTER);
846 gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->combo);
848 gtk_grid_attach (GTK_GRID (priv->filechooser), label, 0, 1, 1, 1);
849 gtk_grid_attach (GTK_GRID (priv->filechooser), priv->combo, 1, 1, 1, 1);
851 gtk_widget_show_all (priv->filechooser);
852 gtk_box_pack_start (GTK_BOX (widget), priv->filechooser, TRUE, TRUE, 0);
854 g_signal_connect (priv->entry, "changed", G_CALLBACK (filesave_changed_cb), widget);
856 g_signal_connect (priv->combo, "selection-changed", G_CALLBACK (filesave_changed_cb), widget);
860 case GTK_PRINTER_OPTION_TYPE_INFO:
861 priv->info_label = gtk_label_new (NULL);
862 gtk_label_set_selectable (GTK_LABEL (priv->info_label), TRUE);
863 gtk_widget_show (priv->info_label);
864 gtk_box_pack_start (GTK_BOX (widget), priv->info_label, FALSE, TRUE, 0);
866 text = g_strdup_printf ("%s:", source->display_text);
867 priv->label = gtk_label_new_with_mnemonic (text);
869 gtk_widget_show (priv->label);
877 priv->image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_MENU);
878 gtk_box_pack_start (GTK_BOX (widget), priv->image, FALSE, FALSE, 0);
882 update_widgets (GtkPrinterOptionWidget *widget)
884 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
885 GtkPrinterOption *source;
887 source = priv->source;
891 gtk_widget_hide (priv->image);
895 switch (source->type)
897 case GTK_PRINTER_OPTION_TYPE_BOOLEAN:
898 if (g_ascii_strcasecmp (source->value, "True") == 0)
899 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->check), TRUE);
901 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->check), FALSE);
903 case GTK_PRINTER_OPTION_TYPE_PICKONE:
904 combo_box_set (priv->combo, source->value);
906 case GTK_PRINTER_OPTION_TYPE_ALTERNATIVE:
907 alternative_set (priv->box, source->value);
909 case GTK_PRINTER_OPTION_TYPE_STRING:
910 gtk_entry_set_text (GTK_ENTRY (priv->entry), source->value);
912 case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSWORD:
913 case GTK_PRINTER_OPTION_TYPE_PICKONE_PASSCODE:
914 case GTK_PRINTER_OPTION_TYPE_PICKONE_REAL:
915 case GTK_PRINTER_OPTION_TYPE_PICKONE_INT:
916 case GTK_PRINTER_OPTION_TYPE_PICKONE_STRING:
920 entry = GTK_ENTRY (gtk_bin_get_child (GTK_BIN (priv->combo)));
921 if (gtk_printer_option_has_choice (source, source->value))
922 combo_box_set (priv->combo, source->value);
924 gtk_entry_set_text (entry, source->value);
928 case GTK_PRINTER_OPTION_TYPE_FILESAVE:
930 gchar *filename = g_filename_from_uri (source->value, NULL, NULL);
931 if (filename != NULL)
933 gchar *basename, *dirname, *text;
935 basename = g_path_get_basename (filename);
936 dirname = g_path_get_dirname (filename);
938 text = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
940 /* need to update dirname and basename without triggering function to avoid loosing names */
941 g_signal_handlers_block_by_func (priv->entry, G_CALLBACK (filesave_changed_cb), widget);
942 g_signal_handlers_block_by_func (priv->combo, G_CALLBACK (filesave_changed_cb), widget);
945 gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
946 if (g_path_is_absolute (dirname))
947 gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (priv->combo),
950 g_signal_handlers_unblock_by_func (priv->entry, G_CALLBACK (filesave_changed_cb), widget);
951 g_signal_handlers_unblock_by_func (priv->combo, G_CALLBACK (filesave_changed_cb), widget);
959 gtk_entry_set_text (GTK_ENTRY (priv->entry), source->value);
962 case GTK_PRINTER_OPTION_TYPE_INFO:
963 gtk_label_set_text (GTK_LABEL (priv->info_label), source->value);
969 if (source->has_conflict)
970 gtk_widget_show (priv->image);
972 gtk_widget_hide (priv->image);
976 gtk_printer_option_widget_has_external_label (GtkPrinterOptionWidget *widget)
978 return widget->priv->label != NULL;
982 gtk_printer_option_widget_get_external_label (GtkPrinterOptionWidget *widget)
984 return widget->priv->label;
988 gtk_printer_option_widget_get_value (GtkPrinterOptionWidget *widget)
990 GtkPrinterOptionWidgetPrivate *priv = widget->priv;
993 return priv->source->value;