diff options
Diffstat (limited to 'toolkit/components/printing/content/printPreviewToolbar.js')
-rw-r--r-- | toolkit/components/printing/content/printPreviewToolbar.js | 444 |
1 files changed, 444 insertions, 0 deletions
diff --git a/toolkit/components/printing/content/printPreviewToolbar.js b/toolkit/components/printing/content/printPreviewToolbar.js new file mode 100644 index 0000000000..b2ff4e8259 --- /dev/null +++ b/toolkit/components/printing/content/printPreviewToolbar.js @@ -0,0 +1,444 @@ +// This file is loaded into the browser window scope. +/* eslint-env mozilla/browser-window */ + +// -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- + +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +customElements.define( + "printpreview-toolbar", + class PrintPreviewToolbar extends MozXULElement { + static get markup() { + return ` + <button id="print-preview-print" oncommand="this.parentNode.print();" data-l10n-id="printpreview-print"/> + <button id="print-preview-pageSetup" oncommand="this.parentNode.doPageSetup();" data-l10n-id="printpreview-page-setup"/> + <vbox align="center" pack="center"> + <label control="print-preview-pageNumber" data-l10n-id="printpreview-page"/> + </vbox> + <toolbarbutton id="print-preview-navigateHome" class="print-preview-navigate-button tabbable" oncommand="parentNode.navigate(0, 0, 'home');" data-l10n-id="printpreview-homearrow"/> + <toolbarbutton id="print-preview-navigatePrevious" class="print-preview-navigate-button tabbable" oncommand="parentNode.navigate(-1, 0, 0);" data-l10n-id="printpreview-previousarrow"/> + <hbox align="center" pack="center"> + <html:input id="print-preview-pageNumber" hidespinbuttons="true" type="number" value="1" min="1"/> + <label data-l10n-id="printpreview-of"/> + <label id="print-preview-totalPages" value="1"/> + </hbox> + <toolbarbutton id="print-preview-navigateNext" class="print-preview-navigate-button tabbable" oncommand="parentNode.navigate(1, 0, 0);" data-l10n-id="printpreview-nextarrow"/> + <toolbarbutton id="print-preview-navigateEnd" class="print-preview-navigate-button tabbable" oncommand="parentNode.navigate(0, 0, 'end');" data-l10n-id="printpreview-endarrow"/> + <toolbarseparator class="toolbarseparator-primary"/> + <vbox align="center" pack="center"> + <label id="print-preview-scale-label" control="print-preview-scale" data-l10n-id="printpreview-scale"/> + </vbox> + <hbox align="center" pack="center"> + <menulist id="print-preview-scale" crop="none" oncommand="parentNode.parentNode.scale(this.selectedItem.value);"> + <menupopup> + <menuitem value="0.3" /> + <menuitem value="0.4" /> + <menuitem value="0.5" /> + <menuitem value="0.6" /> + <menuitem value="0.7" /> + <menuitem value="0.8" /> + <menuitem value="0.9" /> + <menuitem value="1" /> + <menuitem value="1.25" /> + <menuitem value="1.5" /> + <menuitem value="1.75" /> + <menuitem value="2" /> + <menuseparator/> + <menuitem flex="1" value="ShrinkToFit" data-l10n-id="printpreview-shrink-to-fit"/> + <menuitem value="Custom" data-l10n-id="printpreview-custom"/> + </menupopup> + </menulist> + </hbox> + <toolbarseparator class="toolbarseparator-primary"/> + <hbox align="center" pack="center"> + <toolbarbutton id="print-preview-portrait-button" checked="true" type="radio" group="orient" class="tabbable" oncommand="parentNode.parentNode.orient('portrait');" data-l10n-id="printpreview-portrait"/> + <toolbarbutton id="print-preview-landscape-button" type="radio" group="orient" class="tabbable" oncommand="parentNode.parentNode.orient('landscape');" data-l10n-id="printpreview-landscape"/> + </hbox> + <toolbarseparator class="toolbarseparator-primary"/> + <checkbox id="print-preview-simplify" checked="false" disabled="true" oncommand="this.parentNode.simplify();" data-l10n-id="printpreview-simplify-page-checkbox"/> + <toolbarseparator class="toolbarseparator-primary"/> + <button id="print-preview-toolbar-close-button" oncommand="PrintUtils.exitPrintPreview();" data-l10n-id="printpreview-close"/> + <data id="print-preview-custom-scale-prompt-title" data-l10n-id="printpreview-custom-scale-prompt-title"/> + `; + } + constructor() { + super(); + this.disconnectedCallback = this.disconnectedCallback.bind(this); + } + connectedCallback() { + window.addEventListener("unload", this.disconnectedCallback, { + once: true, + }); + + MozXULElement.insertFTLIfNeeded("toolkit/printing/printPreview.ftl"); + this.appendChild(this.constructor.fragment); + + this.mPrintButton = document.getElementById("print-preview-print"); + + this.mPageSetupButton = document.getElementById( + "print-preview-pageSetup" + ); + + this.mNavigateHomeButton = document.getElementById( + "print-preview-navigateHome" + ); + + this.mNavigatePreviousButton = document.getElementById( + "print-preview-navigatePrevious" + ); + + this.mPageTextBox = document.getElementById("print-preview-pageNumber"); + + this.mNavigateNextButton = document.getElementById( + "print-preview-navigateNext" + ); + + this.mNavigateEndButton = document.getElementById( + "print-preview-navigateEnd" + ); + + this.mTotalPages = document.getElementById("print-preview-totalPages"); + + this.mScaleCombobox = document.getElementById("print-preview-scale"); + + this.mPortaitButton = document.getElementById( + "print-preview-portrait-button" + ); + + this.mLandscapeButton = document.getElementById( + "print-preview-landscape-button" + ); + + this.mSimplifyPageCheckbox = document.getElementById( + "print-preview-simplify" + ); + + this.mSimplifyPageNotAllowed = this.mSimplifyPageCheckbox.disabled; + + this.mSimplifyPageToolbarSeparator = this.mSimplifyPageCheckbox.nextElementSibling; + + this.mPrintPreviewObs = ""; + + this.mWebProgress = ""; + + this.mPPBrowser = null; + + this.mOnPageTextBoxChange = () => { + this.navigate(0, Number(this.mPageTextBox.value), 0); + }; + this.mPageTextBox.addEventListener("change", this.mOnPageTextBoxChange); + + let dropdown = document.getElementById("print-preview-scale").menupopup; + for (let menuitem of dropdown.children) { + let value = menuitem.getAttribute("value"); + if (!isNaN(parseFloat(value))) { + document.l10n.setAttributes( + menuitem, + "printpreview-percentage-value", + { percent: Math.round(parseFloat(value) * 100) } + ); + } + } + } + + initialize(aPPBrowser) { + let { Services } = ChromeUtils.import( + "resource://gre/modules/Services.jsm" + ); + if (!Services.prefs.getBoolPref("print.use_simplify_page")) { + this.mSimplifyPageCheckbox.hidden = true; + this.mSimplifyPageToolbarSeparator.hidden = true; + } + this.mPPBrowser = aPPBrowser; + this.updateToolbar(); + + let ltr = document.documentElement.matches(":root:-moz-locale-dir(ltr)"); + // Windows 7 doesn't support ⏮ and ⏭ by default, and fallback doesn't + // always work (bug 1343330). + let { AppConstants } = ChromeUtils.import( + "resource://gre/modules/AppConstants.jsm" + ); + let useCompatCharacters = AppConstants.isPlatformAndVersionAtMost( + "win", + "6.1" + ); + let leftEnd = useCompatCharacters ? "\u23EA" : "\u23EE"; + let rightEnd = useCompatCharacters ? "\u23E9" : "\u23ED"; + document.l10n.setAttributes( + this.mNavigateHomeButton, + "printpreview-homearrow", + { arrow: ltr ? leftEnd : rightEnd } + ); + document.l10n.setAttributes( + this.mNavigatePreviousButton, + "printpreview-previousarrow", + { arrow: ltr ? "\u25C2" : "\u25B8" } + ); + document.l10n.setAttributes( + this.mNavigateNextButton, + "printpreview-nextarrow", + { arrow: ltr ? "\u25B8" : "\u25C2" } + ); + document.l10n.setAttributes( + this.mNavigateEndButton, + "printpreview-endarrow", + { arrow: ltr ? rightEnd : leftEnd } + ); + } + + destroy() { + delete this.mPPBrowser; + } + + disconnectedCallback() { + window.removeEventListener("unload", this.disconnectedCallback); + this.mPageTextBox.removeEventListener( + "change", + this.mOnPageTextBoxChange + ); + this.destroy(); + } + + disableUpdateTriggers(aDisabled) { + this.mPrintButton.disabled = aDisabled; + this.mPageSetupButton.disabled = aDisabled; + this.mNavigateHomeButton.disabled = aDisabled; + this.mNavigatePreviousButton.disabled = aDisabled; + this.mPageTextBox.disabled = aDisabled; + this.mNavigateNextButton.disabled = aDisabled; + this.mNavigateEndButton.disabled = aDisabled; + this.mScaleCombobox.disabled = aDisabled; + this.mPortaitButton.disabled = aDisabled; + this.mLandscapeButton.disabled = aDisabled; + this.mSimplifyPageCheckbox.disabled = + this.mSimplifyPageNotAllowed || aDisabled; + } + + doPageSetup() { + /* import-globals-from printUtils.js */ + var didOK = PrintUtils.showPageSetup(); + if (didOK) { + // the changes that effect the UI + this.updateToolbar(); + + // Now do PrintPreview + PrintUtils.printPreview(); + } + } + + navigate(aDirection, aPageNum, aHomeOrEnd) { + const nsIWebBrowserPrint = Ci.nsIWebBrowserPrint; + let navType, pageNum; + + let { min: lowerLimit, max: upperLimit } = this.mPageTextBox; + + // we use only one of aHomeOrEnd, aDirection, or aPageNum + if (aHomeOrEnd) { + // We're going to either the very first page ("home"), or the + // very last page ("end"). + if (aHomeOrEnd == "home") { + navType = nsIWebBrowserPrint.PRINTPREVIEW_HOME; + this.mPageTextBox.value = 1; + } else { + navType = nsIWebBrowserPrint.PRINTPREVIEW_END; + this.mPageTextBox.value = upperLimit; + } + pageNum = 0; + } else if (aDirection) { + // aDirection is either +1 or -1, and allows us to increment + // or decrement our currently viewed page. + pageNum = Number(this.mPageTextBox.value) + aDirection; + pageNum = Math.min(upperLimit, Math.max(lowerLimit, pageNum)); + this.mPageTextBox.value = pageNum; + navType = nsIWebBrowserPrint.PRINTPREVIEW_GOTO_PAGENUM; + } else { + // We're going to a specific page (aPageNum) + navType = nsIWebBrowserPrint.PRINTPREVIEW_GOTO_PAGENUM; + pageNum = Math.min(upperLimit, Math.max(lowerLimit, aPageNum)); + if (pageNum != aPageNum) { + this.mPageTextBox.value = pageNum; + } + } + + this.mPPBrowser.sendMessageToActor( + "Printing:Preview:Navigate", + { + navType, + pageNum, + }, + "Printing" + ); + } + + print() { + PrintUtils.printWindow(this.mPPBrowser.browsingContext); + } + + promptForScaleValue(aValue) { + var value = Math.round(aValue); + var promptStr = document.getElementById("print-preview-scale-label") + .value; + var renameTitle = document.getElementById( + "print-preview-custom-scale-prompt-title" + ).textContent; + var result = { value }; + let { Services } = ChromeUtils.import( + "resource://gre/modules/Services.jsm" + ); + var confirmed = Services.prompt.prompt( + window, + renameTitle, + promptStr, + result, + null, + { value } + ); + if (!confirmed || !result.value || result.value == "") { + return -1; + } + return result.value; + } + + setScaleCombobox(aValue) { + var scaleValues = [ + 0.3, + 0.4, + 0.5, + 0.6, + 0.7, + 0.8, + 0.9, + 1, + 1.25, + 1.5, + 1.75, + 2, + ]; + + aValue = Number(aValue); + + for (var i = 0; i < scaleValues.length; i++) { + if (aValue == scaleValues[i]) { + this.mScaleCombobox.selectedIndex = i; + return; + } + } + this.mScaleCombobox.value = "Custom"; + } + + scale(aValue) { + var settings = PrintUtils.getPrintSettings(); + if (aValue == "ShrinkToFit") { + if (!settings.shrinkToFit) { + settings.shrinkToFit = true; + this.savePrintSettings( + settings, + settings.kInitSaveShrinkToFit | settings.kInitSaveScaling + ); + PrintUtils.printPreview(); + } + return; + } + + if (aValue == "Custom") { + aValue = this.promptForScaleValue(settings.scaling * 100.0); + if (aValue >= 10) { + aValue /= 100.0; + } else { + if (this.mScaleCombobox.hasAttribute("lastValidInx")) { + this.mScaleCombobox.selectedIndex = this.mScaleCombobox.getAttribute( + "lastValidInx" + ); + } + return; + } + } + + this.setScaleCombobox(aValue); + this.mScaleCombobox.setAttribute( + "lastValidInx", + this.mScaleCombobox.selectedIndex + ); + + if (settings.scaling != aValue || settings.shrinkToFit) { + settings.shrinkToFit = false; + settings.scaling = aValue; + this.savePrintSettings( + settings, + settings.kInitSaveShrinkToFit | settings.kInitSaveScaling + ); + PrintUtils.printPreview(); + } + } + + orient(aOrientation) { + const kIPrintSettings = Ci.nsIPrintSettings; + var orientValue = + aOrientation == "portrait" + ? kIPrintSettings.kPortraitOrientation + : kIPrintSettings.kLandscapeOrientation; + var settings = PrintUtils.getPrintSettings(); + if (settings.orientation != orientValue) { + settings.orientation = orientValue; + this.savePrintSettings(settings, settings.kInitSaveOrientation); + PrintUtils.printPreview(); + } + } + + simplify() { + PrintUtils.setSimplifiedMode(this.mSimplifyPageCheckbox.checked); + PrintUtils.printPreview(); + } + + enableSimplifyPage() { + this.mSimplifyPageNotAllowed = false; + this.mSimplifyPageCheckbox.disabled = false; + document.l10n.setAttributes( + this.mSimplifyPageCheckbox, + "printpreview-simplify-page-checkbox-enabled" + ); + } + + disableSimplifyPage() { + this.mSimplifyPageNotAllowed = true; + this.mSimplifyPageCheckbox.disabled = true; + document.l10n.setAttributes( + this.mSimplifyPageCheckbox, + "printpreview-simplify-page-checkbox" + ); + } + + updateToolbar() { + var settings = PrintUtils.getPrintSettings(); + + var isPortrait = + settings.orientation == Ci.nsIPrintSettings.kPortraitOrientation; + + this.mPortaitButton.checked = isPortrait; + this.mLandscapeButton.checked = !isPortrait; + + if (settings.shrinkToFit) { + this.mScaleCombobox.value = "ShrinkToFit"; + } else { + this.setScaleCombobox(settings.scaling); + } + + this.mPageTextBox.value = 1; + } + + savePrintSettings(settings, flags) { + var PSSVC = Cc["@mozilla.org/gfx/printsettings-service;1"].getService( + Ci.nsIPrintSettingsService + ); + PSSVC.savePrintSettingsToPrefs(settings, true, flags); + } + + updatePageCount(totalPages) { + this.mTotalPages.value = totalPages; + this.mPageTextBox.max = totalPages; + } + }, + { extends: "toolbar" } +); |