From e41446ba7238debdfc8d443e583c1108aebbdcc9 Mon Sep 17 00:00:00 2001 From: "cbiesinger%web.de" Date: Mon, 25 Mar 2002 23:57:40 +0000 Subject: [PATCH] bug 132563 ("Print job options dialog should use paper name instead of paper size to set/get the selected paper size"), r=rods, sr=attinasi, a=asa patch by Roland.Mainz@informatik.med.uni-giessen.de --- gfx/src/gtk/nsDeviceContextSpecG.cpp | 505 ++++++++++++------ gfx/src/gtk/nsDeviceContextSpecG.h | 2 + gfx/src/ps/nsIDeviceContextSpecPS.h | 8 + gfx/src/ps/nsPostScriptObj.cpp | 82 ++- gfx/src/ps/nsPostScriptObj.h | 45 +- gfx/src/xlib/nsDeviceContextSpecXlib.cpp | 499 +++++++++++------ gfx/src/xlib/nsDeviceContextSpecXlib.h | 2 + gfx/src/xprint/nsIDeviceContextSpecXPrint.h | 11 +- gfx/src/xprint/nsXPrintContext.cpp | 52 +- gfx/src/xprint/nsXPrintContext.h | 2 +- gfx/src/xprint/xprintutil.c | 98 +++- gfx/src/xprint/xprintutil.h | 23 + xpfe/global/resources/content/printdialog.js | 2 + .../resources/content/unix/printjoboptions.js | 76 +-- 14 files changed, 975 insertions(+), 432 deletions(-) diff --git a/gfx/src/gtk/nsDeviceContextSpecG.cpp b/gfx/src/gtk/nsDeviceContextSpecG.cpp index a71b90b5a420..603ef3692273 100644 --- a/gfx/src/gtk/nsDeviceContextSpecG.cpp +++ b/gfx/src/gtk/nsDeviceContextSpecG.cpp @@ -71,6 +71,9 @@ #include "nsPostScriptObj.h" #endif /* USE_POSTSCRIPT */ +/* Ensure that the result is always equal to either PR_TRUE or PR_FALSE */ +#define MAKE_PR_BOOL(val) ((val)?(PR_TRUE):(PR_FALSE)) + #ifdef PR_LOGGING static PRLogModuleInfo *DeviceContextSpecGTKLM = PR_NewLogModule("DeviceContextSpecGTK"); #endif /* PR_LOGGING */ @@ -104,6 +107,111 @@ protected: static int mGlobalNumPrinters; }; +#ifdef SET_PRINTER_FEATURES_VIA_PREFS +/* "Prototype" for the new nsPrinterFeatures service */ +class nsPrinterFeatures { +public: + nsPrinterFeatures( const char *printername ); + ~nsPrinterFeatures() {}; + + /* Does this device allow to set/change the paper size ? */ + void SetCanChangePaperSize( PRBool aCanSetPaperSize ); + /* Set number of paper size records and the records itself */ + void SetNumPaperSizeRecords( PRInt32 aCount ); + void SetPaperRecord( PRInt32 aIndex, const char *aName, PRInt32 aWidthMM, PRInt32 aHeightMM, PRBool aIsInch ); + + /* Does this device allow to set/change the content orientation ? */ + void SetCanChangeOrientation( PRBool aCanSetOrientation ); + /* Set number of orientation records and the records itself */ + void SetNumOrientationRecords( PRInt32 aCount ); + void SetOrientationRecord( PRInt32 aIndex, const char *aName ); + + /* Does this device allow to set/change the spooler command ? */ + void SetCanChangeSpoolerCommand( PRBool aCanSetSpoolerCommand ); + + /* Does this device allow to set/change number of copies for an document ? */ + void SetCanChangeNumCopies( PRBool aCanSetNumCopies ); + +private: + /* private helper methods */ + void SetBoolValue( const char *tagname, PRBool value ); + void SetIntValue( const char *tagname, PRInt32 value ); + void SetCharValue( const char *tagname, const char *value ); + + nsXPIDLCString mPrinterName; + nsCOMPtr mPrefs; +}; + +void nsPrinterFeatures::SetBoolValue( const char *tagname, PRBool value ) +{ + mPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +void nsPrinterFeatures::SetIntValue( const char *tagname, PRInt32 value ) +{ + mPrefs->SetIntPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +void nsPrinterFeatures::SetCharValue( const char *tagname, const char *value ) +{ + mPrefs->SetCharPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +nsPrinterFeatures::nsPrinterFeatures( const char *printername ) +{ + DO_PR_DEBUG_LOG(("nsPrinterFeatures::nsPrinterFeatures('%s')\n", printername)); + mPrinterName.Assign(printername); + mPrefs = do_GetService(NS_PREF_CONTRACTID); + + SetBoolValue("has_special_printerfeatures", PR_TRUE); +} + +void nsPrinterFeatures::SetCanChangePaperSize( PRBool aCanSetPaperSize ) +{ + SetBoolValue("can_change_paper_size", aCanSetPaperSize); +} + +/* Set number of paper size records and the records itself */ +void nsPrinterFeatures::SetNumPaperSizeRecords( PRInt32 aCount ) +{ + SetIntValue("paper.count", aCount); +} + +void nsPrinterFeatures::SetPaperRecord(PRInt32 aIndex, const char *aPaperName, PRInt32 aWidthMM, PRInt32 aHeightMM, PRBool aIsInch) +{ + SetCharValue(nsPrintfCString(256, "paper.%d.name", aIndex).get(), aPaperName); + SetIntValue( nsPrintfCString(256, "paper.%d.width_mm", aIndex).get(), aWidthMM); + SetIntValue( nsPrintfCString(256, "paper.%d.height_mm", aIndex).get(), aHeightMM); + SetBoolValue(nsPrintfCString(256, "paper.%d.is_inch", aIndex).get(), aIsInch); +} + +void nsPrinterFeatures::SetCanChangeOrientation( PRBool aCanSetOrientation ) +{ + SetBoolValue("can_change_orientation", aCanSetOrientation); +} + +void nsPrinterFeatures::SetNumOrientationRecords( PRInt32 aCount ) +{ + SetIntValue("orientation.count", aCount); +} + +void nsPrinterFeatures::SetOrientationRecord( PRInt32 aIndex, const char *aOrientationName ) +{ + SetCharValue(nsPrintfCString(256, "orientation.%d.name", aIndex).get(), aOrientationName); +} + +void nsPrinterFeatures::SetCanChangeSpoolerCommand( PRBool aCanSetSpoolerCommand ) +{ + SetBoolValue("can_change_spoolercommand", aCanSetSpoolerCommand); +} + +void nsPrinterFeatures::SetCanChangeNumCopies( PRBool aCanSetNumCopies ) +{ + SetBoolValue("can_change_num_copies", aCanSetNumCopies); +} + +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + //--------------- // static members GlobalPrinters GlobalPrinters::mGlobalPrinters; @@ -216,9 +324,9 @@ static nsresult DisplayXPDialog(nsIPrintSettings* aPS, * - GTK+-toolkit: * file: mozilla/gfx/src/gtk/nsDeviceContextSpecG.cpp * function: NS_IMETHODIMP nsDeviceContextSpecGTK::Init(PRBool aQuiet) - * - Xlib-toolkit: - * file: mozilla/gfx/src/xlib/nsDeviceContextSpecXlib.cpp - * function: NS_IMETHODIMP nsDeviceContextSpecXlib::Init(PRBool aQuiet) + * - GTK-toolkit: + * file: mozilla/gfx/src/xlib/nsDeviceContextSpecGTK.cpp + * function: NS_IMETHODIMP nsDeviceContextSpecGTK::Init(PRBool aQuiet) * - Qt-toolkit: * file: mozilla/gfx/src/qt/nsDeviceContextSpecQT.cpp * function: NS_IMETHODIMP nsDeviceContextSpecQT::Init(PRBool aQuiet) @@ -271,6 +379,7 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings *aPS, PRBool aQuiet) PRUnichar *command = nsnull; PRInt32 copies = 1; PRUnichar *printer = nsnull; + PRUnichar *papername = nsnull; PRUnichar *printfile = nsnull; double dleft = 0.5; double dright = 0.5; @@ -280,6 +389,7 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings *aPS, PRBool aQuiet) aPS->GetPrinterName(&printer); aPS->GetPrintReversed(&reversed); aPS->GetPrintInColor(&color); + aPS->GetPaperName(&papername); aPS->GetOrientation(&orientation); aPS->GetPrintCommand(&command); aPS->GetPrintRange(&printRange); @@ -299,6 +409,8 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings *aPS, PRBool aQuiet) strcpy(mCommand, NS_ConvertUCS2toUTF8(command).get()); if (printer) strcpy(mPrinter, NS_ConvertUCS2toUTF8(printer).get()); + if (papername) + strcpy(mPaperName, NS_ConvertUCS2toUTF8(papername).get()); DO_PR_DEBUG_LOG(("margins: %5.2f,%5.2f,%5.2f,%5.2f\n", dtop, dleft, dbottom, dright)); DO_PR_DEBUG_LOG(("printRange %d\n", printRange)); @@ -308,6 +420,7 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::Init(nsIPrintSettings *aPS, PRBool aQuiet) DO_PR_DEBUG_LOG(("printfile '%s'\n", printfile? NS_ConvertUCS2toUTF8(printfile).get():"")); DO_PR_DEBUG_LOG(("command '%s'\n", command? NS_ConvertUCS2toUTF8(command).get():"")); DO_PR_DEBUG_LOG(("printer '%s'\n", printer? NS_ConvertUCS2toUTF8(printer).get():"")); + DO_PR_DEBUG_LOG(("papername '%s'\n", papername? NS_ConvertUCS2toUTF8(papername).get():"")); mTop = dtop; mBottom = dbottom; @@ -402,6 +515,12 @@ NS_IMETHODIMP nsDeviceContextSpecGTK::GetUserCancelled(PRBool &aCancel) return NS_OK; } +NS_IMETHODIMP nsDeviceContextSpecGTK::GetPaperName( const char **aPaperName ) +{ + *aPaperName = mPaperName; + return NS_OK; +} + NS_IMETHODIMP nsDeviceContextSpecGTK::GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight) { return mPrintSettings->GetPageSizeInTwips(aWidth, aHeight); @@ -582,20 +701,17 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich NS_ENSURE_ARG_POINTER(aPrinterName); NS_ENSURE_ARG_POINTER(aPrintSettings); - - if (!*aPrinterName) { - return NS_ERROR_FAILURE; - } - if (aPrintSettings == nsnull) { - return NS_ERROR_FAILURE; - } + NS_ENSURE_TRUE(*aPrinterName, NS_ERROR_FAILURE); + NS_ENSURE_TRUE(aPrintSettings, NS_ERROR_FAILURE); nsCOMPtr pPrefs = do_GetService(NS_PREF_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; - nsXPIDLCString printerName; + nsXPIDLCString fullPrinterName, /* Full name of printer incl. driver-specific prefix */ + printerName; /* "Stripped" name of printer */ + fullPrinterName.Assign(NS_ConvertUCS2toUTF8(aPrinterName)); printerName.Assign(NS_ConvertUCS2toUTF8(aPrinterName)); DO_PR_DEBUG_LOG(("printerName='%s'\n", printerName.get())); @@ -615,33 +731,25 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich #ifdef SET_PRINTER_FEATURES_VIA_PREFS /* Defaults to FALSE */ - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_FALSE); + pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", fullPrinterName.get()).get(), PR_FALSE); #endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - /* These switches may be dynamic in the future... */ - PRBool doingFilename = PR_TRUE; - PRBool doingNumCopies = PR_TRUE; - PRBool doingOrientation = PR_TRUE; - PRBool doingPaperSize = PR_TRUE; - PRBool doingCommand = PR_TRUE; - - if (doingFilename) { - nsXPIDLCString filename; - if (NS_FAILED(CopyPrinterCharPref(pPrefs, nsnull, printerName, "filename", getter_Copies(filename)))) { - const char *path; - - if (!(path = PR_GetEnv("PWD"))) - path = PR_GetEnv("HOME"); - - if (path) - filename = nsPrintfCString(PATH_MAX, "%s/mozilla.ps", path); - else - filename.Assign("mozilla.ps"); - } - - DO_PR_DEBUG_LOG(("Setting default filename to '%s'\n", filename.get())); - aPrintSettings->SetToFileName(NS_ConvertUTF8toUCS2(filename).get()); - } + + /* Set filename */ + nsXPIDLCString filename; + if (NS_FAILED(CopyPrinterCharPref(pPrefs, nsnull, printerName, "filename", getter_Copies(filename)))) { + const char *path; + + if (!(path = PR_GetEnv("PWD"))) + path = PR_GetEnv("HOME"); + + if (path) + filename = nsPrintfCString(PATH_MAX, "%s/mozilla.ps", path); + else + filename.Assign("mozilla.ps"); + } + DO_PR_DEBUG_LOG(("Setting default filename to '%s'\n", filename.get())); + aPrintSettings->SetToFileName(NS_ConvertUTF8toUCS2(filename).get()); #ifdef USE_XPRINT if (type == pmXprint) { @@ -651,78 +759,127 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich XPContext pcontext; if (XpuGetPrinter(printerName, &pdpy, &pcontext) != 1) return NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND; - - if (doingOrientation) { - XpuOrientationList olist; - int ocount; - XpuOrientationRec *default_orientation; - /* Get list of supported orientations */ - olist = XpuGetOrientationList(pdpy, pcontext, &ocount); - if (olist) { - default_orientation = &olist[0]; /* First entry is the default one */ - - if (!PL_strcasecmp(default_orientation->orientation, "portrait")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); - } - else if (!PL_strcasecmp(default_orientation->orientation, "landscape")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); - } - else { - DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", default_orientation->orientation)); - } - - XpuFreeOrientationList(olist); - } - } - - /* Setup Number of Copies */ - if (doingNumCopies) { -#ifdef NOT_IMPLEMENTED_YET - aPrintSettings->SetNumCopies(PRInt32(aDevMode->dmCopies)); -#endif /* NOT_IMPLEMENTED_YET */ - } - - if (doingPaperSize) { - XpuMediumSourceSizeList mlist; - int mcount; - XpuMediumSourceSizeRec *default_medium; - - mlist = XpuGetMediumSourceSizeList(pdpy, pcontext, &mcount); - if (mlist) { - default_medium = &mlist[0]; /* First entry is the default one */ - double total_width = default_medium->ma1 + default_medium->ma2, - total_height = default_medium->ma3 + default_medium->ma4; - - DO_PR_DEBUG_LOG(("setting default paper size to %g/%g mm\n", total_width, total_height)); - aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); - aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); - aPrintSettings->SetPaperWidth(total_width); - aPrintSettings->SetPaperHeight(total_height); + XpuSupportedFlags supported_doc_attrs = XpuGetSupportedDocAttributes(pdpy, pcontext); #ifdef SET_PRINTER_FEATURES_VIA_PREFS - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_TRUE); - - int i; - for( i = 0 ; i < mcount ; i++ ) - { - XpuMediumSourceSizeRec *curr = &mlist[i]; - double total_width = curr->ma1 + curr->ma2, - total_height = curr->ma3 + curr->ma4; - pPrefs->SetCharPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.name", printerName.get(), i).get(), curr->medium_name); - pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.width_mm", printerName.get(), i).get(), PRInt32(total_width)); - pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.height_mm", printerName.get(), i).get(), PRInt32(total_height)); - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.is_inch", printerName.get(), i).get(), PR_FALSE); - } - pPrefs->SetIntPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.count", printerName.get(), i).get(), (PRInt32)mcount); + nsPrinterFeatures printerFeatures(fullPrinterName); #endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - XpuFreeMediumSourceSizeList(mlist); + /* Setup orientation stuff */ + XpuOrientationList olist; + int ocount; + XpuOrientationRec *default_orientation; + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetOrientation = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION); + printerFeatures.SetCanChangeOrientation(canSetOrientation); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + /* Get list of supported orientations */ + olist = XpuGetOrientationList(pdpy, pcontext, &ocount); + if (olist) { + default_orientation = &olist[0]; /* First entry is the default one */ + + if (!PL_strcasecmp(default_orientation->orientation, "portrait")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); + } + else if (!PL_strcasecmp(default_orientation->orientation, "landscape")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); } + else { + DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", default_orientation->orientation)); + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; i < ocount ; i++ ) + { + XpuOrientationRec *curr = &olist[i]; + printerFeatures.SetOrientationRecord(i, curr->orientation); + } + printerFeatures.SetNumOrientationRecords(ocount); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + XpuFreeOrientationList(olist); + } + + /* Setup Number of Copies */ +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetNumCopies = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_COPY_COUNT); + printerFeatures.SetCanChangeNumCopies(canSetNumCopies); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + long numCopies; + if( XpuGetOneLongAttribute(pdpy, pcontext, XPDocAttr, "copy-count", &numCopies) != 1 ) + { + /* Fallback on failure */ + numCopies = 1; } + aPrintSettings->SetNumCopies(numCopies); + + /* Setup paper size stuff */ + XpuMediumSourceSizeList mlist; + int mcount; + XpuMediumSourceSizeRec *default_medium; + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetPaperSize = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM); + printerFeatures.SetCanChangePaperSize(canSetPaperSize); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + mlist = XpuGetMediumSourceSizeList(pdpy, pcontext, &mcount); + if (mlist) { + nsXPIDLCString papername; + + default_medium = &mlist[0]; /* First entry is the default one */ + double total_width = default_medium->ma1 + default_medium->ma2, + total_height = default_medium->ma3 + default_medium->ma4; + + /* Either "paper" or "tray/paper" */ + if (default_medium->tray_name) { + papername = nsPrintfCString(256, "%s/%s", default_medium->tray_name, default_medium->medium_name); + } + else { + papername.Assign(default_medium->medium_name); + } + DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g/%g mm)\n", papername.get(), total_width, total_height)); + aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); + aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); + aPrintSettings->SetPaperWidth(total_width); + aPrintSettings->SetPaperHeight(total_height); + aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(papername).get()); + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; i < mcount ; i++ ) + { + XpuMediumSourceSizeRec *curr = &mlist[i]; + double total_width = curr->ma1 + curr->ma2, + total_height = curr->ma3 + curr->ma4; + if (curr->tray_name) { + papername = nsPrintfCString(256, "%s/%s", curr->tray_name, curr->medium_name); + } + else { + papername.Assign(curr->medium_name); + } + + printerFeatures.SetPaperRecord(i, papername, PRInt32(total_width), PRInt32(total_height), PR_FALSE); + } + printerFeatures.SetNumPaperSizeRecords(mcount); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + XpuFreeMediumSourceSizeList(mlist); + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + /* Xprint does not allow the client to set a spooler command. + * Job spooling is the job of the server side (=Xprt) */ + printerFeatures.SetCanChangeSpoolerCommand(PR_FALSE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + XpuClosePrinterDisplay(pdpy, pcontext); return NS_OK; @@ -733,68 +890,100 @@ NS_IMETHODIMP nsPrinterEnumeratorGTK::InitPrintSettingsFromPrinter(const PRUnich #ifdef USE_POSTSCRIPT if (type == pmPostScript) { DO_PR_DEBUG_LOG(("InitPrintSettingsFromPrinter() for PostScript printer\n")); + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + nsPrinterFeatures printerFeatures(fullPrinterName); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - if (doingNumCopies) { - /* Not implemented yet */ +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeOrientation(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + nsXPIDLCString orientation; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "orientation", getter_Copies(orientation)))) { + if (!PL_strcasecmp(orientation, "portrait")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); + } + else if (!PL_strcasecmp(orientation, "landscape")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); + } + else { + DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", orientation.get())); + } + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; postscript_module_orientations[i].orientation != nsnull ; i++ ) + { + const PSOrientationRec *curr = &postscript_module_orientations[i]; + printerFeatures.SetOrientationRecord(i, curr->orientation); + } + printerFeatures.SetNumOrientationRecords(i); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangePaperSize(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + nsXPIDLCString papername; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) { + int i; + const PSPaperSizeRec *default_paper = nsnull; + + for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) + { + const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; + + if (!PL_strcasecmp(papername, curr->name)) { + default_paper = curr; + break; + } + } + + if (default_paper) { + DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g inch/%g inch)\n", + default_paper->name, + PSPaperSizeRec_FullPaperWidth(default_paper), + PSPaperSizeRec_FullPaperHeight(default_paper))); + aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); + aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches); + aPrintSettings->SetPaperWidth(PSPaperSizeRec_FullPaperWidth(default_paper)); + aPrintSettings->SetPaperHeight(PSPaperSizeRec_FullPaperHeight(default_paper)); + aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(default_paper->name).get()); + } + else { + DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername.get())); + } +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) + { + const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; +#define CONVERT_INCH_TO_MILLIMETERS(inch) ((inch) * 25.4) + double total_width = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperWidth(curr)), + total_height = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperHeight(curr)); + + printerFeatures.SetPaperRecord(i, curr->name, PRInt32(total_width), PRInt32(total_height), PR_TRUE); + } + printerFeatures.SetNumPaperSizeRecords(i); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeSpoolerCommand(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + nsXPIDLCString command; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "print_command", getter_Copies(command)))) { + DO_PR_DEBUG_LOG(("setting default print command to '%s'\n", command.get())); + aPrintSettings->SetPrintCommand(NS_ConvertUTF8toUCS2(command).get()); } - if (doingOrientation) { - nsXPIDLCString orientation; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "orientation", getter_Copies(orientation)))) { - if (!PL_strcasecmp(orientation, "portrait")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); - } - else if (!PL_strcasecmp(orientation, "landscape")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); - } - else { - DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", orientation.get())); - } - } - } - - if (doingPaperSize) { - /* Not implemented yet */ - nsXPIDLCString papername; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) { - int i; - double width = 0., - height = 0.; - - for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) - { - const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeNumCopies(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - if (!PL_strcasecmp(papername, curr->name)) { - width = curr->width; - height = curr->height; - break; - } - } - - if (width!=0.0 && height!=0.0) { - DO_PR_DEBUG_LOG(("setting default paper size to %g/%g inch\n", width, height)); - aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); - aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches); - aPrintSettings->SetPaperWidth(width); - aPrintSettings->SetPaperHeight(height); - } - else { - DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername)); - } - } - } - - if (doingCommand) { - nsXPIDLCString command; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "print_command", getter_Copies(command)))) { - DO_PR_DEBUG_LOG(("setting default print command to '%s'\n", command.get())); - aPrintSettings->SetPrintCommand(NS_ConvertUTF8toUCS2(command).get()); - } - } - return NS_OK; } #endif /* USE_POSTSCRIPT */ diff --git a/gfx/src/gtk/nsDeviceContextSpecG.h b/gfx/src/gtk/nsDeviceContextSpecG.h index 181f9c010c94..8044d537cea9 100644 --- a/gfx/src/gtk/nsDeviceContextSpecG.h +++ b/gfx/src/gtk/nsDeviceContextSpecG.h @@ -93,6 +93,7 @@ public: NS_IMETHOD GetPrintMethod(PrintMethod &aMethod); static nsresult GetPrintMethod(const char *aPrinter, PrintMethod &aMethod); NS_IMETHOD GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight); + NS_IMETHOD GetPaperName(const char **aPaperName); virtual ~nsDeviceContextSpecGTK(); protected: @@ -104,6 +105,7 @@ protected: char mCommand[PATH_MAX]; /* Print command e.g., lpr */ char mPath[PATH_MAX]; /* If toPrinter = PR_FALSE, dest file */ char mPrinter[256]; /* Printer name */ + char mPaperName[256]; /* Printer name */ int mCopies; /* number of copies */ PRBool mCancel; /* If PR_TRUE, user cancelled */ float mLeft; /* left margin */ diff --git a/gfx/src/ps/nsIDeviceContextSpecPS.h b/gfx/src/ps/nsIDeviceContextSpecPS.h index 6c2755f61652..2812a0bbe5e7 100644 --- a/gfx/src/ps/nsIDeviceContextSpecPS.h +++ b/gfx/src/ps/nsIDeviceContextSpecPS.h @@ -151,6 +151,14 @@ public: **/ NS_IMETHOD GetUserCancelled( PRBool &aCancel ) = 0; + /* + * Paper name e.g., "din-a4" or "manual/din-a4" + * @update + * @param aPaperName -- + * @return + **/ + NS_IMETHOD GetPaperName ( const char **aPaperName ) = 0; + /* * Returns W/H in Twips from Paper Size H/W */ diff --git a/gfx/src/ps/nsPostScriptObj.cpp b/gfx/src/ps/nsPostScriptObj.cpp index d6cb74501893..5d029b7116cd 100644 --- a/gfx/src/ps/nsPostScriptObj.cpp +++ b/gfx/src/ps/nsPostScriptObj.cpp @@ -64,6 +64,9 @@ #include "prprf.h" #endif +/* This is deprecated but we still need it until all platforms set the paper name in nsIPrintSettings... */ +#define PS_FIND_PAPER_BY_SIZE 1 + #ifdef PR_LOGGING static PRLogModuleInfo *nsPostScriptObjLM = PR_NewLogModule("nsPostScriptObj"); #endif /* PR_LOGGING */ @@ -79,7 +82,7 @@ extern "C" PS_FontInfo *PSFE_MaskToFI[N_FONTS]; // need fontmetrics.c #define NS_PS_RED(x) (((float)(NS_GET_R(x))) / 255.0) #define NS_PS_GREEN(x) (((float)(NS_GET_G(x))) / 255.0) #define NS_PS_BLUE(x) (((float)(NS_GET_B(x))) / 255.0) -#define NS_TWIPS_TO_POINTS(x) ((x / 20)) +#define NS_TWIPS_TO_POINTS(x) (((x) / 20)) #define NS_IS_BOLD(x) (((x) >= 401) ? 1 : 0) static NS_DEFINE_CID(kPrefCID, NS_PREF_CID); @@ -242,8 +245,9 @@ nsPostScriptObj::settitle(PRUnichar * aTitle) } } +#ifdef PS_FIND_PAPER_BY_SIZE static -const char *paper_size_to_paper_name(float width_in_inch, float height_in_inch) +const PSPaperSizeRec *paper_size_to_PSPaperSizeRec(float width_in_inch, float height_in_inch) { #define MORE_OR_LESS_EQUAL(a, b, tolerance) (PR_ABS((a) - (b)) <= (tolerance)) #define MATCH_PAGE(width, height, paper_width, paper_height) \ @@ -255,14 +259,31 @@ const char *paper_size_to_paper_name(float width_in_inch, float height_in_inch) { const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; - if (MATCH_PAGE(width_in_inch, height_in_inch, curr->width, curr->height)) - return curr->name; + if (MATCH_PAGE(width_in_inch, height_in_inch, PSPaperSizeRec_FullPaperWidth(curr), PSPaperSizeRec_FullPaperHeight(curr))) + return curr; } #undef MATCH_PAGE #undef MORE_OR_LESS_EQUAL return nsnull; } +#endif /* PS_FIND_PAPER_BY_SIZE */ + +static +const PSPaperSizeRec *paper_name_to_PSPaperSizeRec(const char *paper_name) +{ + int i; + + for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) + { + const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; + + if (!PL_strcasecmp(paper_name, curr->name)) + return curr; + } + + return nsnull; +} /** --------------------------------------------------- * See documentation in nsPostScriptObj.h @@ -283,7 +304,7 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec ) if( (nsnull!=pi) && (nsnull!=mPrintSetup) ){ memset(mPrintSetup, 0, sizeof(struct PrintSetup_)); - + mPrintSetup->color = PR_TRUE; // Image output mPrintSetup->deep_color = PR_TRUE; // 24 bit color output mPrintSetup->reverse = 0; // Output order, 0 is acsending @@ -297,16 +318,25 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec ) aSpec->GetFirstPageFirst( isFirstPageFirst ); if ( isFirstPageFirst == PR_FALSE ) mPrintSetup->reverse = 1; - PRInt32 paper_width_in_twips, - paper_height_in_twips; - aSpec->GetPageSizeInTwips(&paper_width_in_twips, &paper_height_in_twips); - mPrintSetup->paper_width_in_inch = NS_TWIPS_TO_INCHES(paper_width_in_twips); - mPrintSetup->paper_height_in_inch = NS_TWIPS_TO_INCHES(paper_height_in_twips); - /* Chceck if we have a name for this paper size... */ - if (!paper_size_to_paper_name(mPrintSetup->paper_width_in_inch, mPrintSetup->paper_height_in_inch)) + /* Find PS paper size record by name */ + const char *paper_name = nsnull; + aSpec->GetPaperName(&paper_name); + mPrintSetup->paper_size = paper_name_to_PSPaperSizeRec(paper_name); + +#ifdef PS_FIND_PAPER_BY_SIZE + if (!mPrintSetup->paper_size) { + PR_LOG(nsPostScriptObjLM, PR_LOG_DEBUG, ("No paper matched by name '%s' - trying deprecated match-by-size way...\n", paper_name)); + PRInt32 paper_width_in_twips, + paper_height_in_twips; + aSpec->GetPageSizeInTwips(&paper_width_in_twips, &paper_height_in_twips); + mPrintSetup->paper_size = paper_size_to_PSPaperSizeRec(NS_TWIPS_TO_INCHES(paper_width_in_twips), NS_TWIPS_TO_INCHES(paper_height_in_twips)); + } +#endif /* PS_FIND_PAPER_BY_SIZE */ + + if (!mPrintSetup->paper_size) return NS_ERROR_GFX_PRINTER_PAPER_SIZE_NOT_SUPPORTED; - + aSpec->GetToPrinter( isAPrinter ); if (isAPrinter) { /* Define the destination printer (queue). @@ -375,8 +405,8 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec ) mPrintSetup->dpi = 72.0f; // dpi for externally sized items aSpec->GetLandscape( landscape ); - fwidth = mPrintSetup->paper_width_in_inch; - fheight = mPrintSetup->paper_height_in_inch; + fwidth = mPrintSetup->paper_size->width; + fheight = mPrintSetup->paper_size->height; if (landscape) { float temp; @@ -385,7 +415,12 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec ) fheight = temp; } - mPrintSetup->width = (int)(fwidth * mPrintSetup->dpi); + mPrintSetup->left = (int)(mPrintSetup->paper_size->left * mPrintSetup->dpi); + mPrintSetup->top = (int)(mPrintSetup->paper_size->top * mPrintSetup->dpi); + mPrintSetup->bottom = (int)(mPrintSetup->paper_size->bottom * mPrintSetup->dpi); + mPrintSetup->right = (int)(mPrintSetup->paper_size->right * mPrintSetup->dpi); + + mPrintSetup->width = (int)(fwidth * mPrintSetup->dpi); mPrintSetup->height = (int)(fheight * mPrintSetup->dpi); #ifdef DEBUG printf("\nPreWidth = %f PreHeight = %f\n",fwidth,fheight); @@ -403,13 +438,9 @@ nsPostScriptObj::Init( nsIDeviceContextSpecPS *aSpec ) mPrintSetup->scale_pre = PR_FALSE; // do the pre-scaling thing // scale margins (specified in inches) to dots. - mPrintSetup->top = (int) 0; - mPrintSetup->bottom = (int) 0; - mPrintSetup->left = (int) 0; - mPrintSetup->right = (int) 0; -#ifdef DEBUG - printf( "dpi %f top %d bottom %d left %d right %d\n", mPrintSetup->dpi, mPrintSetup->top, mPrintSetup->bottom, mPrintSetup->left, mPrintSetup->right ); -#endif + PR_LOG(nsPostScriptObjLM, PR_LOG_DEBUG, ("dpi %g top %d bottom %d left %d right %d\n", + mPrintSetup->dpi, mPrintSetup->top, mPrintSetup->bottom, mPrintSetup->left, mPrintSetup->right)); + mPrintSetup->rules = 1.0f; // Scale factor for rulers mPrintSetup->n_up = 0; // cool page combining mPrintSetup->bigger = 1; // Used to init sizes if sizesin NULL @@ -526,8 +557,7 @@ FILE *f; gPrefs->CopyCharPref("general.useragent.misc", getter_Copies(useragent)); fprintf(f, "%%%%Creator: Mozilla PostScript module (%s/%lu)\n", useragent.get(), (unsigned long)NS_BUILD_ID); fprintf(f, "%%%%DocumentData: Clean8Bit\n"); - fprintf(f, "%%%%DocumentPaperSizes: %s\n", - paper_size_to_paper_name(mPrintSetup->paper_width_in_inch, mPrintSetup->paper_height_in_inch)); + fprintf(f, "%%%%DocumentPaperSizes: %s\n", mPrintSetup->paper_size->name); fprintf(f, "%%%%Orientation: %s\n", (mPrintContext->prSetup->width < mPrintContext->prSetup->height) ? "Portrait" : "Landscape"); @@ -1970,7 +2000,7 @@ FILE *f; fprintf(f, "%d 0 translate 90 rotate\n",PAGE_TO_POINT_I(mPrintContext->prSetup->height)); } fprintf(f, "%d 0 translate\n", PAGE_TO_POINT_I(mPrintContext->prSetup->left)); - fprintf(f, "0 %d translate\n", -PAGE_TO_POINT_I(mPrintContext->prSetup->top)); + fprintf(f, "0 %d translate\n", PAGE_TO_POINT_I(mPrintContext->prSetup->top)); fprintf(f, "%%%%EndPageSetup\n"); #if 0 annotate_page( mPrintContext->prSetup->header, 0, -1, pn); diff --git a/gfx/src/ps/nsPostScriptObj.h b/gfx/src/ps/nsPostScriptObj.h index eeec321699ab..a2ce41c0f414 100644 --- a/gfx/src/ps/nsPostScriptObj.h +++ b/gfx/src/ps/nsPostScriptObj.h @@ -67,23 +67,42 @@ class nsIImage; typedef struct { const char *name; - float width, + float left, + top, + right, + bottom, + width, height; } PSPaperSizeRec; + static const PSPaperSizeRec postscript_module_paper_sizes[] = { - /* 148mm X 210mm == 5.83in X 8.27in */ - { "A5", 5.83f, 8.27f }, - /* 210mm X 297mm == 8.27in X 11.69in */ - { "A4", 8.27f, 11.69f }, - /* 297mm X 420mm == 11.69in X 16.53in */ - { "A3", 11.69f, 16.53f }, - { "Letter", 8.50f, 11.0f }, - { "Legal", 8.50f, 14.0f }, - { "Executive", 7.50f, 10.0f }, - { NULL, 0.00f, 0.0f } + { "A5", 0.25f, 0.25f, 0.25f, 0.25f, 5.33f, 7.77f }, /* 148mm X 210mm ( 5.83in X 8.27in) */ + { "A4", 0.25f, 0.25f, 0.25f, 0.25f, 7.77f, 11.19f }, /* 210mm X 297mm ( 8.27in X 11.69in) */ + { "A3", 0.25f, 0.25f, 0.25f, 0.25f, 11.19f, 16.03f }, /* 297mm X 420mm (11.69in X 16.53in) */ + { "Letter", 0.25f, 0.25f, 0.25f, 0.25f, 8.00f, 10.50f }, /* 8.50in X 11.0in */ + { "Legal", 0.25f, 0.25f, 0.25f, 0.25f, 8.00f, 13.50f }, /* 8.50in X 14.0in */ + { "Executive", 0.25f, 0.25f, 0.25f, 0.25f, 7.00f, 9.50f }, /* 7.50in X 10.0in */ + { NULL, 0.25f, 0.25f, 0.25f, 0.25f, 0.00f, 0.0f } +}; + +#define PSPaperSizeRec_FullPaperWidth(rec) ((rec)->left + (rec)->right + (rec)->width) +#define PSPaperSizeRec_FullPaperHeight(rec) ((rec)->top + (rec)->bottom + (rec)->height) + +/* This will be extended some day... */ +typedef struct { + const char *orientation; +} PSOrientationRec; + +/* This will be extended some day... */ +static const +PSOrientationRec postscript_module_orientations[] = +{ + { "portrait" }, + { "landscape" }, + { NULL } }; typedef void (*XL_CompletionRoutine)(void*); @@ -187,9 +206,7 @@ struct PrintSetup_ { float rules; /* Scale factor for rulers */ int n_up; /* cool page combining */ int bigger; /* Used to init sizes if sizesin NULL */ - int paper_size; /* Paper Size(letter,legal,exec,a4,a3) */ - float paper_width_in_inch, /* paper width in inch */ - paper_height_in_inch; /* paper height in inch */ + const PSPaperSizeRec *paper_size; /* Paper size record */ const char* prefix; /* For text xlate, prepended to each line */ const char* eol; /* For text translation, line terminator */ const char* bullet; /* What char to use for bullets */ diff --git a/gfx/src/xlib/nsDeviceContextSpecXlib.cpp b/gfx/src/xlib/nsDeviceContextSpecXlib.cpp index 7cb599c68948..454187b50e53 100644 --- a/gfx/src/xlib/nsDeviceContextSpecXlib.cpp +++ b/gfx/src/xlib/nsDeviceContextSpecXlib.cpp @@ -71,6 +71,9 @@ #include "nsPostScriptObj.h" #endif /* USE_POSTSCRIPT */ +/* Ensure that the result is always equal to either PR_TRUE or PR_FALSE */ +#define MAKE_PR_BOOL(val) ((val)?(PR_TRUE):(PR_FALSE)) + #ifdef PR_LOGGING static PRLogModuleInfo *DeviceContextSpecXlibLM = PR_NewLogModule("DeviceContextSpecXlib"); #endif /* PR_LOGGING */ @@ -104,6 +107,111 @@ protected: static int mGlobalNumPrinters; }; +#ifdef SET_PRINTER_FEATURES_VIA_PREFS +/* "Prototype" for the new nsPrinterFeatures service */ +class nsPrinterFeatures { +public: + nsPrinterFeatures( const char *printername ); + ~nsPrinterFeatures() {}; + + /* Does this device allow to set/change the paper size ? */ + void SetCanChangePaperSize( PRBool aCanSetPaperSize ); + /* Set number of paper size records and the records itself */ + void SetNumPaperSizeRecords( PRInt32 aCount ); + void SetPaperRecord( PRInt32 aIndex, const char *aName, PRInt32 aWidthMM, PRInt32 aHeightMM, PRBool aIsInch ); + + /* Does this device allow to set/change the content orientation ? */ + void SetCanChangeOrientation( PRBool aCanSetOrientation ); + /* Set number of orientation records and the records itself */ + void SetNumOrientationRecords( PRInt32 aCount ); + void SetOrientationRecord( PRInt32 aIndex, const char *aName ); + + /* Does this device allow to set/change the spooler command ? */ + void SetCanChangeSpoolerCommand( PRBool aCanSetSpoolerCommand ); + + /* Does this device allow to set/change number of copies for an document ? */ + void SetCanChangeNumCopies( PRBool aCanSetNumCopies ); + +private: + /* private helper methods */ + void SetBoolValue( const char *tagname, PRBool value ); + void SetIntValue( const char *tagname, PRInt32 value ); + void SetCharValue( const char *tagname, const char *value ); + + nsXPIDLCString mPrinterName; + nsCOMPtr mPrefs; +}; + +void nsPrinterFeatures::SetBoolValue( const char *tagname, PRBool value ) +{ + mPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +void nsPrinterFeatures::SetIntValue( const char *tagname, PRInt32 value ) +{ + mPrefs->SetIntPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +void nsPrinterFeatures::SetCharValue( const char *tagname, const char *value ) +{ + mPrefs->SetCharPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.%s", mPrinterName.get(), tagname).get(), value); +} + +nsPrinterFeatures::nsPrinterFeatures( const char *printername ) +{ + DO_PR_DEBUG_LOG(("nsPrinterFeatures::nsPrinterFeatures('%s')\n", printername)); + mPrinterName.Assign(printername); + mPrefs = do_GetService(NS_PREF_CONTRACTID); + + SetBoolValue("has_special_printerfeatures", PR_TRUE); +} + +void nsPrinterFeatures::SetCanChangePaperSize( PRBool aCanSetPaperSize ) +{ + SetBoolValue("can_change_paper_size", aCanSetPaperSize); +} + +/* Set number of paper size records and the records itself */ +void nsPrinterFeatures::SetNumPaperSizeRecords( PRInt32 aCount ) +{ + SetIntValue("paper.count", aCount); +} + +void nsPrinterFeatures::SetPaperRecord(PRInt32 aIndex, const char *aPaperName, PRInt32 aWidthMM, PRInt32 aHeightMM, PRBool aIsInch) +{ + SetCharValue(nsPrintfCString(256, "paper.%d.name", aIndex).get(), aPaperName); + SetIntValue( nsPrintfCString(256, "paper.%d.width_mm", aIndex).get(), aWidthMM); + SetIntValue( nsPrintfCString(256, "paper.%d.height_mm", aIndex).get(), aHeightMM); + SetBoolValue(nsPrintfCString(256, "paper.%d.is_inch", aIndex).get(), aIsInch); +} + +void nsPrinterFeatures::SetCanChangeOrientation( PRBool aCanSetOrientation ) +{ + SetBoolValue("can_change_orientation", aCanSetOrientation); +} + +void nsPrinterFeatures::SetNumOrientationRecords( PRInt32 aCount ) +{ + SetIntValue("orientation.count", aCount); +} + +void nsPrinterFeatures::SetOrientationRecord( PRInt32 aIndex, const char *aOrientationName ) +{ + SetCharValue(nsPrintfCString(256, "orientation.%d.name", aIndex).get(), aOrientationName); +} + +void nsPrinterFeatures::SetCanChangeSpoolerCommand( PRBool aCanSetSpoolerCommand ) +{ + SetBoolValue("can_change_spoolercommand", aCanSetSpoolerCommand); +} + +void nsPrinterFeatures::SetCanChangeNumCopies( PRBool aCanSetNumCopies ) +{ + SetBoolValue("can_change_num_copies", aCanSetNumCopies); +} + +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + //--------------- // static members GlobalPrinters GlobalPrinters::mGlobalPrinters; @@ -271,6 +379,7 @@ NS_IMETHODIMP nsDeviceContextSpecXlib::Init(nsIPrintSettings *aPS, PRBool aQuiet PRUnichar *command = nsnull; PRInt32 copies = 1; PRUnichar *printer = nsnull; + PRUnichar *papername = nsnull; PRUnichar *printfile = nsnull; double dleft = 0.5; double dright = 0.5; @@ -280,6 +389,7 @@ NS_IMETHODIMP nsDeviceContextSpecXlib::Init(nsIPrintSettings *aPS, PRBool aQuiet aPS->GetPrinterName(&printer); aPS->GetPrintReversed(&reversed); aPS->GetPrintInColor(&color); + aPS->GetPaperName(&papername); aPS->GetOrientation(&orientation); aPS->GetPrintCommand(&command); aPS->GetPrintRange(&printRange); @@ -299,6 +409,8 @@ NS_IMETHODIMP nsDeviceContextSpecXlib::Init(nsIPrintSettings *aPS, PRBool aQuiet strcpy(mCommand, NS_ConvertUCS2toUTF8(command).get()); if (printer) strcpy(mPrinter, NS_ConvertUCS2toUTF8(printer).get()); + if (papername) + strcpy(mPaperName, NS_ConvertUCS2toUTF8(papername).get()); DO_PR_DEBUG_LOG(("margins: %5.2f,%5.2f,%5.2f,%5.2f\n", dtop, dleft, dbottom, dright)); DO_PR_DEBUG_LOG(("printRange %d\n", printRange)); @@ -308,6 +420,7 @@ NS_IMETHODIMP nsDeviceContextSpecXlib::Init(nsIPrintSettings *aPS, PRBool aQuiet DO_PR_DEBUG_LOG(("printfile '%s'\n", printfile? NS_ConvertUCS2toUTF8(printfile).get():"")); DO_PR_DEBUG_LOG(("command '%s'\n", command? NS_ConvertUCS2toUTF8(command).get():"")); DO_PR_DEBUG_LOG(("printer '%s'\n", printer? NS_ConvertUCS2toUTF8(printer).get():"")); + DO_PR_DEBUG_LOG(("papername '%s'\n", papername? NS_ConvertUCS2toUTF8(papername).get():"")); mTop = dtop; mBottom = dbottom; @@ -402,6 +515,12 @@ NS_IMETHODIMP nsDeviceContextSpecXlib::GetUserCancelled(PRBool &aCancel) return NS_OK; } +NS_IMETHODIMP nsDeviceContextSpecXlib::GetPaperName( const char **aPaperName ) +{ + *aPaperName = mPaperName; + return NS_OK; +} + NS_IMETHODIMP nsDeviceContextSpecXlib::GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight) { return mPrintSettings->GetPageSizeInTwips(aWidth, aHeight); @@ -582,20 +701,17 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic NS_ENSURE_ARG_POINTER(aPrinterName); NS_ENSURE_ARG_POINTER(aPrintSettings); - - if (!*aPrinterName) { - return NS_ERROR_FAILURE; - } - if (aPrintSettings == nsnull) { - return NS_ERROR_FAILURE; - } + NS_ENSURE_TRUE(*aPrinterName, NS_ERROR_FAILURE); + NS_ENSURE_TRUE(aPrintSettings, NS_ERROR_FAILURE); nsCOMPtr pPrefs = do_GetService(NS_PREF_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; - nsXPIDLCString printerName; + nsXPIDLCString fullPrinterName, /* Full name of printer incl. driver-specific prefix */ + printerName; /* "Stripped" name of printer */ + fullPrinterName.Assign(NS_ConvertUCS2toUTF8(aPrinterName)); printerName.Assign(NS_ConvertUCS2toUTF8(aPrinterName)); DO_PR_DEBUG_LOG(("printerName='%s'\n", printerName.get())); @@ -615,33 +731,25 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic #ifdef SET_PRINTER_FEATURES_VIA_PREFS /* Defaults to FALSE */ - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_FALSE); + pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", fullPrinterName.get()).get(), PR_FALSE); #endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - /* These switches may be dynamic in the future... */ - PRBool doingFilename = PR_TRUE; - PRBool doingNumCopies = PR_TRUE; - PRBool doingOrientation = PR_TRUE; - PRBool doingPaperSize = PR_TRUE; - PRBool doingCommand = PR_TRUE; - - if (doingFilename) { - nsXPIDLCString filename; - if (NS_FAILED(CopyPrinterCharPref(pPrefs, nsnull, printerName, "filename", getter_Copies(filename)))) { - const char *path; - - if (!(path = PR_GetEnv("PWD"))) - path = PR_GetEnv("HOME"); - - if (path) - filename = nsPrintfCString(PATH_MAX, "%s/mozilla.ps", path); - else - filename.Assign("mozilla.ps"); - } - - DO_PR_DEBUG_LOG(("Setting default filename to '%s'\n", filename.get())); - aPrintSettings->SetToFileName(NS_ConvertUTF8toUCS2(filename).get()); - } + + /* Set filename */ + nsXPIDLCString filename; + if (NS_FAILED(CopyPrinterCharPref(pPrefs, nsnull, printerName, "filename", getter_Copies(filename)))) { + const char *path; + + if (!(path = PR_GetEnv("PWD"))) + path = PR_GetEnv("HOME"); + + if (path) + filename = nsPrintfCString(PATH_MAX, "%s/mozilla.ps", path); + else + filename.Assign("mozilla.ps"); + } + DO_PR_DEBUG_LOG(("Setting default filename to '%s'\n", filename.get())); + aPrintSettings->SetToFileName(NS_ConvertUTF8toUCS2(filename).get()); #ifdef USE_XPRINT if (type == pmXprint) { @@ -651,78 +759,127 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic XPContext pcontext; if (XpuGetPrinter(printerName, &pdpy, &pcontext) != 1) return NS_ERROR_GFX_PRINTER_NAME_NOT_FOUND; - - if (doingOrientation) { - XpuOrientationList olist; - int ocount; - XpuOrientationRec *default_orientation; - /* Get list of supported orientations */ - olist = XpuGetOrientationList(pdpy, pcontext, &ocount); - if (olist) { - default_orientation = &olist[0]; /* First entry is the default one */ - - if (!strcasecmp(default_orientation->orientation, "portrait")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); - } - else if (!strcasecmp(default_orientation->orientation, "landscape")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); - } - else { - DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", default_orientation->orientation)); - } - - XpuFreeOrientationList(olist); - } - } - - /* Setup Number of Copies */ - if (doingNumCopies) { -#ifdef NOT_IMPLEMENTED_YET - aPrintSettings->SetNumCopies(PRInt32(aDevMode->dmCopies)); -#endif /* NOT_IMPLEMENTED_YET */ - } - - if (doingPaperSize) { - XpuMediumSourceSizeList mlist; - int mcount; - XpuMediumSourceSizeRec *default_medium; - - mlist = XpuGetMediumSourceSizeList(pdpy, pcontext, &mcount); - if (mlist) { - default_medium = &mlist[0]; /* First entry is the default one */ - double total_width = default_medium->ma1 + default_medium->ma2, - total_height = default_medium->ma3 + default_medium->ma4; - - DO_PR_DEBUG_LOG(("setting default paper size to %g/%g mm\n", total_width, total_height)); - aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); - aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); - aPrintSettings->SetPaperWidth(total_width); - aPrintSettings->SetPaperHeight(total_height); + XpuSupportedFlags supported_doc_attrs = XpuGetSupportedDocAttributes(pdpy, pcontext); #ifdef SET_PRINTER_FEATURES_VIA_PREFS - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.has_special_printerfeatures", printerName.get()).get(), PR_TRUE); - - int i; - for( i = 0 ; i < mcount ; i++ ) - { - XpuMediumSourceSizeRec *curr = &mlist[i]; - double total_width = curr->ma1 + curr->ma2, - total_height = curr->ma3 + curr->ma4; - pPrefs->SetCharPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.name", printerName.get(), i).get(), curr->medium_name); - pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.width_mm", printerName.get(), i).get(), PRInt32(total_width)); - pPrefs->SetIntPref( nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.height_mm", printerName.get(), i).get(), PRInt32(total_height)); - pPrefs->SetBoolPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.%d.is_inch", printerName.get(), i).get(), PR_FALSE); - } - pPrefs->SetIntPref(nsPrintfCString(256, PRINTERFEATURES_PREF ".%s.paper.count", printerName.get(), i).get(), (PRInt32)mcount); + nsPrinterFeatures printerFeatures(fullPrinterName); #endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - XpuFreeMediumSourceSizeList(mlist); + /* Setup orientation stuff */ + XpuOrientationList olist; + int ocount; + XpuOrientationRec *default_orientation; + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetOrientation = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION); + printerFeatures.SetCanChangeOrientation(canSetOrientation); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + /* Get list of supported orientations */ + olist = XpuGetOrientationList(pdpy, pcontext, &ocount); + if (olist) { + default_orientation = &olist[0]; /* First entry is the default one */ + + if (!PL_strcasecmp(default_orientation->orientation, "portrait")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); + } + else if (!PL_strcasecmp(default_orientation->orientation, "landscape")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); } + else { + DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", default_orientation->orientation)); + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; i < ocount ; i++ ) + { + XpuOrientationRec *curr = &olist[i]; + printerFeatures.SetOrientationRecord(i, curr->orientation); + } + printerFeatures.SetNumOrientationRecords(ocount); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + XpuFreeOrientationList(olist); + } + + /* Setup Number of Copies */ +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetNumCopies = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_COPY_COUNT); + printerFeatures.SetCanChangeNumCopies(canSetNumCopies); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + long numCopies; + if( XpuGetOneLongAttribute(pdpy, pcontext, XPDocAttr, "copy-count", &numCopies) != 1 ) + { + /* Fallback on failure */ + numCopies = 1; } + aPrintSettings->SetNumCopies(numCopies); + + /* Setup paper size stuff */ + XpuMediumSourceSizeList mlist; + int mcount; + XpuMediumSourceSizeRec *default_medium; + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + PRBool canSetPaperSize = MAKE_PR_BOOL(supported_doc_attrs & XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM); + printerFeatures.SetCanChangePaperSize(canSetPaperSize); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + mlist = XpuGetMediumSourceSizeList(pdpy, pcontext, &mcount); + if (mlist) { + nsXPIDLCString papername; + + default_medium = &mlist[0]; /* First entry is the default one */ + double total_width = default_medium->ma1 + default_medium->ma2, + total_height = default_medium->ma3 + default_medium->ma4; + + /* Either "paper" or "tray/paper" */ + if (default_medium->tray_name) { + papername = nsPrintfCString(256, "%s/%s", default_medium->tray_name, default_medium->medium_name); + } + else { + papername.Assign(default_medium->medium_name); + } + DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g/%g mm)\n", papername.get(), total_width, total_height)); + aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); + aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeMillimeters); + aPrintSettings->SetPaperWidth(total_width); + aPrintSettings->SetPaperHeight(total_height); + aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(papername).get()); + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; i < mcount ; i++ ) + { + XpuMediumSourceSizeRec *curr = &mlist[i]; + double total_width = curr->ma1 + curr->ma2, + total_height = curr->ma3 + curr->ma4; + if (curr->tray_name) { + papername = nsPrintfCString(256, "%s/%s", curr->tray_name, curr->medium_name); + } + else { + papername.Assign(curr->medium_name); + } + + printerFeatures.SetPaperRecord(i, papername, PRInt32(total_width), PRInt32(total_height), PR_FALSE); + } + printerFeatures.SetNumPaperSizeRecords(mcount); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + XpuFreeMediumSourceSizeList(mlist); + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + /* Xprint does not allow the client to set a spooler command. + * Job spooling is the job of the server side (=Xprt) */ + printerFeatures.SetCanChangeSpoolerCommand(PR_FALSE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + XpuClosePrinterDisplay(pdpy, pcontext); return NS_OK; @@ -733,68 +890,100 @@ NS_IMETHODIMP nsPrinterEnumeratorXlib::InitPrintSettingsFromPrinter(const PRUnic #ifdef USE_POSTSCRIPT if (type == pmPostScript) { DO_PR_DEBUG_LOG(("InitPrintSettingsFromPrinter() for PostScript printer\n")); + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + nsPrinterFeatures printerFeatures(fullPrinterName); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - if (doingNumCopies) { - /* Not implemented yet */ +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeOrientation(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + nsXPIDLCString orientation; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "orientation", getter_Copies(orientation)))) { + if (!PL_strcasecmp(orientation, "portrait")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); + } + else if (!PL_strcasecmp(orientation, "landscape")) { + DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); + aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); + } + else { + DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", orientation.get())); + } + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + int i; + for( i = 0 ; postscript_module_orientations[i].orientation != nsnull ; i++ ) + { + const PSOrientationRec *curr = &postscript_module_orientations[i]; + printerFeatures.SetOrientationRecord(i, curr->orientation); + } + printerFeatures.SetNumOrientationRecords(i); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangePaperSize(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + nsXPIDLCString papername; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) { + int i; + const PSPaperSizeRec *default_paper = nsnull; + + for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) + { + const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; + + if (!PL_strcasecmp(papername, curr->name)) { + default_paper = curr; + break; + } + } + + if (default_paper) { + DO_PR_DEBUG_LOG(("setting default paper size to '%s' (%g inch/%g inch)\n", + default_paper->name, + PSPaperSizeRec_FullPaperWidth(default_paper), + PSPaperSizeRec_FullPaperHeight(default_paper))); + aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); + aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches); + aPrintSettings->SetPaperWidth(PSPaperSizeRec_FullPaperWidth(default_paper)); + aPrintSettings->SetPaperHeight(PSPaperSizeRec_FullPaperHeight(default_paper)); + aPrintSettings->SetPaperName(NS_ConvertUTF8toUCS2(default_paper->name).get()); + } + else { + DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername.get())); + } +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) + { + const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; +#define CONVERT_INCH_TO_MILLIMETERS(inch) ((inch) * 25.4) + double total_width = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperWidth(curr)), + total_height = CONVERT_INCH_TO_MILLIMETERS(PSPaperSizeRec_FullPaperHeight(curr)); + + printerFeatures.SetPaperRecord(i, curr->name, PRInt32(total_width), PRInt32(total_height), PR_TRUE); + } + printerFeatures.SetNumPaperSizeRecords(i); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + } + +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeSpoolerCommand(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ + + nsXPIDLCString command; + if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "print_command", getter_Copies(command)))) { + DO_PR_DEBUG_LOG(("setting default print command to '%s'\n", command.get())); + aPrintSettings->SetPrintCommand(NS_ConvertUTF8toUCS2(command).get()); } - if (doingOrientation) { - nsXPIDLCString orientation; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "orientation", getter_Copies(orientation)))) { - if (!strcasecmp(orientation, "portrait")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'portrait'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kPortraitOrientation); - } - else if (!strcasecmp(orientation, "landscape")) { - DO_PR_DEBUG_LOG(("setting default orientation to 'landscape'\n")); - aPrintSettings->SetOrientation(nsIPrintSettings::kLandscapeOrientation); - } - else { - DO_PR_DEBUG_LOG(("Unknown default orientation '%s'\n", orientation.get())); - } - } - } - - if (doingPaperSize) { - /* Not implemented yet */ - nsXPIDLCString papername; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "paper_size", getter_Copies(papername)))) { - int i; - double width = 0., - height = 0.; - - for( i = 0 ; postscript_module_paper_sizes[i].name != nsnull ; i++ ) - { - const PSPaperSizeRec *curr = &postscript_module_paper_sizes[i]; +#ifdef SET_PRINTER_FEATURES_VIA_PREFS + printerFeatures.SetCanChangeNumCopies(PR_TRUE); +#endif /* SET_PRINTER_FEATURES_VIA_PREFS */ - if (!strcasecmp(papername, curr->name)) { - width = curr->width; - height = curr->height; - break; - } - } - - if (width!=0.0 && height!=0.0) { - DO_PR_DEBUG_LOG(("setting default paper size to %g/%g inch\n", width, height)); - aPrintSettings->SetPaperSizeType(nsIPrintSettings::kPaperSizeDefined); - aPrintSettings->SetPaperSizeUnit(nsIPrintSettings::kPaperSizeInches); - aPrintSettings->SetPaperWidth(width); - aPrintSettings->SetPaperHeight(height); - } - else { - DO_PR_DEBUG_LOG(("Unknown paper size '%s' given.\n", papername)); - } - } - } - - if (doingCommand) { - nsXPIDLCString command; - if (NS_SUCCEEDED(CopyPrinterCharPref(pPrefs, "postscript", printerName, "print_command", getter_Copies(command)))) { - DO_PR_DEBUG_LOG(("setting default print command to '%s'\n", command.get())); - aPrintSettings->SetPrintCommand(NS_ConvertUTF8toUCS2(command).get()); - } - } - return NS_OK; } #endif /* USE_POSTSCRIPT */ diff --git a/gfx/src/xlib/nsDeviceContextSpecXlib.h b/gfx/src/xlib/nsDeviceContextSpecXlib.h index 0af10fee86d7..eb135d979fc3 100644 --- a/gfx/src/xlib/nsDeviceContextSpecXlib.h +++ b/gfx/src/xlib/nsDeviceContextSpecXlib.h @@ -93,6 +93,7 @@ public: NS_IMETHOD GetPrintMethod(PrintMethod &aMethod); static nsresult GetPrintMethod(const char *aPrinter, PrintMethod &aMethod); NS_IMETHOD GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight); + NS_IMETHOD GetPaperName(const char **aPaperName); virtual ~nsDeviceContextSpecXlib(); protected: @@ -104,6 +105,7 @@ protected: char mCommand[PATH_MAX]; /* Print command e.g., lpr */ char mPath[PATH_MAX]; /* If toPrinter = PR_FALSE, dest file */ char mPrinter[256]; /* Printer name */ + char mPaperName[256]; /* Printer name */ int mCopies; /* number of copies */ PRBool mCancel; /* If PR_TRUE, user cancelled */ float mLeft; /* left margin */ diff --git a/gfx/src/xprint/nsIDeviceContextSpecXPrint.h b/gfx/src/xprint/nsIDeviceContextSpecXPrint.h index 4e93db8dc314..398707fbb61d 100644 --- a/gfx/src/xprint/nsIDeviceContextSpecXPrint.h +++ b/gfx/src/xprint/nsIDeviceContextSpecXPrint.h @@ -138,10 +138,13 @@ public: **/ NS_IMETHOD GetUserCancelled( PRBool &aCancel ) = 0; - /* - * Returns W/H in Twips from Paper Size H/W - */ - NS_IMETHOD GetPageSizeInTwips(PRInt32 *aWidth, PRInt32 *aHeight) = 0; + /* + * Paper name e.g., "din-a4" or "manual/din-a4" + * @update + * @param aPaperName -- + * @return + **/ + NS_IMETHOD GetPaperName ( const char **aPaperName ) = 0; /* * Return number of copies to print diff --git a/gfx/src/xprint/nsXPrintContext.cpp b/gfx/src/xprint/nsXPrintContext.cpp index 0afad78ea8b2..239aeed8f695 100644 --- a/gfx/src/xprint/nsXPrintContext.cpp +++ b/gfx/src/xprint/nsXPrintContext.cpp @@ -353,15 +353,19 @@ nsXPrintContext::SetupWindow(int x, int y, int width, int height) } -nsresult nsXPrintContext::SetPageSize(float page_width_mm, float page_height_mm) +nsresult nsXPrintContext::SetMediumSize(const char *aPaperName) { nsresult rv = NS_ERROR_GFX_PRINTER_PAPER_SIZE_NOT_SUPPORTED; XpuMediumSourceSizeList mlist; int mlist_count; int i; + char *paper_name, + *alloc_paper_name; /* for free() ... */ + paper_name = alloc_paper_name = strdup(aPaperName); + if (!paper_name) + return NS_ERROR_OUT_OF_MEMORY; - PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, ("SetPageSize: Requested page width_mm=%f, page height_mm=%f\n", - (double)page_width_mm, (double)page_height_mm)); + PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, ("SetMediumSize: Requested page '%s'\n", paper_name)); mlist = XpuGetMediumSourceSizeList(mPDisplay, mPContext, &mlist_count); if( !mlist ) @@ -382,29 +386,38 @@ nsresult nsXPrintContext::SetPageSize(float page_width_mm, float page_height_mm) } #endif /* PR_LOGGING */ - /* Tolerate +/- 2mm due conversion/rounding errors and different notations */ - match = XpuFindMediumSourceSizeBySize(mlist, mlist_count, page_width_mm, page_height_mm, 2.0f); - - /* No match ? - * The "try again" with a tolerance if +/- 10mm - */ - if (!match) + char *s; + + /* Did we get a tray name and paper name (e.g. "manual/din-a4") ? */ + if (s = strchr(paper_name, '/')) { - PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, - ("No match found in first attempt, trying again with 10mm tolerance...\n")); - match = XpuFindMediumSourceSizeBySize(mlist, mlist_count, page_width_mm, page_height_mm, 10.0f); - } + const char *tray_name; + *s = '\0'; + tray_name = paper_name; + paper_name = s+1; + + PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, ("SetMediumSize: searching for '%s'/'%s'\n", tray_name, paper_name)); + match = XpuFindMediumSourceSizeByName(mlist, mlist_count, tray_name, paper_name); + } + else + { + PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, ("SetMediumSize: searching for '%s'\n", paper_name)); + match = XpuFindMediumSourceSizeByName(mlist, mlist_count, nsnull, paper_name); + } /* Found a match ? */ if (match) { PR_LOG(nsXPrintContextLM, PR_LOG_DEBUG, - ("match %s/%s !\n", XPU_NULLXSTR(match->tray_name), match->medium_name)); + ("match '%s'/'%s' !\n", XPU_NULLXSTR(match->tray_name), match->medium_name)); + + /* Set document's paper size */ if( XpuSetDocMediumSourceSize(mPDisplay, mPContext, match) == 1 ) rv = NS_OK; } XpuFreeMediumSourceSizeList(mlist); + free(alloc_paper_name); return rv; } @@ -554,13 +567,10 @@ nsXPrintContext::SetupPrintContext(nsIDeviceContextSpecXp *aSpec) dumpXpAttributes(mPDisplay, mPContext); #endif /* XPRINT_DEBUG_SOMETIMES_USEFULL */ - PRInt32 page_width_in_twips, - page_height_in_twips; - - aSpec->GetPageSizeInTwips(&page_width_in_twips, &page_height_in_twips); + const char *paper_name = nsnull; + aSpec->GetPaperName(&paper_name); - if (NS_FAILED(XPU_TRACE(rv = SetPageSize(NS_TWIPS_TO_MILLIMETERS(page_width_in_twips), - NS_TWIPS_TO_MILLIMETERS(page_height_in_twips))))) + if (NS_FAILED(XPU_TRACE(rv = SetMediumSize(paper_name)))) return rv; if (NS_FAILED(XPU_TRACE(rv = SetOrientation(landscape)))) diff --git a/gfx/src/xprint/nsXPrintContext.h b/gfx/src/xprint/nsXPrintContext.h index e1ab9cb3bc0c..325092967bb6 100644 --- a/gfx/src/xprint/nsXPrintContext.h +++ b/gfx/src/xprint/nsXPrintContext.h @@ -133,7 +133,7 @@ private: nsresult SetupWindow(int x, int y, int width, int height); nsresult SetupPrintContext(nsIDeviceContextSpecXp *aSpec); - nsresult SetPageSize(float page_width_mm, float page_height_mm); + nsresult SetMediumSize(const char *paper_name); nsresult SetOrientation(int landscape); nsresult SetResolution(void); }; diff --git a/gfx/src/xprint/xprintutil.c b/gfx/src/xprint/xprintutil.c index e37e5b9885c5..5e9ab0011d16 100644 --- a/gfx/src/xprint/xprintutil.c +++ b/gfx/src/xprint/xprintutil.c @@ -284,7 +284,10 @@ void XpuSetOneLongAttribute( Display *pdpy, XPContext pcontext, } } -/* check if attribute value is supported or not */ +/* Check if attribute value is supported or not + * Use this function _only_ if XpuGetSupported{Job,Doc,Page}Attributes() + * does not help you... + */ int XpuCheckSupported( Display *pdpy, XPContext pcontext, XPAttributes type, const char *attribute_name, const char *query ) { char *value; @@ -325,14 +328,14 @@ int XpuCheckSupported( Display *pdpy, XPContext pcontext, XPAttributes type, con int XpuSetJobTitle( Display *pdpy, XPContext pcontext, const char *title ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "job-attributes-supported", "job-name") ) + if( XpuGetSupportedJobAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_JOB_NAME ) { XpuSetOneAttribute(pdpy, pcontext, XPJobAttr, "*job-name", title, XPAttrMerge); return(1); } else { - XPU_DEBUG_ONLY(printf("XpuSetJobTitle: XpuCheckSupported failed for '%s'\n", XPU_NULLXSTR(title))); + XPU_DEBUG_ONLY(printf("XpuSetJobTitle: XPUATTRIBUTESUPPORTED_JOB_NAME not supported ('%s')\n", XPU_NULLXSTR(title))); return(0); } } @@ -890,14 +893,14 @@ void XpuFreePrinterList( XPPrinterList list ) /* Set number of copies to print from this document */ int XpuSetDocumentCopies( Display *pdpy, XPContext pcontext, long num_copies ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "copy-count") ) + if( XpuGetSupportedDocAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_COPY_COUNT) { XpuSetOneLongAttribute(pdpy, pcontext, XPDocAttr, "*copy-count", num_copies, XPAttrMerge); return(1); } else { - XPU_DEBUG_ONLY(printf("XpuSetContentOrientation: XpuCheckSupported failed for 'copy-count'\n")); + XPU_DEBUG_ONLY(printf("XpuSetContentOrientation: XPUATTRIBUTESUPPORTED_COPY_COUNT not supported\n")); /* Failure... */ return(0); @@ -1032,12 +1035,16 @@ int XpuSetMediumSourceSize( Display *pdpy, XPContext pcontext, XPAttributes type /* Set document medium size */ int XpuSetDocMediumSourceSize( Display *pdpy, XPContext pcontext, XpuMediumSourceSizeRec *medium_spec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "default-medium") == 0 ) + XpuSupportedFlags doc_supported_flags; + + doc_supported_flags = XpuGetSupportedDocAttributes(pdpy, pcontext); + + if( (doc_supported_flags & XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM) == 0 ) return( 0 ); if (medium_spec->tray_name) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "default-input-tray") == 0 ) + if( (doc_supported_flags & XPUATTRIBUTESUPPORTED_DEFAULT_INPUT_TRAY) == 0 ) return( 0 ); } @@ -1047,12 +1054,16 @@ int XpuSetDocMediumSourceSize( Display *pdpy, XPContext pcontext, XpuMediumSourc /* Set page medium size */ int XpuSetPageMediumSourceSize( Display *pdpy, XPContext pcontext, XpuMediumSourceSizeRec *medium_spec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported", "default-medium") == 0 ) + XpuSupportedFlags page_supported_flags; + + page_supported_flags = XpuGetSupportedPageAttributes(pdpy, pcontext); + + if( (page_supported_flags & XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM) == 0 ) return( 0 ); if (medium_spec->tray_name) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported", "default-input-tray") == 0 ) + if( (page_supported_flags & XPUATTRIBUTESUPPORTED_DEFAULT_INPUT_TRAY) == 0 ) return( 0 ); } @@ -1300,7 +1311,7 @@ int XpuSetResolution( Display *pdpy, XPContext pcontext, XPAttributes type, XpuR */ int XpuSetDocResolution( Display *pdpy, XPContext pcontext, XpuResolutionRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "default-printer-resolution") == 0 ) + if( (XpuGetSupportedDocAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION) == 0 ) return( 0 ); return XpuSetResolution(pdpy, pcontext, XPDocAttr, rec); @@ -1312,7 +1323,7 @@ int XpuSetDocResolution( Display *pdpy, XPContext pcontext, XpuResolutionRec *re */ int XpuSetPageResolution( Display *pdpy, XPContext pcontext, XpuResolutionRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported", "default-printer-resolution") == 0 ) + if( (XpuGetSupportedPageAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION) == 0 ) return( 0 ); return XpuSetResolution(pdpy, pcontext, XPPageAttr, rec); @@ -1436,7 +1447,7 @@ int XpuSetOrientation( Display *pdpy, XPContext pcontext, XPAttributes type, Xpu */ int XpuSetDocOrientation( Display *pdpy, XPContext pcontext, XpuOrientationRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "content-orientation") == 0 ) + if( (XpuGetSupportedDocAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION) == 0 ) return( 0 ); return XpuSetOrientation(pdpy, pcontext, XPDocAttr, rec); @@ -1448,7 +1459,7 @@ int XpuSetDocOrientation( Display *pdpy, XPContext pcontext, XpuOrientationRec * */ int XpuSetPageOrientation( Display *pdpy, XPContext pcontext, XpuOrientationRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported", "content-orientation") == 0 ) + if( (XpuGetSupportedPageAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION) == 0 ) return( 0 ); return XpuSetOrientation(pdpy, pcontext, XPPageAttr, rec); @@ -1572,7 +1583,7 @@ int XpuSetContentPlex( Display *pdpy, XPContext pcontext, XPAttributes type, Xpu */ int XpuSetDocPlex( Display *pdpy, XPContext pcontext, XpuPlexRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported", "plex") == 0 ) + if( (XpuGetSupportedDocAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_PLEX) == 0 ) return( 0 ); return XpuSetContentPlex(pdpy, pcontext, XPDocAttr, rec); @@ -1584,10 +1595,67 @@ int XpuSetDocPlex( Display *pdpy, XPContext pcontext, XpuPlexRec *rec ) */ int XpuSetPagePlex( Display *pdpy, XPContext pcontext, XpuPlexRec *rec ) { - if( XpuCheckSupported(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported", "plex") == 0 ) + if( (XpuGetSupportedPageAttributes(pdpy, pcontext) & XPUATTRIBUTESUPPORTED_PLEX) == 0 ) return( 0 ); return XpuSetContentPlex(pdpy, pcontext, XPPageAttr, rec); } + +/* Return flags to indicate which attributes are supported and which not... */ +static +XpuSupportedFlags XpuGetSupportedAttributes( Display *pdpy, XPContext pcontext, XPAttributes type, const char *attribute_name ) +{ + char *value; + void *tok_lasts; + XpuSupportedFlags flags = 0; + + MAKE_STRING_WRITABLE(attribute_name); + if( attribute_name == NULL ) + return(0); + + value = XpGetOneAttribute(pdpy, pcontext, type, STRING_AS_WRITABLE(attribute_name)); + + FREE_WRITABLE_STRING(attribute_name); + + if( value != NULL ) + { + const char *s; + + for( s = XpuEnumerateXpAttributeValue(value, &tok_lasts) ; s != NULL ; s = XpuEnumerateXpAttributeValue(NULL, &tok_lasts) ) + { + if( !strcmp(s, "job-name") ) flags |= XPUATTRIBUTESUPPORTED_JOB_NAME; + else if( !strcmp(s, "job-owner") ) flags |= XPUATTRIBUTESUPPORTED_JOB_OWNER; + else if( !strcmp(s, "notification-profile") ) flags |= XPUATTRIBUTESUPPORTED_NOTIFICATION_PROFILE; + else if( !strcmp(s, "copy-count") ) flags |= XPUATTRIBUTESUPPORTED_COPY_COUNT; + else if( !strcmp(s, "document-format") ) flags |= XPUATTRIBUTESUPPORTED_DOCUMENT_FORMAT; + else if( !strcmp(s, "content-orientation") ) flags |= XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION; + else if( !strcmp(s, "default-printer-resolution") ) flags |= XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION; + else if( !strcmp(s, "default-input-tray") ) flags |= XPUATTRIBUTESUPPORTED_DEFAULT_INPUT_TRAY; + else if( !strcmp(s, "default-medium") ) flags |= XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM; + else if( !strcmp(s, "plex") ) flags |= XPUATTRIBUTESUPPORTED_PLEX; + } + + XpuDisposeEnumerateXpAttributeValue(&tok_lasts); + XFree(value); + } + + return(flags); +} + +XpuSupportedFlags XpuGetSupportedJobAttributes(Display *pdpy, XPContext pcontext) +{ + return XpuGetSupportedAttributes(pdpy, pcontext, XPPrinterAttr, "job-attributes-supported"); +} + +XpuSupportedFlags XpuGetSupportedDocAttributes(Display *pdpy, XPContext pcontext) +{ + return XpuGetSupportedAttributes(pdpy, pcontext, XPPrinterAttr, "document-attributes-supported"); +} + +XpuSupportedFlags XpuGetSupportedPageAttributes(Display *pdpy, XPContext pcontext) +{ + return XpuGetSupportedAttributes(pdpy, pcontext, XPPrinterAttr, "xp-page-attributes-supported"); +} + /* EOF. */ diff --git a/gfx/src/xprint/xprintutil.h b/gfx/src/xprint/xprintutil.h index d4a4683a343a..81fdba2c22bf 100644 --- a/gfx/src/xprint/xprintutil.h +++ b/gfx/src/xprint/xprintutil.h @@ -109,6 +109,24 @@ typedef struct { const char *plex; } XpuPlexRec, *XpuPlexList; + +/* XPUATTRIBUTESUPPORTED_*: + * Flags which indicate whether it is allowed to set/change a specific attribute + */ +typedef long XpuSupportedFlags; +/* Job attributes */ +#define XPUATTRIBUTESUPPORTED_JOB_NAME (1L<<0) +#define XPUATTRIBUTESUPPORTED_JOB_OWNER (1L<<1) +#define XPUATTRIBUTESUPPORTED_NOTIFICATION_PROFILE (1L<<2) +/* Document/Page attributes */ +#define XPUATTRIBUTESUPPORTED_COPY_COUNT (1L<<3) +#define XPUATTRIBUTESUPPORTED_DOCUMENT_FORMAT (1L<<4) +#define XPUATTRIBUTESUPPORTED_CONTENT_ORIENTATION (1L<<5) +#define XPUATTRIBUTESUPPORTED_DEFAULT_PRINTER_RESOLUTION (1L<<6) +#define XPUATTRIBUTESUPPORTED_DEFAULT_INPUT_TRAY (1L<<7) +#define XPUATTRIBUTESUPPORTED_DEFAULT_MEDIUM (1L<<8) +#define XPUATTRIBUTESUPPORTED_PLEX (1L<<9) + /* prototypes */ _XFUNCPROTOBEGIN @@ -181,6 +199,11 @@ void XpuStartJobToSpooler(Display *pdpy); void *XpuStartJobToFile( Display *pdpy, XPContext pcontext, const char *filename ); XPGetDocStatus XpuWaitForPrintFileChild( void *handle ); +/* Get flags which indicate whether it is allowed to set/change a specific attribute */ +XpuSupportedFlags XpuGetSupportedJobAttributes(Display *pdpy, XPContext pcontext); +XpuSupportedFlags XpuGetSupportedDocAttributes(Display *pdpy, XPContext pcontext); +XpuSupportedFlags XpuGetSupportedPageAttributes(Display *pdpy, XPContext pcontext); + _XFUNCPROTOEND #define XpuGetJobAttributes( pdpy, pcontext ) XpGetAttributes( (pdpy), (pcontext), XPJobAttr ) diff --git a/xpfe/global/resources/content/printdialog.js b/xpfe/global/resources/content/printdialog.js index 2f977f01cd86..9de4b85aa96f 100644 --- a/xpfe/global/resources/content/printdialog.js +++ b/xpfe/global/resources/content/printdialog.js @@ -204,6 +204,7 @@ function setPrinterDefaultsForSelectedPrinter() var flags = gPrintSetInterface.kInitSavePaperSizeType | gPrintSetInterface.kInitSavePaperSizeUnit | gPrintSetInterface.kInitSavePaperWidth | gPrintSetInterface.kInitSavePaperHeight | + gPrintSetInterface.kInitSavePaperName | gPrintSetInterface.kInitSavePrintCommand; // now augment them with any values from last time @@ -460,6 +461,7 @@ function onAccept() if (saveToPrefs && gWebBrowserPrint != null) { var flags = gPrintSetInterface.kInitSavePaperSizeType | gPrintSetInterface.kInitSavePaperSizeUnit | gPrintSetInterface.kInitSavePaperWidth | gPrintSetInterface.kInitSavePaperHeight | + gPrintSetInterface.kInitSavePaperName | gPrintSetInterface.kInitSavePrintCommand; gWebBrowserPrint.savePrintSettingsToPrefs(gPrintSettings, true, flags); } diff --git a/xpfe/global/resources/content/unix/printjoboptions.js b/xpfe/global/resources/content/unix/printjoboptions.js index 11ff311251da..18e86572cd4e 100644 --- a/xpfe/global/resources/content/unix/printjoboptions.js +++ b/xpfe/global/resources/content/unix/printjoboptions.js @@ -96,6 +96,13 @@ function initDialog() dialog.rightInput = document.getElementById("rightInput"); } +//--------------------------------------------------- +function round10(val) +{ + return Math.round(val * 10) / 10; +} + + //--------------------------------------------------- function listElement(aListElement) { @@ -126,7 +133,7 @@ listElement.prototype = /* No name in string bundle ? Then build one manually (this * usually happens when gPaperArray was build by createPaperArrayFromPrinterFeatures() ...) */ if (paperObj.inches) { - label = paperObj.name + " (" + paperObj.width + "x" + paperObj.height + " in.)"; + label = paperObj.name + " (" + round10(paperObj.width) + "x" + round10(paperObj.height) + " inch)"; } else { label = paperObj.name + " (" + paperObj.width + "x" + paperObj.height + " mm)"; @@ -259,8 +266,7 @@ function loadDialog() var print_paper_unit = 0; var print_paper_width = 0.0; var print_paper_height = 0.0; - var print_paper_width_mm = 0.0; - var print_paper_height_mm = 0.0; + var print_paper_name = ""; var print_color = true; var print_command = default_command; @@ -271,20 +277,9 @@ function loadDialog() print_paper_unit = gPrintSettings.paperSizeUnit; print_paper_width = gPrintSettings.paperWidth; print_paper_height = gPrintSettings.paperHeight; + print_paper_name = gPrintSettings.paperName; print_color = gPrintSettings.printInColor; print_command = gPrintSettings.printCommand; - - if (print_paper_unit == gPrintSettingsInterface.kPaperSizeInches) { - print_paper_width_mm = gPrintSettings.paperWidth * 25.4; - print_paper_height_mm = gPrintSettings.paperHeight * 25.4; - } - else if (print_paper_unit == gPrintSettingsInterface.kPaperSizeMillimeters) { - print_paper_width_mm = gPrintSettings.paperWidth; - print_paper_height_mm = gPrintSettings.paperHeight; - } - else { - dump("Unknown value in gPrintSettings.paperSizeUnit"); - } } if (doDebug) { @@ -292,6 +287,7 @@ function loadDialog() dump("paperSizeType "+print_paper_unit+"\n"); dump("paperWidth "+print_paper_width+"\n"); dump("paperHeight "+print_paper_height+"\n"); + dump("paperName "+print_paper_name+"\n"); dump("printInColor "+print_color+"\n"); dump("printCommand "+print_command+"\n"); } @@ -299,11 +295,8 @@ function loadDialog() createPaperArray(); var selectedInx = 0; - var tolerance = 10.0; // 4 is usually enougth except for large papers like DIN-A3 for (var i=0;i