/* * Copyright (C) 2002 Jorn Baayen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * $Id$ */ #include "print-dialog.h" #include "ephy-command-manager.h" #include "ephy-prefs.h" #include #include #include #include #define CONF_PRINT_BOTTOM_MARGIN "/apps/epiphany/dialogs/print_bottom_margin" #define CONF_PRINT_TOP_MARGIN "/apps/epiphany/dialogs/print_top_margin" #define CONF_PRINT_LEFT_MARGIN "/apps/epiphany/dialogs/print_left_margin" #define CONF_PRINT_RIGHT_MARGIN "/apps/epiphany/dialogs/print_right_margin" #define CONF_PRINT_PAGE_TITLE "/apps/epiphany/dialogs/print_page_title" #define CONF_PRINT_PAGE_URL "/apps/epiphany/dialogs/print_page_url" #define CONF_PRINT_DATE "/apps/epiphany/dialogs/print_date" #define CONF_PRINT_PAGE_NUMBERS "/apps/epiphany/dialogs/print_page_numbers" #define CONF_PRINT_PRINTER "/apps/epiphany/dialogs/print_printer" #define CONF_PRINT_FILE "/apps/epiphany/dialogs/print_file" #define CONF_PRINT_PRINTON "/apps/epiphany/dialogs/print_on" #define CONF_PRINT_PAPER "/apps/epiphany/dialogs/print_paper" #define CONF_PRINT_ALL_PAGES "/apps/epiphany/dialogs/print_all_pages" #define CONF_PRINT_COLOR "/apps/epiphany/dialogs/print_color" #define CONF_PRINT_ORIENTATION "/apps/epiphany/dialogs/print_orientation" static void print_dialog_class_init (PrintDialogClass *klass); static void print_dialog_init (PrintDialog *dialog); /* Glade callbacks */ void print_cancel_button_cb (GtkWidget *widget, EphyDialog *dialog); void print_ok_button_cb (GtkWidget *widget, EphyDialog *dialog); void print_preview_button_cb (GtkWidget *widget, EphyDialog *dialog); static GObjectClass *parent_class = NULL; #define EPHY_PRINT_DIALOG_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_PRINT_DIALOG, PrintDialogPrivate)) struct PrintDialogPrivate { GtkWidget *window; }; enum { WINDOW_PROP, PRINTON_PROP, PRINTER_PROP, FILE_PROP, PAPER_PROP, TOP_PROP, BOTTOM_PROP, LEFT_PROP, RIGHT_PROP, PAGE_TITLE_PROP, PAGE_URL_PROP, PAGE_NUMBERS_PROP, DATE_PROP, ALL_PAGES_PROP, TO_PROP, FROM_PROP, COLOR_PROP, ORIENTATION_PROP, PREVIEW_PROP, SELECTION_PROP }; enum { PREVIEW, LAST_SIGNAL }; static const EphyDialogProperty properties [] = { { "print_dialog", NULL, PT_NORMAL, 0 }, { "printer_radiobutton", CONF_PRINT_PRINTON, PT_NORMAL, 0 }, { "printer_entry", CONF_PRINT_PRINTER, PT_NORMAL, 0 }, { "file_entry", CONF_PRINT_FILE, PT_NORMAL, 0 }, { "A4_radiobutton", CONF_PRINT_PAPER, PT_NORMAL, G_TYPE_STRING }, { "top_spinbutton", CONF_PRINT_TOP_MARGIN, PT_NORMAL, 0 }, { "bottom_spinbutton", CONF_PRINT_BOTTOM_MARGIN, PT_NORMAL, 0 }, { "left_spinbutton", CONF_PRINT_LEFT_MARGIN, PT_NORMAL, 0 }, { "right_spinbutton", CONF_PRINT_RIGHT_MARGIN, PT_NORMAL, 0 }, { "print_page_title_checkbutton", CONF_PRINT_PAGE_TITLE, PT_NORMAL, 0 }, { "print_page_url_checkbutton", CONF_PRINT_PAGE_URL, PT_NORMAL, 0 }, { "print_page_numbers_checkbutton", CONF_PRINT_PAGE_NUMBERS, PT_NORMAL, 0 }, { "print_date_checkbutton", CONF_PRINT_DATE, PT_NORMAL, 0 }, { "all_pages_radiobutton", CONF_PRINT_ALL_PAGES, PT_NORMAL, 0 }, { "to_spinbutton", NULL, PT_NORMAL, 0 }, { "from_spinbutton", NULL, PT_NORMAL, 0 }, { "print_color_radiobutton", CONF_PRINT_COLOR, PT_NORMAL, 0 }, { "orient_p_radiobutton", CONF_PRINT_ORIENTATION, PT_NORMAL, 0 }, { "preview_button", NULL, PT_NORMAL, 0 }, { "selection_radiobutton", NULL, PT_NORMAL, 0 }, { NULL } }; static const char *paper_format_enum [] = { "A4", "Letter", "Legal", "Executive" }; static guint n_paper_format_enum = G_N_ELEMENTS (paper_format_enum); static guint print_dialog_signals[LAST_SIGNAL] = { 0 }; GType print_dialog_get_type (void) { static GType print_dialog_type = 0; if (print_dialog_type == 0) { static const GTypeInfo our_info = { sizeof (PrintDialogClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc) print_dialog_class_init, NULL, NULL, /* class_data */ sizeof (PrintDialog), 0, /* n_preallocs */ (GInstanceInitFunc) print_dialog_init }; print_dialog_type = g_type_register_static (EPHY_TYPE_EMBED_DIALOG, "PrintDialog", &our_info, 0); } return print_dialog_type; } static void impl_show (EphyDialog *dialog) { PrintDialog *print_dialog = EPHY_PRINT_DIALOG (dialog); EphyEmbed *embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG (dialog)); EPHY_DIALOG_CLASS (parent_class)->show (dialog); if (print_dialog->only_collect_info) { GtkWidget *button; /* disappear preview button */ button = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[PREVIEW_PROP].id); gtk_widget_hide (button); } if (ephy_command_manager_can_do_command (EPHY_COMMAND_MANAGER (embed), "cmd_copy") == FALSE) { GtkWidget *widget; /* Make selection button disabled */ widget = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[SELECTION_PROP].id); gtk_widget_set_sensitive (widget, FALSE); if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) { GtkWidget *all_pages; all_pages = ephy_dialog_get_control (EPHY_DIALOG (dialog), properties[ALL_PAGES_PROP].id); gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (all_pages), TRUE); } } } static void print_dialog_class_init (PrintDialogClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); EphyDialogClass *dialog_class = EPHY_DIALOG_CLASS (klass); parent_class = g_type_class_peek_parent (klass); dialog_class->show = impl_show; print_dialog_signals[PREVIEW] = g_signal_new ("preview", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (PrintDialogClass, preview), NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); g_type_class_add_private (object_class, sizeof(PrintDialogPrivate)); } static void print_dialog_init (PrintDialog *dialog) { GdkPixbuf *icon; dialog->priv = EPHY_PRINT_DIALOG_GET_PRIVATE (dialog); dialog->only_collect_info = FALSE; dialog->ret_info = NULL; ephy_dialog_construct (EPHY_DIALOG(dialog), properties, "print.glade", "print_dialog"); dialog->priv->window = ephy_dialog_get_control (EPHY_DIALOG(dialog), properties[WINDOW_PROP].id); ephy_dialog_add_enum (EPHY_DIALOG (dialog), properties[PAPER_PROP].id, n_paper_format_enum, paper_format_enum); icon = gtk_widget_render_icon (dialog->priv->window, GTK_STOCK_PRINT, GTK_ICON_SIZE_MENU, "print_dialog"); gtk_window_set_icon (GTK_WINDOW(dialog->priv->window), icon); g_object_unref (icon); } EphyDialog * print_dialog_new (EphyEmbed *embed, EmbedPrintInfo **ret_info) { PrintDialog *dialog; dialog = EPHY_PRINT_DIALOG (g_object_new (EPHY_TYPE_PRINT_DIALOG, "embed", embed, NULL)); if (ret_info != NULL) { dialog->only_collect_info = TRUE; dialog->ret_info = ret_info; } return EPHY_DIALOG(dialog); } EphyDialog * print_dialog_new_with_parent (GtkWidget *window, EphyEmbed *embed, EmbedPrintInfo **ret_info) { PrintDialog *dialog; dialog = EPHY_PRINT_DIALOG (g_object_new (EPHY_TYPE_PRINT_DIALOG, "embed", embed, "parent-window", window, NULL)); if (ret_info != NULL) { dialog->only_collect_info = TRUE; dialog->ret_info = ret_info; } return EPHY_DIALOG(dialog); } void print_free_info (EmbedPrintInfo *info) { g_free (info->printer); g_free (info->file); g_free (info->paper); g_free (info->header_left_string); g_free (info->header_center_string); g_free (info->header_right_string); g_free (info->footer_left_string); g_free (info->footer_center_string); g_free (info->footer_right_string); g_free (info); } static EmbedPrintInfo * print_get_info (EphyDialog *dialog) { EmbedPrintInfo *info; GValue print_to_file = {0, }; GValue printer = {0, }; GValue file = {0, }; GValue top_margin = {0, }; GValue bottom_margin = {0, }; GValue left_margin = {0, }; GValue right_margin = {0, }; GValue from_page = {0, }; GValue to_page = {0, }; GValue paper = {0, }; GValue pages = {0, }; GValue print_color = {0, }; GValue orientation = {0, }; GValue page_title = {0, }; GValue page_url = {0, }; GValue date = {0, }; GValue page_numbers = {0, }; const char *filename; info = g_new0 (EmbedPrintInfo, 1); ephy_dialog_get_value (dialog, properties[PRINTON_PROP].id, &print_to_file); info->print_to_file = g_value_get_int (&print_to_file); g_value_unset (&print_to_file); ephy_dialog_get_value (dialog, properties[PRINTER_PROP].id, &printer); info->printer = g_strdup (g_value_get_string (&printer)); g_value_unset (&printer); ephy_dialog_get_value (dialog, properties[FILE_PROP].id, &file); filename = g_value_get_string (&file); if (filename != NULL) { info->file = gnome_vfs_expand_initial_tilde (g_value_get_string (&file)); } else { info->file = NULL; } g_value_unset (&file); ephy_dialog_get_value (dialog, properties[BOTTOM_PROP].id, &bottom_margin); info->bottom_margin = g_value_get_float (&bottom_margin); g_value_unset (&bottom_margin); ephy_dialog_get_value (dialog, properties[LEFT_PROP].id, &left_margin); info->left_margin = g_value_get_float (&left_margin); g_value_unset (&left_margin); ephy_dialog_get_value (dialog, properties[TOP_PROP].id, &top_margin); info->top_margin = g_value_get_float (&top_margin); g_value_unset (&top_margin); ephy_dialog_get_value (dialog, properties[RIGHT_PROP].id, &right_margin); info->right_margin = g_value_get_float (&right_margin); g_value_unset (&right_margin); ephy_dialog_get_value (dialog, properties[FROM_PROP].id, &from_page); info->from_page = g_value_get_float (&from_page); g_value_unset (&from_page); ephy_dialog_get_value (dialog, properties[TO_PROP].id, &to_page); info->to_page = g_value_get_float (&to_page); g_value_unset (&to_page); ephy_dialog_get_value (dialog, properties[PAPER_PROP].id, &paper); info->paper = g_strdup (paper_format_enum[g_value_get_int (&paper)]); g_value_unset (&paper); ephy_dialog_get_value (dialog, properties[ALL_PAGES_PROP].id, &pages); info->pages = g_value_get_int (&pages); g_value_unset (&pages); ephy_dialog_get_value (dialog, properties[COLOR_PROP].id, &print_color); info->print_color = !g_value_get_int (&print_color); g_value_unset (&print_color); ephy_dialog_get_value (dialog, properties[ORIENTATION_PROP].id, &orientation); info->orientation = g_value_get_int (&orientation); g_value_unset (&orientation); info->frame_type = 0; ephy_dialog_get_value (dialog, properties[PAGE_TITLE_PROP].id, &page_title); info->header_left_string = g_value_get_boolean (&page_title) ? g_strdup ("&T") : g_strdup (""); g_value_unset (&page_title); ephy_dialog_get_value (dialog, properties[PAGE_URL_PROP].id, &page_url); info->header_right_string = g_value_get_boolean (&page_url) ? g_strdup ("&U") : g_strdup (""); g_value_unset (&page_url); ephy_dialog_get_value (dialog, properties[PAGE_NUMBERS_PROP].id, &page_numbers); info->footer_left_string = g_value_get_boolean (&page_numbers) ? g_strdup ("&PT") : g_strdup (""); g_value_unset (&page_numbers); ephy_dialog_get_value (dialog, properties[DATE_PROP].id, &date); info->footer_right_string = g_value_get_boolean (&date) ? g_strdup ("&D") : g_strdup (""); g_value_unset (&date); info->header_center_string = g_strdup(""); info->footer_center_string = g_strdup(""); return info; } static void print_dialog_print (EphyDialog *dialog) { EmbedPrintInfo *info; EphyEmbed *embed; info = print_get_info (dialog); if(EPHY_PRINT_DIALOG(dialog)->only_collect_info && EPHY_PRINT_DIALOG(dialog)->ret_info) { *(EPHY_PRINT_DIALOG(dialog)->ret_info) = info; /* When in collect_info mode the caller owns the reference */ return; } embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG(dialog)); g_return_if_fail (embed != NULL); info->preview = FALSE; ephy_embed_print (embed, info); print_free_info (info); g_object_unref (G_OBJECT(dialog)); } static void print_dialog_preview (EphyDialog *dialog) { EmbedPrintInfo *info; EphyEmbed *embed; /* Should not be called in collect_info mode */ if(EPHY_PRINT_DIALOG(dialog)->only_collect_info && EPHY_PRINT_DIALOG(dialog)->ret_info) { g_return_if_reached (); } info = print_get_info (dialog); embed = ephy_embed_dialog_get_embed (EPHY_EMBED_DIALOG(dialog)); g_return_if_fail (embed != NULL); info->preview = TRUE; ephy_embed_print (embed, info); print_free_info (info); g_signal_emit (G_OBJECT (dialog), print_dialog_signals[PREVIEW], 0); g_object_unref (G_OBJECT(dialog)); } void print_cancel_button_cb (GtkWidget *widget, EphyDialog *dialog) { if (EPHY_PRINT_DIALOG (dialog)->only_collect_info) { /* When in collect_info mode the caller owns the reference */ return; } g_object_unref (G_OBJECT(dialog)); } void print_ok_button_cb (GtkWidget *widget, EphyDialog *dialog) { print_dialog_print (dialog); } void print_preview_button_cb (GtkWidget *widget, EphyDialog *dialog) { print_dialog_preview (dialog); }