+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE);
+ gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE);
+ file = g_file_new_for_uri (ev_window->priv->uri);
+ base_name = g_file_get_basename (file);
+ gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name);
+
+ default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_SAVE);
+ if (default_uri) {
+ gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (fc), default_uri);
+ } else {
+ const gchar *folder;
+
+ folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+ gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+ folder ? folder : g_get_home_dir ());
+ }
+
+ g_object_unref (file);
+ g_free (base_name);
+
+ g_signal_connect (fc, "response",
+ G_CALLBACK (file_save_dialog_response_cb),
+ ev_window);
+
+ gtk_widget_show (fc);
+}
+
+static GKeyFile *
+get_print_settings_file (void)
+{
+ GKeyFile *print_settings_file;
+ gchar *filename;
+ GError *error = NULL;
+
+ print_settings_file = g_key_file_new ();
+
+ filename = g_build_filename (ev_application_get_dot_dir (EV_APP, FALSE),
+ EV_PRINT_SETTINGS_FILE, NULL);
+ if (!g_key_file_load_from_file (print_settings_file,
+ filename,
+ G_KEY_FILE_KEEP_COMMENTS |
+ G_KEY_FILE_KEEP_TRANSLATIONS,
+ &error)) {
+
+ /* Don't warn if the file simply doesn't exist */
+ if (!g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT))
+ g_warning ("%s", error->message);
+
+ g_error_free (error);
+ }
+
+ g_free (filename);
+
+ return print_settings_file;
+}
+
+static void
+save_print_setting_file (GKeyFile *key_file)
+{
+ gchar *filename;
+ gchar *data;
+ gsize data_length;
+ GError *error = NULL;
+
+ filename = g_build_filename (ev_application_get_dot_dir (EV_APP, TRUE),
+ EV_PRINT_SETTINGS_FILE, NULL);
+ data = g_key_file_to_data (key_file, &data_length, NULL);
+ g_file_set_contents (filename, data, data_length, &error);
+ if (error) {
+ g_warning ("Failed to save print settings: %s", error->message);
+ g_error_free (error);
+ }
+ g_free (data);
+ g_free (filename);
+}
+
+static void
+ev_window_save_print_settings (EvWindow *window,
+ GtkPrintSettings *print_settings)
+{
+ GKeyFile *key_file;
+ gint i;
+
+ key_file = get_print_settings_file ();
+ gtk_print_settings_to_key_file (print_settings, key_file, EV_PRINT_SETTINGS_GROUP);
+
+ /* Save print settings that are specific to the document */
+ for (i = 0; i < G_N_ELEMENTS (document_print_settings); i++) {
+ /* Remove it from global settings */
+ g_key_file_remove_key (key_file, EV_PRINT_SETTINGS_GROUP,
+ document_print_settings[i], NULL);
+
+ if (window->priv->metadata) {
+ const gchar *value;
+
+ value = gtk_print_settings_get (print_settings,
+ document_print_settings[i]);
+ ev_metadata_set_string (window->priv->metadata,
+ document_print_settings[i], value);
+ }
+ }
+
+ save_print_setting_file (key_file);
+ g_key_file_free (key_file);
+}
+
+static void
+ev_window_save_print_page_setup (EvWindow *window,
+ GtkPageSetup *page_setup)
+{
+ GKeyFile *key_file;
+
+ key_file = get_print_settings_file ();
+ gtk_page_setup_to_key_file (page_setup, key_file, EV_PAGE_SETUP_GROUP);
+
+ /* Do not save document settings in global file */
+ g_key_file_remove_key (key_file, EV_PAGE_SETUP_GROUP,
+ "page-setup-orientation", NULL);
+ g_key_file_remove_key (key_file, EV_PAGE_SETUP_GROUP,
+ "page-setup-margin-top", NULL);
+ g_key_file_remove_key (key_file, EV_PAGE_SETUP_GROUP,
+ "page-setup-margin-bottom", NULL);
+ g_key_file_remove_key (key_file, EV_PAGE_SETUP_GROUP,
+ "page-setup-margin-left", NULL);
+ g_key_file_remove_key (key_file, EV_PAGE_SETUP_GROUP,
+ "page-setup-margin-right", NULL);
+
+ save_print_setting_file (key_file);
+ g_key_file_free (key_file);
+
+ if (!window->priv->metadata)
+ return;
+
+ /* Save page setup options that are specific to the document */
+ ev_metadata_set_int (window->priv->metadata, "page-setup-orientation",
+ gtk_page_setup_get_orientation (page_setup));
+ ev_metadata_set_double (window->priv->metadata, "page-setup-margin-top",
+ gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_MM));
+ ev_metadata_set_double (window->priv->metadata, "page-setup-margin-bottom",
+ gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_MM));
+ ev_metadata_set_double (window->priv->metadata, "page-setup-margin-left",
+ gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_MM));
+ ev_metadata_set_double (window->priv->metadata, "page-setup-margin-right",
+ gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_MM));
+}
+
+static void
+ev_window_load_print_settings_from_metadata (EvWindow *window,
+ GtkPrintSettings *print_settings)
+{
+ gint i;
+
+ if (!window->priv->metadata)
+ return;
+
+ /* Load print setting that are specific to the document */
+ for (i = 0; i < G_N_ELEMENTS (document_print_settings); i++) {
+ gchar *value = NULL;
+
+ ev_metadata_get_string (window->priv->metadata,
+ document_print_settings[i], &value);
+ gtk_print_settings_set (print_settings,
+ document_print_settings[i], value);
+ }
+}
+
+static void
+ev_window_load_print_page_setup_from_metadata (EvWindow *window,
+ GtkPageSetup *page_setup)
+{
+ gint int_value;
+ gdouble double_value;
+ GtkPaperSize *paper_size = gtk_page_setup_get_paper_size (page_setup);
+
+ /* Load page setup options that are specific to the document */
+ if (window->priv->metadata &&
+ ev_metadata_get_int (window->priv->metadata, "page-setup-orientation", &int_value)) {
+ gtk_page_setup_set_orientation (page_setup, int_value);
+ } else {
+ gtk_page_setup_set_orientation (page_setup, GTK_PAGE_ORIENTATION_PORTRAIT);
+ }
+
+ if (window->priv->metadata &&
+ ev_metadata_get_double (window->priv->metadata, "page-setup-margin-top", &double_value)) {
+ gtk_page_setup_set_top_margin (page_setup, double_value, GTK_UNIT_MM);
+ } else {
+ gtk_page_setup_set_top_margin (page_setup,
+ gtk_paper_size_get_default_top_margin (paper_size, GTK_UNIT_MM),
+ GTK_UNIT_MM);
+ }
+
+ if (window->priv->metadata &&
+ ev_metadata_get_double (window->priv->metadata, "page-setup-margin-bottom", &double_value)) {
+ gtk_page_setup_set_bottom_margin (page_setup, double_value, GTK_UNIT_MM);
+ } else {
+ gtk_page_setup_set_bottom_margin (page_setup,
+ gtk_paper_size_get_default_bottom_margin (paper_size, GTK_UNIT_MM),
+ GTK_UNIT_MM);
+ }