2 * Copyright © 2006 Christian Persch
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
9 * This program 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
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * $Id: ephy-print-utils.c 6952 2007-03-11 19:42:02Z chpe $
26 #include <gtk/gtktypebuiltins.h>
28 #include "ephy-debug.h"
29 #include "ephy-string.h"
31 #include "ephy-print-utils.h"
33 #define PRINT_SETTINGS_GROUP "Print Settings"
34 #define PAGE_SETUP_GROUP "Page Setup"
35 #define PAPER_SIZE_GROUP "Paper Size"
37 #define ERROR_QUARK (g_quark_from_static_string ("ephy-print-utils-error"))
40 * ephy_print_utils_settings_new_from_file:
41 * @file_name: the filename to read the settings from
44 * Reads the print settings from @filename. Returns a new #GtkPrintSettings
45 * object with the restored settings, or %NULL if an error occurred.
47 * Return value: the restored #GtkPrintSettings
52 ephy_print_utils_settings_new_from_file (const gchar
*file_name
,
55 GtkPrintSettings
*settings
;
58 g_return_val_if_fail (file_name
!= NULL
, NULL
);
60 key_file
= g_key_file_new ();
61 if (!g_key_file_load_from_file (key_file
, file_name
, 0, error
))
63 g_key_file_free (key_file
);
67 settings
= ephy_print_utils_settings_new_from_key_file (key_file
, error
);
68 g_key_file_free (key_file
);
74 * ephy_print_utils_settings_new_from_key_file:
75 * @key_file: the #GKeyFile to retrieve the settings from
78 * Reads the print settings from @key_file. Returns a new #GtkPrintSettings
79 * object with the restored settings, or %NULL if an error occurred.
81 * Return value: the restored #GtkPrintSettings
86 ephy_print_utils_settings_new_from_key_file (GKeyFile
*key_file
,
89 GtkPrintSettings
*settings
;
94 g_return_val_if_fail (key_file
!= NULL
, NULL
);
96 keys
= g_key_file_get_keys (key_file
,
102 g_propagate_error (error
, err
);
106 settings
= gtk_print_settings_new ();
108 for (i
= 0 ; i
< n_keys
; ++i
)
112 value
= g_key_file_get_string (key_file
,
113 PRINT_SETTINGS_GROUP
,
119 gtk_print_settings_set (settings
, keys
[i
], value
);
129 * ephy_print_utils_settings_to_file:
130 * @settings: a #GtkPrintSettings
131 * @file_name: the file to save to
134 * This function saves the print settings from @settings to @file_name.
136 * Return value: %TRUE on success
141 ephy_print_utils_settings_to_file (GtkPrintSettings
*settings
,
142 const char *file_name
,
151 g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings
), FALSE
);
152 g_return_val_if_fail (file_name
!= NULL
, FALSE
);
154 keyfile
= g_key_file_new ();
155 retval
= ephy_print_utils_settings_to_key_file (settings
, keyfile
, &err
);
156 if (!retval
) goto out
;
158 data
= g_key_file_to_data (keyfile
, &len
, &err
);
161 retval
= g_file_set_contents (file_name
, data
, len
, &err
);
165 g_propagate_error (error
, err
);
167 g_key_file_free (keyfile
);
174 add_value_to_keyfile (const gchar
*key
,
178 g_key_file_set_string (keyfile
, PRINT_SETTINGS_GROUP
, key
, value
);
182 * ephy_print_utils_settings_to_key_file:
183 * @settings: a #GtkPrintSettings
184 * @key_file: the #GKeyFile to save the print settings to
187 * This function adds the print settings from @settings to @key_file.
189 * Return value: %TRUE on success
194 ephy_print_utils_settings_to_key_file (GtkPrintSettings
*settings
,
198 g_return_val_if_fail (GTK_IS_PRINT_SETTINGS (settings
), FALSE
);
199 g_return_val_if_fail (key_file
!= NULL
, FALSE
);
201 gtk_print_settings_foreach (settings
,
202 (GtkPrintSettingsFunc
) add_value_to_keyfile
,
209 * ephy_print_utils_page_setup_new_from_file:
210 * @file_name: the filename to read the page_setup from
213 * Reads the print page_setup from @filename. Returns a new #GtkPageSetup
214 * object with the restored page_setup, or %NULL if an error occurred.
216 * Return value: the restored #GtkPageSetup
221 ephy_print_utils_page_setup_new_from_file (const gchar
*file_name
,
224 GtkPageSetup
*page_setup
;
227 g_return_val_if_fail (file_name
!= NULL
, NULL
);
229 key_file
= g_key_file_new ();
230 if (!g_key_file_load_from_file (key_file
, file_name
, 0, error
))
232 g_key_file_free (key_file
);
236 page_setup
= ephy_print_utils_page_setup_new_from_key_file (key_file
, error
);
237 g_key_file_free (key_file
);
243 * ephy_print_utils_page_setup_new_from_key_file:
244 * @key_file: the #GKeyFile to retrieve the page_setup from
247 * Reads the print page_setup from @key_file. Returns a new #GtkPageSetup
248 * object with the restored page_setup, or %NULL if an error occurred.
250 * Return value: the restored #GtkPageSetup
255 ephy_print_utils_page_setup_new_from_key_file (GKeyFile
*key_file
,
258 GtkPageSetup
*page_setup
= NULL
;
259 GtkPaperSize
*paper_size
= NULL
;
260 gdouble width
, height
, top
, bottom
, left
, right
;
261 char *name
= NULL
, *ppd_name
= NULL
, *display_name
= NULL
, *orientation
= NULL
;
262 gboolean retval
= TRUE
;
265 g_return_val_if_fail (key_file
!= NULL
, NULL
);
267 if (!g_key_file_has_group (key_file
, PAGE_SETUP_GROUP
) ||
268 !g_key_file_has_group (key_file
, PAPER_SIZE_GROUP
)) {
269 g_set_error (error
, ERROR_QUARK
, 0, "Not a valid epiphany page setup file");
274 #define GET_DOUBLE(kf, group, name, v) \
275 v = g_key_file_get_double (kf, group, name, &err); \
277 g_propagate_error (error, err);\
282 GET_DOUBLE (key_file
, PAPER_SIZE_GROUP
, "Width", width
);
283 GET_DOUBLE (key_file
, PAPER_SIZE_GROUP
, "Height", height
);
284 GET_DOUBLE (key_file
, PAGE_SETUP_GROUP
, "MarginTop", top
);
285 GET_DOUBLE (key_file
, PAGE_SETUP_GROUP
, "MarginBottom", bottom
);
286 GET_DOUBLE (key_file
, PAGE_SETUP_GROUP
, "MarginLeft", left
);
287 GET_DOUBLE (key_file
, PAGE_SETUP_GROUP
, "MarginRight", right
);
291 name
= g_key_file_get_string (key_file
, PAPER_SIZE_GROUP
,
293 ppd_name
= g_key_file_get_string (key_file
, PAPER_SIZE_GROUP
,
295 display_name
= g_key_file_get_string (key_file
, PAPER_SIZE_GROUP
,
296 "DisplayName", NULL
);
297 orientation
= g_key_file_get_string (key_file
, PAGE_SETUP_GROUP
,
298 "Orientation", NULL
);
300 if ((ppd_name
== NULL
&& name
== NULL
) || orientation
== NULL
)
302 g_set_error (error
, ERROR_QUARK
, 0, "Not a valid epiphany page setup file");
307 if (ppd_name
!= NULL
) {
308 paper_size
= gtk_paper_size_new_from_ppd (ppd_name
, display_name
,
311 paper_size
= gtk_paper_size_new_custom (name
, display_name
,
312 width
, height
, GTK_UNIT_MM
);
314 g_assert (paper_size
!= NULL
);
316 page_setup
= gtk_page_setup_new ();
317 gtk_page_setup_set_paper_size (page_setup
, paper_size
);
318 gtk_paper_size_free (paper_size
);
320 gtk_page_setup_set_top_margin (page_setup
, top
, GTK_UNIT_MM
);
321 gtk_page_setup_set_bottom_margin (page_setup
, bottom
, GTK_UNIT_MM
);
322 gtk_page_setup_set_left_margin (page_setup
, left
, GTK_UNIT_MM
);
323 gtk_page_setup_set_right_margin (page_setup
, right
, GTK_UNIT_MM
);
325 gtk_page_setup_set_orientation (page_setup
,
326 ephy_string_enum_from_string (GTK_TYPE_PAGE_ORIENTATION
,
331 g_free (display_name
);
332 g_free (orientation
);
338 * ephy_print_utils_page_setup_to_file:
339 * @page_setup: a #GtkPageSetup
340 * @file_name: the file to save to
343 * This function saves the print page_setup from @page_setup to @file_name.
345 * Return value: %TRUE on success
350 ephy_print_utils_page_setup_to_file (GtkPageSetup
*page_setup
,
351 const char *file_name
,
359 g_return_val_if_fail (GTK_IS_PAGE_SETUP (page_setup
), FALSE
);
360 g_return_val_if_fail (file_name
!= NULL
, FALSE
);
362 keyfile
= g_key_file_new ();
363 retval
= ephy_print_utils_page_setup_to_key_file (page_setup
, keyfile
, error
);
364 if (!retval
) goto out
;
366 data
= g_key_file_to_data (keyfile
, &len
, error
);
369 retval
= g_file_set_contents (file_name
, data
, len
, error
);
372 g_key_file_free (keyfile
);
379 * ephy_print_utils_page_setup_to_key_file:
380 * @page_setup: a #GtkPageSetup
381 * @key_file: the #GKeyFile to save the print page_setup to
384 * This function adds the print page_setup from @page_setup to @key_file.
386 * Return value: %TRUE on success
391 ephy_print_utils_page_setup_to_key_file (GtkPageSetup
*page_setup
,
395 GtkPaperSize
*paper_size
;
396 const char *name
, *ppd_name
, *display_name
;
399 g_return_val_if_fail (GTK_IS_PAGE_SETUP (page_setup
), FALSE
);
400 g_return_val_if_fail (key_file
!= NULL
, FALSE
);
402 paper_size
= gtk_page_setup_get_paper_size (page_setup
);
403 g_assert (paper_size
!= NULL
);
405 name
= gtk_paper_size_get_name (paper_size
);
406 display_name
= gtk_paper_size_get_display_name (paper_size
);
407 ppd_name
= gtk_paper_size_get_ppd_name (paper_size
);
409 if (ppd_name
!= NULL
) {
410 g_key_file_set_string (key_file
, PAPER_SIZE_GROUP
,
411 "PPDName", ppd_name
);
413 g_key_file_set_string (key_file
, PAPER_SIZE_GROUP
,
418 g_key_file_set_string (key_file
, PAPER_SIZE_GROUP
,
419 "DisplayName", display_name
);
422 g_key_file_set_double (key_file
, PAPER_SIZE_GROUP
,
423 "Width", gtk_paper_size_get_width (paper_size
, GTK_UNIT_MM
));
424 g_key_file_set_double (key_file
, PAPER_SIZE_GROUP
,
425 "Height", gtk_paper_size_get_height (paper_size
, GTK_UNIT_MM
));
427 g_key_file_set_double (key_file
, PAGE_SETUP_GROUP
,
428 "MarginTop", gtk_page_setup_get_top_margin (page_setup
, GTK_UNIT_MM
));
429 g_key_file_set_double (key_file
, PAGE_SETUP_GROUP
,
430 "MarginBottom", gtk_page_setup_get_bottom_margin (page_setup
, GTK_UNIT_MM
));
431 g_key_file_set_double (key_file
, PAGE_SETUP_GROUP
,
432 "MarginLeft", gtk_page_setup_get_left_margin (page_setup
, GTK_UNIT_MM
));
433 g_key_file_set_double (key_file
, PAGE_SETUP_GROUP
,
434 "MarginRight", gtk_page_setup_get_right_margin (page_setup
, GTK_UNIT_MM
));
436 orientation
= ephy_string_enum_to_string (GTK_TYPE_PAGE_ORIENTATION
,
437 gtk_page_setup_get_orientation (page_setup
));
438 g_key_file_set_string (key_file
, PAGE_SETUP_GROUP
,
439 "Orientation", orientation
);
440 g_free (orientation
);