Bug 417356: Define & use "UnwriteableMargin" PrintSettings pref, to make Linux printing work more like Mac printing (keeping us from printing right up against the edge of the page) r=ventron sr=roc a=blocking1.9+

This commit is contained in:
dholbert@cs.stanford.edu 2008-03-14 00:48:04 -07:00
parent 52a3ff9796
commit b847cc90cc
18 changed files with 188 additions and 162 deletions

View File

@ -47,7 +47,7 @@
class THEBES_API gfxPDFSurface : public gfxASurface {
public:
gfxPDFSurface(nsIOutputStream *aStream, const gfxSize& aSizeInPonits);
gfxPDFSurface(nsIOutputStream *aStream, const gfxSize& aSizeInPoints);
virtual ~gfxPDFSurface();
virtual nsresult BeginPrinting(const nsAString& aTitle, const nsAString& aPrintToFileName);

View File

@ -47,7 +47,7 @@
class THEBES_API gfxPSSurface : public gfxASurface {
public:
gfxPSSurface(nsIOutputStream *aStream, const gfxSize& aSizeInPonits);
gfxPSSurface(nsIOutputStream *aStream, const gfxSize& aSizeInPoints);
virtual ~gfxPSSurface();
virtual nsresult BeginPrinting(const nsAString& aTitle, const nsAString& aPrintToFileName);

View File

@ -519,6 +519,13 @@ public:
{ return NSToCoordRound(NS_TWIPS_TO_INCHES(aTwips) *
mDeviceContext->AppUnitsPerInch()); }
// Margin-specific version, since they often need TwipsToAppUnits
nsMargin TwipsToAppUnits(const nsMargin &marginInTwips) const
{ return nsMargin(TwipsToAppUnits(marginInTwips.left),
TwipsToAppUnits(marginInTwips.top),
TwipsToAppUnits(marginInTwips.right),
TwipsToAppUnits(marginInTwips.bottom)); }
PRInt32 AppUnitsToTwips(nscoord aTwips) const
{ return NS_INCHES_TO_TWIPS((float)aTwips /
mDeviceContext->AppUnitsPerInch()); }

View File

@ -198,12 +198,16 @@ nsSimplePageSequenceFrame::Reflow(nsPresContext* aPresContext,
// now get out margins & edges
if (mPageData->mPrintSettings) {
nsMargin unwriteableTwips;
mPageData->mPrintSettings->GetUnwriteableMarginInTwips(unwriteableTwips);
NS_ASSERTION(unwriteableTwips.left >= 0 && unwriteableTwips.top >= 0 &&
unwriteableTwips.right >= 0 && unwriteableTwips.bottom >= 0,
"Unwriteable twips should be non-negative");
nsMargin marginTwips;
mPageData->mPrintSettings->GetMarginInTwips(marginTwips);
mMargin = nsMargin(aPresContext->TwipsToAppUnits(marginTwips.left),
aPresContext->TwipsToAppUnits(marginTwips.top),
aPresContext->TwipsToAppUnits(marginTwips.right),
aPresContext->TwipsToAppUnits(marginTwips.bottom));
mMargin = aPresContext->TwipsToAppUnits(marginTwips + unwriteableTwips);
PRInt16 printType;
mPageData->mPrintSettings->GetPrintRange(&printType);
mPrintRangeType = printType;
@ -219,10 +223,7 @@ nsSimplePageSequenceFrame::Reflow(nsPresContext* aPresContext,
edgeTwips.right = PR_MIN(PR_MAX(edgeTwips.right, 0), inchInTwips);
mPageData->mEdgePaperMargin =
nsMargin(aPresContext->TwipsToAppUnits(edgeTwips.left),
aPresContext->TwipsToAppUnits(edgeTwips.top),
aPresContext->TwipsToAppUnits(edgeTwips.right),
aPresContext->TwipsToAppUnits(edgeTwips.bottom));
aPresContext->TwipsToAppUnits(edgeTwips + unwriteableTwips);
}
// *** Special Override ***

View File

@ -2194,10 +2194,7 @@ nsPrintEngine::DoPrint(nsPrintObject * aPO)
mPrt->mPrintSettings->SetEndPageRange(endPageNum);
nsMargin marginTwips(0,0,0,0);
mPrt->mPrintSettings->GetMarginInTwips(marginTwips);
nsMargin margin(poPresContext->TwipsToAppUnits(marginTwips.left),
poPresContext->TwipsToAppUnits(marginTwips.top),
poPresContext->TwipsToAppUnits(marginTwips.right),
poPresContext->TwipsToAppUnits(marginTwips.bottom));
nsMargin margin = poPresContext->TwipsToAppUnits(marginTwips);
if (startPageNum == endPageNum) {
{

View File

@ -245,12 +245,26 @@ pref("print.whileInPrintPreview", true);
// Cache old Presentation when going into Print Preview
pref("print.always_cache_old_pres", false);
// Enables you to specify the gap from the edge of the paper to the margin
// this is used by both Printing and Print Preview
pref("print.print_edge_top", 0); // 1/100 of an inch
pref("print.print_edge_left", 0); // 1/100 of an inch
pref("print.print_edge_right", 0); // 1/100 of an inch
pref("print.print_edge_bottom", 0); // 1/100 of an inch
// Enables you to specify the amount of the paper that is to be treated
// as unwriteable. The print_edge_XXX and print_margin_XXX preferences
// are treated as offsets that are added to this pref.
// Default is "-1", which means "use the system default". (If there is
// no system default, then the -1 is treated as if it were 0.)
// This is used by both Printing and Print Preview.
// Units are in 1/100ths of an inch.
pref("print.print_unwriteable_margin_top", -1);
pref("print.print_unwriteable_margin_left", -1);
pref("print.print_unwriteable_margin_right", -1);
pref("print.print_unwriteable_margin_bottom", -1);
// Enables you to specify the gap from the edge of the paper's
// unwriteable area to the margin.
// This is used by both Printing and Print Preview
// Units are in 1/100ths of an inch.
pref("print.print_edge_top", 0);
pref("print.print_edge_left", 0);
pref("print.print_edge_right", 0);
pref("print.print_edge_bottom", 0);
// Pref used by the spellchecker extension to control the
// maximum number of misspelled words that will be underlined
@ -2113,13 +2127,6 @@ pref("print.print_color", true);
pref("print.print_landscape", false);
pref("print.print_paper_size", 0);
// Enables you to specify the gap from the edge of the paper to the margin
// this is used by both Printing and Print Preview
pref("print.print_edge_top", 4); // 1/100 of an inch
pref("print.print_edge_left", 4); // 1/100 of an inch
pref("print.print_edge_right", 4); // 1/100 of an inch
pref("print.print_edge_bottom", 4); // 1/100 of an inch
// print_extra_margin enables platforms to specify an extra gap or margin
// around the content of the page for Print Preview only
pref("print.print_extra_margin", 0); // twips

View File

@ -58,7 +58,7 @@ interface nsIPrintSession;
*
* @status UNDER_REVIEW
*/
[scriptable, uuid(3e097aba-c1d6-425d-9c52-b371d5da964a)]
[scriptable, uuid(5af07661-6477-4235-8814-4a45215855b8)]
interface nsIPrintSettings : nsISupports
{
@ -79,7 +79,7 @@ interface nsIPrintSettings : nsISupports
/* Flag 0x00000800 is unused */
/* Flag 0x00001000 is unused */
const unsigned long kInitSavePaperData = 0x00002000;
/* Flag 0x00004000 is unused */
const unsigned long kInitSaveUnwriteableMargins = 0x00004000;
const unsigned long kInitSaveEdges = 0x00008000;
const unsigned long kInitSaveReversed = 0x00010000;
@ -311,4 +311,16 @@ interface nsIPrintSettings : nsISupports
* before printing, otherwise printing can fail on some platforms.
*/
[noscript] void SetupSilentPrinting();
/**
* Sets/Gets the "unwriteable margin" for the page format. This defines
* the boundary from which we'll measure the EdgeInTwips and MarginInTwips
* attributes, to place the headers and content, respectively.
*
* Note: Implementations of SetUnwriteableMarginInTwips should handle
* negative margin values by falling back on the system default for
* that margin.
*/
[noscript] void SetUnwriteableMarginInTwips(in nsNativeMarginRef aEdge);
[noscript] void GetUnwriteableMarginInTwips(in nsNativeMarginRef aEdge);
};

View File

@ -72,9 +72,7 @@ public:
*/
NS_IMETHOD Init(nsIWidget *aWidget, nsIPrintSettings* aPS, PRBool aIsPrintPreview);
void GetPageRect(double* aTop, double* aLeft, double* aBottom, double* aRight);
void GetPageMargins(double *aTopMargin, double* aLeftMargin,
double* aBottomMargin, double *aRightMargin);
void GetPaperRect(double* aTop, double* aLeft, double* aBottom, double* aRight);
protected:
/**

View File

@ -185,31 +185,15 @@ NS_IMETHODIMP nsDeviceContextSpecX::EndPage()
NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
}
void nsDeviceContextSpecX::GetPageRect(double* aTop, double* aLeft, double* aBottom, double* aRight)
void nsDeviceContextSpecX::GetPaperRect(double* aTop, double* aLeft, double* aBottom, double* aRight)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
PMRect pageRect;
::PMGetAdjustedPageRect(mPageFormat, &pageRect);
*aTop = pageRect.top, *aLeft = pageRect.left;
*aBottom = pageRect.bottom, *aRight = pageRect.right;
PMRect paperRect;
::PMGetAdjustedPaperRect(mPageFormat, &paperRect);
NS_OBJC_END_TRY_ABORT_BLOCK;
}
void nsDeviceContextSpecX::GetPageMargins(double *aTopMargin, double* aLeftMargin,
double* aBottomMargin, double *aRightMargin)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK;
PMPaper paper;
PMPaperMargins margins;
::PMGetPageFormatPaper(mPageFormat, &paper);
::PMPaperGetMargins(paper, &margins);
*aTopMargin = margins.top;
*aLeftMargin = margins.left;
*aBottomMargin = margins.bottom;
*aRightMargin = margins.right;
*aTop = paperRect.top, *aLeft = paperRect.left;
*aBottom = paperRect.bottom, *aRight = paperRect.right;
NS_OBJC_END_TRY_ABORT_BLOCK;
}
@ -219,10 +203,7 @@ NS_IMETHODIMP nsDeviceContextSpecX::GetSurfaceForPrinter(gfxASurface **surface)
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
double top, left, bottom, right;
double topMargin, leftMargin, bottomMargin, rightMargin;
GetPageRect(&top, &left, &bottom, &right);
GetPageMargins(&topMargin, &leftMargin, &bottomMargin, &rightMargin);
GetPaperRect(&top, &left, &bottom, &right);
const double width = right - left;
const double height = bottom - top;
@ -233,8 +214,8 @@ NS_IMETHODIMP nsDeviceContextSpecX::GetSurfaceForPrinter(gfxASurface **surface)
if (context) {
// Initially, origin is at bottom-left corner of the paper.
// Here, we translate it to top-left corner of the printable area.
CGContextTranslateCTM(context, leftMargin, bottomMargin + height);
// Here, we translate it to top-left corner of the paper.
CGContextTranslateCTM(context, 0, height);
CGContextScaleCTM(context, 1.0, -1.0);
newSurface = new gfxQuartzSurface(context, gfxSize(width, height), PR_TRUE);
} else {

View File

@ -58,6 +58,9 @@ public:
nsresult Init();
// Page format's unwriteable margin
nsresult GetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin);
protected:
nsPrintSettingsX(const nsPrintSettingsX& src);
nsPrintSettingsX& operator=(const nsPrintSettingsX& rhs);

View File

@ -259,6 +259,23 @@ nsresult nsPrintSettingsX::Init()
NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
}
NS_IMETHODIMP nsPrintSettingsX::GetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin)
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
PMPaper paper;
PMPaperMargins margins;
::PMGetPageFormatPaper(mPageFormat, &paper);
::PMPaperGetMargins(paper, &margins);
aUnwriteableMargin.top = NS_POINTS_TO_TWIPS(margins.top);
aUnwriteableMargin.left = NS_POINTS_TO_TWIPS(margins.left);
aUnwriteableMargin.bottom = NS_POINTS_TO_TWIPS(margins.bottom);
aUnwriteableMargin.right = NS_POINTS_TO_TWIPS(margins.right);
return NS_OK;
NS_OBJC_END_TRY_ABORT_BLOCK_NSRESULT;
}
/** ---------------------------------------------------
*/
NS_IMETHODIMP nsPrintSettingsX::GetNativePrintSession(PMPrintSession *aNativePrintSession)
@ -493,8 +510,8 @@ OSStatus nsPrintSettingsX::CreateDefaultPageFormat(PMPrintSession aSession, PMPa
outFormat = kPMNoPageFormat;
status = ::PMCreatePageFormat(&pageFormat);
if (status == noErr && pageFormat != kPMNoPageFormat) {
status = ::PMSessionDefaultPageFormat(aSession, pageFormat);
if (status == noErr && pageFormat != kPMNoPageFormat) {
status = ::PMSessionDefaultPageFormat(aSession, pageFormat);
if (status == noErr) {
outFormat = pageFormat;
return NS_OK;

View File

@ -418,8 +418,8 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::GetSurfaceForPrinter(gfxASurface **aSurfac
double width, height;
mPrintSettings->GetEffectivePageSize(&width, &height);
// convert twips to points
width /= 20;
height /= 20;
width /= TWIPS_PER_POINT_FLOAT;
height /= TWIPS_PER_POINT_FLOAT;
DO_PR_DEBUG_LOG(("\"%s\", %f, %f\n", path, width, height));
nsresult rv;

View File

@ -506,66 +506,6 @@ nsPrintSettingsGTK::SetNumCopies(PRInt32 aNumCopies)
return NS_OK;
}
/* attribute double edgeTop; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetEdgeTop(double *aEdgeTop)
{
NS_ENSURE_ARG_POINTER(aEdgeTop);
*aEdgeTop = gtk_page_setup_get_top_margin(mPageSetup, GTK_UNIT_INCH);
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::SetEdgeTop(double aEdgeTop)
{
gtk_page_setup_set_top_margin(mPageSetup, aEdgeTop, GTK_UNIT_INCH);
return NS_OK;
}
/* attribute double edgeLeft; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetEdgeLeft(double *aEdgeLeft)
{
NS_ENSURE_ARG_POINTER(aEdgeLeft);
*aEdgeLeft = gtk_page_setup_get_left_margin(mPageSetup, GTK_UNIT_INCH);
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::SetEdgeLeft(double aEdgeLeft)
{
gtk_page_setup_set_left_margin(mPageSetup, aEdgeLeft, GTK_UNIT_INCH);
return NS_OK;
}
/* attribute double edgeBottom; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetEdgeBottom(double *aEdgeBottom)
{
NS_ENSURE_ARG_POINTER(aEdgeBottom);
*aEdgeBottom = gtk_page_setup_get_bottom_margin(mPageSetup, GTK_UNIT_INCH);
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::SetEdgeBottom(double aEdgeBottom)
{
gtk_page_setup_set_bottom_margin(mPageSetup, aEdgeBottom, GTK_UNIT_INCH);
return NS_OK;
}
/* attribute double edgeRight; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetEdgeRight(double *aEdgeRight)
{
NS_ENSURE_ARG_POINTER(aEdgeRight);
*aEdgeRight = gtk_page_setup_get_right_margin(mPageSetup, GTK_UNIT_INCH);
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::SetEdgeRight(double aEdgeRight)
{
gtk_page_setup_set_right_margin(mPageSetup, aEdgeRight, GTK_UNIT_INCH);
return NS_OK;
}
/* attribute double scaling; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetScaling(double *aScaling)
@ -633,6 +573,43 @@ nsPrintSettingsGTK::SaveNewPageSize()
gtk_page_setup_set_paper_size(mPageSetup, mPaperSize);
}
NS_IMETHODIMP
nsPrintSettingsGTK::GetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin)
{
aUnwriteableMargin.SizeTo(
NS_INCHES_TO_TWIPS(gtk_page_setup_get_left_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_top_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_right_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_bottom_margin(mPageSetup, GTK_UNIT_INCH))
);
return NS_OK;
}
// Note that margin values less than 0 are treated as "use system default"
// (i.e. we'll keep whatever's in mPageSetup)
NS_IMETHODIMP
nsPrintSettingsGTK::SetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin)
{
if (aUnwriteableMargin.left >= 0) {
gtk_page_setup_set_left_margin(mPageSetup,
NS_TWIPS_TO_INCHES(aUnwriteableMargin.left), GTK_UNIT_INCH);
}
if (aUnwriteableMargin.top >= 0) {
gtk_page_setup_set_top_margin(mPageSetup,
NS_TWIPS_TO_INCHES(aUnwriteableMargin.top), GTK_UNIT_INCH);
}
if (aUnwriteableMargin.right >= 0) {
gtk_page_setup_set_right_margin(mPageSetup,
NS_TWIPS_TO_INCHES(aUnwriteableMargin.right), GTK_UNIT_INCH);
}
if (aUnwriteableMargin.bottom >= 0) {
gtk_page_setup_set_bottom_margin(mPageSetup,
NS_TWIPS_TO_INCHES(aUnwriteableMargin.bottom), GTK_UNIT_INCH);
}
return NS_OK;
}
/* attribute double paperWidth; */
NS_IMETHODIMP
nsPrintSettingsGTK::GetPaperWidth(double *aPaperWidth)
@ -686,27 +663,6 @@ nsPrintSettingsGTK::SetPaperSizeUnit(PRInt16 aPaperSizeUnit)
return NS_OK;
}
// Get/Set our margins as an nsMargin
NS_IMETHODIMP
nsPrintSettingsGTK::SetEdgeInTwips(nsMargin& aEdge)
{
gtk_page_setup_set_top_margin(mPageSetup, NS_TWIPS_TO_INCHES(aEdge.top), GTK_UNIT_INCH);
gtk_page_setup_set_left_margin(mPageSetup, NS_TWIPS_TO_INCHES(aEdge.left), GTK_UNIT_INCH);
gtk_page_setup_set_bottom_margin(mPageSetup, NS_TWIPS_TO_INCHES(aEdge.bottom), GTK_UNIT_INCH);
gtk_page_setup_set_right_margin(mPageSetup, NS_TWIPS_TO_INCHES(aEdge.right), GTK_UNIT_INCH);
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::GetEdgeInTwips(nsMargin& aEdge)
{
aEdge.SizeTo(NS_INCHES_TO_TWIPS(gtk_page_setup_get_left_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_top_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_right_margin(mPageSetup, GTK_UNIT_INCH)),
NS_INCHES_TO_TWIPS(gtk_page_setup_get_bottom_margin(mPageSetup, GTK_UNIT_INCH)));
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettingsGTK::GetEffectivePageSize(double *aWidth, double *aHeight)
{

View File

@ -114,17 +114,9 @@ public:
NS_IMETHOD GetNumCopies(PRInt32 *aNumCopies);
NS_IMETHOD SetNumCopies(PRInt32 aNumCopies);
NS_IMETHOD GetEdgeTop(double *aEdgeTop);
NS_IMETHOD SetEdgeTop(double aEdgeTop);
NS_IMETHOD GetEdgeLeft(double *aEdgeLeft);
NS_IMETHOD SetEdgeLeft(double aEdgeLeft);
NS_IMETHOD GetEdgeBottom(double *aEdgeBottom);
NS_IMETHOD SetEdgeBottom(double aEdgeBottom);
NS_IMETHOD GetEdgeRight(double *aEdgeRight);
NS_IMETHOD SetEdgeRight(double aEdgeRight);
// Page format's unwriteable margin
NS_IMETHOD GetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin);
NS_IMETHOD SetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin);
NS_IMETHOD GetScaling(double *aScaling);
NS_IMETHOD SetScaling(double aScaling);
@ -141,9 +133,6 @@ public:
NS_IMETHOD SetPaperSizeUnit(PRInt16 aPaperSizeUnit);
NS_IMETHOD SetEdgeInTwips(nsMargin& aEdge);
NS_IMETHOD GetEdgeInTwips(nsMargin& aEdge);
NS_IMETHOD GetEffectivePageSize(double *aWidth, double *aHeight);
NS_IMETHOD SetupSilentPrinting();

View File

@ -367,8 +367,8 @@ NS_IMETHODIMP nsDeviceContextSpecOS2::GetSurfaceForPrinter(gfxASurface **surface
double width, height;
mPrintSettings->GetEffectivePageSize(&width, &height);
// convert twips to points
width /= 20;
height /= 20;
width /= TWIPS_PER_POINT_FLOAT;
height /= TWIPS_PER_POINT_FLOAT;
nsCOMPtr<nsILocalFile> file = do_CreateInstance("@mozilla.org/file/local;1");
rv = file->InitWithPath(filename);

View File

@ -528,8 +528,8 @@ NS_IMETHODIMP nsDeviceContextSpecWin::GetSurfaceForPrinter(gfxASurface **surface
double width, height;
mPrintSettings->GetEffectivePageSize(&width, &height);
// convert twips to points
width /= 20;
height /= 20;
width /= TWIPS_PER_POINT_FLOAT;
height /= TWIPS_PER_POINT_FLOAT;
nsCOMPtr<nsILocalFile> file = do_CreateInstance("@mozilla.org/file/local;1");
nsresult rv = file->InitWithPath(filename);

View File

@ -74,6 +74,10 @@ static const char kEdgeTop[] = "print_edge_top";
static const char kEdgeLeft[] = "print_edge_left";
static const char kEdgeBottom[] = "print_edge_bottom";
static const char kEdgeRight[] = "print_edge_right";
static const char kUnwriteableMarginTop[] = "print_unwriteable_margin_top";
static const char kUnwriteableMarginLeft[] = "print_unwriteable_margin_left";
static const char kUnwriteableMarginBottom[] = "print_unwriteable_margin_bottom";
static const char kUnwriteableMarginRight[] = "print_unwriteable_margin_right";
// Prefs for Print Options
static const char kPrintEvenPages[] = "print_evenpages";
@ -284,6 +288,24 @@ nsPrintOptions::ReadPrefs(nsIPrintSettings* aPS, const nsAString& aPrinterName,
aPS->SetEdgeInTwips(margin);
}
if (aFlags & nsIPrintSettings::kInitSaveUnwriteableMargins) {
nsMargin margin;
margin.SizeTo(0,0,0,0);
ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginTop, aPrinterName), margin.top,
kUnwriteableMarginTop);
DUMP_INT(kReadStr, kUnwriteableMarginTop, margin.top);
ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginLeft, aPrinterName), margin.left,
kUnwriteableMarginLeft);
DUMP_INT(kReadStr, kUnwriteableMarginLeft, margin.left);
ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginBottom, aPrinterName),
margin.bottom, kUnwriteableMarginBottom);
DUMP_INT(kReadStr, kUnwriteableMarginBottom, margin.bottom);
ReadInchesIntToTwipsPref(GetPrefName(kUnwriteableMarginRight, aPrinterName), margin.right,
kUnwriteableMarginRight);
DUMP_INT(kReadStr, kUnwriteableMarginRight, margin.right);
aPS->SetUnwriteableMarginInTwips(margin);
}
PRBool b;
nsAutoString str;
PRInt32 iVal;
@ -572,6 +594,24 @@ nsPrintOptions::WritePrefs(nsIPrintSettings *aPS, const nsAString& aPrinterName,
}
}
nsMargin unwriteableMargin;
if (aFlags & nsIPrintSettings::kInitSaveUnwriteableMargins) {
if (NS_SUCCEEDED(aPS->GetUnwriteableMarginInTwips(unwriteableMargin))) {
WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginTop, aPrinterName),
unwriteableMargin.top);
DUMP_INT(kWriteStr, kUnwriteableMarginTop, unwriteableMargin.top);
WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginLeft, aPrinterName),
unwriteableMargin.left);
DUMP_INT(kWriteStr, kUnwriteableMarginLeft, unwriteableMargin.top);
WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginBottom, aPrinterName),
unwriteableMargin.bottom);
DUMP_INT(kWriteStr, kUnwriteableMarginBottom, unwriteableMargin.top);
WriteInchesIntFromTwipsPref(GetPrefName(kUnwriteableMarginRight, aPrinterName),
unwriteableMargin.right);
DUMP_INT(kWriteStr, kUnwriteableMarginRight, unwriteableMargin.top);
}
}
// Paper size prefs are saved as a group
if (aFlags & nsIPrintSettings::kInitSavePaperSize) {
PRInt16 sizeUnit, sizeType;

View File

@ -954,6 +954,16 @@ nsPrintSettings::SetEdgeInTwips(nsMargin& 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(nsMargin& aUnwriteableMargin)
{
// Default implementation does nothing
return NS_OK;
}
/** ---------------------------------------------------
* See documentation in nsPrintOptionsImpl.h
* @update 6/21/00 dwc
@ -972,6 +982,14 @@ nsPrintSettings::GetEdgeInTwips(nsMargin& aEdge)
return NS_OK;
}
NS_IMETHODIMP
nsPrintSettings::GetUnwriteableMarginInTwips(nsMargin& aUnwriteableMargin)
{
// Default implementation just returns 0
aUnwriteableMargin.SizeTo(0,0,0,0);
return NS_OK;
}
/** ---------------------------------------------------
* Stub - platform-specific implementations can use this function.
*/