aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla/GeckoPrintService.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'embed/mozilla/GeckoPrintService.cpp')
-rw-r--r--embed/mozilla/GeckoPrintService.cpp755
1 files changed, 0 insertions, 755 deletions
diff --git a/embed/mozilla/GeckoPrintService.cpp b/embed/mozilla/GeckoPrintService.cpp
deleted file mode 100644
index de2020397..000000000
--- a/embed/mozilla/GeckoPrintService.cpp
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- * Copyright © 2006, 2007 Christian Persch
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $Id$
- */
-
-#include "mozilla-config.h"
-#include "config.h"
-
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtkcheckbutton.h>
-#include <gtk/gtkdialog.h>
-#include <gtk/gtklabel.h>
-#include <gtk/gtkmessagedialog.h>
-#include <gtk/gtkprintunixdialog.h>
-#include <gtk/gtkstock.h>
-#include <gtk/gtkwindow.h>
-#include <glade/glade-xml.h>
-
-#include <nsStringAPI.h>
-
-#include <nsCOMPtr.h>
-#include <nsIDOMWindow.h>
-#include <nsIDOMWindowInternal.h>
-
-#include "eel-gconf-extensions.h"
-#include "ephy-debug.h"
-#include "ephy-embed-shell.h"
-#include "ephy-file-helpers.h"
-#include "ephy-gui.h"
-#include "ephy-prefs.h"
-#include "ephy-stock-icons.h"
-
-#include "AutoModalDialog.h"
-#include "EphyUtils.h"
-#include "GeckoPrintSession.h"
-
-#include "GeckoPrintService.h"
-
-/* Some printing keys */
-
-#define CONF_PRINT_BG_COLORS "/apps/epiphany/dialogs/print_background_colors"
-#define CONF_PRINT_BG_IMAGES "/apps/epiphany/dialogs/print_background_images"
-#define CONF_PRINT_COLOR "/apps/epiphany/dialogs/print_color"
-#define CONF_PRINT_DATE "/apps/epiphany/dialogs/print_date"
-#define CONF_PRINT_PAGE_NUMBERS "/apps/epiphany/dialogs/print_page_numbers"
-#define CONF_PRINT_PAGE_TITLE "/apps/epiphany/dialogs/print_page_title"
-#define CONF_PRINT_PAGE_URL "/apps/epiphany/dialogs/print_page_url"
-
-#define LITERAL(s) reinterpret_cast<const nsAString::char_type*>(NS_L(s))
-
-/* From nsIDeviceContext.h */
-#define NS_ERROR_GFX_PRINTER_BASE (1) /* adjustable :-) */
-#define NS_ERROR_GFX_PRINTER_ACCESS_DENIED \
- NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GFX,NS_ERROR_GFX_PRINTER_BASE+5)
-#define NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND \
- NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_GFX,NS_ERROR_GFX_PRINTER_BASE+4)
-
-NS_IMPL_ISUPPORTS1 (GeckoPrintService,
- nsIPrintingPromptService)
-
-GeckoPrintService::GeckoPrintService()
-{
- LOG ("GeckoPrintService ctor [%p]", this);
-}
-
-GeckoPrintService::~GeckoPrintService()
-{
- LOG ("GeckoPrintService dtor [%p]", this);
-}
-
-/* nsIPrintingPromptService implementation */
-
-/* void showPrintDialog (in nsIDOMWindow parent,
- in nsIWebBrowserPrint webBrowserPrint,
- in nsIPrintSettings printSettings); */
-NS_IMETHODIMP
-GeckoPrintService::ShowPrintDialog (nsIDOMWindow *aParent,
- nsIWebBrowserPrint *aWebBrowserPrint,
- nsIPrintSettings *aSettings)
-{
- /* Locked down? */
- if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINTING)) {
- return NS_ERROR_GFX_PRINTER_ACCESS_DENIED;
- }
-
- GeckoPrintSession *session = GeckoPrintSession::FromSettings (aSettings);
- NS_ENSURE_TRUE (session, NS_ERROR_INVALID_POINTER);
-
- /* Print settings changes disallowed, just translate the settings */
- if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINT_SETUP)) {
- return PrintUnattended (aParent, aSettings);
- }
-
- /* Not locked down, show the dialogue */
-
- nsresult rv;
-#if 0
- PRBool haveSelection = PR_FALSE;
- rv = aSettings->GetPrintOptions(nsIPrintSettings::kEnableSelectionRB, &haveSelection);
- NS_ENSURE_SUCCESS (rv, rv);
-#endif
-
- PRInt16 frameUI = nsIPrintSettings::kFrameEnableAll;
- rv = aSettings->GetHowToEnableFrameUI (&frameUI);
- NS_ENSURE_SUCCESS (rv, rv);
-
- AutoModalDialog modalDialog (aParent, PR_TRUE);
- if (!modalDialog.ShouldShow ())
- return NS_ERROR_ABORT;
-
- GtkWindow *parent = modalDialog.GetParent ();
- NS_ENSURE_TRUE(parent, NS_ERROR_INVALID_POINTER);
-
- EphyEmbedShell *shell = ephy_embed_shell_get_default ();
-
- GladeXML *xml = glade_xml_new (ephy_file ("print.glade"),
- "print_dialog_custom_tab", NULL);
- if (!xml) {
- return NS_ERROR_FAILURE;
- }
-
- /* Build the custom tab */
- GtkWidget *custom_tab = glade_xml_get_widget (xml, "custom_tab_container");
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_bg_colors_checkbutton"), CONF_PRINT_BG_COLORS);
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_bg_images_checkbutton"), CONF_PRINT_BG_IMAGES);
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_date_checkbutton"), CONF_PRINT_DATE);
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_page_numbers_checkbutton"), CONF_PRINT_PAGE_NUMBERS);
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_page_title_checkbutton"), CONF_PRINT_PAGE_TITLE);
- ephy_gui_connect_checkbutton_to_gconf (glade_xml_get_widget (xml, "print_page_url_checkbutton"), CONF_PRINT_PAGE_URL);
-
- GtkWidget *frame_box = glade_xml_get_widget (xml, "frame_box");
- GtkWidget *print_frames_normal = glade_xml_get_widget (xml, "print_frames_normal");
- GtkWidget *print_frames_selected = glade_xml_get_widget (xml, "print_frames_selected");
- GtkWidget *print_frames_separately = glade_xml_get_widget (xml, "print_frames_separately");
-
- /* FIXME: store/load from pref */
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (print_frames_normal), TRUE);
-
- if (frameUI == nsIPrintSettings::kFrameEnableAll) {
- /* Allow all frame options */
- gtk_widget_set_sensitive (frame_box, TRUE);
- } else if (frameUI == nsIPrintSettings::kFrameEnableAsIsAndEach) {
- /* Allow all except "selected frame" */
- gtk_widget_set_sensitive (frame_box, TRUE);
- gtk_widget_set_sensitive (print_frames_selected, FALSE);
- /* Preselect this one, since the default above only prints _one page_ ! */
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (print_frames_separately), TRUE);
- }
-
- /* FIXME: this sucks! find some way to do all of this async! */
- GtkWidget *dialog = gtk_print_unix_dialog_new (NULL /* FIXME title */,
- GTK_WINDOW (parent));
- GtkPrintUnixDialog *print_dialog = GTK_PRINT_UNIX_DIALOG (dialog);
-
- GtkPrintCapabilities capabilities =
- GtkPrintCapabilities (GTK_PRINT_CAPABILITY_PAGE_SET |
- GTK_PRINT_CAPABILITY_COPIES |
- GTK_PRINT_CAPABILITY_COLLATE |
- GTK_PRINT_CAPABILITY_REVERSE |
- GTK_PRINT_CAPABILITY_SCALE |
- GTK_PRINT_CAPABILITY_GENERATE_PS);
-#ifdef HAVE_GECKO_1_9
- capabilities = GtkPrintCapabilities (capabilities | GTK_PRINT_CAPABILITY_GENERATE_PDF);
-#endif
- gtk_print_unix_dialog_set_manual_capabilities (print_dialog, capabilities);
-
- gtk_print_unix_dialog_set_page_setup (print_dialog,
- ephy_embed_shell_get_page_setup (shell));
- gtk_print_unix_dialog_set_settings (print_dialog,
- ephy_embed_shell_get_print_settings (shell));
-
- /* Remove custom tab from its dummy window and put it in the print dialogue */
- g_object_ref_sink (custom_tab);
- gtk_container_remove (GTK_CONTAINER (custom_tab->parent), custom_tab);
- gtk_print_unix_dialog_add_custom_tab (print_dialog, custom_tab,
- gtk_label_new (_("Options"))); /* FIXME better name! */
- g_object_unref (custom_tab);
- g_object_unref (xml);
-
- gtk_window_set_icon_name (GTK_WINDOW (dialog), EPHY_STOCK_EPHY);
-
- int response = modalDialog.Run (GTK_DIALOG (dialog));
- gtk_widget_hide (dialog);
-
- GtkPrinter *printer = gtk_print_unix_dialog_get_selected_printer (print_dialog);
-
- if (response != GTK_RESPONSE_OK || !printer) {
- gtk_widget_destroy (dialog);
-
- return NS_ERROR_ABORT;
- }
-
- PRInt16 printFrames = nsIPrintSettings::kNoFrames;
- if (frameUI != nsIPrintSettings::kFrameEnableNone) {
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (print_frames_normal))) {
- printFrames = nsIPrintSettings::kFramesAsIs;
- } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (print_frames_selected))) {
- printFrames = nsIPrintSettings::kSelectedFrame;
- } if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (print_frames_separately))) {
- printFrames = nsIPrintSettings::kEachFrameSep;
- }
- }
-
- GtkPageSetup *pageSetup = gtk_print_unix_dialog_get_page_setup (print_dialog); /* no reference owned */
- ephy_embed_shell_set_page_setup (shell, pageSetup);
-
- GtkPrintSettings *settings = gtk_print_unix_dialog_get_settings (print_dialog);
- ephy_embed_shell_set_print_settings (shell, settings);
-
- /* We copy the setup and settings so we can modify them to unset
- * options handled by gecko.
- */
- GtkPageSetup *pageSetupCopy = gtk_page_setup_copy (pageSetup);
- pageSetup = pageSetupCopy;
-
- GtkPrintSettings *settingsCopy = gtk_print_settings_copy (settings);
- g_object_unref (settings);
- settings = settingsCopy;
-
- rv = session->SetSettings (aSettings, settings, pageSetup, printer);
-
- /* Now translate the settings to nsIPrintSettings */
- if (NS_SUCCEEDED (rv)) {
- nsCString sourceFile;
- session->GetSourceFile (sourceFile);
- if (!sourceFile.IsEmpty ()) {
- rv = TranslateSettings (settings, pageSetup, printer, sourceFile, printFrames, PR_TRUE, aSettings);
- } else {
- rv = NS_ERROR_FAILURE;
- }
- }
-
- gtk_widget_destroy (dialog);
-
- g_object_unref (settings);
- g_object_unref (pageSetup);
-
- return rv;
-}
-
-/* void showProgress (in nsIDOMWindow parent,
- in nsIWebBrowserPrint webBrowserPrint,
- in nsIPrintSettings printSettings,
- in nsIObserver openDialogObserver,
- in boolean isForPrinting,
- out nsIWebProgressListener webProgressListener,
- out nsIPrintProgressParams printProgressParams,
- out boolean notifyOnOpen); */
-NS_IMETHODIMP
-GeckoPrintService::ShowProgress (nsIDOMWindow *aParent,
- nsIWebBrowserPrint *aWebBrowserPrint,
- nsIPrintSettings *aPrintSettings,
- nsIObserver *aOpenDialogObserver,
- PRBool aIsForPrinting,
- nsIWebProgressListener **_webProgressListener,
- nsIPrintProgressParams **_printProgressParams,
- PRBool *_notifyOnOpen)
-{
- /* Print preview */
- if (!aIsForPrinting) {
- return NS_OK;
- }
-
- nsresult rv;
- nsCOMPtr<nsIDOMWindowInternal> domWin (do_QueryInterface (aParent, &rv));
- NS_ENSURE_SUCCESS (rv, rv);
-
- nsCOMPtr<nsIPrintSession> session;
- rv = aPrintSettings->GetPrintSession (getter_AddRefs (session));
- NS_ENSURE_TRUE (NS_SUCCEEDED (rv) && session, nsnull);
-
- nsCOMPtr<nsIPrintProgress> progress (do_QueryInterface (session, &rv));
- NS_ENSURE_SUCCESS (rv, rv);
-
- /* Our print session implements those interfaces */
- rv = CallQueryInterface (session, _webProgressListener);
- rv |= CallQueryInterface (session, _printProgressParams);
- NS_ENSURE_SUCCESS (rv, rv);
-
- /* Setting this to PR_FALSE will make gecko immediately start printing
- * when we return from this function.
- * If we set this to PR_TRUE, we need to call aOpenDialogObserver::Observe
- * (topic, subject and data don't matter) when we're ready for printing.
- */
- *_notifyOnOpen = PR_FALSE;
-
- return progress->OpenProgressDialog (domWin, nsnull, nsnull, aOpenDialogObserver, _notifyOnOpen);
-}
-
-/* void showPageSetup (in nsIDOMWindow parent,
- in nsIPrintSettings printSettings,
- in nsIObserver aObs); */
-NS_IMETHODIMP GeckoPrintService::ShowPageSetup (nsIDOMWindow *aParent,
- nsIPrintSettings *aPrintSettings,
- nsIObserver *aObserver)
-{
- /* This function is never called from gecko code */
-#if 0
- /* Locked down? */
- if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINTING) ||
- eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINT_SETUP)) {
- return NS_ERROR_ABORT;
- }
-
- GtkWidget *parent = EphyUtils::FindGtkParent (aParent);
- NS_ENSURE_TRUE(parent, NS_ERROR_INVALID_POINTER);
-
- AutoJSContextStack stack;
- nsresult rv = stack.Init ();
- if (NS_FAILED (rv)) {
- return rv;
- }
-
- AutoWindowModalState modalState (aParent);
-
- EphyEmbedShell *shell = ephy_embed_shell_get_default ();
- GtkPageSetup *new_setup =
- gtk_print_run_page_setup_dialog (GTK_WINDOW (parent),
- ephy_embed_shell_get_page_setup (shell),
- ephy_embed_shell_get_print_settings (shell));
- if (new_setup) {
- ephy_embed_shell_set_page_setup (shell, new_setup);
- g_object_unref (new_setup);
- }
-
- /* FIXME do we need to notify aObserver somehow? */
- return NS_OK;
-#endif
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* void showPrinterProperties (in nsIDOMWindow parent,
- in wstring printerName,
- in nsIPrintSettings printSettings); */
-NS_IMETHODIMP
-GeckoPrintService::ShowPrinterProperties (nsIDOMWindow *aParent,
- const PRUnichar *aPrinterName,
- nsIPrintSettings *aPrintSettings)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-}
-
-/* Private methods */
-
-#if 0
-typedef struct
-{
- GMainLoop *mainLoop;
- GtkPrinter *mPrinter;
- guint timeout;
- int response;
- guint cancelled : 1;
-} FindPrinterData;
-
-static void
-FreeFindPrinterData (FindPrinterData *data)
-{
- if (data->printer) {
- g_object_unref (data->printer);
- }
-}
-
-static void
-DialogResponseCallback (GtkWidget *aDialog,
- int aResponse,
- FindPrinterData *data)
-{
- data->response = aResponse;
- g_main_loop_quit (data->mainloop);
-}
-
-static void
-TimeoutCallback (FindPrinterData *data)
-{
- data->cancelled = TRUE;
- g_main_loop_quit (data->mainLoop);
- data->mainLoop = NULL;
- return FALSE;
-}
-
-static gboolean
-PrinterEnumerateCallback (GtkPrinter *aPrinter,
- FindPrinterData *data)
-{
- if (data->cancelled)
- return TRUE;
-
- if ((data->printerName &&
- strcmp (data->printerName, gtk_printer_get_name (aPrinter)) == 0) ||
- (!data->printerName &&
- gtk_printer_is_default (aPrinter))) {
- data->printer = g_object_ref (aPrinter);
- return TRUE;
- }
-
- return FALSE;
-}
-#endif
-
-nsresult
-GeckoPrintService::PrintUnattended (nsIDOMWindow *aParent,
- nsIPrintSettings *aPrintSettings)
-{
- return NS_ERROR_NOT_IMPLEMENTED;
-#if 0
- GtkWidget *parent = EphyUtils::FindGtkParent (aParent);
- NS_ENSURE_TRUE(parent, NS_ERROR_INVALID_POINTER);
-
- PRBool isCalledFromScript = EphyJSUtils::IsCalledFromScript ();
-
- nsresult rv;
- AutoJSContextStack stack;
- rv = stack.Init ();
- if (NS_FAILED (rv)) {
- return rv;
- }
-
- AutoWindowModalState modalState (aParent);
-
- EphyEmbedShell *shell = ephy_embed_shell_get_default ();
- GtkPrintSettings *settings = ephy_embed_shell_get_print_settings (shell);
- NS_ENSURE_TRUE (settings, NS_ERROR_FAILURE);
-
- const char *printer = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_PRINTER);
-#if 0
- if (!printer || !printer[0]) {
- return NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND;
- }
-#endif
- /* We need to find the printer, so we need to run a mainloop.
- * If called from a script, give the user a way to cancel the print;
- * otherwise we'll just show a generic progress message.
- */
- GtkWidget *dialog;
- if (isCalledFromScript) {
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
- GtkDialogFlags (0),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_CANCEL,
- "%s", _("Print this page?"));
- gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_PRINT,
- GTK_RESPONSE_ACCEPT);
- } else {
- dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
- GtkDialogFlags (0),
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_CANCEL,
- "%s", _("Preparing to print"));
- }
- gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_CANCEL);
- gtk_window_set_icon_name (GTK_WINDOW (dialog), EPHY_STOCK_EPHY);
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-
- FindPrinterData *data = g_new0 (PrinterData, 1);
- data->dialog = dialog;
-
- g_signal_connect (dialog, "response",
- G_CALLBACK (DialogResponseCallback), data);
-
- /* Don't run forever */
- data->timeoutId = g_timeout_add (PRINTER_ENUMERATE_TIMEOUT,
- (GSourceFunc) EnumerateTimoutCallback,
- data);
- /* Enumerate printers until we find our printer */
- gtk_enumerate_printers ((GtkPrinterFunc) PrinterEnumerateCallback,
- data,
- (GDestroyNotify) EnumerateDestroyCallback, FALSE);
-
- /* Now run the mainloop */
- int response = gtk_dialog_run (GTK_DIALOG (dialog));
- Printer
- gtk_widget_destroy (dialog);
-
- if (response != GTK_RESPONSE_ACCEPT) {
- return NS_ERROR_ABORT;
- }
-
- nsCString sourceFile;
- session->GetSourceFile (sourceFile);
- if (!sourceFile.IsEmpty ()) {
- rv = TranslateSettings (settings,
- ephy_embed_shell_get_page_setup (shell),
- sourceFile, PR_TRUE, aSettings);
- } else {
- rv = NS_ERROR_FAILURE;
- }
-
- return rv;
- }
-#endif /* if 0 */
-}
-
-/* Static methods */
-
-/* static */ nsresult
-GeckoPrintService::TranslateSettings (GtkPrintSettings *aGtkSettings,
- GtkPageSetup *aPageSetup,
- GtkPrinter *aPrinter,
- const nsACString &aSourceFile,
- PRInt16 aPrintFrames,
- PRBool aIsForPrinting,
- nsIPrintSettings *aSettings)
-{
- NS_ENSURE_ARG (aPrinter);
- NS_ENSURE_ARG (aGtkSettings);
- NS_ENSURE_ARG (aPageSetup);
-
-#if 0
- /* Locked down? */
- if (gtk_print_settings_get_print_to_file (aGtkSettings) &&
- eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_SAVE_TO_DISK)) {
- return NS_ERROR_GFX_PRINTER_ACCESS_DENIED;
- }
-#endif
-
- GtkPrintCapabilities capabilities = gtk_printer_get_capabilities (aPrinter);
-
- /* Initialisation */
- aSettings->SetIsInitializedFromPrinter (PR_FALSE); /* FIXME: PR_TRUE? */
- aSettings->SetIsInitializedFromPrefs (PR_FALSE); /* FIXME: PR_TRUE? */
- aSettings->SetPrintSilent (PR_FALSE);
- aSettings->SetShowPrintProgress (PR_TRUE);
-
- /* We always print PS to a file and then hand that off to gtk-print */
- aSettings->SetPrinterName (LITERAL ("PostScript/default"));
-
- if (aIsForPrinting) {
- aSettings->SetPrintToFile (PR_TRUE);
-
- nsString sourceFile;
- NS_CStringToUTF16 (aSourceFile,
- NS_CSTRING_ENCODING_NATIVE_FILESYSTEM,
- sourceFile);
-
- aSettings->SetToFileName (sourceFile.get ());
- } else {
- /* Otherwise mozilla will create the file nevertheless and
- * fail since we haven't set a name!
- */
- aSettings->SetPrintToFile (PR_FALSE);
- }
-
- /* This is the time between printing each page, in ms.
- * It 'gives the user more time to press cancel' !
- * We don't want any of this nonsense, so set this to a low value,
- * just enough to update the print dialogue.
- */
- aSettings->SetPrintPageDelay (50);
-
- if (aIsForPrinting) {
-#ifdef HAVE_GECKO_1_9
- NS_ENSURE_TRUE (aPrinter, NS_ERROR_FAILURE);
-
- const char *format = gtk_print_settings_get (aGtkSettings, GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT);
- if (!format)
- format = "ps";
-
- if (strcmp (format, "pdf") == 0 &&
- gtk_printer_accepts_pdf (aPrinter)) {
- aSettings->SetOutputFormat (nsIPrintSettings::kOutputFormatPDF);
- } else if (strcmp (format, "ps") == 0 &&
- gtk_printer_accepts_ps (aPrinter)) {
- aSettings->SetOutputFormat (nsIPrintSettings::kOutputFormatPS);
- } else {
- g_warning ("Output format '%s' specified, but printer '%s' does not support it!",
- format, gtk_printer_get_name (aPrinter));
- return NS_ERROR_FAILURE;
- }
-#endif
-
- int n_copies = gtk_print_settings_get_n_copies (aGtkSettings);
- if (n_copies <= 0)
- return NS_ERROR_FAILURE;
- if (capabilities & GTK_PRINT_CAPABILITY_COPIES) {
- aSettings->SetNumCopies (1);
- } else {
- /* We have to copy them ourself */
- aSettings->SetNumCopies (n_copies);
- gtk_print_settings_set_n_copies (aGtkSettings, 1);
- }
-
- gboolean reverse = gtk_print_settings_get_reverse (aGtkSettings);
- if (capabilities & GTK_PRINT_CAPABILITY_REVERSE) {
- aSettings->SetPrintReversed (PR_FALSE);
- } else {
- aSettings->SetPrintReversed (reverse);
- gtk_print_settings_set_reverse (aGtkSettings, FALSE);
- }
-
- GtkPageSet pageSet = gtk_print_settings_get_page_set (aGtkSettings);
- aSettings->SetPrintOptions (nsIPrintSettings::kPrintEvenPages,
- pageSet != GTK_PAGE_SET_ODD);
- aSettings->SetPrintOptions (nsIPrintSettings::kPrintEvenPages,
- pageSet != GTK_PAGE_SET_EVEN);
-
- GtkPrintPages printPages = gtk_print_settings_get_print_pages (aGtkSettings);
- switch (printPages) {
- case GTK_PRINT_PAGES_RANGES: {
- int numRanges = 0;
- GtkPageRange *pageRanges = gtk_print_settings_get_page_ranges (aGtkSettings, &numRanges);
- if (numRanges > 0) {
- /* FIXME: We can only support one range, ignore more ranges or raise error? */
- aSettings->SetPrintRange (nsIPrintSettings::kRangeSpecifiedPageRange);
- /* Gecko page numbers start at 1, while gtk page numbers start at 0 */
- aSettings->SetStartPageRange (pageRanges[0].start + 1);
- aSettings->SetEndPageRange (pageRanges[0].end + 1);
-
- g_free (pageRanges);
- break;
- }
- /* Fall-through to PAGES_ALL */
- }
- case GTK_PRINT_PAGES_CURRENT:
- /* not supported, fall through */
- case GTK_PRINT_PAGES_ALL:
- aSettings->SetPrintRange (nsIPrintSettings::kRangeAllPages);
- break;
- /* FIXME: we need some custom ranges here, "Selection" and "Focused Frame" */
- }
- } else {
- aSettings->SetPrintOptions (nsIPrintSettings::kPrintEvenPages, PR_TRUE);
- aSettings->SetPrintOptions (nsIPrintSettings::kPrintEvenPages, PR_TRUE);
- aSettings->SetPrintReversed (PR_FALSE);
- aSettings->SetPrintRange (nsIPrintSettings::kRangeAllPages);
- }
-
- /* And clear those in the settings, so the printer doesn't try to apply them too */
- gtk_print_settings_set_print_pages (aGtkSettings, GTK_PRINT_PAGES_ALL);
- gtk_print_settings_set_page_ranges (aGtkSettings, NULL, 0);
- gtk_print_settings_set_page_set (aGtkSettings, GTK_PAGE_SET_ALL);
-
- /* We must use the page setup here instead of the print settings, see gtk bug #485685 */
- switch (gtk_page_setup_get_orientation (aPageSetup)) {
- case GTK_PAGE_ORIENTATION_PORTRAIT:
- case GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT: /* not supported */
- aSettings->SetOrientation (nsIPrintSettings::kPortraitOrientation);
- break;
- case GTK_PAGE_ORIENTATION_LANDSCAPE:
- case GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE: /* not supported */
- aSettings->SetOrientation (nsIPrintSettings::kLandscapeOrientation);
- break;
- }
-
- aSettings->SetPrintInColor (gtk_print_settings_get_use_color (aGtkSettings));
-
- aSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters);
-
-#ifndef HAVE_GECKO_1_9
- aSettings->SetPaperSize (nsIPrintSettings::kPaperSizeDefined);
-#endif
-
- GtkPaperSize *paperSize = gtk_page_setup_get_paper_size (aPageSetup);
- if (!paperSize) {
- return NS_ERROR_FAILURE;
- }
-
- aSettings->SetPaperSizeType (nsIPrintSettings::kPaperSizeDefined);
- aSettings->SetPaperWidth (gtk_paper_size_get_width (paperSize, GTK_UNIT_MM));
- aSettings->SetPaperHeight (gtk_paper_size_get_height (paperSize, GTK_UNIT_MM));
-
-#ifdef HAVE_GECKO_1_9
- aSettings->SetPaperName (NS_ConvertUTF8toUTF16 (gtk_paper_size_get_name (paperSize)).get ());
-#else
-{
- /* Mozilla bug https://bugzilla.mozilla.org/show_bug.cgi?id=307404
- * means that we cannot actually use any paper sizes except mozilla's
- * builtin list, and we must refer to them *by name*!
- */
- static const struct {
- const char gtkPaperName[13];
- const char mozPaperName[10];
- } paperTable [] = {
- { GTK_PAPER_NAME_A5, "A5" },
- { GTK_PAPER_NAME_A4, "A4" },
- { GTK_PAPER_NAME_A3, "A3" },
- { GTK_PAPER_NAME_LETTER, "Letter" },
- { GTK_PAPER_NAME_LEGAL, "Legal" },
- { GTK_PAPER_NAME_EXECUTIVE, "Executive" },
- };
-
- const char *paperName = gtk_paper_size_get_name (paperSize);
-
- PRUint32 i;
- for (i = 0; i < G_N_ELEMENTS (paperTable); i++) {
- if (g_ascii_strcasecmp (paperTable[i].gtkPaperName, paperName) == 0) {
- paperName = paperTable[i].mozPaperName;
- break;
- }
- }
- if (i == G_N_ELEMENTS (paperTable)) {
- /* Not in table, fall back to A4 */
- g_warning ("Unknown paper name '%s', falling back to A4", gtk_paper_size_get_name (paperSize));
- paperName = paperTable[1].mozPaperName;
- }
-
- aSettings->SetPaperName (NS_ConvertUTF8toUTF16 (paperName).get ());
-}
-#endif /* !HAVE_GECKO_1_9 */
-
- /* Sucky mozilla wants margins in inch! */
- aSettings->SetMarginTop (gtk_page_setup_get_top_margin (aPageSetup, GTK_UNIT_INCH));
- aSettings->SetMarginBottom (gtk_page_setup_get_bottom_margin (aPageSetup, GTK_UNIT_INCH));
- aSettings->SetMarginLeft (gtk_page_setup_get_left_margin (aPageSetup, GTK_UNIT_INCH));
- aSettings->SetMarginRight (gtk_page_setup_get_right_margin (aPageSetup, GTK_UNIT_INCH));
-
- aSettings->SetHeaderStrLeft (eel_gconf_get_boolean (CONF_PRINT_PAGE_TITLE) ? LITERAL ("&T") : LITERAL (""));
- aSettings->SetHeaderStrCenter (LITERAL (""));
- aSettings->SetHeaderStrRight (eel_gconf_get_boolean (CONF_PRINT_PAGE_URL) ? LITERAL ("&U") : LITERAL (""));
- aSettings->SetFooterStrLeft (eel_gconf_get_boolean (CONF_PRINT_PAGE_NUMBERS) ? LITERAL ("&PT") : LITERAL (""));
- aSettings->SetFooterStrCenter (LITERAL (""));
- aSettings->SetFooterStrRight (eel_gconf_get_boolean (CONF_PRINT_DATE) ? LITERAL ("&D") : LITERAL (""));
-
- aSettings->SetPrintFrameType (aPrintFrames);
- aSettings->SetPrintFrameTypeUsage (nsIPrintSettings::kUseSettingWhenPossible);
-
- /* FIXME: only if GTK_PRINT_CAPABILITY_SCALE is not set? */
- aSettings->SetScaling (gtk_print_settings_get_scale (aGtkSettings) / 100.0);
- gtk_print_settings_set_scale (aGtkSettings, 1.0);
-
- aSettings->SetShrinkToFit (PR_FALSE); /* FIXME setting */
-
- aSettings->SetPrintBGColors (eel_gconf_get_boolean (CONF_PRINT_BG_COLORS) != FALSE);
- aSettings->SetPrintBGImages (eel_gconf_get_boolean (CONF_PRINT_BG_IMAGES) != FALSE);
-
- /* aSettings->SetPlexName (LITERAL ("default")); */
- /* aSettings->SetColorspace (LITERAL ("default")); */
- /* aSettings->SetResolutionName (LITERAL ("default")); */
- /* aSettings->SetDownloadFonts (PR_TRUE); */
-
- /* Unset those setting that we can handle, so they don't get applied
- * again for the print job.
- */
- /* gtk_print_settings_set_collate (aGtkSettings, FALSE); not yet */
- /* FIXME: Unset the orientation for the print job? */
- /* gtk_page_setup_set_orientation (aPageSetup, GTK_PAGE_ORIENTATION_PORTRAIT); */
- /* FIXME: unset output format -> "ps" ? */
-
- return NS_OK;
-}