diff options
Diffstat (limited to 'widget/nsPrintSettingsImpl.cpp')
-rw-r--r-- | widget/nsPrintSettingsImpl.cpp | 926 |
1 files changed, 926 insertions, 0 deletions
diff --git a/widget/nsPrintSettingsImpl.cpp b/widget/nsPrintSettingsImpl.cpp new file mode 100644 index 0000000000..ce69d82271 --- /dev/null +++ b/widget/nsPrintSettingsImpl.cpp @@ -0,0 +1,926 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsPrintSettingsImpl.h" + +#include "prenv.h" +#include "nsCoord.h" +#include "nsPaper.h" +#include "nsReadableUtils.h" +#include "mozilla/DebugOnly.h" +#include "mozilla/RefPtr.h" + +using namespace mozilla; + +#define DEFAULT_MARGIN_WIDTH 0.5 + +NS_IMPL_ISUPPORTS(nsPrintSettings, nsIPrintSettings) + +nsPrintSettings::nsPrintSettings() { + /* member initializers and constructor code */ + int32_t marginWidth = NS_INCHES_TO_INT_TWIPS(DEFAULT_MARGIN_WIDTH); + mMargin.SizeTo(marginWidth, marginWidth, marginWidth, marginWidth); + mEdge.SizeTo(0, 0, 0, 0); + mUnwriteableMargin.SizeTo(0, 0, 0, 0); + + mHeaderStrs[0].AssignLiteral("&T"); + mHeaderStrs[2].AssignLiteral("&U"); + + mFooterStrs[0].AssignLiteral( + "&PT"); // Use &P (Page Num Only) or &PT (Page Num of Page Total) + mFooterStrs[2].AssignLiteral("&D"); +} + +void nsPrintSettings::InitWithInitializer( + const PrintSettingsInitializer& aSettings) { + const double kInchesPerPoint = 1.0 / 72.0; + + SetPrinterName(aSettings.mPrinter); + SetPrintInColor(aSettings.mPrintInColor); + SetResolution(aSettings.mResolution); + SetNumCopies(aSettings.mNumCopies); + SetDuplex(aSettings.mDuplex); + // The paper ID used by nsPrintSettings is the non-localizable identifier + // exposed as "id" by the paper, not the potentially localized human-friendly + // "name", which could change, e.g. if the user changes their system locale. + SetPaperId(aSettings.mPaperInfo.mId); + + // Set the paper sizes to match the unit. + SetPaperSizeUnit(aSettings.mPaperSizeUnit); + double sizeUnitsPerPoint = + aSettings.mPaperSizeUnit == kPaperSizeInches ? 1.0 / 72.0 : 25.4 / 72.0; + SetPaperWidth(aSettings.mPaperInfo.mSize.width * sizeUnitsPerPoint); + SetPaperHeight(aSettings.mPaperInfo.mSize.height * sizeUnitsPerPoint); + + // If our initializer says that we're producing portrait-mode sheets of + // paper, then our page format must also be portrait-mode; unless we've got + // a pages-per-sheet value with orthogonal pages/sheets, in which case it's + // reversed. + const bool areSheetsOfPaperPortraitMode = + (aSettings.mSheetOrientation == kPortraitOrientation); + const bool arePagesPortraitMode = + (areSheetsOfPaperPortraitMode != HasOrthogonalSheetsAndPages()); + SetOrientation(arePagesPortraitMode ? kPortraitOrientation + : kLandscapeOrientation); + + if (aSettings.mPaperInfo.mUnwriteableMargin) { + const auto& margin = aSettings.mPaperInfo.mUnwriteableMargin.value(); + // Margins are stored internally in TWIPS, but the setters expect inches. + SetUnwriteableMarginTop(margin.top * kInchesPerPoint); + SetUnwriteableMarginRight(margin.right * kInchesPerPoint); + SetUnwriteableMarginBottom(margin.bottom * kInchesPerPoint); + SetUnwriteableMarginLeft(margin.left * kInchesPerPoint); + } + + // Set this last because other setters may overwrite its value. + SetIsInitializedFromPrinter(true); +} + +nsPrintSettings::nsPrintSettings(const nsPrintSettings& aPS) { *this = aPS; } + +nsPrintSettings::~nsPrintSettings() = default; + +NS_IMETHODIMP nsPrintSettings::GetPrintReversed(bool* aPrintReversed) { + *aPrintReversed = mPrintReversed; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintReversed(bool aPrintReversed) { + mPrintReversed = aPrintReversed; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintInColor(bool* aPrintInColor) { + *aPrintInColor = mPrintInColor; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintInColor(bool aPrintInColor) { + mPrintInColor = aPrintInColor; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetOrientation(int32_t* aOrientation) { + *aOrientation = mOrientation; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetOrientation(int32_t aOrientation) { + mOrientation = aOrientation; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetResolution(int32_t* aResolution) { + NS_ENSURE_ARG_POINTER(aResolution); + *aResolution = mResolution; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetResolution(const int32_t aResolution) { + mResolution = aResolution; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetDuplex(int32_t* aDuplex) { + NS_ENSURE_ARG_POINTER(aDuplex); + *aDuplex = mDuplex; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetDuplex(const int32_t aDuplex) { + mDuplex = aDuplex; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrinterName(nsAString& aPrinter) { + aPrinter = mPrinter; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetPrinterName(const nsAString& aPrinter) { + if (!mPrinter.Equals(aPrinter)) { + mIsInitedFromPrinter = false; + mIsInitedFromPrefs = false; + } + + mPrinter.Assign(aPrinter); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetNumCopies(int32_t* aNumCopies) { + NS_ENSURE_ARG_POINTER(aNumCopies); + *aNumCopies = mNumCopies; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetNumCopies(int32_t aNumCopies) { + mNumCopies = aNumCopies; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetNumPagesPerSheet(int32_t* aNumPagesPerSheet) { + NS_ENSURE_ARG_POINTER(aNumPagesPerSheet); + *aNumPagesPerSheet = mNumPagesPerSheet; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetNumPagesPerSheet(int32_t aNumPagesPerSheet) { + mNumPagesPerSheet = aNumPagesPerSheet; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetOutputDestination( + OutputDestinationType* aDestination) { + *aDestination = mOutputDestination; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetOutputDestination( + OutputDestinationType aDestination) { + mOutputDestination = aDestination; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetOutputStream(nsIOutputStream* aStream) { + mOutputStream = aStream; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetOutputStream(nsIOutputStream** aStream) { + NS_IF_ADDREF(*aStream = mOutputStream.get()); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetToFileName(nsAString& aToFileName) { + aToFileName = mToFileName; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetToFileName(const nsAString& aToFileName) { + mToFileName = aToFileName; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetOutputFormat(int16_t* aOutputFormat) { + NS_ENSURE_ARG_POINTER(aOutputFormat); + *aOutputFormat = mOutputFormat; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetOutputFormat(int16_t aOutputFormat) { + mOutputFormat = aOutputFormat; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintPageDelay(int32_t* aPrintPageDelay) { + *aPrintPageDelay = mPrintPageDelay; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintPageDelay(int32_t aPrintPageDelay) { + mPrintPageDelay = aPrintPageDelay; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetIsInitializedFromPrinter( + bool* aIsInitializedFromPrinter) { + NS_ENSURE_ARG_POINTER(aIsInitializedFromPrinter); + *aIsInitializedFromPrinter = mIsInitedFromPrinter; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetIsInitializedFromPrinter( + bool aIsInitializedFromPrinter) { + mIsInitedFromPrinter = aIsInitializedFromPrinter; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetIsInitializedFromPrefs( + bool* aInitializedFromPrefs) { + NS_ENSURE_ARG_POINTER(aInitializedFromPrefs); + *aInitializedFromPrefs = mIsInitedFromPrefs; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetIsInitializedFromPrefs( + bool aInitializedFromPrefs) { + mIsInitedFromPrefs = aInitializedFromPrefs; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetMarginTop(double* aMarginTop) { + NS_ENSURE_ARG_POINTER(aMarginTop); + *aMarginTop = NS_TWIPS_TO_INCHES(mMargin.top); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetMarginTop(double aMarginTop) { + mMargin.top = NS_INCHES_TO_INT_TWIPS(float(aMarginTop)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetMarginLeft(double* aMarginLeft) { + NS_ENSURE_ARG_POINTER(aMarginLeft); + *aMarginLeft = NS_TWIPS_TO_INCHES(mMargin.left); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetMarginLeft(double aMarginLeft) { + mMargin.left = NS_INCHES_TO_INT_TWIPS(float(aMarginLeft)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetMarginBottom(double* aMarginBottom) { + NS_ENSURE_ARG_POINTER(aMarginBottom); + *aMarginBottom = NS_TWIPS_TO_INCHES(mMargin.bottom); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetMarginBottom(double aMarginBottom) { + mMargin.bottom = NS_INCHES_TO_INT_TWIPS(float(aMarginBottom)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetMarginRight(double* aMarginRight) { + NS_ENSURE_ARG_POINTER(aMarginRight); + *aMarginRight = NS_TWIPS_TO_INCHES(mMargin.right); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetMarginRight(double aMarginRight) { + mMargin.right = NS_INCHES_TO_INT_TWIPS(float(aMarginRight)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetEdgeTop(double* aEdgeTop) { + NS_ENSURE_ARG_POINTER(aEdgeTop); + *aEdgeTop = NS_TWIPS_TO_INCHES(mEdge.top); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetEdgeTop(double aEdgeTop) { + mEdge.top = NS_INCHES_TO_INT_TWIPS(float(aEdgeTop)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetEdgeLeft(double* aEdgeLeft) { + NS_ENSURE_ARG_POINTER(aEdgeLeft); + *aEdgeLeft = NS_TWIPS_TO_INCHES(mEdge.left); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetEdgeLeft(double aEdgeLeft) { + mEdge.left = NS_INCHES_TO_INT_TWIPS(float(aEdgeLeft)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetEdgeBottom(double* aEdgeBottom) { + NS_ENSURE_ARG_POINTER(aEdgeBottom); + *aEdgeBottom = NS_TWIPS_TO_INCHES(mEdge.bottom); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetEdgeBottom(double aEdgeBottom) { + mEdge.bottom = NS_INCHES_TO_INT_TWIPS(float(aEdgeBottom)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetEdgeRight(double* aEdgeRight) { + NS_ENSURE_ARG_POINTER(aEdgeRight); + *aEdgeRight = NS_TWIPS_TO_INCHES(mEdge.right); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetEdgeRight(double aEdgeRight) { + mEdge.right = NS_INCHES_TO_INT_TWIPS(float(aEdgeRight)); + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetUnwriteableMarginTop( + double* aUnwriteableMarginTop) { + NS_ENSURE_ARG_POINTER(aUnwriteableMarginTop); + *aUnwriteableMarginTop = NS_TWIPS_TO_INCHES(mUnwriteableMargin.top); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetUnwriteableMarginTop( + double aUnwriteableMarginTop) { + if (aUnwriteableMarginTop >= 0.0) { + mUnwriteableMargin.top = NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginTop); + } + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetUnwriteableMarginLeft( + double* aUnwriteableMarginLeft) { + NS_ENSURE_ARG_POINTER(aUnwriteableMarginLeft); + *aUnwriteableMarginLeft = NS_TWIPS_TO_INCHES(mUnwriteableMargin.left); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetUnwriteableMarginLeft( + double aUnwriteableMarginLeft) { + if (aUnwriteableMarginLeft >= 0.0) { + mUnwriteableMargin.left = NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginLeft); + } + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetUnwriteableMarginBottom( + double* aUnwriteableMarginBottom) { + NS_ENSURE_ARG_POINTER(aUnwriteableMarginBottom); + *aUnwriteableMarginBottom = NS_TWIPS_TO_INCHES(mUnwriteableMargin.bottom); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetUnwriteableMarginBottom( + double aUnwriteableMarginBottom) { + if (aUnwriteableMarginBottom >= 0.0) { + mUnwriteableMargin.bottom = + NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginBottom); + } + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetUnwriteableMarginRight( + double* aUnwriteableMarginRight) { + NS_ENSURE_ARG_POINTER(aUnwriteableMarginRight); + *aUnwriteableMarginRight = NS_TWIPS_TO_INCHES(mUnwriteableMargin.right); + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetUnwriteableMarginRight( + double aUnwriteableMarginRight) { + if (aUnwriteableMarginRight >= 0.0) { + mUnwriteableMargin.right = NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginRight); + } + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetScaling(double* aScaling) { + NS_ENSURE_ARG_POINTER(aScaling); + *aScaling = mScaling; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetScaling(double aScaling) { + mScaling = aScaling; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintBGColors(bool* aPrintBGColors) { + NS_ENSURE_ARG_POINTER(aPrintBGColors); + *aPrintBGColors = mPrintBGColors; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintBGColors(bool aPrintBGColors) { + mPrintBGColors = aPrintBGColors; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintBGImages(bool* aPrintBGImages) { + NS_ENSURE_ARG_POINTER(aPrintBGImages); + *aPrintBGImages = mPrintBGImages; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintBGImages(bool aPrintBGImages) { + mPrintBGImages = aPrintBGImages; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetTitle(nsAString& aTitle) { + aTitle = mTitle; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetTitle(const nsAString& aTitle) { + mTitle = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetDocURL(nsAString& aDocURL) { + aDocURL = mURL; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetDocURL(const nsAString& aDocURL) { + mURL = aDocURL; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetHeaderStrLeft(nsAString& aTitle) { + aTitle = mHeaderStrs[0]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetHeaderStrLeft(const nsAString& aTitle) { + mHeaderStrs[0] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetHeaderStrCenter(nsAString& aTitle) { + aTitle = mHeaderStrs[1]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetHeaderStrCenter(const nsAString& aTitle) { + mHeaderStrs[1] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetHeaderStrRight(nsAString& aTitle) { + aTitle = mHeaderStrs[2]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetHeaderStrRight(const nsAString& aTitle) { + mHeaderStrs[2] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetFooterStrLeft(nsAString& aTitle) { + aTitle = mFooterStrs[0]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetFooterStrLeft(const nsAString& aTitle) { + mFooterStrs[0] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetFooterStrCenter(nsAString& aTitle) { + aTitle = mFooterStrs[1]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetFooterStrCenter(const nsAString& aTitle) { + mFooterStrs[1] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetFooterStrRight(nsAString& aTitle) { + aTitle = mFooterStrs[2]; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetFooterStrRight(const nsAString& aTitle) { + mFooterStrs[2] = aTitle; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintSilent(bool* aPrintSilent) { + NS_ENSURE_ARG_POINTER(aPrintSilent); + *aPrintSilent = mPrintSilent; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPrintSilent(bool aPrintSilent) { + mPrintSilent = aPrintSilent; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetShrinkToFit(bool* aShrinkToFit) { + NS_ENSURE_ARG_POINTER(aShrinkToFit); + *aShrinkToFit = mShrinkToFit; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetShrinkToFit(bool aShrinkToFit) { + mShrinkToFit = aShrinkToFit; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetShowMarginGuides(bool* aShowMarginGuides) { + *aShowMarginGuides = mShowMarginGuides; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetShowMarginGuides(bool aShowMarginGuides) { + mShowMarginGuides = aShowMarginGuides; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetHonorPageRuleMargins(bool* aResult) { + *aResult = mHonorPageRuleMargins; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetHonorPageRuleMargins(bool aHonor) { + mHonorPageRuleMargins = aHonor; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetIgnoreUnwriteableMargins(bool* aResult) { + *aResult = mIgnoreUnwriteableMargins; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetIgnoreUnwriteableMargins(bool aIgnore) { + mIgnoreUnwriteableMargins = aIgnore; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPrintSelectionOnly(bool* aResult) { + *aResult = mPrintSelectionOnly; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::SetPrintSelectionOnly(bool aSelectionOnly) { + mPrintSelectionOnly = aSelectionOnly; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPaperId(nsAString& aPaperId) { + aPaperId = mPaperId; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPaperId(const nsAString& aPaperId) { + mPaperId = aPaperId; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPaperWidth(double* aPaperWidth) { + NS_ENSURE_ARG_POINTER(aPaperWidth); + *aPaperWidth = mPaperWidth; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPaperWidth(double aPaperWidth) { + mPaperWidth = aPaperWidth; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPaperHeight(double* aPaperHeight) { + NS_ENSURE_ARG_POINTER(aPaperHeight); + *aPaperHeight = mPaperHeight; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPaperHeight(double aPaperHeight) { + mPaperHeight = aPaperHeight; + return NS_OK; +} + +NS_IMETHODIMP nsPrintSettings::GetPaperSizeUnit(int16_t* aPaperSizeUnit) { + NS_ENSURE_ARG_POINTER(aPaperSizeUnit); + *aPaperSizeUnit = mPaperSizeUnit; + return NS_OK; +} +NS_IMETHODIMP nsPrintSettings::SetPaperSizeUnit(int16_t aPaperSizeUnit) { + mPaperSizeUnit = aPaperSizeUnit; + return NS_OK; +} + +/** --------------------------------------------------- + * See documentation in nsPrintSettingsService.h + * @update 6/21/00 dwc + * @update 1/12/01 rods + */ +NS_IMETHODIMP +nsPrintSettings::SetMarginInTwips(nsIntMargin& aMargin) { + mMargin = aMargin; + return NS_OK; +} + +NS_IMETHODIMP +nsPrintSettings::SetEdgeInTwips(nsIntMargin& aEdge) { + mEdge = aEdge; + return NS_OK; +} + +// NOTE: Any subclass implementation of this function should make sure +// to check for negative margin values in aUnwriteableMargin (which +// would indicate that we should use the system default unwriteable margin.) +NS_IMETHODIMP +nsPrintSettings::SetUnwriteableMarginInTwips(nsIntMargin& aUnwriteableMargin) { + if (aUnwriteableMargin.top >= 0) { + mUnwriteableMargin.top = aUnwriteableMargin.top; + } + if (aUnwriteableMargin.left >= 0) { + mUnwriteableMargin.left = aUnwriteableMargin.left; + } + if (aUnwriteableMargin.bottom >= 0) { + mUnwriteableMargin.bottom = aUnwriteableMargin.bottom; + } + if (aUnwriteableMargin.right >= 0) { + mUnwriteableMargin.right = aUnwriteableMargin.right; + } + return NS_OK; +} + +nsIntMargin nsPrintSettings::GetMarginInTwips() { return mMargin; } + +nsIntMargin nsPrintSettings::GetEdgeInTwips() { return mEdge; } + +nsIntMargin nsPrintSettings::GetUnwriteableMarginInTwips() { + return mUnwriteableMargin; +} + +/** --------------------------------------------------- + * See documentation in nsPrintSettingsService.h + */ +NS_IMETHODIMP +nsPrintSettings::GetEffectivePageSize(double* aWidth, double* aHeight) { + if (mPaperSizeUnit == kPaperSizeInches) { + *aWidth = NS_INCHES_TO_TWIPS(float(mPaperWidth)); + *aHeight = NS_INCHES_TO_TWIPS(float(mPaperHeight)); + } else { + MOZ_ASSERT(mPaperSizeUnit == kPaperSizeMillimeters, + "unexpected paper size unit"); + *aWidth = NS_MILLIMETERS_TO_TWIPS(float(mPaperWidth)); + *aHeight = NS_MILLIMETERS_TO_TWIPS(float(mPaperHeight)); + } + if (kLandscapeOrientation == mOrientation) { + double temp = *aWidth; + *aWidth = *aHeight; + *aHeight = temp; + } + return NS_OK; +} + +bool nsPrintSettings::HasOrthogonalSheetsAndPages() { + return mNumPagesPerSheet == 2 || mNumPagesPerSheet == 6; +} + +void nsPrintSettings::GetEffectiveSheetSize(double* aWidth, double* aHeight) { + mozilla::DebugOnly<nsresult> rv = GetEffectivePageSize(aWidth, aHeight); + + // Our GetEffectivePageSize impls only return NS_OK, so this should hold: + MOZ_ASSERT(NS_SUCCEEDED(rv), "Uh oh, GetEffectivePageSize failed"); + + if (HasOrthogonalSheetsAndPages()) { + std::swap(*aWidth, *aHeight); + } +} + +int32_t nsPrintSettings::GetSheetOrientation() { + if (HasOrthogonalSheetsAndPages()) { + // Sheet orientation is rotated with respect to the page orientation. + return kLandscapeOrientation == mOrientation ? kPortraitOrientation + : kLandscapeOrientation; + } + + // Sheet orientation is the same as the page orientation. + return mOrientation; +} + +NS_IMETHODIMP +nsPrintSettings::SetPageRanges(const nsTArray<int32_t>& aPages) { + // Needs to be a set of (start, end) pairs. + if (aPages.Length() % 2 != 0) { + return NS_ERROR_FAILURE; + } + mPageRanges = aPages.Clone(); + return NS_OK; +} + +NS_IMETHODIMP +nsPrintSettings::GetPageRanges(nsTArray<int32_t>& aPages) { + aPages = mPageRanges.Clone(); + return NS_OK; +} + +bool nsIPrintSettings::IsPageSkipped(int32_t aPageNum, + const nsTArray<int32_t>& aRanges) { + MOZ_RELEASE_ASSERT(aRanges.Length() % 2 == 0); + if (aRanges.IsEmpty()) { + return false; + } + for (size_t i = 0; i < aRanges.Length(); i += 2) { + if (aRanges[i] <= aPageNum && aPageNum <= aRanges[i + 1]) { + // The page is included in this piece of the custom range, + // so it's not skipped. + return false; + } + } + return true; +} + +nsresult nsPrintSettings::_Clone(nsIPrintSettings** _retval) { + RefPtr<nsPrintSettings> printSettings = new nsPrintSettings(*this); + printSettings.forget(_retval); + return NS_OK; +} + +NS_IMETHODIMP +nsPrintSettings::Clone(nsIPrintSettings** _retval) { + NS_ENSURE_ARG_POINTER(_retval); + return _Clone(_retval); +} + +nsresult nsPrintSettings::_Assign(nsIPrintSettings* aPS) { + nsPrintSettings* ps = static_cast<nsPrintSettings*>(aPS); + *this = *ps; + return NS_OK; +} + +nsresult nsPrintSettings::EquivalentTo(nsIPrintSettings* aPrintSettings, + bool* _retval) { + MOZ_ASSERT(aPrintSettings); + *_retval = false; + auto* other = static_cast<nsPrintSettings*>(aPrintSettings); + if (GetMarginInTwips() != aPrintSettings->GetMarginInTwips()) { + return NS_OK; + } + if (GetEdgeInTwips() != aPrintSettings->GetEdgeInTwips()) { + return NS_OK; + } + if (GetUnwriteableMarginInTwips() != + aPrintSettings->GetUnwriteableMarginInTwips()) { + return NS_OK; + } + nsTArray<int32_t> ourPageRanges, otherPageRanges; + if (NS_FAILED(GetPageRanges(ourPageRanges)) || + NS_FAILED(aPrintSettings->GetPageRanges(otherPageRanges)) || + ourPageRanges != otherPageRanges) { + return NS_OK; + } + double ourScaling, otherScaling; + if (NS_FAILED(GetScaling(&ourScaling)) || + NS_FAILED(aPrintSettings->GetScaling(&otherScaling)) || + ourScaling != otherScaling) { + return NS_OK; + } + if (GetPrintBGColors() != aPrintSettings->GetPrintBGColors()) { + return NS_OK; + } + if (GetPrintBGImages() != aPrintSettings->GetPrintBGImages()) { + return NS_OK; + } + if (GetPrintSelectionOnly() != aPrintSettings->GetPrintSelectionOnly()) { + return NS_OK; + } + if (GetShrinkToFit() != aPrintSettings->GetShrinkToFit()) { + return NS_OK; + } + if (GetShowMarginGuides() != aPrintSettings->GetShowMarginGuides()) { + return NS_OK; + } + if (GetHonorPageRuleMargins() != aPrintSettings->GetHonorPageRuleMargins()) { + return NS_OK; + } + if (GetIgnoreUnwriteableMargins() != + aPrintSettings->GetIgnoreUnwriteableMargins()) { + return NS_OK; + } + nsAutoString ourTitle, otherTitle; + if (NS_FAILED(GetTitle(ourTitle)) || + NS_FAILED(aPrintSettings->GetTitle(otherTitle)) || + ourTitle != otherTitle) { + return NS_OK; + } + nsAutoString ourUrl, otherUrl; + if (NS_FAILED(GetDocURL(ourUrl)) || + NS_FAILED(aPrintSettings->GetDocURL(otherUrl)) || ourUrl != otherUrl) { + return NS_OK; + } + if (!mozilla::ArrayEqual(mHeaderStrs, other->mHeaderStrs) || + !mozilla::ArrayEqual(mFooterStrs, other->mFooterStrs)) { + return NS_OK; + } + nsAutoString ourPaperId, otherPaperId; + if (NS_FAILED(GetPaperId(ourPaperId)) || + NS_FAILED(aPrintSettings->GetPaperId(otherPaperId)) || + ourPaperId != otherPaperId) { + return NS_OK; + } + double ourWidth, ourHeight, otherWidth, otherHeight; + if (NS_FAILED(GetEffectivePageSize(&ourWidth, &ourHeight)) || + NS_FAILED(other->GetEffectivePageSize(&otherWidth, &otherHeight)) || + std::abs(ourWidth - otherWidth) >= 1 || + std::abs(ourHeight - otherHeight) >= 1) { + return NS_OK; + } + int32_t ourOrientation, otherOrientation; + if (NS_FAILED(GetOrientation(&ourOrientation)) || + NS_FAILED(aPrintSettings->GetOrientation(&otherOrientation)) || + ourOrientation != otherOrientation) { + return NS_OK; + } + int32_t ourResolution, otherResolution; + if (NS_FAILED(GetResolution(&ourResolution)) || + NS_FAILED(aPrintSettings->GetResolution(&otherResolution)) || + ourResolution != otherResolution) { + return NS_OK; + } + int32_t ourNumPagesPerSheet, otherNumPagesPerSheet; + if (NS_FAILED(GetNumPagesPerSheet(&ourNumPagesPerSheet)) || + NS_FAILED(aPrintSettings->GetNumPagesPerSheet(&otherNumPagesPerSheet)) || + ourNumPagesPerSheet != otherNumPagesPerSheet) { + return NS_OK; + } + + *_retval = true; + return NS_OK; +} + +mozilla::PrintSettingsInitializer nsPrintSettings::GetSettingsInitializer() { + mozilla::PrintSettingsInitializer settingsInitializer; + settingsInitializer.mPrinter.Assign(mPrinter); + settingsInitializer.mPaperInfo.mId = mPaperId; + + double pointsPerSizeUnit = + mPaperSizeUnit == kPaperSizeInches ? 72.0 : 72.0 / 25.4; + settingsInitializer.mPaperInfo.mSize = {mPaperWidth * pointsPerSizeUnit, + mPaperHeight * pointsPerSizeUnit}; + + // Unwritable margins are stored in TWIPS here and points in PaperInfo. + settingsInitializer.mPaperInfo.mUnwriteableMargin = + Some(mozilla::gfx::MarginDouble( + mUnwriteableMargin.top / 20.0, mUnwriteableMargin.right / 20.0, + mUnwriteableMargin.bottom / 20.0, mUnwriteableMargin.left / 20.0)); + + settingsInitializer.mPrintInColor = mPrintInColor; + settingsInitializer.mResolution = mResolution; + settingsInitializer.mSheetOrientation = GetSheetOrientation(); + settingsInitializer.mNumCopies = mNumCopies; + settingsInitializer.mDuplex = mDuplex; + RefPtr<nsIPrintSettings> settingsToInitialize; + MOZ_ALWAYS_SUCCEEDS(Clone(getter_AddRefs(settingsToInitialize))); + settingsInitializer.mPrintSettings = + new nsMainThreadPtrHolder<nsPrintSettings>( + "PrintSettingsInitializer::mPrintSettings", + settingsToInitialize.forget().downcast<nsPrintSettings>()); + return settingsInitializer; +} + +NS_IMETHODIMP +nsPrintSettings::Assign(nsIPrintSettings* aPS) { + NS_ENSURE_ARG(aPS); + return _Assign(aPS); +} + +//------------------------------------------- +nsPrintSettings& nsPrintSettings::operator=(const nsPrintSettings& rhs) { + if (this == &rhs) { + return *this; + } + + mPageRanges = rhs.mPageRanges.Clone(); + mMargin = rhs.mMargin; + mEdge = rhs.mEdge; + mUnwriteableMargin = rhs.mUnwriteableMargin; + mScaling = rhs.mScaling; + mPrintBGColors = rhs.mPrintBGColors; + mPrintBGImages = rhs.mPrintBGImages; + mTitle = rhs.mTitle; + mURL = rhs.mURL; + mPrintSilent = rhs.mPrintSilent; + mShrinkToFit = rhs.mShrinkToFit; + mShowMarginGuides = rhs.mShowMarginGuides; + mHonorPageRuleMargins = rhs.mHonorPageRuleMargins; + mIgnoreUnwriteableMargins = rhs.mIgnoreUnwriteableMargins; + mPrintSelectionOnly = rhs.mPrintSelectionOnly; + mPaperId = rhs.mPaperId; + mPaperWidth = rhs.mPaperWidth; + mPaperHeight = rhs.mPaperHeight; + mPaperSizeUnit = rhs.mPaperSizeUnit; + mPrintReversed = rhs.mPrintReversed; + mPrintInColor = rhs.mPrintInColor; + mOrientation = rhs.mOrientation; + mResolution = rhs.mResolution; + mDuplex = rhs.mDuplex; + mNumCopies = rhs.mNumCopies; + mNumPagesPerSheet = rhs.mNumPagesPerSheet; + mPrinter = rhs.mPrinter; + mOutputDestination = rhs.mOutputDestination; + mOutputStream = rhs.mOutputStream; + mToFileName = rhs.mToFileName; + mOutputFormat = rhs.mOutputFormat; + mIsInitedFromPrinter = rhs.mIsInitedFromPrinter; + mIsInitedFromPrefs = rhs.mIsInitedFromPrefs; + mPrintPageDelay = rhs.mPrintPageDelay; + + for (int32_t i = 0; i < NUM_HEAD_FOOT; i++) { + mHeaderStrs[i] = rhs.mHeaderStrs[i]; + mFooterStrs[i] = rhs.mFooterStrs[i]; + } + + return *this; +} + +void nsPrintSettings::SetDefaultFileName() { + nsAutoString filename; + nsresult rv = GetToFileName(filename); + if (NS_FAILED(rv) || filename.IsEmpty()) { + const char* path = PR_GetEnv("PWD"); + if (!path) { + path = PR_GetEnv("HOME"); + } + + if (path) { + CopyUTF8toUTF16(mozilla::MakeStringSpan(path), filename); + filename.AppendLiteral("/mozilla.pdf"); + } else { + filename.AssignLiteral("mozilla.pdf"); + } + + SetToFileName(filename); + } +} |