aboutsummaryrefslogtreecommitdiffstats
path: root/embed/mozilla
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2005-07-24 05:31:19 +0800
committerChristian Persch <chpe@src.gnome.org>2005-07-24 05:31:19 +0800
commit057680fd0b25cc7bf90598f50bd2088ca4aa87ac (patch)
treef4580dd6c00b2707304b231a043502654e8aa4cd /embed/mozilla
parent7c8cd0db552da2366754cd7616e3ae9baec3b33a (diff)
downloadgsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar.gz
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar.bz2
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar.lz
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar.xz
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.tar.zst
gsoc2013-epiphany-057680fd0b25cc7bf90598f50bd2088ca4aa87ac.zip
Use libgnomeprintui for the printing dialog and the paper part of the
2005-07-22 Jürg Billeter <j@bitron.ch> * configure.ac: * data/glade/print.glade: * embed/mozilla/EphyUtils.cpp: * embed/mozilla/EphyUtils.h: * embed/mozilla/PrintingPromptService.cpp: * embed/mozilla/PrintingPromptService.h: * embed/print-dialog.c: (ephy_print_info_free), (ephy_print_load_config_from_file), (ephy_print_save_config_to_file), (ephy_print_get_print_info), (ephy_print_dialog_response_cb), (ephy_print_do_print_idle_cb), (ephy_print_do_print_and_free), (ephy_print_paper_selector_new), (ephy_print_dialog_construct_range_page), (ephy_print_dialog_new), (ephy_print_setup_dialog_new): * embed/print-dialog.h: Use libgnomeprintui for the printing dialog and the paper part of the printing setup dialog. Fixes bug #141241, bug #163255 and bug #301730.
Diffstat (limited to 'embed/mozilla')
-rw-r--r--embed/mozilla/EphyUtils.cpp140
-rw-r--r--embed/mozilla/EphyUtils.h2
-rw-r--r--embed/mozilla/PrintingPromptService.cpp128
-rw-r--r--embed/mozilla/PrintingPromptService.h8
4 files changed, 227 insertions, 51 deletions
diff --git a/embed/mozilla/EphyUtils.cpp b/embed/mozilla/EphyUtils.cpp
index 3d43cf11e..55a392b44 100644
--- a/embed/mozilla/EphyUtils.cpp
+++ b/embed/mozilla/EphyUtils.cpp
@@ -26,6 +26,7 @@
#include "ephy-embed-shell.h"
#include "ephy-embed-single.h"
#include "print-dialog.h"
+#include "ephy-file-helpers.h"
#include <nsIIOService.h>
#include <nsIURI.h>
@@ -124,10 +125,8 @@ EphyUtils::FindGtkParent (nsIDOMWindow *aDOMWindow)
return gtk_widget_get_toplevel (GTK_WIDGET (embed));
}
-#define MM_TO_INCH(x) (((double) x) / 25.4)
-
nsresult
-EphyUtils::CollatePrintSettings (const EmbedPrintInfo *info,
+EphyUtils::CollatePrintSettings (EmbedPrintInfo *info,
nsIPrintSettings *options,
gboolean preview)
{
@@ -137,25 +136,64 @@ EphyUtils::CollatePrintSettings (const EmbedPrintInfo *info,
nsIPrintSettings::kEachFrameSep
};
- switch (info->pages)
+ switch (info->range)
{
- case 0:
+ case GNOME_PRINT_RANGE_ALL:
options->SetPrintRange (nsIPrintSettings::kRangeAllPages);
break;
- case 1:
+ case GNOME_PRINT_RANGE_RANGE:
options->SetPrintRange (nsIPrintSettings::kRangeSpecifiedPageRange);
options->SetStartPageRange (info->from_page);
options->SetEndPageRange (info->to_page);
break;
- case 2:
+ case GNOME_PRINT_RANGE_SELECTION:
options->SetPrintRange (nsIPrintSettings::kRangeSelection);
break;
}
+
+ const GnomePrintUnit *unit, *inch, *mm;
+ double value;
+
+ mm = gnome_print_unit_get_by_abbreviation ((const guchar *) "mm");
+ inch = gnome_print_unit_get_by_abbreviation ((const guchar *) "in");
+ g_assert (mm != NULL && inch != NULL);
+
+ /* top margin */
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAGE_MARGIN_TOP,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, inch))
+ {
+ options->SetMarginTop (value);
+ }
+
+ /* bottom margin */
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAGE_MARGIN_BOTTOM,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, inch))
+ {
+ options->SetMarginBottom (value);
+ }
+
+ /* left margin */
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAGE_MARGIN_LEFT,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, inch))
+ {
+ options->SetMarginLeft (value);
+ }
+
+ /* right margin */
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAGE_MARGIN_RIGHT,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, inch))
+ {
+ options->SetMarginRight (value);
+ }
- options->SetMarginTop (MM_TO_INCH (info->top_margin));
- options->SetMarginBottom (MM_TO_INCH (info->bottom_margin));
- options->SetMarginLeft (MM_TO_INCH (info->left_margin));
- options->SetMarginRight (MM_TO_INCH (info->right_margin));
nsEmbedString tmp;
@@ -183,38 +221,76 @@ EphyUtils::CollatePrintSettings (const EmbedPrintInfo *info,
NS_CSTRING_ENCODING_UTF8, tmp);
options->SetFooterStrRight(tmp.get());
- NS_CStringToUTF16 (nsEmbedCString(info->file),
- NS_CSTRING_ENCODING_UTF8, tmp);
- options->SetToFileName (tmp.get());
+ options->SetPrintToFile (PR_FALSE);
+
+ if (!preview)
+ {
+ char *cmd, *base;
+ const char *temp_dir;
+
+ temp_dir = ephy_file_tmp_dir ();
+ base = g_build_filename (temp_dir, "printXXXXXX", NULL);
+ info->tempfile = ephy_file_tmp_filename (base, "ps");
+ g_free (base);
+
+ /* use cat instead of print to file to avoid fflush to ensure
+ * the file has been written completely and we don't need to
+ * select a printer (i.e. should be printing backend independent)
+ */
+
+ cmd = g_strconcat ("cat > ", info->tempfile, NULL);
+ NS_CStringToUTF16 (nsEmbedCString(cmd),
+ NS_CSTRING_ENCODING_UTF8, tmp);
+ options->SetPrintCommand (tmp.get());
+ g_free (cmd);
+ }
- NS_CStringToUTF16 (nsEmbedCString(info->printer),
- NS_CSTRING_ENCODING_UTF8, tmp);
- options->SetPrinterName (tmp.get());
+ /* paper size */
+ options->SetPaperSize (nsIPrintSettings::kPaperSizeDefined);
+ options->SetPaperSizeUnit (nsIPrintSettings::kPaperSizeMillimeters);
- /**
- * Work around a mozilla bug where paper size & orientation are ignored
- * and the specified file is created (containing invalid postscript)
- * in print preview mode if we set "print to file" to true.
- * See epiphany bug #119818.
- */
- if (preview)
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAPER_WIDTH,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, mm))
{
- options->SetPrintToFile (PR_FALSE);
+ options->SetPaperWidth (value);
}
- else
+
+ if (gnome_print_config_get_length (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAPER_HEIGHT,
+ &value, &unit)
+ && gnome_print_convert_distance (&value, unit, mm))
{
- options->SetPrintToFile (info->print_to_file);
+ options->SetPaperHeight (value);
}
+
+ char *string;
- /* native paper size formats. Our dialog does not support custom yet */
- options->SetPaperSize (nsIPrintSettings::kPaperSizeNativeData);
-
- NS_CStringToUTF16 (nsEmbedCString(info->paper),
+ /* paper name */
+ string = (char *) gnome_print_config_get (info->config,
+ (const guchar *) GNOME_PRINT_KEY_PAPER_SIZE);
+ NS_CStringToUTF16 (nsEmbedCString(string),
NS_CSTRING_ENCODING_UTF8, tmp);
options->SetPaperName (tmp.get());
+ g_free (string);
+
+ /* paper orientation */
+ string = (char *) gnome_print_config_get (info->config,
+ (const guchar *) GNOME_PRINT_KEY_ORIENTATION);
+ if (string == NULL) string = g_strdup ("R0");
+
+ if (strncmp (string, "R90", 3) == 0 || strncmp (string, "R270", 4) == 0)
+ {
+ options->SetOrientation (nsIPrintSettings::kLandscapeOrientation);
+ }
+ else
+ {
+ options->SetOrientation (nsIPrintSettings::kPortraitOrientation);
+ }
+ g_free (string);
options->SetPrintInColor (info->print_color);
- options->SetOrientation (info->orientation);
options->SetPrintFrameType (frame_types[info->frame_type]);
return NS_OK;
diff --git a/embed/mozilla/EphyUtils.h b/embed/mozilla/EphyUtils.h
index c518d4893..368e1e59f 100644
--- a/embed/mozilla/EphyUtils.h
+++ b/embed/mozilla/EphyUtils.h
@@ -50,7 +50,7 @@ namespace EphyUtils
GtkWidget *FindGtkParent (nsIDOMWindow *aDOMWindow);
- nsresult CollatePrintSettings (const _EmbedPrintInfo *info,
+ nsresult CollatePrintSettings (_EmbedPrintInfo *info,
nsIPrintSettings *settings,
gboolean preview);
PRBool StringEquals (nsAString &s1,
diff --git a/embed/mozilla/PrintingPromptService.cpp b/embed/mozilla/PrintingPromptService.cpp
index 570b15774..2770f0d30 100644
--- a/embed/mozilla/PrintingPromptService.cpp
+++ b/embed/mozilla/PrintingPromptService.cpp
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2002 Philip Langdale
* Copyright (C) 2003-2004 Christian Persch
+ * Copyright (C) 2005 Juerg Billeter
*
* 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
@@ -24,6 +25,8 @@
#include "config.h"
#include <gtk/gtkdialog.h>
+
+#include <libgnomeprintui/gnome-print-dialog.h>
#include "print-dialog.h"
#include "ephy-embed.h"
@@ -39,22 +42,30 @@
#include <nsIServiceManager.h>
/* Implementation file */
-NS_IMPL_ISUPPORTS1(GPrintingPromptService, nsIPrintingPromptService)
+NS_IMPL_ISUPPORTS3(GPrintingPromptService, nsIPrintingPromptService, nsIWebProgressListener, nsIPrintProgressParams)
GPrintingPromptService::GPrintingPromptService()
{
LOG ("GPrintingPromptService ctor (%p)", this);
+
+ mPrintInfo = NULL;
}
GPrintingPromptService::~GPrintingPromptService()
{
LOG ("GPrintingPromptService dtor (%p)", this);
+
+ if (mPrintInfo != NULL)
+ {
+ ephy_print_info_free (mPrintInfo);
+ }
}
/* void showPrintDialog (in nsIDOMWindow parent, in nsIWebBrowserPrint webBrowserPrint, in nsIPrintSettings printSettings); */
NS_IMETHODIMP GPrintingPromptService::ShowPrintDialog(nsIDOMWindow *parent, nsIWebBrowserPrint *webBrowserPrint, nsIPrintSettings *printSettings)
{
- EphyDialog *dialog;
+ EmbedPrintInfo *info;
+ GtkWidget *dialog;
if (eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINTING))
{
@@ -64,38 +75,50 @@ NS_IMETHODIMP GPrintingPromptService::ShowPrintDialog(nsIDOMWindow *parent, nsIW
EphyEmbed *embed = EPHY_EMBED (EphyUtils::FindEmbed (parent));
NS_ENSURE_TRUE (embed, NS_ERROR_FAILURE);
+ info = ephy_print_get_print_info ();
+
if (!eel_gconf_get_boolean (CONF_LOCKDOWN_DISABLE_PRINT_SETUP))
{
GtkWidget *gtkParent = EphyUtils::FindGtkParent(parent);
NS_ENSURE_TRUE (gtkParent, NS_ERROR_FAILURE);
- dialog = ephy_print_dialog_new (gtkParent, embed);
- ephy_dialog_set_modal (dialog, TRUE);
+ dialog = ephy_print_dialog_new (gtkParent, info);
+ gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
- int ret = ephy_dialog_run (dialog);
-
- g_object_unref (dialog);
+ int ret;
+
+ while (TRUE)
+ {
+ ret = gtk_dialog_run (GTK_DIALOG (dialog));;
+
+ if (ret != GNOME_PRINT_DIALOG_RESPONSE_PRINT)
+ break;
+
+ if (ephy_print_verify_postscript (GNOME_PRINT_DIALOG (dialog)))
+ break;
+ }
+
+ gtk_widget_destroy (dialog);
- if (ret != GTK_RESPONSE_OK)
+ if (ret != GNOME_PRINT_DIALOG_RESPONSE_PRINT)
{
+ ephy_print_info_free (info);
+
return NS_ERROR_ABORT;
}
}
- EmbedPrintInfo *info;
-
- info = ephy_print_get_print_info ();
-
/* work around mozilla bug which borks when printing selection without having one */
- if (info->pages == 2 && ephy_command_manager_can_do_command
+ if (info->range == GNOME_PRINT_RANGE_SELECTION &&
+ ephy_command_manager_can_do_command
(EPHY_COMMAND_MANAGER (embed), "cmd_copy") == FALSE)
{
- info->pages = 0;
+ info->range = GNOME_PRINT_RANGE_ALL;
}
EphyUtils::CollatePrintSettings (info, printSettings, FALSE);
-
- ephy_print_info_free (info);
+
+ mPrintInfo = info;
return NS_OK;
}
@@ -103,7 +126,13 @@ NS_IMETHODIMP GPrintingPromptService::ShowPrintDialog(nsIDOMWindow *parent, nsIW
/* 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 GPrintingPromptService::ShowProgress(nsIDOMWindow *parent, nsIWebBrowserPrint *webBrowserPrint, nsIPrintSettings *printSettings, nsIObserver *openDialogObserver, PRBool isForPrinting, nsIWebProgressListener **webProgressListener, nsIPrintProgressParams **printProgressParams, PRBool *notifyOnOpen)
{
- return NS_ERROR_NOT_IMPLEMENTED;
+ *printProgressParams = NS_STATIC_CAST(nsIPrintProgressParams*, this);
+ NS_ADDREF(*printProgressParams);
+
+ *webProgressListener = NS_STATIC_CAST(nsIWebProgressListener*, this);
+ NS_ADDREF(*webProgressListener);
+
+ return NS_OK;
}
/* void showPageSetup (in nsIDOMWindow parent, in nsIPrintSettings printSettings, in nsIObserver printObserver); */
@@ -138,3 +167,68 @@ NS_IMETHODIMP GPrintingPromptService::ShowPrinterProperties(nsIDOMWindow *parent
{
return NS_ERROR_NOT_IMPLEMENTED;
}
+
+
+/* void onStateChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long aStateFlags, in nsresult aStatus); */
+NS_IMETHODIMP GPrintingPromptService::OnStateChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 aStateFlags, nsresult aStatus)
+{
+ if ((aStateFlags & STATE_STOP) && mPrintInfo)
+ {
+ if (NS_SUCCEEDED (aStatus))
+ {
+ ephy_print_do_print_and_free (mPrintInfo);
+ }
+ else
+ {
+ ephy_print_info_free (mPrintInfo);
+ }
+
+ mPrintInfo = NULL;
+ }
+ return NS_OK;
+}
+
+/* void onProgressChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in long aCurSelfProgress, in long aMaxSelfProgress, in long aCurTotalProgress, in long aMaxTotalProgress); */
+NS_IMETHODIMP GPrintingPromptService::OnProgressChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRInt32 aCurSelfProgress, PRInt32 aMaxSelfProgress, PRInt32 aCurTotalProgress, PRInt32 aMaxTotalProgress)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void onLocationChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsIURI location); */
+NS_IMETHODIMP GPrintingPromptService::OnLocationChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsIURI *location)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void onStatusChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in nsresult aStatus, in wstring aMessage); */
+NS_IMETHODIMP GPrintingPromptService::OnStatusChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, nsresult aStatus, const PRUnichar *aMessage)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* void onSecurityChange (in nsIWebProgress aWebProgress, in nsIRequest aRequest, in unsigned long state); */
+NS_IMETHODIMP GPrintingPromptService::OnSecurityChange(nsIWebProgress *aWebProgress, nsIRequest *aRequest, PRUint32 state)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* attribute wstring docTitle; */
+NS_IMETHODIMP GPrintingPromptService::GetDocTitle(PRUnichar * *aDocTitle)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+NS_IMETHODIMP GPrintingPromptService::SetDocTitle(const PRUnichar * aDocTitle)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
+/* attribute wstring docURL; */
+NS_IMETHODIMP GPrintingPromptService::GetDocURL(PRUnichar * *aDocURL)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+NS_IMETHODIMP GPrintingPromptService::SetDocURL(const PRUnichar * aDocURL)
+{
+ return NS_ERROR_NOT_IMPLEMENTED;
+}
+
diff --git a/embed/mozilla/PrintingPromptService.h b/embed/mozilla/PrintingPromptService.h
index 31df4be61..b0c1c004e 100644
--- a/embed/mozilla/PrintingPromptService.h
+++ b/embed/mozilla/PrintingPromptService.h
@@ -23,6 +23,7 @@
#include "nsError.h"
#include "nsIPrintingPromptService.h"
+#include "print-dialog.h"
#define G_PRINTINGPROMPTSERVICE_CID \
{ /* 5998a2d3-88ea-4c52-b4bb-4e7abd0d35e0 */ \
@@ -35,15 +36,20 @@
#define G_PRINTINGPROMPTSERVICE_CLASSNAME "Epiphany's Printing Prompt Service"
#define G_PRINTINGPROMPTSERVICE_CONTRACTID "@mozilla.org/embedcomp/printingprompt-service;1"
-class GPrintingPromptService : public nsIPrintingPromptService
+class GPrintingPromptService : public nsIPrintingPromptService, nsIWebProgressListener, nsIPrintProgressParams
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPRINTINGPROMPTSERVICE
+ NS_DECL_NSIWEBPROGRESSLISTENER
+ NS_DECL_NSIPRINTPROGRESSPARAMS
GPrintingPromptService();
virtual ~GPrintingPromptService();
/* additional members */
+
+protected:
+ EmbedPrintInfo *mPrintInfo;
};
#endif