Index: chrome/browser/resources/print_preview/print_preview.js |
diff --git a/chrome/browser/resources/print_preview/print_preview.js b/chrome/browser/resources/print_preview/print_preview.js |
index f47cb296fa36e2e052bef3ad30f90d40f3c2fe08..ed78cfc9b83628a43443d1bac002b275655996cc 100644 |
--- a/chrome/browser/resources/print_preview/print_preview.js |
+++ b/chrome/browser/resources/print_preview/print_preview.js |
@@ -2,1267 +2,916 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-// require: cr/ui/print_preview_cloud.js |
+// TODO(rltoscano): Might be a problem where might be in fetching destinations |
+// state, then to file selection state, then cancel, which results in the |
+// fetching destinations state being lost. |
-var localStrings = new LocalStrings(); |
- |
-// If useCloudPrint is true we attempt to connect to cloud print |
-// and populate the list of printers with cloud print printers. |
-var useCloudPrint = false; |
- |
-// Store the last selected printer index. |
-var lastSelectedPrinterIndex = 0; |
- |
-// Used to disable some printing options when the preview is not modifiable. |
-var previewModifiable = false; |
- |
-// Used to identify whether the printing frame has specific page size style. |
-var hasPageSizeStyle = false; |
- |
-// Destination list special value constants. |
- |
-/** @const */ var MANAGE_CLOUD_PRINTERS = 'manageCloudPrinters'; |
-/** @const */ var MANAGE_LOCAL_PRINTERS = 'manageLocalPrinters'; |
-/** @const */ var SIGN_IN = 'signIn'; |
-/** @const */ var PRINT_TO_PDF = 'Save as PDF'; |
-/** @const */ var PRINT_WITH_CLOUD_PRINT = 'printWithCloudPrint'; |
- |
-// State of the print preview settings. |
-var printSettings = new PrintSettings(); |
- |
-// Print ready data index. |
-/** @const */ var PRINT_READY_DATA_INDEX = -1; |
- |
-// The name of the default or last used printer. |
-var defaultOrLastUsedPrinterName = ''; |
- |
-// True when a pending print preview request exists. |
-var hasPendingPreviewRequest = false; |
- |
-// True when the first page is loaded in the plugin. |
-var isFirstPageLoaded = false; |
- |
-// The ID of the last preview request. |
-var lastPreviewRequestID = -1; |
- |
-// The ID of the initial preview request. |
-var initialPreviewRequestID = -1; |
- |
-// True when a pending print file request exists. |
-var hasPendingPrintDocumentRequest = false; |
+// TODO(rltoscano): Move data/* into print_preview.data namespace |
-// True when the complete metafile for the previewed doc is ready. |
-var isPrintReadyMetafileReady = false; |
+// TODO(rltoscano): Handle case where cloud print is initial destination, but |
+// cloud print is not enabled. |
-// True when preview tab is hidden. |
-var isTabHidden = false; |
- |
-// True in kiosk mode where print preview can print automatically without |
-// user intervention. See http://crbug.com/31395. |
-var printAutomaticallyInKioskMode = false; |
- |
-// @type {print_preview.PrintHeader} Holds the print and cancel buttons. |
-var printHeader; |
- |
-// @type {print_preview.PageSettings} Holds all the pages related settings. |
-var pageSettings; |
+var localStrings = new LocalStrings(); |
-// @type {print_preview.CopiesSettings} Holds all the copies related settings. |
-var copiesSettings; |
- |
-// @type {print_preview.LayoutSettings} Holds all the layout related settings. |
-var layoutSettings; |
- |
-// @type {print_preview.MarginSettings} Holds all the margin related settings. |
-var marginSettings; |
- |
-// @type {print_preview.HeaderFooterSettings} Holds all the header footer |
-// related settings. |
-var headerFooterSettings; |
- |
-// @type {print_preview.FitToPageSettings} Holds all the fit to page related |
-// settings. |
-var fitToPageSettings; |
- |
-// @type {print_preview.MoreOptions} Holds the more options implementation. |
-var moreOptions; |
- |
-// @type {print_preview.ColorSettings} Holds all the color related settings. |
-var colorSettings; |
- |
-// @type {print_preview.PreviewArea} Holds information related to the preview |
-// area (on the right). |
-var previewArea; |
- |
-// True if the user has click 'Advanced...' in order to open the system print |
-// dialog. |
-var showingSystemDialog = false; |
- |
-// True if the user has clicked 'Open PDF in Preview' option. |
-var previewAppRequested = false; |
- |
-// The range of options in the printer dropdown controlled by cloud print. |
-var firstCloudPrintOptionPos = 0; |
-var lastCloudPrintOptionPos = firstCloudPrintOptionPos; |
- |
-// Store the current previewUid. |
-var currentPreviewUid = ''; |
- |
-// True if we need to generate draft preview data. |
-var generateDraftData = true; |
- |
-// The last element clicked with the mouse. |
-var lastClickedElement = null; |
- |
-// A dictionary of cloud printers that have been added to the printer |
-// dropdown. |
-var addedCloudPrinters = {}; |
- |
-// The maximum number of cloud printers to allow in the dropdown. |
-/** @const */ var maxCloudPrinters = 10; |
- |
-/** @const */ var MIN_REQUEST_ID = 0; |
-/** @const */ var MAX_REQUEST_ID = 32000; |
- |
-// Names of all the custom events used. |
-var customEvents = { |
- // Fired when the header footer option visibility changed. |
- HEADER_FOOTER_VISIBILITY_CHANGED: 'headerFooterVisibilityChanged', |
- // Fired when the mouse moves while a margin line is being dragged. |
- MARGIN_LINE_DRAG: 'marginLineDrag', |
- // Fired when a mousedown event occurs on a margin line. |
- MARGIN_LINE_MOUSE_DOWN: 'marginLineMouseDown', |
- // Fired when a margin textbox gains focus. |
- MARGIN_TEXTBOX_FOCUSED: 'marginTextboxFocused', |
- // Fired when a new preview might be needed because of margin changes. |
- MARGINS_MAY_HAVE_CHANGED: 'marginsMayHaveChanged', |
- // Fired when a pdf generation related error occurs. |
- PDF_GENERATION_ERROR: 'PDFGenerationError', |
- // Fired once the first page of the pdf document is loaded in the plugin. |
- PDF_LOADED: 'PDFLoaded', |
- // Fired when the selected printer capabilities change. |
- PRINTER_CAPABILITIES_UPDATED: 'printerCapabilitiesUpdated', |
- // Fired when the destination printer is changed. |
- PRINTER_SELECTION_CHANGED: 'printerSelectionChanged', |
- // Fired when the print button needs to be updated. |
- UPDATE_PRINT_BUTTON: 'updatePrintButton', |
- // Fired when the print summary needs to be updated. |
- UPDATE_SUMMARY: 'updateSummary' |
-}; |
- |
-/** |
- * Window onload handler, sets up the page and starts print preview by getting |
- * the printer list. |
- */ |
-function onLoad() { |
- initialPreviewRequestID = randomInteger(MIN_REQUEST_ID, MAX_REQUEST_ID); |
- lastPreviewRequestID = initialPreviewRequestID; |
- |
- previewArea = print_preview.PreviewArea.getInstance(); |
- printHeader = print_preview.PrintHeader.getInstance(); |
- document.addEventListener(customEvents.PDF_GENERATION_ERROR, |
- cancelPendingPrintRequest); |
- document.addEventListener('click', setLastClickedElement); |
- |
- if (!checkCompatiblePluginExists()) { |
- disableInputElementsInSidebar(); |
- $('cancel-button').focus(); |
- previewArea.displayErrorMessageWithButtonAndNotify( |
- localStrings.getString('noPlugin'), |
- localStrings.getString('launchNativeDialog'), |
- launchNativePrintDialog); |
- $('mainview').parentElement.removeChild($('dummy-viewer')); |
- return; |
- } |
- |
- $('system-dialog-link').addEventListener('click', onSystemDialogLinkClicked); |
- if (cr.isMac) { |
- $('open-pdf-in-preview-link').addEventListener( |
- 'click', onOpenPdfInPreviewLinkClicked); |
- } |
- $('mainview').parentElement.removeChild($('dummy-viewer')); |
- |
- $('printer-list').disabled = true; |
- |
- pageSettings = print_preview.PageSettings.getInstance(); |
- copiesSettings = print_preview.CopiesSettings.getInstance(); |
- layoutSettings = print_preview.LayoutSettings.getInstance(); |
- marginSettings = print_preview.MarginSettings.getInstance(); |
- headerFooterSettings = print_preview.HeaderFooterSettings.getInstance(); |
- fitToPageSettings = print_preview.FitToPageSettings.getInstance(); |
- moreOptions = print_preview.MoreOptions.getInstance(); |
- colorSettings = print_preview.ColorSettings.getInstance(); |
- $('printer-list').onchange = updateControlsWithSelectedPrinterCapabilities; |
- |
- previewArea.showLoadingAnimation(); |
- chrome.send('getInitialSettings'); |
-} |
- |
-/** |
- * @param {object} initialSettings An object containing all the initial |
- * settings. |
- */ |
-function setInitialSettings(initialSettings) { |
- setInitiatorTabTitle(initialSettings['initiatorTabTitle']); |
- previewModifiable = initialSettings['previewModifiable']; |
- if (previewModifiable) { |
- print_preview.MarginSettings.setNumberFormatAndMeasurementSystem( |
- initialSettings['numberFormat'], |
- initialSettings['measurementSystem']); |
- marginSettings.setLastUsedMargins(initialSettings); |
- } |
- printAutomaticallyInKioskMode = |
- initialSettings['printAutomaticallyInKioskMode']; |
- headerFooterSettings.setChecked(initialSettings['headerFooterEnabled']); |
- copiesSettings.previousDuplexMode = initialSettings['duplex']; |
- setDefaultPrinter(initialSettings['printerName'], |
- initialSettings['cloudPrintData']); |
-} |
- |
-/** |
- * Disables the input elements in the sidebar. |
- */ |
-function disableInputElementsInSidebar() { |
- var els = $('navbar-container').querySelectorAll('input, button, select'); |
- for (var i = 0; i < els.length; i++) { |
- if (els[i] == printHeader.cancelButton) |
- continue; |
- els[i].disabled = true; |
- } |
-} |
- |
-/** |
- * Enables the input elements in the sidebar. |
- */ |
-function enableInputElementsInSidebar() { |
- var els = $('navbar-container').querySelectorAll('input, button, select'); |
- for (var i = 0; i < els.length; i++) |
- els[i].disabled = false; |
-} |
- |
-/** |
- * Keep track of the last element to receive a click. |
- * @param {Event} e The click event. |
- */ |
-function setLastClickedElement(e) { |
- lastClickedElement = e.target; |
-} |
- |
-/** |
- * Disables the controls in the sidebar, shows the throbber and instructs the |
- * backend to open the native print dialog. |
- */ |
-function onSystemDialogLinkClicked() { |
- if (showingSystemDialog) |
- return; |
- showingSystemDialog = true; |
- disableInputElementsInSidebar(); |
- printHeader.disableCancelButton(); |
- $('system-dialog-throbber').hidden = false; |
- chrome.send('showSystemDialog'); |
-} |
- |
-/** |
- * Disables the controls in the sidebar, shows the throbber and instructs the |
- * backend to open the pdf in native preview app. This is only for Mac. |
- */ |
-function onOpenPdfInPreviewLinkClicked() { |
- if (previewAppRequested) |
- return; |
- previewAppRequested = true; |
- disableInputElementsInSidebar(); |
- $('open-preview-app-throbber').hidden = false; |
- printHeader.disableCancelButton(); |
- requestToPrintDocument(); |
-} |
- |
-/** |
- * Similar to onSystemDialogLinkClicked(), but specific to the |
- * 'Launch native print dialog' UI. |
- */ |
-function launchNativePrintDialog() { |
- if (showingSystemDialog) |
- return; |
- showingSystemDialog = true; |
- previewArea.errorButton.disabled = true; |
- printHeader.disableCancelButton(); |
- $('native-print-dialog-throbber').hidden = false; |
- chrome.send('showSystemDialog'); |
-} |
- |
-/** |
- * Notifies listeners of |customEvents.PRINTER_SELECTION_CHANGED| event about |
- * the current selected printer. |
- */ |
-function dispatchPrinterSelectionChangedEvent() { |
- var customEvent = cr.Event(customEvents.PRINTER_SELECTION_CHANGED); |
- customEvent.selectedPrinter = getSelectedPrinterName(); |
- document.dispatchEvent(customEvent); |
-} |
- |
-/** |
- * Gets the selected printer capabilities and updates the controls accordingly. |
- */ |
-function updateControlsWithSelectedPrinterCapabilities() { |
- var printerList = $('printer-list'); |
- var selectedIndex = printerList.selectedIndex; |
- if (selectedIndex < 0) |
- return; |
- if (cr.isMac) |
- $('open-pdf-in-preview-link').disabled = false; |
- |
- var skip_refresh = false; |
- var selectedPrinterChanged = true; |
- var selectedValue = printerList.options[selectedIndex].value; |
- if (cloudprint.isCloudPrint(printerList.options[selectedIndex])) { |
- cloudprint.updatePrinterCaps(printerList.options[selectedIndex], |
- doUpdateCloudPrinterCapabilities); |
- skip_refresh = true; |
- } else if (selectedValue == SIGN_IN || |
- selectedValue == MANAGE_CLOUD_PRINTERS || |
- selectedValue == MANAGE_LOCAL_PRINTERS) { |
- printerList.selectedIndex = lastSelectedPrinterIndex; |
- chrome.send(selectedValue); |
- skip_refresh = true; |
- selectedPrinterChanged = false; |
- } else if (selectedValue == PRINT_TO_PDF || |
- selectedValue == PRINT_WITH_CLOUD_PRINT) { |
- updateWithPrinterCapabilities({ |
- 'disableColorOption': true, |
- 'setColorAsDefault': true, |
- 'setDuplexAsDefault': false, |
- 'printerColorModelForColor': print_preview.ColorSettings.COLOR, |
- 'printerDefaultDuplexValue': copiesSettings.UNKNOWN_DUPLEX_MODE, |
- 'disableCopiesOption': true}); |
- if (cr.isChromeOS && selectedValue == PRINT_WITH_CLOUD_PRINT) |
- requestToPrintDocument(); |
- } else { |
- // This message will call back to 'updateWithPrinterCapabilities' |
- // function. |
- chrome.send('getPrinterCapabilities', [selectedValue]); |
- } |
- if (selectedPrinterChanged) |
- dispatchPrinterSelectionChangedEvent(); |
- |
- if (!skip_refresh) { |
- lastSelectedPrinterIndex = selectedIndex; |
- |
- // Regenerate the preview data based on selected printer settings. |
- // Do not reset the margins if no preview request has been made. |
- var resetMargins = lastPreviewRequestID != initialPreviewRequestID; |
- setDefaultValuesAndRegeneratePreview(resetMargins); |
- } |
-} |
- |
-/** |
- * Helper function to do the actual work of updating cloud printer |
- * capabilities. |
- * @param {Object} printer The printer object to set capabilities for. |
- */ |
-function doUpdateCloudPrinterCapabilities(printer) { |
- var settings = {'disableColorOption': !cloudprint.supportsColor(printer), |
- 'setColorAsDefault': cloudprint.colorIsDefault(printer), |
- 'disableCopiesOption': true, |
- 'disableLandscapeOption': true}; |
- updateWithPrinterCapabilities(settings); |
- var printerList = $('printer-list'); |
- var selectedIndex = printerList.selectedIndex; |
- lastSelectedPrinterIndex = selectedIndex; |
- |
- // Regenerate the preview data based on selected printer settings. |
- // Do not reset the margins if no preview request has been made. |
- var resetMargins = lastPreviewRequestID != initialPreviewRequestID; |
- setDefaultValuesAndRegeneratePreview(resetMargins); |
-} |
- |
-/** |
- * Notifies listeners of |customEvents.PRINTER_CAPABILITIES_UPDATED| about the |
- * capabilities of the currently selected printer. It is called from C++ too. |
- * @param {Object} settingInfo printer setting information. |
- */ |
-function updateWithPrinterCapabilities(settingInfo) { |
- var customEvent = new cr.Event(customEvents.PRINTER_CAPABILITIES_UPDATED); |
- customEvent.printerCapabilities = settingInfo; |
- document.dispatchEvent(customEvent); |
-} |
- |
-/** |
- * Reloads the printer list. |
- */ |
-function reloadPrintersList() { |
- $('printer-list').length = 0; |
- firstCloudPrintOptionPos = 0; |
- lastCloudPrintOptionPos = 0; |
- chrome.send('getPrinters'); |
-} |
- |
-/** |
- * Turn on the integration of Cloud Print. |
- * @param {string} cloudPrintURL The URL to use for cloud print servers. |
- */ |
-function setUseCloudPrint(cloudPrintURL) { |
- useCloudPrint = true; |
- cloudprint.setBaseURL(cloudPrintURL); |
-} |
- |
-/** |
- * Take the PDF data handed to us and submit it to the cloud, closing the print |
- * preview tab once the upload is successful. |
- * @param {string} data Data to send as the print job. |
- */ |
-function printToCloud(data) { |
- cloudprint.printToCloud(data, finishedCloudPrinting); |
-} |
- |
-/** |
- * Cloud print upload of the PDF file is finished, time to close the dialog. |
- */ |
-function finishedCloudPrinting() { |
- closePrintPreviewTab(); |
-} |
- |
-/** |
- * Updates the fit to page option state based on the print scaling option of |
- * source pdf. PDF's have an option to enable/disable print scaling. When we |
- * find out that the print scaling option is disabled for the source pdf, we |
- * uncheck the fit to page checkbox. This function is called from C++ code. |
- */ |
-function printScalingDisabledForSourcePDF() { |
- fitToPageSettings.onPrintScalingDisabled(); |
-} |
- |
-/** |
- * Checks whether the specified settings are valid. |
- * |
- * @return {boolean} true if settings are valid, false if not. |
- */ |
-function areSettingsValid() { |
- var selectedPrinter = getSelectedPrinterName(); |
- return pageSettings.isPageSelectionValid() && |
- marginSettings.areMarginSettingsValid() && |
- (copiesSettings.isValid() || selectedPrinter == PRINT_TO_PDF || |
- selectedPrinter == PRINT_WITH_CLOUD_PRINT); |
-} |
- |
-/** |
- * Creates an object based on the values in the printer settings. |
- * |
- * @return {Object} Object containing print job settings. |
- */ |
-function getSettings() { |
- var deviceName = getSelectedPrinterName(); |
- var printToPDF = deviceName == PRINT_TO_PDF; |
- var printWithCloudPrint = deviceName == PRINT_WITH_CLOUD_PRINT; |
- |
- var settings = |
- {'deviceName': deviceName, |
- 'pageRange': pageSettings.selectedPageRanges, |
- 'duplex': copiesSettings.duplexMode, |
- 'copies': copiesSettings.numberOfCopies, |
- 'collate': copiesSettings.isCollated(), |
- 'landscape': layoutSettings.isLandscape(), |
- 'color': colorSettings.colorMode, |
- 'printToPDF': printToPDF, |
- 'printWithCloudPrint': printWithCloudPrint, |
- 'isFirstRequest' : false, |
- 'headerFooterEnabled': headerFooterSettings.hasHeaderFooter(), |
- 'marginsType': marginSettings.selectedMarginsValue, |
- 'requestID': -1, |
- 'generateDraftData': generateDraftData, |
- 'fitToPageEnabled': fitToPageSettings.hasFitToPage(), |
- 'previewModifiable': previewModifiable}; |
- |
- if (marginSettings.isCustomMarginsSelected()) |
- settings['marginsCustom'] = marginSettings.customMargins; |
- |
- var printerList = $('printer-list'); |
- var selectedPrinter = printerList.selectedIndex; |
- if (cloudprint.isCloudPrint(printerList.options[selectedPrinter])) { |
- settings['cloudPrintID'] = |
- printerList.options[selectedPrinter].value; |
- } |
- return settings; |
-} |
- |
-/** |
- * Creates an object based on the values in the printer settings. |
- * Note: |lastPreviewRequestID| is being modified every time this function is |
- * called. Only call this function when a preview request is actually sent, |
- * otherwise (for example when debugging) call getSettings(). |
- * |
- * @return {Object} Object containing print job settings. |
- */ |
-function getSettingsWithRequestID() { |
- var settings = getSettings(); |
- settings.requestID = generatePreviewRequestID(); |
- settings.isFirstRequest = isFirstPreviewRequest(); |
- return settings; |
-} |
- |
-/** |
- * @return {number} The next unused preview request id. |
- */ |
-function generatePreviewRequestID() { |
- return ++lastPreviewRequestID; |
-} |
- |
-/** |
- * @return {boolean} True iff a preview has been requested. |
- */ |
-function hasRequestedPreview() { |
- return lastPreviewRequestID != initialPreviewRequestID; |
-} |
- |
-/** |
- * @return {boolean} True if |lastPreviewRequestID| corresponds to the initial |
- * preview request. |
- */ |
-function isFirstPreviewRequest() { |
- return lastPreviewRequestID == initialPreviewRequestID + 1; |
-} |
- |
-/** |
- * Checks if |previewResponseId| matches |lastPreviewRequestId|. Used to ignore |
- * obsolete preview data responses. |
- * @param {number} previewResponseId The id to check. |
- * @return {boolean} True if previewResponseId reffers to the expected response. |
- */ |
-function isExpectedPreviewResponse(previewResponseId) { |
- return lastPreviewRequestID == previewResponseId; |
-} |
- |
-/** |
- * Returns the name of the selected printer or the empty string if no |
- * printer is selected. |
- * @return {string} The name of the currently selected printer. |
- */ |
-function getSelectedPrinterName() { |
- var printerList = $('printer-list'); |
- var selectedPrinter = printerList.selectedIndex; |
- if (selectedPrinter < 0) |
- return ''; |
- return printerList.options[selectedPrinter].value; |
-} |
- |
-/** |
- * Asks the browser to print the preview PDF based on current print |
- * settings. If the preview is still loading, printPendingFile() will get |
- * called once the preview loads. |
- */ |
-function requestToPrintDocument() { |
- hasPendingPrintDocumentRequest = !isPrintReadyMetafileReady; |
- var selectedPrinterName = getSelectedPrinterName(); |
- var printToPDF = selectedPrinterName == PRINT_TO_PDF; |
- var printWithCloudPrint = selectedPrinterName == PRINT_WITH_CLOUD_PRINT; |
- if (hasPendingPrintDocumentRequest) { |
- if (previewAppRequested) { |
- previewArea.showCustomMessage( |
+<include src="component.js"/> |
+ |
+cr.define('print_preview', function() { |
+ 'use strict'; |
+ |
+ /** |
+ * Container class for Chromium's print preview. |
+ * @constructor |
+ * @extends {print_preview.Component} |
+ */ |
+ function PrintPreview() { |
+ print_preview.Component.call(this); |
+ |
+ /** |
+ * Used to communicate with Chromium's print system. |
+ * @type {!print_preview.NativeLayer} |
+ * @private |
+ */ |
+ this.nativeLayer_ = new print_preview.NativeLayer(); |
+ |
+ /** |
+ * Data store which holds print destinations. |
+ * @type {!print_preview.DestinationStore} |
+ * @private |
+ */ |
+ this.destinationStore_ = new print_preview.DestinationStore(); |
+ |
+ /** |
+ * Storage of the print ticket used to create the print job. |
+ * @type {!print_preview.PrintTicketStore} |
+ * @private |
+ */ |
+ this.printTicketStore_ = new print_preview.PrintTicketStore( |
+ this.destinationStore_); |
+ |
+ /** |
+ * Holds the print and cancel buttons and renders some document statistics. |
+ * @type {!print_preview.PrintHeader} |
+ * @private |
+ */ |
+ this.printHeader_ = new print_preview.PrintHeader( |
+ this.printTicketStore_, this.destinationStore_); |
+ this.addChild(this.printHeader_); |
+ |
+ /** |
+ * Component that renders the print destination. |
+ * @type {!print_preview.DestinationSettings} |
+ * @private |
+ */ |
+ this.destinationSettings_ = new print_preview.DestinationSettings( |
+ this.destinationStore_); |
+ this.addChild(this.destinationSettings_); |
+ |
+ /** |
+ * Component that renders UI for entering in page range. |
+ * @type {!print_preview.PageSettings} |
+ * @private |
+ */ |
+ this.pageSettings_ = new print_preview.PageSettings(this.printTicketStore_); |
+ this.addChild(this.pageSettings_); |
+ |
+ /** |
+ * Component that renders the copies settings. |
+ * @type {!print_preview.CopiesSettings} |
+ * @private |
+ */ |
+ this.copiesSettings_ = new print_preview.CopiesSettings( |
+ this.printTicketStore_); |
+ this.addChild(this.copiesSettings_); |
+ |
+ /** |
+ * Component that renders the layout settings. |
+ * @type {!print_preview.LayoutSettings} |
+ * @private |
+ */ |
+ this.layoutSettings_ = new print_preview.LayoutSettings( |
+ this.printTicketStore_); |
+ this.addChild(this.layoutSettings_); |
+ |
+ /** |
+ * Component that renders the color options. |
+ * @type {!print_preview.ColorSettings} |
+ * @private |
+ */ |
+ this.colorSettings_ = new print_preview.ColorSettings( |
+ this.printTicketStore_); |
+ this.addChild(this.colorSettings_); |
+ |
+ /** |
+ * Component that renders a select box for choosing margin settings. |
+ * @type {!print_preview.MarginSettings} |
+ * @private |
+ */ |
+ this.marginSettings_ = new print_preview.MarginSettings( |
+ this.printTicketStore_); |
+ this.addChild(this.marginSettings_); |
+ |
+ /** |
+ * Component that renders miscellaneous print options. |
+ * @type {!print_preview.OtherOptionsSettings} |
+ * @private |
+ */ |
+ this.otherOptionsSettings_ = new print_preview.OtherOptionsSettings( |
+ this.printTicketStore_); |
+ this.addChild(this.otherOptionsSettings_); |
+ |
+ /** |
+ * Area of the UI that holds the print preview. |
+ * @type {!print_preview.PreviewArea} |
+ * @private |
+ */ |
+ this.previewArea_ = new print_preview.PreviewArea( |
+ this.destinationStore_, this.printTicketStore_, this.nativeLayer_); |
+ this.addChild(this.previewArea_); |
+ |
+ /** |
+ * Interface to the Google Cloud Print API. Null if Google Cloud Print |
+ * integration is disabled. |
+ * @type {cloudprint.CloudPrintInterface} |
+ * @private |
+ */ |
+ this.cloudPrintInterface_ = null; |
+ |
+ /** |
+ * Whether in kiosk mode where print preview can print automatically without |
+ * user intervention. See http://crbug.com/31395. Print will start when |
+ * both the print ticket has been initialized, and an initial printer has |
+ * been selected. |
+ * @type {boolean} |
+ * @private |
+ */ |
+ this.isInKioskAutoPrintMode_ = false; |
+ |
+ /** |
+ * State of the print preview UI. |
+ * @type {print_preview.PrintPreview.UiState_} |
+ * @private |
+ */ |
+ this.uiState_ = PrintPreview.UiState_.INITIALIZING; |
+ |
+ /** |
+ * Current state of fetching destinations. |
+ * @type {print_preview.PrintPreview.FetchState_} |
+ * @private |
+ */ |
+ this.fetchState_ = PrintPreview.FetchState_.READY; |
+ |
+ /** |
+ * Whether document preview generation is in progress. |
+ * @type {boolean} |
+ * @private |
+ */ |
+ this.isPreviewGenerationInProgress_ = true; |
+ |
+ this.tracker.add(window, 'DOMContentLoaded', this.onWindowLoad_.bind(this)); |
+ }; |
+ |
+ /** |
+ * States of the print preview. |
+ * @enum {string} |
+ * @private |
+ */ |
+ PrintPreview.UiState_ = { |
+ INITIALIZING: 'initializing', |
+ READY: 'ready', |
+ OPENING_PDF_PREVIEW: 'opening-pdf-preview', |
+ OPENING_NATIVE_PRINT_DIALOG: 'opening-native-print-dialog', |
+ PRINTING: 'printing', |
+ FILE_SELECTION: 'file-selection', |
+ CLOSING: 'closing', |
+ ERROR: 'error' |
+ }; |
+ |
+ /** |
+ * Bitfield of the states of fetching destinations. |
+ * @enum {number} |
+ * @private |
+ */ |
+ PrintPreview.FetchState_ = { |
+ READY: 1, |
+ LOCAL_DESTINATIONS: 2, |
+ RECENT_CLOUD_DESTINATIONS: 4, |
+ ALL_CLOUD_DESTINATIONS: 8 |
+ }; |
+ |
+ PrintPreview.prototype = { |
+ __proto__: print_preview.Component.prototype, |
+ |
+ /** @override */ |
+ decorateInternal: function() { |
+ this.printHeader_.decorate($('print-header')); |
+ this.destinationSettings_.decorate($('destination-settings')); |
+ this.pageSettings_.decorate($('page-settings')); |
+ this.copiesSettings_.decorate($('copies-settings')); |
+ this.layoutSettings_.decorate($('layout-settings')); |
+ this.colorSettings_.decorate($('color-settings')); |
+ this.marginSettings_.decorate($('margin-settings')); |
+ this.otherOptionsSettings_.decorate($('other-options-settings')); |
+ this.previewArea_.decorate($('preview-area')); |
+ |
+ setIsVisible($('cloud-print-dialog-link'), cr.isChromeOS); |
+ setIsVisible($('system-dialog-link'), !cr.isChromeOS); |
+ setIsVisible($('open-pdf-in-preview-link'), cr.isMac); |
+ }, |
+ |
+ /** @override */ |
+ enterDocument: function() { |
+ // Native layer events. |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.INITIAL_SETTINGS_SET, |
+ this.onInitialSettingsSet_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.CLOUD_PRINT_ENABLE, |
+ this.onCloudPrintEnable_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.LOCAL_DESTINATIONS_SET, |
+ this.onLocalDestinationsSet_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.CAPABILITIES_SET, |
+ this.onLocalDestinationCapabilitiesSet_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.DESTINATIONS_RELOAD, |
+ this.onDestinationsReload_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.PRINT_TO_CLOUD, |
+ this.onPrintToCloud_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.FILE_SELECTION_CANCEL, |
+ this.onFileSelectionCancel_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.FILE_SELECTION_COMPLETE, |
+ this.onFileSelectionComplete_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.SETTINGS_INVALID, |
+ this.onSettingsInvalid_.bind(this)); |
+ this.tracker.add( |
+ this.nativeLayer_, |
+ print_preview.NativeLayer.EventType.DISABLE_SCALING, |
+ this.onDisableScaling_.bind(this)); |
+ |
+ this.tracker.add( |
+ $('system-dialog-link'), |
+ 'click', |
+ this.openSystemPrintDialog_.bind(this)); |
+ this.tracker.add( |
+ $('cloud-print-dialog-link'), |
+ 'click', |
+ this.openSystemPrintDialog_.bind(this)); |
+ this.tracker.add( |
+ $('open-pdf-in-preview-link'), |
+ 'click', |
+ this.onOpenPdfInPreviewLinkClick_.bind(this)); |
+ |
+ this.tracker.add( |
+ this.previewArea_, |
+ print_preview.PreviewArea.EventType.PREVIEW_GENERATION_IN_PROGRESS, |
+ this.onPreviewGenerationInProgress_.bind(this)); |
+ this.tracker.add( |
+ this.previewArea_, |
+ print_preview.PreviewArea.EventType.PREVIEW_GENERATION_DONE, |
+ this.onPreviewGenerationDone_.bind(this)); |
+ this.tracker.add( |
+ this.previewArea_, |
+ print_preview.PreviewArea.EventType.PREVIEW_GENERATION_FAIL, |
+ this.onPreviewGenerationFail_.bind(this)); |
+ this.tracker.add( |
+ this.previewArea_, |
+ print_preview.PreviewArea.EventType.OPEN_SYSTEM_DIALOG_CLICK, |
+ this.openSystemPrintDialog_.bind(this)); |
+ |
+ this.tracker.add( |
+ this.destinationStore_, |
+ print_preview.DestinationStore.EventType.DESTINATION_SELECT, |
+ this.onDestinationSelect_.bind(this)); |
+ |
+ this.tracker.add( |
+ this.printHeader_, |
+ print_preview.PrintHeader.EventType.PRINT_BUTTON_CLICK, |
+ this.onPrintButtonClick_.bind(this)); |
+ this.tracker.add( |
+ this.printHeader_, |
+ print_preview.PrintHeader.EventType.CANCEL_BUTTON_CLICK, |
+ this.onCancelButtonClick_.bind(this)); |
+ |
+ this.tracker.add( |
+ this.destinationSettings_, |
+ print_preview.DestinationSettings.EventType.MANAGE_PRINTERS_SELECT, |
+ this.onManagePrinters_.bind(this)); |
+ |
+ this.tracker.add(window, 'keydown', this.onKeyDown_.bind(this)); |
+ }, |
+ |
+ /** |
+ * Sets whether the controls in the print preview are enabled. |
+ * @param {boolean} isEnabled Whether the controls in the print preview are |
+ * enabled. |
+ * @private |
+ */ |
+ setIsEnabled_: function(isEnabled) { |
+ $('system-dialog-link').disabled = !isEnabled; |
+ $('cloud-print-dialog-link').disabled = !isEnabled; |
+ $('open-pdf-in-preview-link').disabled = !isEnabled; |
+ this.printHeader_.isEnabled = isEnabled; |
+ this.destinationSettings_.isEnabled = isEnabled; |
+ this.pageSettings_.isEnabled = isEnabled; |
+ this.copiesSettings_.isEnabled = isEnabled; |
+ this.layoutSettings_.isEnabled = isEnabled; |
+ this.colorSettings_.isEnabled = isEnabled; |
+ this.marginSettings_.isEnabled = isEnabled; |
+ this.otherOptionsSettings_.isEnabled = isEnabled; |
+ }, |
+ |
+ /** |
+ * Creates a local PDF print destination. |
+ * @return {!print_preview.Destination} Created print destination. |
+ * @private |
+ */ |
+ createLocalPdfPrintDestination_: function() { |
+ var dest = new print_preview.Destination( |
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF, |
+ localStrings.getString('printToPDF'), |
+ false /*isRecent*/, |
+ true /*isLocal*/); |
+ dest.capabilities = new print_preview.ChromiumCapabilities( |
+ false /*hasCopiesCapability*/, |
+ '1' /*defaultCopiesStr*/, |
+ false /*hasCollateCapability*/, |
+ false /*defaultIsCollateEnabled*/, |
+ false /*hasDuplexCapability*/, |
+ false /*defaultIsDuplexEnabled*/, |
+ true /*hasOrientationCapability*/, |
+ false /*defaultIsLandscapeEnabled*/, |
+ true /*hasColorCapability*/, |
+ true /*defaultIsColorEnabled*/); |
+ return dest; |
+ }, |
+ |
+ /** |
+ * Creates a new "Print with Cloud Print" print destination. NOTE: this |
+ * destination will appear as "Search for additional printers..." on |
+ * Chrome OS. |
+ * @return {!print_preview.Destination} Created print destination. |
+ * @private |
+ */ |
+ createPrintWithCloudPrintDestination_: function() { |
+ var dest = new print_preview.Destination( |
+ print_preview.Destination.GooglePromotedId.PRINT_WITH_CLOUD_PRINT, |
+ localStrings.getString('printWithCloudPrint'), |
+ false /*isRecent*/, |
+ false /*isLocal*/); |
+ dest.capabilities = new print_preview.ChromiumCapabilities( |
+ false /*hasCopiesCapability*/, |
+ '1' /*defaultCopiesStr*/, |
+ false /*hasCollateCapability*/, |
+ false /*defaultIsCollateEnabled*/, |
+ false /*hasDuplexCapability*/, |
+ false /*defaultIsDuplexEnabled*/, |
+ true /*hasOrientationCapability*/, |
+ false /*defaultIsLandscapeEnabled*/, |
+ true /*hasColorCapability*/, |
+ true /*defaultIsColorEnabled*/); |
+ return dest; |
+ }, |
+ |
+ /** |
+ * Prints the document or launches a pdf preview on the local system. |
+ * @param {boolean} isPdfPreview Whether to launch the pdf preview. |
+ * @private |
+ */ |
+ printDocumentOrOpenPdfPreview_: function(isPdfPreview) { |
+ assert(this.uiState_ == PrintPreview.UiState_.READY, |
+ 'Print document request received when not in ready state: ' + |
+ this.uiState_); |
+ if (isPdfPreview) { |
+ this.uiState_ = PrintPreview.UiState_.OPENING_PDF_PREVIEW; |
+ } else if (this.destinationStore_.selectedDestination.id == |
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) { |
+ this.uiState_ = PrintPreview.UiState_.FILE_SELECTION; |
+ } else { |
+ this.uiState_ = PrintPreview.UiState_.PRINTING; |
+ } |
+ this.setIsEnabled_(false); |
+ if (this.printIfReady_() && |
+ ((this.destinationStore_.selectedDestination.isLocal && |
+ this.destinationStore_.selectedDestination.id != |
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) || |
+ this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW)) { |
+ // Hide the dialog for now. The actual print command will be issued when |
+ // the preview generation is done. |
+ this.nativeLayer_.startHideDialog(); |
+ } |
+ }, |
+ |
+ /** |
+ * Attempts to print if needed and if ready. |
+ * @return {boolean} Whether a print request was issued. |
+ * @private |
+ */ |
+ printIfReady_: function() { |
+ if ((this.uiState_ == PrintPreview.UiState_.PRINTING || |
+ this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW || |
+ this.uiState_ == PrintPreview.UiState_.FILE_SELECTION || |
+ this.isInKioskAutoPrintMode_) && |
+ !this.isPreviewGenerationInProgress_ && |
+ this.destinationStore_.selectedDestination && |
+ this.destinationStore_.selectedDestination.capabilities) { |
+ assert(this.printTicketStore_.isTicketValid(), |
+ 'Trying to print with invalid ticket'); |
+ this.nativeLayer_.startSaveDestinationAndTicket( |
+ this.destinationStore_.selectedDestination, |
+ this.printTicketStore_); |
+ this.nativeLayer_.startPrint( |
+ this.destinationStore_.selectedDestination, |
+ this.printTicketStore_, |
+ this.cloudPrintInterface_, |
+ this.uiState_ == PrintPreview.UiState_.OPENING_PDF_PREVIEW); |
+ return true; |
+ } else { |
+ return false; |
+ } |
+ }, |
+ |
+ /** |
+ * Closes the print preview. |
+ * @private |
+ */ |
+ close_: function() { |
+ this.exitDocument(); |
+ this.uiState_ = PrintPreview.UiState_.CLOSING; |
+ this.nativeLayer_.startCloseDialog(); |
+ }, |
+ |
+ /** |
+ * Opens the native system print dialog after disabling all controls. |
+ * @private |
+ */ |
+ openSystemPrintDialog_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.READY, |
+ 'Opening system dialog when not in ready state: ' + this.uiState_); |
+ setIsVisible($('dialog-throbber'), true); |
+ this.setIsEnabled_(false); |
+ this.uiState_ = PrintPreview.UiState_.OPENING_NATIVE_PRINT_DIALOG; |
+ this.nativeLayer_.startShowSystemDialog(); |
+ }, |
+ |
+ /** |
+ * Window onload handler, sets up the page and starts print preview by |
+ * getting the printer list. |
+ * @private |
+ */ |
+ onWindowLoad_: function() { |
+ this.decorate($('print-preview')); |
+ i18nTemplate.process(document, templateData); |
+ if (!this.previewArea_.hasCompatiblePlugin) { |
+ this.setIsEnabled_(false); |
+ } |
+ this.nativeLayer_.startGetInitialSettings(); |
+ this.nativeLayer_.startGetLocalDestinations(); |
+ }, |
+ |
+ /** |
+ * Called when the native layer has initial settings to set. Sets the |
+ * initial settings of the print preview and begins fetching print |
+ * destinations. |
+ * @param {cr.Event} event Contains the initial print preview settings |
+ * persisted through the session. |
+ * @private |
+ */ |
+ onInitialSettingsSet_: function(event) { |
+ assert(this.uiState_ == PrintPreview.UiState_.INITIALIZING, |
+ 'Updating initial settings when not in initializing state: ' + |
+ this.uiState_); |
+ this.uiState_ = PrintPreview.UiState_.READY; |
+ |
+ this.isInKioskAutoPrintMode_ = |
+ event.initialSettings.isInKioskAutoPrintMode; |
+ this.destinationStore_.setInitialDestinationId( |
+ event.initialSettings.initialDestinationId); |
+ this.printTicketStore_.initialize( |
+ event.initialSettings.isDocumentModifiable, |
+ event.initialSettings.isDuplexEnabled, |
+ event.initialSettings.isHeaderFooterEnabled, |
+ event.initialSettings.marginsType, |
+ event.initialSettings.customMargins, |
+ event.initialSettings.thousandsDelimeter, |
+ event.initialSettings.decimalDelimeter, |
+ event.initialSettings.unitType); |
+ }, |
+ |
+ /** |
+ * Calls when the native layer enables Google Cloud Print integration. |
+ * Fetches the user's cloud printers. |
+ * @param {cr.Event} event Contains the base URL of the Google Cloud Print |
+ * service. |
+ * @private |
+ */ |
+ onCloudPrintEnable_: function(event) { |
+ this.cloudPrintInterface_ = new cloudprint.CloudPrintInterface( |
+ event.baseCloudPrintUrl); |
+ this.tracker.add( |
+ this.cloudPrintInterface_, |
+ cloudprint.CloudPrintInterface.EventType.SEARCH_DONE, |
+ this.onCloudPrintSearchDone_.bind(this)); |
+ this.tracker.add( |
+ this.cloudPrintInterface_, |
+ cloudprint.CloudPrintInterface.EventType.PRINTER_DONE, |
+ this.onCloudPrintPrinterDone_.bind(this)); |
+ this.tracker.add( |
+ this.cloudPrintInterface_, |
+ cloudprint.CloudPrintInterface.EventType.SUBMIT_DONE, |
+ this.onCloudPrintSubmitDone_.bind(this)); |
+ this.tracker.add( |
+ this.cloudPrintInterface_, |
+ cloudprint.CloudPrintInterface.EventType.ERROR, |
+ this.onCloudPrintError_.bind(this)); |
+ |
+ var printWithCloudPrintDest = |
+ this.createPrintWithCloudPrintDestination_(); |
+ this.destinationStore_.insertDestination(printWithCloudPrintDest); |
+ |
+ if (cr.isChromeOS) { |
+ this.cloudPrintInterface_.search(true /*isRecent*/); |
+ this.fetchState_ |= PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS; |
+ } |
+ }, |
+ |
+ /** |
+ * Called when the native layer gets local destinations. Adds local |
+ * destination objects received from the operating system to the destination |
+ * store. Also adds a save-as-pdf printer. |
+ * @param {cr.Event} Contains the local destinations to set. |
+ * @private |
+ */ |
+ onLocalDestinationsSet_: function(event) { |
+ var localDestinations = []; |
+ for (var destInfo, i = 0; destInfo = event.destinationInfos[i]; i++) { |
+ localDestinations.push( |
+ print_preview.LocalDestinationParser.parse(destInfo)); |
+ } |
+ localDestinations.push(this.createLocalPdfPrintDestination_()); |
+ this.destinationStore_.insertDestinations(localDestinations); |
+ this.fetchState_ &= ~PrintPreview.FetchState_.LOCAL_DESTINATIONS; |
+ }, |
+ |
+ /** |
+ * Called when the native layer retrieves the capabilities for the selected |
+ * local destination. |
+ * @param {cr.Event} event Contains the capabilities of the local print |
+ * destination. |
+ * @private |
+ */ |
+ onLocalDestinationCapabilitiesSet_: function(event) { |
+ // TODO(rltoscano): There may be a race condition here. This method is |
+ // assumed to return capabilities for the currently selected printer. But |
+ // between the time the local printer was selected and the capabilities |
+ // were retrieved, the selected printer can change. One way to address |
+ // this is to include the destination ID in the settingsInfo parameter. |
+ var selectedDestination = this.destinationStore_.selectedDestination; |
+ if (selectedDestination.isLocal) { |
+ var capabilities = print_preview.LocalCapabilitiesParser.parse( |
+ event.settingsInfo); |
+ selectedDestination.capabilities = capabilities; |
+ this.printTicketStore_.updateDestinationCapabilities(capabilities); |
+ this.printIfReady_(); |
+ } |
+ }, |
+ |
+ /** |
+ * Called from native layer after the user was requested to sign in, and did |
+ * so successfully. |
+ * @private |
+ */ |
+ onDestinationsReload_: function() { |
+ this.destinationStore_.clear(); |
+ this.nativeLayer_.startGetLocalDestinations(); |
+ if (this.cloudPrintInterface_) { |
+ // Fetch recent printers. |
+ this.cloudPrintInterface_.search(true /*isRecent*/); |
+ // Fetch the full printer list. |
+ this.cloudPrintInterface_.search(false /*isRecent*/); |
+ } |
+ this.fetchState_ = |
+ PrintPreview.FetchState_.LOCAL_DESTINATIONS | |
+ PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS | |
+ PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS; |
+ }, |
+ |
+ /** |
+ * Called from the native layer when ready to print to Google Cloud Print. |
+ * @param {cr.Event} event Contains the body to send in the HTTP request. |
+ * @private |
+ */ |
+ onPrintToCloud_: function(event) { |
+ assert(this.uiState_ == PrintPreview.UiState_.PRINTING, |
+ 'Document ready to be sent to the cloud when not in printing ' + |
+ 'state: ' + this.uiState_); |
+ assert(this.cloudPrintInterface_ != null, |
+ 'Google Cloud Print is not enabled'); |
+ this.cloudPrintInterface_.submit(event.data); |
+ }, |
+ |
+ /** |
+ * Called from the native layer when the user cancels the save-to-pdf file |
+ * selection dialog. |
+ * @private |
+ */ |
+ onFileSelectionCancel_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.FILE_SELECTION, |
+ 'File selection cancelled when not in file-selection state: ' + |
+ this.uiState_); |
+ this.setIsEnabled_(true); |
+ this.uiState_ = PrintPreview.UiState_.READY; |
+ }, |
+ |
+ /** |
+ * Called from the native layer when save-to-pdf file selection is complete. |
+ * @private |
+ */ |
+ onFileSelectionComplete_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.FILE_SELECTION, |
+ 'File selection completed when not in file-selection state: ' + |
+ this.uiState_); |
+ this.previewArea_.showCustomMessage( |
+ localStrings.getString('printingToPDFInProgress')); |
+ this.uiState_ = PrintPreview.UiState_.PRINTING; |
+ }, |
+ |
+ /** |
+ * Called when the Google Cloud Print search API call completes. Adds |
+ * destinations to the printer store and selects one if it matches the |
+ * initial destination. |
+ * @param {cr.Event} event Contains the new cloud destinations. |
+ * @private |
+ */ |
+ onCloudPrintSearchDone_: function(event) { |
+ this.destinationStore_.insertDestinations(event.printers); |
+ if (event.isRecent) { |
+ this.fetchState_ &= ~PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS; |
+ } else { |
+ this.fetchState_ &= ~PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS; |
+ } |
+ }, |
+ |
+ /** |
+ * Called when the Google Cloud Print printer API call completes. Updates |
+ * the UI with the newly received capabilities. |
+ * @param {cr.Event} event Contains the destination returned in the printer |
+ * API call. |
+ */ |
+ onCloudPrintPrinterDone_: function(event) { |
+ var dest = this.destinationStore_.updateDestination(event.printer); |
+ if (this.destinationStore_.selectedDestination == dest) { |
+ this.printTicketStore_.updateDestinationCapabilities(dest.capabilities); |
+ this.printIfReady_(); |
+ } |
+ }, |
+ |
+ /** |
+ * Called after successfully submitting a job to Google Cloud Print. |
+ * @private |
+ */ |
+ onCloudPrintSubmitDone_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.PRINTING, |
+ 'Submited job to Google Cloud Print but not in printing state ' + |
+ this.uiState_); |
+ this.close_(); |
+ }, |
+ |
+ /** |
+ * Called when there was an error communicating with Google Cloud print. |
+ * Displays an error message in the print header. |
+ * @param {cr.Event} event Contains the error message. |
+ * @private |
+ */ |
+ onCloudPrintError_: function(event) { |
+ if (cr.isChromeOS && event.message == '403') { |
+ this.nativeLayer_.startCloudPrintSignIn(); |
+ } else { |
+ this.printHeader_.setErrorMessage(event.message); |
+ } |
+ this.fetchState_ &= |
+ ~PrintPreview.FetchState_.RECENT_CLOUD_DESTINATIONS & |
+ ~PrintPreview.FetchState_.ALL_CLOUD_DESTINATIONS; |
+ }, |
+ |
+ /** |
+ * Called when a new destination has been selected. Fetches the |
+ * destination's capability list. |
+ * @private |
+ */ |
+ onDestinationSelect_: function() { |
+ var destination = this.destinationStore_.selectedDestination; |
+ |
+ // Fetch destination capabilities if necessary. |
+ if (!destination.capabilities) { |
+ if (destination.isLocal) { |
+ this.nativeLayer_.startGetLocalDestinationCapabilities( |
+ destination.id); |
+ } else { |
+ assert(this.cloudPrintInterface_ != null, |
+ 'Selected destination is a cloud destination, but Google ' + |
+ 'Cloud Print is not enabled'); |
+ this.cloudPrintInterface_.printer(destination.id); |
+ } |
+ } else { |
+ this.printTicketStore_.updateDestinationCapabilities( |
+ destination.capabilities); |
+ } |
+ |
+ this.printIfReady_(); |
+ }, |
+ |
+ /** |
+ * Called when the preview area's preview generation is in progress. |
+ * @private |
+ */ |
+ onPreviewGenerationInProgress_: function() { |
+ this.isPreviewGenerationInProgress_ = true; |
+ }, |
+ |
+ /** |
+ * Called when the preview area's preview generation is complete. |
+ * @private |
+ */ |
+ onPreviewGenerationDone_: function() { |
+ this.isPreviewGenerationInProgress_ = false; |
+ this.printIfReady_(); |
+ }, |
+ |
+ /** |
+ * Called when the preview area's preview failed to load. |
+ * @private |
+ */ |
+ onPreviewGenerationFail_: function() { |
+ this.isPreviewGenerationInProgress_ = false; |
+ if (this.uiState_ == PrintPreview.UiState_.PRINTING) { |
+ this.nativeLayer_.startCancelPendingPrint(); |
+ } |
+ }, |
+ |
+ /** |
+ * Called when the 'Open pdf in preview' link is clicked. Launches the pdf |
+ * preview app. |
+ * @private |
+ */ |
+ onOpenPdfInPreviewLinkClick_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.READY, |
+ 'Trying to open pdf in preview when not in ready state: ' + |
+ this.uiState_); |
+ setIsVisible($('open-preview-app-throbber'), true); |
+ this.previewArea_.showCustomMessage( |
localStrings.getString('openingPDFInPreview')); |
- } else if (printToPDF) { |
- sendPrintDocumentRequest(); |
- } else if (printWithCloudPrint) { |
- previewArea.showCustomMessage( |
- localStrings.getString('printWithCloudPrintWait')); |
- disableInputElementsInSidebar(); |
- } else { |
- isTabHidden = true; |
- chrome.send('hidePreview'); |
- } |
- return; |
- } |
- |
- if (printToPDF || previewAppRequested) { |
- sendPrintDocumentRequest(); |
- } else { |
- window.setTimeout(function() { sendPrintDocumentRequest(); }, 1000); |
- } |
-} |
- |
-/** |
- * Sends a message to cancel the pending print request. |
- */ |
-function cancelPendingPrintRequest() { |
- if (isTabHidden) |
- chrome.send('cancelPendingPrintRequest'); |
-} |
- |
-/** |
- * Sends a message to initiate print workflow. |
- */ |
-function sendPrintDocumentRequest() { |
- var printerList = $('printer-list'); |
- var printer = printerList[printerList.selectedIndex]; |
- chrome.send('saveLastPrinter', [printer.value, cloudprint.getData(printer)]); |
- |
- var settings = getSettings(); |
- if (cr.isMac && previewAppRequested) |
- settings.OpenPDFInPreview = true; |
- |
- chrome.send('print', [JSON.stringify(settings), |
- cloudprint.getPrintTicketJSON(printer)]); |
-} |
- |
-/** |
- * Loads the selected preview pages. |
- */ |
-function loadSelectedPages() { |
- pageSettings.updatePageSelection(); |
- var pageSet = pageSettings.previouslySelectedPages; |
- var pageCount = pageSet.length; |
- if (pageCount == 0 || currentPreviewUid == '') |
- return; |
- |
- cr.dispatchSimpleEvent(document, customEvents.UPDATE_SUMMARY); |
- for (var i = 0; i < pageCount; i++) |
- onDidPreviewPage(pageSet[i] - 1, currentPreviewUid, lastPreviewRequestID); |
-} |
- |
-/** |
- * Updates the variables states for preview. |
- */ |
-function updateStateForPreview() { |
- if (!isTabHidden) |
- previewArea.showLoadingAnimation(); |
- |
- if (!hasPendingPreviewRequest && previewModifiable && |
- hasOnlyPageSettingsChanged()) { |
- loadSelectedPages(); |
- generateDraftData = false; |
- } else { |
- hasPendingPreviewRequest = true; |
- generateDraftData = true; |
- pageSettings.updatePageSelection(); |
- } |
- |
- printSettings.save(); |
- layoutSettings.updateState(); |
- previewArea.resetState(); |
- isPrintReadyMetafileReady = false; |
- isFirstPageLoaded = false; |
- |
- var totalPageCount = pageSettings.totalPageCount; |
- if (!previewModifiable && totalPageCount > 0) |
- generateDraftData = false; |
-} |
- |
-/** |
- * Asks the browser to generate a preview PDF based on current print settings. |
- */ |
-function requestPrintPreview() { |
- updateStateForPreview(); |
- var totalPageCount = pageSettings.totalPageCount; |
- var pageCount = totalPageCount || -1; |
- chrome.send('getPreview', [JSON.stringify(getSettingsWithRequestID()), |
- pageCount, |
- previewModifiable]); |
-} |
- |
-/** |
- * Called from PrintPreviewUI::OnFileSelectionCancelled to notify the print |
- * preview tab regarding the file selection cancel event. |
- */ |
-function fileSelectionCancelled() { |
- printHeader.enableCancelButton(); |
-} |
- |
-/** |
- * Called from PrintPreviewUI::OnFileSelectionCompleted to notify the print |
- * preview tab regarding the file selection completed event. |
- */ |
-function fileSelectionCompleted() { |
- // If the file selection is completed and the tab is not already closed it |
- // means that a pending print to pdf request exists. |
- disableInputElementsInSidebar(); |
- previewArea.showCustomMessage( |
- localStrings.getString('printingToPDFInProgress')); |
-} |
- |
-/** |
- * Set the default printer. If there is one, generate a print preview. |
- * @param {string} printerName Name of the default printer. Empty if none. |
- * @param {string} cloudPrintData Cloud print related data to restore if |
- * the default printer is a cloud printer. |
- */ |
-function setDefaultPrinter(printerName, cloudPrintData) { |
- // Add a placeholder value so the printer list looks valid. |
- addDestinationListOption('', '', true, true, true); |
- if (printerName) { |
- defaultOrLastUsedPrinterName = printerName; |
- if (cloudPrintData) { |
- cloudprint.setDefaultPrinter(printerName, |
- cloudPrintData, |
- addDestinationListOptionAtPosition, |
- doUpdateCloudPrinterCapabilities); |
- } else { |
- $('printer-list')[0].value = defaultOrLastUsedPrinterName; |
- updateControlsWithSelectedPrinterCapabilities(); |
- } |
- } |
- chrome.send('getPrinters'); |
-} |
- |
-/** |
- * Fill the printer list drop down. |
- * Called from PrintPreviewHandler::SetupPrinterList(). |
- * @param {Array} printers Array of printer info objects. |
- */ |
-function setPrinters(printers) { |
- var printerList = $('printer-list'); |
- // Remove empty entry added by setDefaultPrinter. |
- if (printerList[0] && printerList[0].textContent == '') |
- printerList.remove(0); |
- for (var i = 0; i < printers.length; ++i) { |
- var isDefault = (printers[i].deviceName == defaultOrLastUsedPrinterName); |
- addDestinationListOption(printers[i].printerName, printers[i].deviceName, |
- isDefault, false, false); |
- } |
- |
- if (printers.length != 0) |
- addDestinationListOption('', '', false, true, true); |
- |
- // Adding option for saving PDF to disk. |
- addDestinationListOption(localStrings.getString('printToPDF'), |
- PRINT_TO_PDF, |
- defaultOrLastUsedPrinterName == PRINT_TO_PDF, |
- false, |
- false); |
- addDestinationListOption('', '', false, true, true); |
- if (useCloudPrint) { |
- addDestinationListOption(localStrings.getString('printWithCloudPrint'), |
- PRINT_WITH_CLOUD_PRINT, |
- false, |
- false, |
- false); |
- addDestinationListOption('', '', false, true, true); |
- } |
- // Add options to manage printers. |
- if (!cr.isChromeOS) { |
- addDestinationListOption(localStrings.getString('managePrinters'), |
- MANAGE_LOCAL_PRINTERS, false, false, false); |
- } else if (useCloudPrint) { |
- // Fetch recent printers. |
- cloudprint.fetchPrinters(addDestinationListOptionAtPosition, false); |
- // Fetch the full printer list. |
- cloudprint.fetchPrinters(addDestinationListOptionAtPosition, true); |
- addDestinationListOption(localStrings.getString('managePrinters'), |
- MANAGE_CLOUD_PRINTERS, false, false, false); |
- } |
- |
- printerList.disabled = false; |
- |
- if (!hasRequestedPreview()) |
- updateControlsWithSelectedPrinterCapabilities(); |
-} |
- |
-/** |
- * Creates an option that can be added to the printer destination list. |
- * @param {string} optionText specifies the option text content. |
- * @param {string} optionValue specifies the option value. |
- * @param {boolean} isDefault is true if the option needs to be selected. |
- * @param {boolean} isDisabled is true if the option needs to be disabled. |
- * @param {boolean} isSeparator is true if the option is a visual separator and |
- * needs to be disabled. |
- * @return {Object} The created option. |
- */ |
-function createDestinationListOption(optionText, optionValue, isDefault, |
- isDisabled, isSeparator) { |
- var option = document.createElement('option'); |
- option.textContent = optionText; |
- option.value = optionValue; |
- option.selected = isDefault; |
- option.disabled = isSeparator || isDisabled; |
- // Adding attribute for improved accessibility. |
- if (isSeparator) |
- option.setAttribute('role', 'separator'); |
- return option; |
-} |
- |
-/** |
- * Adds an option to the printer destination list. |
- * @param {string} optionText specifies the option text content. |
- * @param {string} optionValue specifies the option value. |
- * @param {boolean} isDefault is true if the option needs to be selected. |
- * @param {boolean} isDisabled is true if the option needs to be disabled. |
- * @param {boolean} isSeparator is true if the option serves just as a |
- * separator. |
- * @return {Object} The created option. |
- */ |
-function addDestinationListOption(optionText, optionValue, isDefault, |
- isDisabled, isSeparator) { |
- var option = createDestinationListOption(optionText, |
- optionValue, |
- isDefault, |
- isDisabled, |
- isSeparator); |
- $('printer-list').add(option); |
- return option; |
-} |
- |
-/** |
- * Adds an option to the printer destination list at a specified position. |
- * @param {number} position The index in the printer-list wher the option |
- should be created. |
- * @param {string} optionText specifies the option text content. |
- * @param {string} optionValue specifies the option value. |
- * @param {boolean} isDefault is true if the option needs to be selected. |
- * @param {boolean} isDisabled is true if the option needs to be disabled. |
- * @param {boolean} isSeparator is true if the option is a visual separator and |
- * needs to be disabled. |
- * @return {Object} The created option. |
- */ |
-function addDestinationListOptionAtPosition(position, |
- optionText, |
- optionValue, |
- isDefault, |
- isDisabled, |
- isSeparator) { |
- var option = createDestinationListOption(optionText, |
- optionValue, |
- isDefault, |
- isDisabled, |
- isSeparator); |
- var printerList = $('printer-list'); |
- var before = printerList[position]; |
- printerList.add(option, before); |
- return option; |
-} |
-/** |
- * Sets the color mode for the PDF plugin. |
- * Called from PrintPreviewHandler::ProcessColorSetting(). |
- * @param {boolean} color is true if the PDF plugin should display in color. |
- */ |
-function setColor(color) { |
- if (!previewArea.pdfPlugin) |
- return; |
- |
- previewArea.pdfPlugin.grayscale(!color); |
- var printerList = $('printer-list'); |
- cloudprint.setColor(printerList[printerList.selectedIndex], color); |
-} |
- |
-/** |
- * Display an error message when print preview fails. |
- * Called from PrintPreviewMessageHandler::OnPrintPreviewFailed(). |
- */ |
-function printPreviewFailed() { |
- previewArea.displayErrorMessageAndNotify( |
- localStrings.getString('previewFailed')); |
-} |
- |
-/** |
- * Display an error message when encountered invalid printer settings. |
- * Called from PrintPreviewMessageHandler::OnInvalidPrinterSettings(). |
- */ |
-function invalidPrinterSettings() { |
- if (cr.isMac) { |
- if (previewAppRequested) { |
- $('open-preview-app-throbber').hidden = true; |
- previewArea.clearCustomMessageWithDots(); |
- previewAppRequested = false; |
- hasPendingPrintDocumentRequest = false; |
- enableInputElementsInSidebar(); |
- } |
- $('open-pdf-in-preview-link').disabled = true; |
- } |
- previewArea.displayErrorMessageAndNotify( |
- localStrings.getString('invalidPrinterSettings')); |
-} |
- |
-/** |
- * Called when the PDF plugin loads its document. |
- */ |
-function onPDFLoad() { |
- if (previewModifiable) { |
- setPluginPreviewPageCount(); |
- } else { |
- // If the source is pdf, print ready metafile is available only after |
- // loading the pdf in the plugin. |
- isPrintReadyMetafileReady = true; |
- } |
- // Instruct the plugin which page numbers to display in the page number |
- // indicator. |
- previewArea.pdfPlugin.setPageNumbers( |
- JSON.stringify(pageSettings.selectedPagesSet)); |
- cr.dispatchSimpleEvent(document, customEvents.PDF_LOADED); |
- isFirstPageLoaded = true; |
- checkAndHideOverlayLayerIfValid(); |
- sendPrintDocumentRequestIfNeeded(); |
- if (printAutomaticallyInKioskMode) |
- printHeader.printButton.click(); |
-} |
- |
-function setPluginPreviewPageCount() { |
- previewArea.pdfPlugin.printPreviewPageCount( |
- pageSettings.previouslySelectedPages.length); |
-} |
- |
-/** |
- * Update the page count and check the page range. |
- * Called from PrintPreviewUI::OnDidGetPreviewPageCount(). |
- * @param {number} pageCount The number of pages. |
- * @param {number} previewResponseId The preview request id that resulted in |
- * this response. |
- */ |
-function onDidGetPreviewPageCount(pageCount, previewResponseId) { |
- if (!isExpectedPreviewResponse(previewResponseId)) |
- return; |
- pageSettings.updateState(pageCount); |
- if (!previewModifiable && pageSettings.requestPrintPreviewIfNeeded()) |
- return; |
- |
- cr.dispatchSimpleEvent(document, customEvents.UPDATE_SUMMARY); |
-} |
- |
-/** |
- * @param {{contentWidth: number, contentHeight: number, marginLeft: number, |
- * marginRight: number, marginTop: number, marginBottom: number, |
- * printableAreaX: number, printableAreaY: number, |
- * printableAreaWidth: number, printableAreaHeight: number}} pageLayout |
- * Specifies default page layout details in points. |
- * @param {boolean} hasCustomPageSizeStyle Indicates whether the previewed |
- * document has a custom page size style. |
- */ |
-function onDidGetDefaultPageLayout(pageLayout, hasCustomPageSizeStyle) { |
- hasPageSizeStyle = hasCustomPageSizeStyle; |
- marginSettings.currentDefaultPageLayout = new print_preview.PageLayout( |
- pageLayout.contentWidth, |
- pageLayout.contentHeight, |
- pageLayout.marginLeft, |
- pageLayout.marginTop, |
- pageLayout.marginRight, |
- pageLayout.marginBottom); |
- headerFooterSettings.checkAndHideHeaderFooterOption( |
- pageLayout, marginSettings.selectedMarginsValue); |
-} |
- |
-/** |
- * This function sends a request to hide the overlay layer only if there is no |
- * pending print document request and we are not waiting for the print ready |
- * metafile. |
- */ |
-function checkAndHideOverlayLayerIfValid() { |
- var selectedPrinter = getSelectedPrinterName(); |
- var printToDialog = selectedPrinter == PRINT_TO_PDF || |
- selectedPrinter == PRINT_WITH_CLOUD_PRINT; |
- if ((printToDialog || !previewModifiable) && |
- !isPrintReadyMetafileReady && hasPendingPrintDocumentRequest) { |
- return; |
- } |
- previewArea.hideOverlayLayer(); |
-} |
- |
-/** |
- * Called when no pipelining previewed pages. |
- * @param {string} previewUid Preview unique identifier. |
- * @param {number} previewResponseId The preview request id that resulted in |
- * this response. |
- */ |
-function reloadPreviewPages(previewUid, previewResponseId) { |
- if (!isExpectedPreviewResponse(previewResponseId)) |
- return; |
- |
- if (!previewModifiable) |
- previewArea.createOrReloadPDFPlugin(PRINT_READY_DATA_INDEX); |
- cr.dispatchSimpleEvent(document, customEvents.UPDATE_PRINT_BUTTON); |
- checkAndHideOverlayLayerIfValid(); |
- var pageSet = pageSettings.previouslySelectedPages; |
- for (var i = 0; i < pageSet.length; i++) { |
- previewArea.pdfPlugin.loadPreviewPage( |
- getPageSrcURL(previewUid, pageSet[i] - 1), i); |
- } |
- |
- hasPendingPreviewRequest = false; |
- isPrintReadyMetafileReady = true; |
- previewArea.pdfLoaded = true; |
- sendPrintDocumentRequestIfNeeded(); |
-} |
- |
-/** |
- * Notification that a print preview page has been rendered. |
- * Check if the settings have changed and request a regeneration if needed. |
- * Called from PrintPreviewUI::OnDidPreviewPage(). |
- * @param {number} pageNumber The page number, 0-based. |
- * @param {string} previewUid Preview unique identifier. |
- * @param {number} previewResponseId The preview request id that resulted in |
- * this response. |
- */ |
-function onDidPreviewPage(pageNumber, previewUid, previewResponseId) { |
- if (!isExpectedPreviewResponse(previewResponseId)) |
- return; |
- |
- // Refactor |
- if (!previewModifiable) |
- return; |
- |
- if (pageSettings.requestPrintPreviewIfNeeded()) |
- return; |
- |
- var pageIndex = pageSettings.previouslySelectedPages.indexOf(pageNumber + 1); |
- if (pageIndex == -1) |
- return; |
- |
- currentPreviewUid = previewUid; |
- if (pageIndex == 0) |
- previewArea.createOrReloadPDFPlugin(pageNumber); |
- |
- previewArea.pdfPlugin.loadPreviewPage( |
- getPageSrcURL(previewUid, pageNumber), pageIndex); |
- |
- if (pageIndex + 1 == pageSettings.previouslySelectedPages.length) { |
- hasPendingPreviewRequest = false; |
- if (pageIndex != 0) |
- sendPrintDocumentRequestIfNeeded(); |
- } |
-} |
- |
-/** |
- * Update the print preview when new preview data is available. |
- * Create the PDF plugin as needed. |
- * Called from PrintPreviewUI::PreviewDataIsAvailable(). |
- * @param {string} previewUid Preview unique identifier. |
- * @param {number} previewResponseId The preview request id that resulted in |
- * this response. |
- */ |
-function updatePrintPreview(previewUid, previewResponseId) { |
- if (!isExpectedPreviewResponse(previewResponseId)) |
- return; |
- |
- if (!previewModifiable) { |
- // If the preview is not modifiable the plugin has not been created yet. |
- currentPreviewUid = previewUid; |
- hasPendingPreviewRequest = false; |
- previewArea.createOrReloadPDFPlugin(PRINT_READY_DATA_INDEX); |
- } else { |
- isPrintReadyMetafileReady = true; |
- } |
- |
- cr.dispatchSimpleEvent(document, customEvents.UPDATE_PRINT_BUTTON); |
- if (previewModifiable) |
- sendPrintDocumentRequestIfNeeded(); |
-} |
- |
-/** |
- * Checks to see if the requested print data is available for printing and |
- * sends a print document request if needed. |
- */ |
-function sendPrintDocumentRequestIfNeeded() { |
- if (!hasPendingPrintDocumentRequest || !isFirstPageLoaded) |
- return; |
- |
- // If the selected printer is PRINT_TO_PDF or PRINT_WITH_CLOUD_PRINT or |
- // the preview source is not modifiable, we need the print ready data for |
- // printing. If the preview source is modifiable, we need to wait till all |
- // the requested pages are loaded in the plugin for printing. |
- var selectedPrinter = getSelectedPrinterName(); |
- var printToDialog = selectedPrinter == PRINT_TO_PDF || |
- selectedPrinter == PRINT_WITH_CLOUD_PRINT; |
- if (((printToDialog || !previewModifiable) && !isPrintReadyMetafileReady) || |
- (previewModifiable && hasPendingPreviewRequest)) { |
- return; |
- } |
- |
- hasPendingPrintDocumentRequest = false; |
- |
- if (!areSettingsValid()) { |
- cancelPendingPrintRequest(); |
- return; |
- } |
- sendPrintDocumentRequest(); |
-} |
- |
-/** |
- * Check if only page selection has been changed since the last preview request |
- * and is valid. |
- * @return {boolean} true if the new page selection is valid. |
- */ |
-function hasOnlyPageSettingsChanged() { |
- var tempPrintSettings = new PrintSettings(); |
- tempPrintSettings.save(); |
- |
- return !!(printSettings.deviceName == tempPrintSettings.deviceName && |
- printSettings.isLandscape == tempPrintSettings.isLandscape && |
- printSettings.hasHeaderFooter == |
- tempPrintSettings.hasHeaderFooter && |
- pageSettings.hasPageSelectionChangedAndIsValid()); |
-} |
- |
-/** |
- * Called either when there is a scroll event or when the plugin size changes. |
- */ |
-function onPreviewPositionChanged() { |
- marginSettings.onPreviewPositionChanged(); |
-} |
- |
-/** |
- * @return {boolean} true if a compatible pdf plugin exists. |
- */ |
-function checkCompatiblePluginExists() { |
- var dummyPlugin = $('dummy-viewer'); |
- var pluginInterface = [dummyPlugin.onload, |
- dummyPlugin.goToPage, |
- dummyPlugin.removePrintButton, |
- dummyPlugin.loadPreviewPage, |
- dummyPlugin.printPreviewPageCount, |
- dummyPlugin.resetPrintPreviewUrl, |
- dummyPlugin.onPluginSizeChanged, |
- dummyPlugin.onScroll, |
- dummyPlugin.pageXOffset, |
- dummyPlugin.pageYOffset, |
- dummyPlugin.setZoomLevel, |
- dummyPlugin.setPageNumbers, |
- dummyPlugin.setPageXOffset, |
- dummyPlugin.setPageYOffset, |
- dummyPlugin.getHorizontalScrollbarThickness, |
- dummyPlugin.getVerticalScrollbarThickness, |
- dummyPlugin.getPageLocationNormalized, |
- dummyPlugin.getHeight, |
- dummyPlugin.getWidth]; |
- |
- for (var i = 0; i < pluginInterface.length; i++) { |
- if (!pluginInterface[i]) |
- return false; |
- } |
- return true; |
-} |
- |
-/** |
- * Sets the default values and sends a request to regenerate preview data. |
- * Resets the margin options only if |resetMargins| is true. |
- * @param {boolean} resetMargins True if margin settings should be resetted. |
- */ |
-function setDefaultValuesAndRegeneratePreview(resetMargins) { |
- if (resetMargins) |
- marginSettings.resetMarginsIfNeeded(); |
- pageSettings.resetState(); |
- requestPrintPreview(); |
-} |
- |
-/** |
- * Class that represents the state of the print settings. |
- * @constructor |
- */ |
-function PrintSettings() { |
- this.deviceName = ''; |
- this.isLandscape = ''; |
- this.hasHeaderFooter = ''; |
-} |
- |
-/** |
- * Takes a snapshot of the print settings. |
- */ |
-PrintSettings.prototype.save = function() { |
- this.deviceName = getSelectedPrinterName(); |
- this.isLandscape = layoutSettings.isLandscape(); |
- this.hasHeaderFooter = headerFooterSettings.hasHeaderFooter(); |
-}; |
- |
-/** |
- * Updates the title of the print preview tab according to |initiatorTabTitle|. |
- * @param {string} initiatorTabTitle The title of the initiator tab. |
- */ |
-function setInitiatorTabTitle(initiatorTabTitle) { |
- if (initiatorTabTitle == '') |
- return; |
- document.title = localStrings.getStringF( |
- 'printPreviewTitleFormat', initiatorTabTitle); |
-} |
- |
-/** |
- * Closes this print preview tab. |
- */ |
-function closePrintPreviewTab() { |
- window.removeEventListener('keydown', onKeyDown); |
- chrome.send('closePrintPreviewTab'); |
- chrome.send('DialogClose'); |
-} |
- |
-/** |
- * Pass certain directional keyboard events to the PDF viewer. |
- * @param {Event} e The keydown event. |
- */ |
-function tryToHandleDirectionKeyDown(e) { |
- // Make sure the PDF plugin is there. |
- if (!previewArea.pdfPlugin) |
- return; |
- |
- // We only care about: PageUp, PageDown, Left, Up, Right, Down. |
- if (!(e.keyCode == 33 || e.keyCode == 34 || |
- (e.keyCode >= 37 && e.keyCode <= 40))) { |
- return; |
- } |
- |
- // If the user is holding a modifier key, ignore. |
- if (e.metaKey || e.altKey || e.shiftKey || e.ctrlKey) |
- return; |
- |
- // Don't handle the key event for these elements. |
- var tagName = document.activeElement.tagName; |
- if (tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'EMBED') |
- return; |
- |
- // For the most part, if any div of header was the last clicked element, |
- // then the active element is the body. Starting with the last clicked |
- // element, and work up the DOM tree to see if any element has a scrollbar. |
- // If there exists a scrollbar, do not handle the key event here. |
- var element = document.activeElement; |
- if (element == document.body) { |
- if (lastClickedElement) |
- element = lastClickedElement; |
- while (element) { |
- if (element.scrollHeight > element.clientHeight) |
+ this.printDocumentOrOpenPdfPreview_(true /*isPdfPreview*/); |
+ }, |
+ |
+ /** |
+ * Called when the print header's print button is clicked. Prints the |
+ * document. |
+ * @private |
+ */ |
+ onPrintButtonClick_: function() { |
+ assert(this.uiState_ == PrintPreview.UiState_.READY, |
+ 'Trying to print when not in ready state: ' + this.uiState_); |
+ this.printDocumentOrOpenPdfPreview_(false /*isPdfPreview*/); |
+ }, |
+ |
+ /** |
+ * Called when the print header's cancel button is clicked. Closes the |
+ * print dialog. |
+ * @private |
+ */ |
+ onCancelButtonClick_: function() { |
+ this.close_(); |
+ }, |
+ |
+ /** |
+ * Consume escape key presses and ctrl + shift + p. Delegate everything else |
+ * to the preview area. |
+ * @param {KeyboardEvent} e The keyboard event. |
+ * @private |
+ */ |
+ onKeyDown_: function(e) { |
+ // Escape key closes the dialog. |
+ if (e.keyCode == 27 && !e.shiftKey && !e.ctrlKey && !e.altKey && |
+ !e.metaKey) { |
+ this.close_(); |
+ e.preventDefault(); |
return; |
- element = element.parentElement; |
+ } |
+ |
+ // Ctrl + Shift + p / Mac equivalent. |
+ if (e.keyCode == 80) { |
+ if ((cr.isMac && e.metaKey && e.altKey && !e.shiftKey && !e.ctrlKey) || |
+ (!cr.isMac && e.shiftKey && e.ctrlKey && !e.altKey && !e.metaKey)) { |
+ this.openSystemPrintDialog_(); |
+ e.preventDefault(); |
+ return; |
+ } |
+ } |
+ |
+ // Pass certain directional keyboard events to the PDF viewer. |
+ this.previewArea_.handleDirectionalKeyEvent(e); |
+ }, |
+ |
+ /** |
+ * Called when native layer receives invalid settings for a print request. |
+ * @private |
+ */ |
+ onSettingsInvalid_: function() { |
+ this.uiState_ = PrintPreview.UiState_.ERROR; |
+ this.previewArea_.showCustomMessage( |
+ localStrings.getString('invalidPrinterSettings')); |
+ }, |
+ |
+ /** |
+ * Called when the native layer dispatches a DISABLE_SCALING event. Updates |
+ * the print ticket. |
+ * @private |
+ */ |
+ onDisableScaling_: function() { |
+ this.printTicketStore_.updateFitToPage(false); |
+ }, |
+ |
+ /** |
+ * Called when the user selects the "Manage printers..." option in the |
+ * destination select. |
+ * @private |
+ */ |
+ onManagePrinters_: function() { |
+ if (cr.isChromeOS) { |
+ this.nativeLayer_.startManageCloudPrinters(); |
+ } else { |
+ this.nativeLayer_.startManageLocalPrinters(); |
+ } |
} |
- } |
- |
- // No scroll bar anywhere, or the active element is something else, like a |
- // button. Note: buttons have a bigger scrollHeight than clientHeight. |
- previewArea.pdfPlugin.sendKeyEvent(e.keyCode); |
- e.preventDefault(); |
-} |
- |
-/** |
- * Handle keyboard events. |
- * @param {KeyboardEvent} e The keyboard event. |
- */ |
-function onKeyDown(e) { |
- // Escape key closes the dialog. |
- if (e.keyCode == 27 && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) { |
- printHeader.disableCancelButton(); |
- closePrintPreviewTab(); |
- e.preventDefault(); |
- } |
- // Ctrl + Shift + p / Mac equivalent. |
- if (e.keyCode == 80) { |
- if ((cr.isMac && e.metaKey && e.altKey && !e.shiftKey && !e.ctrlKey) || |
- (!cr.isMac && e.shiftKey && e.ctrlKey && !e.altKey && !e.metaKey)) { |
- window.removeEventListener('keydown', onKeyDown); |
- onSystemDialogLinkClicked(); |
- e.preventDefault(); |
- } |
- } |
- |
- tryToHandleDirectionKeyDown(e); |
-} |
- |
-window.addEventListener('DOMContentLoaded', onLoad); |
-window.addEventListener('keydown', onKeyDown); |
- |
-/// Pull in all other scripts in a single shot. |
+ }; |
+ |
+ // Export |
+ return { |
+ PrintPreview: PrintPreview |
+ }; |
+}); |
+ |
+// Pull in all other scripts in a single shot. |
+<include src="data/page_number_set.js"/> |
+<include src="data/destination.js"/> |
+<include src="data/local_parsers.js"/> |
+<include src="data/cloud_parsers.js"/> |
+<include src="data/chromium_capabilities.js"/> |
+<include src="data/cloud_capabilities.js"/> |
+<include src="data/destination_store.js"/> |
+<include src="data/margins.js"/> |
+<include src="data/document_info.js"/> |
+<include src="data/printable_area.js"/> |
+<include src="data/measurement_system.js"/> |
+<include src="data/print_ticket_store.js"/> |
+<include src="data/coordinate2d.js"/> |
+<include src="data/size.js"/> |
+<include src="data/capabilities_holder.js"/> |
+ |
+<include src="data/ticket_items/ticket_item.js"/> |
+ |
+<include src="data/ticket_items/custom_margins.js"/> |
+<include src="data/ticket_items/collate.js"/> |
+<include src="data/ticket_items/color.js"/> |
+<include src="data/ticket_items/copies.js"/> |
+<include src="data/ticket_items/duplex.js"/> |
+<include src="data/ticket_items/header_footer.js"/> |
+<include src="data/ticket_items/landscape.js"/> |
+<include src="data/ticket_items/margins_type.js"/> |
+<include src="data/ticket_items/page_range.js"/> |
+<include src="data/ticket_items/fit_to_page.js"/> |
+ |
+<include src="native_layer.js"/> |
<include src="print_preview_animations.js"/> |
-<include src="print_preview_cloud.js"/> |
+<include src="cloud_print_interface.js"/> |
<include src="print_preview_utils.js"/> |
<include src="print_header.js"/> |
-<include src="page_settings.js"/> |
-<include src="copies_settings.js"/> |
-<include src="header_footer_settings.js"/> |
-<include src="fit_to_page_settings.js"/> |
-<include src="layout_settings.js"/> |
-<include src="color_settings.js"/> |
-<include src="margin_settings.js"/> |
-<include src="margin_textbox.js"/> |
-<include src="margin_utils.js"/> |
-<include src="margins_ui.js"/> |
-<include src="margins_ui_pair.js"/> |
-<include src="more_options.js"/> |
-<include src="preview_area.js"/> |
+ |
+<include src="settings/page_settings.js"/> |
+<include src="settings/copies_settings.js"/> |
+<include src="settings/layout_settings.js"/> |
+<include src="settings/color_settings.js"/> |
+<include src="settings/margin_settings.js"/> |
+<include src="settings/destination_settings.js"/> |
+<include src="settings/other_options_settings.js"/> |
+ |
+<include src="previewarea/margin_control.js"/> |
+<include src="previewarea/margin_control_container.js"/> |
+<include src="previewarea/preview_area.js"/> |
+<include src="preview_generator.js"/> |
+ |
+var printPreview = new print_preview.PrintPreview(); |