1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #include "nsPrintSettingsImpl.h"
11 #include "nsReadableUtils.h"
12 #include "mozilla/DebugOnly.h"
13 #include "mozilla/RefPtr.h"
15 using namespace mozilla
;
17 #define DEFAULT_MARGIN_WIDTH 0.5
19 NS_IMPL_ISUPPORTS(nsPrintSettings
, nsIPrintSettings
)
21 nsPrintSettings::nsPrintSettings() {
22 /* member initializers and constructor code */
23 int32_t marginWidth
= NS_INCHES_TO_INT_TWIPS(DEFAULT_MARGIN_WIDTH
);
24 mMargin
.SizeTo(marginWidth
, marginWidth
, marginWidth
, marginWidth
);
25 mEdge
.SizeTo(0, 0, 0, 0);
26 mUnwriteableMargin
.SizeTo(0, 0, 0, 0);
28 mHeaderStrs
[0].AssignLiteral("&T");
29 mHeaderStrs
[2].AssignLiteral("&U");
31 mFooterStrs
[0].AssignLiteral(
32 "&PT"); // Use &P (Page Num Only) or &PT (Page Num of Page Total)
33 mFooterStrs
[2].AssignLiteral("&D");
36 void nsPrintSettings::InitWithInitializer(
37 const PrintSettingsInitializer
& aSettings
) {
38 const double kInchesPerPoint
= 1.0 / 72.0;
40 SetPrinterName(aSettings
.mPrinter
);
41 SetPrintInColor(aSettings
.mPrintInColor
);
42 SetResolution(aSettings
.mResolution
);
43 SetNumCopies(aSettings
.mNumCopies
);
44 SetDuplex(aSettings
.mDuplex
);
45 // The paper ID used by nsPrintSettings is the non-localizable identifier
46 // exposed as "id" by the paper, not the potentially localized human-friendly
47 // "name", which could change, e.g. if the user changes their system locale.
48 SetPaperId(aSettings
.mPaperInfo
.mId
);
50 // Set the paper sizes to match the unit.
51 SetPaperSizeUnit(aSettings
.mPaperSizeUnit
);
52 double sizeUnitsPerPoint
=
53 aSettings
.mPaperSizeUnit
== kPaperSizeInches
? 1.0 / 72.0 : 25.4 / 72.0;
54 SetPaperWidth(aSettings
.mPaperInfo
.mSize
.width
* sizeUnitsPerPoint
);
55 SetPaperHeight(aSettings
.mPaperInfo
.mSize
.height
* sizeUnitsPerPoint
);
57 // If our initializer says that we're producing portrait-mode sheets of
58 // paper, then our page format must also be portrait-mode; unless we've got
59 // a pages-per-sheet value with orthogonal pages/sheets, in which case it's
61 const bool areSheetsOfPaperPortraitMode
=
62 (aSettings
.mSheetOrientation
== kPortraitOrientation
);
63 const bool arePagesPortraitMode
=
64 (areSheetsOfPaperPortraitMode
!= HasOrthogonalSheetsAndPages());
65 SetOrientation(arePagesPortraitMode
? kPortraitOrientation
66 : kLandscapeOrientation
);
68 if (aSettings
.mPaperInfo
.mUnwriteableMargin
) {
69 const auto& margin
= aSettings
.mPaperInfo
.mUnwriteableMargin
.value();
70 // Margins are stored internally in TWIPS, but the setters expect inches.
71 SetUnwriteableMarginTop(margin
.top
* kInchesPerPoint
);
72 SetUnwriteableMarginRight(margin
.right
* kInchesPerPoint
);
73 SetUnwriteableMarginBottom(margin
.bottom
* kInchesPerPoint
);
74 SetUnwriteableMarginLeft(margin
.left
* kInchesPerPoint
);
77 // Set this last because other setters may overwrite its value.
78 SetIsInitializedFromPrinter(true);
81 nsPrintSettings::nsPrintSettings(const nsPrintSettings
& aPS
) { *this = aPS
; }
83 nsPrintSettings::~nsPrintSettings() = default;
85 NS_IMETHODIMP
nsPrintSettings::GetPrintReversed(bool* aPrintReversed
) {
86 *aPrintReversed
= mPrintReversed
;
89 NS_IMETHODIMP
nsPrintSettings::SetPrintReversed(bool aPrintReversed
) {
90 mPrintReversed
= aPrintReversed
;
94 NS_IMETHODIMP
nsPrintSettings::GetPrintInColor(bool* aPrintInColor
) {
95 *aPrintInColor
= mPrintInColor
;
98 NS_IMETHODIMP
nsPrintSettings::SetPrintInColor(bool aPrintInColor
) {
99 mPrintInColor
= aPrintInColor
;
103 NS_IMETHODIMP
nsPrintSettings::GetOrientation(int32_t* aOrientation
) {
104 *aOrientation
= mOrientation
;
107 NS_IMETHODIMP
nsPrintSettings::SetOrientation(int32_t aOrientation
) {
108 mOrientation
= aOrientation
;
112 NS_IMETHODIMP
nsPrintSettings::GetResolution(int32_t* aResolution
) {
113 NS_ENSURE_ARG_POINTER(aResolution
);
114 *aResolution
= mResolution
;
117 NS_IMETHODIMP
nsPrintSettings::SetResolution(const int32_t aResolution
) {
118 mResolution
= aResolution
;
122 NS_IMETHODIMP
nsPrintSettings::GetDuplex(int32_t* aDuplex
) {
123 NS_ENSURE_ARG_POINTER(aDuplex
);
127 NS_IMETHODIMP
nsPrintSettings::SetDuplex(const int32_t aDuplex
) {
132 NS_IMETHODIMP
nsPrintSettings::GetPrinterName(nsAString
& aPrinter
) {
137 NS_IMETHODIMP
nsPrintSettings::SetPrinterName(const nsAString
& aPrinter
) {
138 if (!mPrinter
.Equals(aPrinter
)) {
139 mIsInitedFromPrinter
= false;
140 mIsInitedFromPrefs
= false;
143 mPrinter
.Assign(aPrinter
);
147 NS_IMETHODIMP
nsPrintSettings::GetNumCopies(int32_t* aNumCopies
) {
148 NS_ENSURE_ARG_POINTER(aNumCopies
);
149 *aNumCopies
= mNumCopies
;
152 NS_IMETHODIMP
nsPrintSettings::SetNumCopies(int32_t aNumCopies
) {
153 mNumCopies
= aNumCopies
;
157 NS_IMETHODIMP
nsPrintSettings::GetNumPagesPerSheet(int32_t* aNumPagesPerSheet
) {
158 NS_ENSURE_ARG_POINTER(aNumPagesPerSheet
);
159 *aNumPagesPerSheet
= mNumPagesPerSheet
;
162 NS_IMETHODIMP
nsPrintSettings::SetNumPagesPerSheet(int32_t aNumPagesPerSheet
) {
163 mNumPagesPerSheet
= aNumPagesPerSheet
;
167 NS_IMETHODIMP
nsPrintSettings::GetOutputDestination(
168 OutputDestinationType
* aDestination
) {
169 *aDestination
= mOutputDestination
;
173 NS_IMETHODIMP
nsPrintSettings::SetOutputDestination(
174 OutputDestinationType aDestination
) {
175 mOutputDestination
= aDestination
;
179 NS_IMETHODIMP
nsPrintSettings::SetOutputStream(nsIOutputStream
* aStream
) {
180 mOutputStream
= aStream
;
184 NS_IMETHODIMP
nsPrintSettings::GetOutputStream(nsIOutputStream
** aStream
) {
185 NS_IF_ADDREF(*aStream
= mOutputStream
.get());
189 NS_IMETHODIMP
nsPrintSettings::GetToFileName(nsAString
& aToFileName
) {
190 aToFileName
= mToFileName
;
193 NS_IMETHODIMP
nsPrintSettings::SetToFileName(const nsAString
& aToFileName
) {
194 mToFileName
= aToFileName
;
198 NS_IMETHODIMP
nsPrintSettings::GetOutputFormat(int16_t* aOutputFormat
) {
199 NS_ENSURE_ARG_POINTER(aOutputFormat
);
200 *aOutputFormat
= mOutputFormat
;
203 NS_IMETHODIMP
nsPrintSettings::SetOutputFormat(int16_t aOutputFormat
) {
204 mOutputFormat
= aOutputFormat
;
208 NS_IMETHODIMP
nsPrintSettings::GetPrintPageDelay(int32_t* aPrintPageDelay
) {
209 *aPrintPageDelay
= mPrintPageDelay
;
212 NS_IMETHODIMP
nsPrintSettings::SetPrintPageDelay(int32_t aPrintPageDelay
) {
213 mPrintPageDelay
= aPrintPageDelay
;
217 NS_IMETHODIMP
nsPrintSettings::GetIsInitializedFromPrinter(
218 bool* aIsInitializedFromPrinter
) {
219 NS_ENSURE_ARG_POINTER(aIsInitializedFromPrinter
);
220 *aIsInitializedFromPrinter
= mIsInitedFromPrinter
;
223 NS_IMETHODIMP
nsPrintSettings::SetIsInitializedFromPrinter(
224 bool aIsInitializedFromPrinter
) {
225 mIsInitedFromPrinter
= aIsInitializedFromPrinter
;
229 NS_IMETHODIMP
nsPrintSettings::GetIsInitializedFromPrefs(
230 bool* aInitializedFromPrefs
) {
231 NS_ENSURE_ARG_POINTER(aInitializedFromPrefs
);
232 *aInitializedFromPrefs
= mIsInitedFromPrefs
;
235 NS_IMETHODIMP
nsPrintSettings::SetIsInitializedFromPrefs(
236 bool aInitializedFromPrefs
) {
237 mIsInitedFromPrefs
= aInitializedFromPrefs
;
241 NS_IMETHODIMP
nsPrintSettings::GetMarginTop(double* aMarginTop
) {
242 NS_ENSURE_ARG_POINTER(aMarginTop
);
243 *aMarginTop
= NS_TWIPS_TO_INCHES(mMargin
.top
);
246 NS_IMETHODIMP
nsPrintSettings::SetMarginTop(double aMarginTop
) {
247 mMargin
.top
= NS_INCHES_TO_INT_TWIPS(float(aMarginTop
));
251 NS_IMETHODIMP
nsPrintSettings::GetMarginLeft(double* aMarginLeft
) {
252 NS_ENSURE_ARG_POINTER(aMarginLeft
);
253 *aMarginLeft
= NS_TWIPS_TO_INCHES(mMargin
.left
);
256 NS_IMETHODIMP
nsPrintSettings::SetMarginLeft(double aMarginLeft
) {
257 mMargin
.left
= NS_INCHES_TO_INT_TWIPS(float(aMarginLeft
));
261 NS_IMETHODIMP
nsPrintSettings::GetMarginBottom(double* aMarginBottom
) {
262 NS_ENSURE_ARG_POINTER(aMarginBottom
);
263 *aMarginBottom
= NS_TWIPS_TO_INCHES(mMargin
.bottom
);
266 NS_IMETHODIMP
nsPrintSettings::SetMarginBottom(double aMarginBottom
) {
267 mMargin
.bottom
= NS_INCHES_TO_INT_TWIPS(float(aMarginBottom
));
271 NS_IMETHODIMP
nsPrintSettings::GetMarginRight(double* aMarginRight
) {
272 NS_ENSURE_ARG_POINTER(aMarginRight
);
273 *aMarginRight
= NS_TWIPS_TO_INCHES(mMargin
.right
);
276 NS_IMETHODIMP
nsPrintSettings::SetMarginRight(double aMarginRight
) {
277 mMargin
.right
= NS_INCHES_TO_INT_TWIPS(float(aMarginRight
));
281 NS_IMETHODIMP
nsPrintSettings::GetEdgeTop(double* aEdgeTop
) {
282 NS_ENSURE_ARG_POINTER(aEdgeTop
);
283 *aEdgeTop
= NS_TWIPS_TO_INCHES(mEdge
.top
);
286 NS_IMETHODIMP
nsPrintSettings::SetEdgeTop(double aEdgeTop
) {
287 mEdge
.top
= NS_INCHES_TO_INT_TWIPS(float(aEdgeTop
));
291 NS_IMETHODIMP
nsPrintSettings::GetEdgeLeft(double* aEdgeLeft
) {
292 NS_ENSURE_ARG_POINTER(aEdgeLeft
);
293 *aEdgeLeft
= NS_TWIPS_TO_INCHES(mEdge
.left
);
296 NS_IMETHODIMP
nsPrintSettings::SetEdgeLeft(double aEdgeLeft
) {
297 mEdge
.left
= NS_INCHES_TO_INT_TWIPS(float(aEdgeLeft
));
301 NS_IMETHODIMP
nsPrintSettings::GetEdgeBottom(double* aEdgeBottom
) {
302 NS_ENSURE_ARG_POINTER(aEdgeBottom
);
303 *aEdgeBottom
= NS_TWIPS_TO_INCHES(mEdge
.bottom
);
306 NS_IMETHODIMP
nsPrintSettings::SetEdgeBottom(double aEdgeBottom
) {
307 mEdge
.bottom
= NS_INCHES_TO_INT_TWIPS(float(aEdgeBottom
));
311 NS_IMETHODIMP
nsPrintSettings::GetEdgeRight(double* aEdgeRight
) {
312 NS_ENSURE_ARG_POINTER(aEdgeRight
);
313 *aEdgeRight
= NS_TWIPS_TO_INCHES(mEdge
.right
);
316 NS_IMETHODIMP
nsPrintSettings::SetEdgeRight(double aEdgeRight
) {
317 mEdge
.right
= NS_INCHES_TO_INT_TWIPS(float(aEdgeRight
));
321 NS_IMETHODIMP
nsPrintSettings::GetUnwriteableMarginTop(
322 double* aUnwriteableMarginTop
) {
323 NS_ENSURE_ARG_POINTER(aUnwriteableMarginTop
);
324 *aUnwriteableMarginTop
= NS_TWIPS_TO_INCHES(mUnwriteableMargin
.top
);
327 NS_IMETHODIMP
nsPrintSettings::SetUnwriteableMarginTop(
328 double aUnwriteableMarginTop
) {
329 if (aUnwriteableMarginTop
>= 0.0) {
330 mUnwriteableMargin
.top
= NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginTop
);
335 NS_IMETHODIMP
nsPrintSettings::GetUnwriteableMarginLeft(
336 double* aUnwriteableMarginLeft
) {
337 NS_ENSURE_ARG_POINTER(aUnwriteableMarginLeft
);
338 *aUnwriteableMarginLeft
= NS_TWIPS_TO_INCHES(mUnwriteableMargin
.left
);
341 NS_IMETHODIMP
nsPrintSettings::SetUnwriteableMarginLeft(
342 double aUnwriteableMarginLeft
) {
343 if (aUnwriteableMarginLeft
>= 0.0) {
344 mUnwriteableMargin
.left
= NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginLeft
);
349 NS_IMETHODIMP
nsPrintSettings::GetUnwriteableMarginBottom(
350 double* aUnwriteableMarginBottom
) {
351 NS_ENSURE_ARG_POINTER(aUnwriteableMarginBottom
);
352 *aUnwriteableMarginBottom
= NS_TWIPS_TO_INCHES(mUnwriteableMargin
.bottom
);
355 NS_IMETHODIMP
nsPrintSettings::SetUnwriteableMarginBottom(
356 double aUnwriteableMarginBottom
) {
357 if (aUnwriteableMarginBottom
>= 0.0) {
358 mUnwriteableMargin
.bottom
=
359 NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginBottom
);
364 NS_IMETHODIMP
nsPrintSettings::GetUnwriteableMarginRight(
365 double* aUnwriteableMarginRight
) {
366 NS_ENSURE_ARG_POINTER(aUnwriteableMarginRight
);
367 *aUnwriteableMarginRight
= NS_TWIPS_TO_INCHES(mUnwriteableMargin
.right
);
370 NS_IMETHODIMP
nsPrintSettings::SetUnwriteableMarginRight(
371 double aUnwriteableMarginRight
) {
372 if (aUnwriteableMarginRight
>= 0.0) {
373 mUnwriteableMargin
.right
= NS_INCHES_TO_INT_TWIPS(aUnwriteableMarginRight
);
378 NS_IMETHODIMP
nsPrintSettings::GetScaling(double* aScaling
) {
379 NS_ENSURE_ARG_POINTER(aScaling
);
380 *aScaling
= mScaling
;
384 NS_IMETHODIMP
nsPrintSettings::SetScaling(double aScaling
) {
389 NS_IMETHODIMP
nsPrintSettings::GetPrintBGColors(bool* aPrintBGColors
) {
390 NS_ENSURE_ARG_POINTER(aPrintBGColors
);
391 *aPrintBGColors
= mPrintBGColors
;
394 NS_IMETHODIMP
nsPrintSettings::SetPrintBGColors(bool aPrintBGColors
) {
395 mPrintBGColors
= aPrintBGColors
;
399 NS_IMETHODIMP
nsPrintSettings::GetPrintBGImages(bool* aPrintBGImages
) {
400 NS_ENSURE_ARG_POINTER(aPrintBGImages
);
401 *aPrintBGImages
= mPrintBGImages
;
404 NS_IMETHODIMP
nsPrintSettings::SetPrintBGImages(bool aPrintBGImages
) {
405 mPrintBGImages
= aPrintBGImages
;
409 NS_IMETHODIMP
nsPrintSettings::GetTitle(nsAString
& aTitle
) {
413 NS_IMETHODIMP
nsPrintSettings::SetTitle(const nsAString
& aTitle
) {
418 NS_IMETHODIMP
nsPrintSettings::GetDocURL(nsAString
& aDocURL
) {
422 NS_IMETHODIMP
nsPrintSettings::SetDocURL(const nsAString
& aDocURL
) {
427 NS_IMETHODIMP
nsPrintSettings::GetHeaderStrLeft(nsAString
& aTitle
) {
428 aTitle
= mHeaderStrs
[0];
431 NS_IMETHODIMP
nsPrintSettings::SetHeaderStrLeft(const nsAString
& aTitle
) {
432 mHeaderStrs
[0] = aTitle
;
436 NS_IMETHODIMP
nsPrintSettings::GetHeaderStrCenter(nsAString
& aTitle
) {
437 aTitle
= mHeaderStrs
[1];
440 NS_IMETHODIMP
nsPrintSettings::SetHeaderStrCenter(const nsAString
& aTitle
) {
441 mHeaderStrs
[1] = aTitle
;
445 NS_IMETHODIMP
nsPrintSettings::GetHeaderStrRight(nsAString
& aTitle
) {
446 aTitle
= mHeaderStrs
[2];
449 NS_IMETHODIMP
nsPrintSettings::SetHeaderStrRight(const nsAString
& aTitle
) {
450 mHeaderStrs
[2] = aTitle
;
454 NS_IMETHODIMP
nsPrintSettings::GetFooterStrLeft(nsAString
& aTitle
) {
455 aTitle
= mFooterStrs
[0];
458 NS_IMETHODIMP
nsPrintSettings::SetFooterStrLeft(const nsAString
& aTitle
) {
459 mFooterStrs
[0] = aTitle
;
463 NS_IMETHODIMP
nsPrintSettings::GetFooterStrCenter(nsAString
& aTitle
) {
464 aTitle
= mFooterStrs
[1];
467 NS_IMETHODIMP
nsPrintSettings::SetFooterStrCenter(const nsAString
& aTitle
) {
468 mFooterStrs
[1] = aTitle
;
472 NS_IMETHODIMP
nsPrintSettings::GetFooterStrRight(nsAString
& aTitle
) {
473 aTitle
= mFooterStrs
[2];
476 NS_IMETHODIMP
nsPrintSettings::SetFooterStrRight(const nsAString
& aTitle
) {
477 mFooterStrs
[2] = aTitle
;
481 NS_IMETHODIMP
nsPrintSettings::GetPrintSilent(bool* aPrintSilent
) {
482 NS_ENSURE_ARG_POINTER(aPrintSilent
);
483 *aPrintSilent
= mPrintSilent
;
486 NS_IMETHODIMP
nsPrintSettings::SetPrintSilent(bool aPrintSilent
) {
487 mPrintSilent
= aPrintSilent
;
491 NS_IMETHODIMP
nsPrintSettings::GetShrinkToFit(bool* aShrinkToFit
) {
492 NS_ENSURE_ARG_POINTER(aShrinkToFit
);
493 *aShrinkToFit
= mShrinkToFit
;
496 NS_IMETHODIMP
nsPrintSettings::SetShrinkToFit(bool aShrinkToFit
) {
497 mShrinkToFit
= aShrinkToFit
;
501 NS_IMETHODIMP
nsPrintSettings::GetShowMarginGuides(bool* aShowMarginGuides
) {
502 *aShowMarginGuides
= mShowMarginGuides
;
506 NS_IMETHODIMP
nsPrintSettings::SetShowMarginGuides(bool aShowMarginGuides
) {
507 mShowMarginGuides
= aShowMarginGuides
;
511 NS_IMETHODIMP
nsPrintSettings::GetHonorPageRuleMargins(bool* aResult
) {
512 *aResult
= mHonorPageRuleMargins
;
516 NS_IMETHODIMP
nsPrintSettings::SetHonorPageRuleMargins(bool aHonor
) {
517 mHonorPageRuleMargins
= aHonor
;
521 NS_IMETHODIMP
nsPrintSettings::GetPrintSelectionOnly(bool* aResult
) {
522 *aResult
= mPrintSelectionOnly
;
526 NS_IMETHODIMP
nsPrintSettings::SetPrintSelectionOnly(bool aSelectionOnly
) {
527 mPrintSelectionOnly
= aSelectionOnly
;
531 NS_IMETHODIMP
nsPrintSettings::GetPaperId(nsAString
& aPaperId
) {
535 NS_IMETHODIMP
nsPrintSettings::SetPaperId(const nsAString
& aPaperId
) {
540 NS_IMETHODIMP
nsPrintSettings::GetPaperWidth(double* aPaperWidth
) {
541 NS_ENSURE_ARG_POINTER(aPaperWidth
);
542 *aPaperWidth
= mPaperWidth
;
545 NS_IMETHODIMP
nsPrintSettings::SetPaperWidth(double aPaperWidth
) {
546 mPaperWidth
= aPaperWidth
;
550 NS_IMETHODIMP
nsPrintSettings::GetPaperHeight(double* aPaperHeight
) {
551 NS_ENSURE_ARG_POINTER(aPaperHeight
);
552 *aPaperHeight
= mPaperHeight
;
555 NS_IMETHODIMP
nsPrintSettings::SetPaperHeight(double aPaperHeight
) {
556 mPaperHeight
= aPaperHeight
;
560 NS_IMETHODIMP
nsPrintSettings::GetPaperSizeUnit(int16_t* aPaperSizeUnit
) {
561 NS_ENSURE_ARG_POINTER(aPaperSizeUnit
);
562 *aPaperSizeUnit
= mPaperSizeUnit
;
565 NS_IMETHODIMP
nsPrintSettings::SetPaperSizeUnit(int16_t aPaperSizeUnit
) {
566 mPaperSizeUnit
= aPaperSizeUnit
;
570 /** ---------------------------------------------------
571 * See documentation in nsPrintSettingsService.h
572 * @update 6/21/00 dwc
573 * @update 1/12/01 rods
576 nsPrintSettings::SetMarginInTwips(nsIntMargin
& aMargin
) {
582 nsPrintSettings::SetEdgeInTwips(nsIntMargin
& aEdge
) {
587 // NOTE: Any subclass implementation of this function should make sure
588 // to check for negative margin values in aUnwriteableMargin (which
589 // would indicate that we should use the system default unwriteable margin.)
591 nsPrintSettings::SetUnwriteableMarginInTwips(nsIntMargin
& aUnwriteableMargin
) {
592 if (aUnwriteableMargin
.top
>= 0) {
593 mUnwriteableMargin
.top
= aUnwriteableMargin
.top
;
595 if (aUnwriteableMargin
.left
>= 0) {
596 mUnwriteableMargin
.left
= aUnwriteableMargin
.left
;
598 if (aUnwriteableMargin
.bottom
>= 0) {
599 mUnwriteableMargin
.bottom
= aUnwriteableMargin
.bottom
;
601 if (aUnwriteableMargin
.right
>= 0) {
602 mUnwriteableMargin
.right
= aUnwriteableMargin
.right
;
607 nsIntMargin
nsPrintSettings::GetMarginInTwips() { return mMargin
; }
609 nsIntMargin
nsPrintSettings::GetEdgeInTwips() { return mEdge
; }
611 nsIntMargin
nsPrintSettings::GetUnwriteableMarginInTwips() {
612 return mUnwriteableMargin
;
615 /** ---------------------------------------------------
616 * See documentation in nsPrintSettingsService.h
619 nsPrintSettings::GetEffectivePageSize(double* aWidth
, double* aHeight
) {
620 if (mPaperSizeUnit
== kPaperSizeInches
) {
621 *aWidth
= NS_INCHES_TO_TWIPS(float(mPaperWidth
));
622 *aHeight
= NS_INCHES_TO_TWIPS(float(mPaperHeight
));
624 MOZ_ASSERT(mPaperSizeUnit
== kPaperSizeMillimeters
,
625 "unexpected paper size unit");
626 *aWidth
= NS_MILLIMETERS_TO_TWIPS(float(mPaperWidth
));
627 *aHeight
= NS_MILLIMETERS_TO_TWIPS(float(mPaperHeight
));
629 if (kLandscapeOrientation
== mOrientation
) {
630 double temp
= *aWidth
;
637 bool nsPrintSettings::HasOrthogonalSheetsAndPages() {
638 return mNumPagesPerSheet
== 2 || mNumPagesPerSheet
== 6;
641 void nsPrintSettings::GetEffectiveSheetSize(double* aWidth
, double* aHeight
) {
642 mozilla::DebugOnly
<nsresult
> rv
= GetEffectivePageSize(aWidth
, aHeight
);
644 // Our GetEffectivePageSize impls only return NS_OK, so this should hold:
645 MOZ_ASSERT(NS_SUCCEEDED(rv
), "Uh oh, GetEffectivePageSize failed");
647 if (HasOrthogonalSheetsAndPages()) {
648 std::swap(*aWidth
, *aHeight
);
652 int32_t nsPrintSettings::GetSheetOrientation() {
653 if (HasOrthogonalSheetsAndPages()) {
654 // Sheet orientation is rotated with respect to the page orientation.
655 return kLandscapeOrientation
== mOrientation
? kPortraitOrientation
656 : kLandscapeOrientation
;
659 // Sheet orientation is the same as the page orientation.
664 nsPrintSettings::SetPageRanges(const nsTArray
<int32_t>& aPages
) {
665 // Needs to be a set of (start, end) pairs.
666 if (aPages
.Length() % 2 != 0) {
667 return NS_ERROR_FAILURE
;
669 mPageRanges
= aPages
.Clone();
674 nsPrintSettings::GetPageRanges(nsTArray
<int32_t>& aPages
) {
675 aPages
= mPageRanges
.Clone();
679 bool nsIPrintSettings::IsPageSkipped(int32_t aPageNum
,
680 const nsTArray
<int32_t>& aRanges
) {
681 MOZ_RELEASE_ASSERT(aRanges
.Length() % 2 == 0);
682 if (aRanges
.IsEmpty()) {
685 for (size_t i
= 0; i
< aRanges
.Length(); i
+= 2) {
686 if (aRanges
[i
] <= aPageNum
&& aPageNum
<= aRanges
[i
+ 1]) {
687 // The page is included in this piece of the custom range,
688 // so it's not skipped.
695 nsresult
nsPrintSettings::_Clone(nsIPrintSettings
** _retval
) {
696 RefPtr
<nsPrintSettings
> printSettings
= new nsPrintSettings(*this);
697 printSettings
.forget(_retval
);
702 nsPrintSettings::Clone(nsIPrintSettings
** _retval
) {
703 NS_ENSURE_ARG_POINTER(_retval
);
704 return _Clone(_retval
);
707 nsresult
nsPrintSettings::_Assign(nsIPrintSettings
* aPS
) {
708 nsPrintSettings
* ps
= static_cast<nsPrintSettings
*>(aPS
);
713 nsresult
nsPrintSettings::EquivalentTo(nsIPrintSettings
* aPrintSettings
,
715 MOZ_ASSERT(aPrintSettings
);
717 auto* other
= static_cast<nsPrintSettings
*>(aPrintSettings
);
718 if (GetMarginInTwips() != aPrintSettings
->GetMarginInTwips()) {
721 if (GetEdgeInTwips() != aPrintSettings
->GetEdgeInTwips()) {
724 if (GetUnwriteableMarginInTwips() !=
725 aPrintSettings
->GetUnwriteableMarginInTwips()) {
728 nsTArray
<int32_t> ourPageRanges
, otherPageRanges
;
729 if (NS_FAILED(GetPageRanges(ourPageRanges
)) ||
730 NS_FAILED(aPrintSettings
->GetPageRanges(otherPageRanges
)) ||
731 ourPageRanges
!= otherPageRanges
) {
734 double ourScaling
, otherScaling
;
735 if (NS_FAILED(GetScaling(&ourScaling
)) ||
736 NS_FAILED(aPrintSettings
->GetScaling(&otherScaling
)) ||
737 ourScaling
!= otherScaling
) {
740 if (GetPrintBGColors() != aPrintSettings
->GetPrintBGColors()) {
743 if (GetPrintBGImages() != aPrintSettings
->GetPrintBGImages()) {
746 if (GetPrintSelectionOnly() != aPrintSettings
->GetPrintSelectionOnly()) {
749 if (GetShrinkToFit() != aPrintSettings
->GetShrinkToFit()) {
752 if (GetShowMarginGuides() != aPrintSettings
->GetShowMarginGuides()) {
755 if (GetHonorPageRuleMargins() != aPrintSettings
->GetHonorPageRuleMargins()) {
758 nsAutoString ourTitle
, otherTitle
;
759 if (NS_FAILED(GetTitle(ourTitle
)) ||
760 NS_FAILED(aPrintSettings
->GetTitle(otherTitle
)) ||
761 ourTitle
!= otherTitle
) {
764 nsAutoString ourUrl
, otherUrl
;
765 if (NS_FAILED(GetDocURL(ourUrl
)) ||
766 NS_FAILED(aPrintSettings
->GetDocURL(otherUrl
)) || ourUrl
!= otherUrl
) {
769 if (!mozilla::ArrayEqual(mHeaderStrs
, other
->mHeaderStrs
) ||
770 !mozilla::ArrayEqual(mFooterStrs
, other
->mFooterStrs
)) {
773 nsAutoString ourPaperId
, otherPaperId
;
774 if (NS_FAILED(GetPaperId(ourPaperId
)) ||
775 NS_FAILED(aPrintSettings
->GetPaperId(otherPaperId
)) ||
776 ourPaperId
!= otherPaperId
) {
779 double ourWidth
, ourHeight
, otherWidth
, otherHeight
;
780 if (NS_FAILED(GetEffectivePageSize(&ourWidth
, &ourHeight
)) ||
781 NS_FAILED(other
->GetEffectivePageSize(&otherWidth
, &otherHeight
)) ||
782 std::abs(ourWidth
- otherWidth
) >= 1 ||
783 std::abs(ourHeight
- otherHeight
) >= 1) {
786 int32_t ourOrientation
, otherOrientation
;
787 if (NS_FAILED(GetOrientation(&ourOrientation
)) ||
788 NS_FAILED(aPrintSettings
->GetOrientation(&otherOrientation
)) ||
789 ourOrientation
!= otherOrientation
) {
792 int32_t ourResolution
, otherResolution
;
793 if (NS_FAILED(GetResolution(&ourResolution
)) ||
794 NS_FAILED(aPrintSettings
->GetResolution(&otherResolution
)) ||
795 ourResolution
!= otherResolution
) {
798 int32_t ourNumPagesPerSheet
, otherNumPagesPerSheet
;
799 if (NS_FAILED(GetNumPagesPerSheet(&ourNumPagesPerSheet
)) ||
800 NS_FAILED(aPrintSettings
->GetNumPagesPerSheet(&otherNumPagesPerSheet
)) ||
801 ourNumPagesPerSheet
!= otherNumPagesPerSheet
) {
809 mozilla::PrintSettingsInitializer
nsPrintSettings::GetSettingsInitializer() {
810 mozilla::PrintSettingsInitializer settingsInitializer
;
811 settingsInitializer
.mPrinter
.Assign(mPrinter
);
812 settingsInitializer
.mPaperInfo
.mId
= mPaperId
;
814 double pointsPerSizeUnit
=
815 mPaperSizeUnit
== kPaperSizeInches
? 72.0 : 72.0 / 25.4;
816 settingsInitializer
.mPaperInfo
.mSize
= {mPaperWidth
* pointsPerSizeUnit
,
817 mPaperHeight
* pointsPerSizeUnit
};
819 // Unwritable margins are stored in TWIPS here and points in PaperInfo.
820 settingsInitializer
.mPaperInfo
.mUnwriteableMargin
=
821 Some(mozilla::gfx::MarginDouble(
822 mUnwriteableMargin
.top
/ 20.0, mUnwriteableMargin
.right
/ 20.0,
823 mUnwriteableMargin
.bottom
/ 20.0, mUnwriteableMargin
.left
/ 20.0));
825 settingsInitializer
.mPrintInColor
= mPrintInColor
;
826 settingsInitializer
.mResolution
= mResolution
;
827 settingsInitializer
.mSheetOrientation
= GetSheetOrientation();
828 settingsInitializer
.mNumCopies
= mNumCopies
;
829 settingsInitializer
.mDuplex
= mDuplex
;
830 RefPtr
<nsIPrintSettings
> settingsToInitialize
;
831 MOZ_ALWAYS_SUCCEEDS(Clone(getter_AddRefs(settingsToInitialize
)));
832 settingsInitializer
.mPrintSettings
=
833 new nsMainThreadPtrHolder
<nsPrintSettings
>(
834 "PrintSettingsInitializer::mPrintSettings",
835 settingsToInitialize
.forget().downcast
<nsPrintSettings
>());
836 return settingsInitializer
;
840 nsPrintSettings::Assign(nsIPrintSettings
* aPS
) {
845 //-------------------------------------------
846 nsPrintSettings
& nsPrintSettings::operator=(const nsPrintSettings
& rhs
) {
851 mPageRanges
= rhs
.mPageRanges
.Clone();
852 mMargin
= rhs
.mMargin
;
854 mUnwriteableMargin
= rhs
.mUnwriteableMargin
;
855 mScaling
= rhs
.mScaling
;
856 mPrintBGColors
= rhs
.mPrintBGColors
;
857 mPrintBGImages
= rhs
.mPrintBGImages
;
860 mPrintSilent
= rhs
.mPrintSilent
;
861 mShrinkToFit
= rhs
.mShrinkToFit
;
862 mShowMarginGuides
= rhs
.mShowMarginGuides
;
863 mHonorPageRuleMargins
= rhs
.mHonorPageRuleMargins
;
864 mPrintSelectionOnly
= rhs
.mPrintSelectionOnly
;
865 mPaperId
= rhs
.mPaperId
;
866 mPaperWidth
= rhs
.mPaperWidth
;
867 mPaperHeight
= rhs
.mPaperHeight
;
868 mPaperSizeUnit
= rhs
.mPaperSizeUnit
;
869 mPrintReversed
= rhs
.mPrintReversed
;
870 mPrintInColor
= rhs
.mPrintInColor
;
871 mOrientation
= rhs
.mOrientation
;
872 mResolution
= rhs
.mResolution
;
873 mDuplex
= rhs
.mDuplex
;
874 mNumCopies
= rhs
.mNumCopies
;
875 mNumPagesPerSheet
= rhs
.mNumPagesPerSheet
;
876 mPrinter
= rhs
.mPrinter
;
877 mOutputDestination
= rhs
.mOutputDestination
;
878 mOutputStream
= rhs
.mOutputStream
;
879 mToFileName
= rhs
.mToFileName
;
880 mOutputFormat
= rhs
.mOutputFormat
;
881 mIsInitedFromPrinter
= rhs
.mIsInitedFromPrinter
;
882 mIsInitedFromPrefs
= rhs
.mIsInitedFromPrefs
;
883 mPrintPageDelay
= rhs
.mPrintPageDelay
;
885 for (int32_t i
= 0; i
< NUM_HEAD_FOOT
; i
++) {
886 mHeaderStrs
[i
] = rhs
.mHeaderStrs
[i
];
887 mFooterStrs
[i
] = rhs
.mFooterStrs
[i
];
893 void nsPrintSettings::SetDefaultFileName() {
894 nsAutoString filename
;
895 nsresult rv
= GetToFileName(filename
);
896 if (NS_FAILED(rv
) || filename
.IsEmpty()) {
897 const char* path
= PR_GetEnv("PWD");
899 path
= PR_GetEnv("HOME");
903 CopyUTF8toUTF16(mozilla::MakeStringSpan(path
), filename
);
904 filename
.AppendLiteral("/mozilla.pdf");
906 filename
.AssignLiteral("mozilla.pdf");
909 SetToFileName(filename
);