Chromium Code Reviews| Index: chrome/browser/resources/print_preview/preview_generator.js |
| diff --git a/chrome/browser/resources/print_preview/preview_generator.js b/chrome/browser/resources/print_preview/preview_generator.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8bb5a1b3b9d7e3bbbde6b08a3830a38e54807df6 |
| --- /dev/null |
| +++ b/chrome/browser/resources/print_preview/preview_generator.js |
| @@ -0,0 +1,348 @@ |
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +cr.define('print_preview', function() { |
| + 'use strict'; |
| + |
| + // TODO Need to handle termination case--detach event listeners from native |
| + // layer. |
| + |
| + /** |
| + * Interface to the Chromium print preview generator. |
| + * |
| + * @param {!print_preview.DestinationStore} destinationStore Used to get the |
| + * currently selected destination. |
| + * @param {!print_preview.PrintTicketStore} printTicketStore Used to read the |
| + * state of the ticket and write document information. |
| + * @param {!print_preview.NativeLayer} nativeLayer Used to communicate to |
| + * Chromium's preview rendering system. |
| + * @constructor |
| + * @extends {cr.EventTarget} |
| + */ |
| + function PreviewGenerator(destinationStore, printTicketStore, nativeLayer) { |
| + cr.EventTarget.call(this); |
| + |
| + /** |
| + * Used to get the currently selected destination. |
| + * @type {!print_preview.DestinationStore} |
| + * @private |
| + */ |
| + this.destinationStore_ = destinationStore; |
| + |
| + /** |
| + * Used to read the state of the ticket and write document information. |
| + * @type {!print_preview.PrintTicketStore} |
| + * @private |
| + */ |
| + this.printTicketStore_ = printTicketStore; |
| + |
| + /** |
| + * Interface to the Chromium native layer. |
| + * @type {!print_preview.NativeLayer} |
| + * @private |
| + */ |
| + this.nativeLayer_ = nativeLayer; |
| + |
| + /** |
| + * ID of current in-flight request. Requests that do not share this ID will |
| + * be ignored. |
| + * @type {number} |
| + * @private |
| + */ |
| + this.inFlightRequestId_ = -1; |
| + |
| + /** |
| + * Whether the previews are being generated in landscape mode. |
| + * @type {boolean} |
| + * @private |
| + */ |
| + this.isLandscapeEnabled_ = false; |
| + |
| + /** |
| + * Whether the previews are being generated with a header and footer. |
| + * @type {boolean} |
| + * @private |
| + */ |
| + this.isHeaderFooterEnabled_ = false; |
| + |
| + /** |
| + * Whether the previews are being generated in color. |
| + * @type {boolean} |
| + * @private |
| + */ |
| + this.isColorEnabled_ = false; |
| + |
| + /** |
| + * Page number set used to generate the last preview. |
| + * @type {print_preview.PageNumberSet} |
| + * @private |
| + */ |
| + this.pageNumberSet_ = null; |
| + |
| + /** |
| + * Margins type used to generate the last preview. |
| + * @type {print_preview.Margins.Type} |
| + * @private |
| + */ |
| + this.marginsType_ = print_preview.Margins.Type.DEFAULT; |
| + |
| + /** |
| + * Custom margins used to generate the last preview. |
| + * @type {print_preview.Margins} |
| + * @private |
| + */ |
| + this.customMargins_ = null; |
| + |
| + /** |
| + * Event tracker used to keep track of native layer events. |
| + * @type {!EventTracker} |
| + * @private |
| + */ |
| + this.tracker_ = new EventTracker(); |
| + |
| + this.addEventListeners_(); |
| + }; |
| + |
| + /** |
| + * Events dispatched by the preview generator. |
| + * @enum {string} |
| + */ |
| + PreviewGenerator.Event = { |
| + // Dispatched when the document can be printed. |
| + DOCUMENT_READY: 'print_preview.PreviewGenerator.DOCUMENT_READY', |
| + |
| + // Dispatched when a page preview is ready. The previewIndex field of the |
| + // event is the index of the page in the modified document, not the |
| + // original. So page 4 of the original document might be previewIndex = 0 of |
| + // the modified document. |
| + PAGE_READY: 'print_preview.PreviewGenerator.PAGE_READY', |
| + |
| + // Dispatched when the current print preview request fails. |
| + FAIL: 'print_preview.PreviewGenerator.FAIL' |
| + }; |
| + |
| + PreviewGenerator.prototype = { |
| + __proto__: cr.EventTarget.prototype, |
| + |
| + /** @override */ |
| + dispatchEvent: function(evt) { |
| + // TODO REMOVE ME |
| + log(evt.type); |
| + cr.EventTarget.prototype.dispatchEvent.call(this, evt); |
| + }, |
| + |
| + /** |
| + * Request that new preview be generated. A preview request will not be |
| + * generated if the print ticket has not changed sufficiently. |
| + */ |
| + requestPreview: function() { |
| + if (this.hasPreviewChanged_()) { |
| + log('print_preview.PreviewGenerator.requestPreview'); |
| + this.isLandscapeEnabled_ = this.printTicketStore_.isLandscapeEnabled(); |
| + this.isHeaderFooterEnabled_ = |
| + this.printTicketStore_.isHeaderFooterEnabled(); |
| + this.isColorEnabled_ = this.printTicketStore_.isColorEnabled(); |
| + this.pageNumberSet_ = this.printTicketStore_.getPageNumberSet(); |
| + this.marginsType_ = this.printTicketStore_.getMarginsType(); |
| + this.customMargins_ = this.printTicketStore_.getCustomMargins(); |
| + |
| + this.inFlightRequestId_++; |
| + this.nativeLayer_.startGetPreview( |
| + this.destinationStore_.selectedDestination, |
| + this.printTicketStore_, |
| + this.inFlightRequestId_); |
| + } |
| + }, |
| + |
| + /** Removes all event listeners that the preview generator has attached. */ |
| + removeEventListeners: function() { |
| + this.tracker_.removeAll(); |
| + }, |
| + |
| + /** |
| + * Adds event listeners to the relevant native layer events. |
| + * @private |
| + */ |
| + addEventListeners_: function() { |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PAGE_LAYOUT_CHANGE, |
| + this.onPageLayoutChange_.bind(this)); |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PAGE_COUNT_CHANGE, |
| + this.onPageCountChange_.bind(this)); |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PREVIEW_RELOAD, |
| + this.onPreviewReload_.bind(this)); |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PAGE_PREVIEW_READY, |
| + this.onPagePreviewReady_.bind(this)); |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PREVIEW_GENERATION_DONE, |
| + this.onPreviewGenerationDone_.bind(this)); |
| + this.tracker_.add( |
| + this.nativeLayer_, |
| + print_preview.NativeLayer.Event.PREVIEW_GENERATION_FAIL, |
| + this.onPreviewGenerationFail_.bind(this)); |
| + }, |
| + |
| + /** |
| + * Dispatches a PAGE_READY event to signal that a page preview is ready. |
| + * @param {number} previewIndex Index of the page with respect to the pages |
| + * shown in the preview. E.g an index of 0 might be the fifth page in |
|
dpapad
2012/04/24 01:24:56
Took me a while to parse this comment. I think it
Robert Toscano
2012/04/24 22:29:56
Done.
|
| + * in the document, but it will be the first page to be shown in the |
| + * preview. |
| + * @param {number} pageNumber Number of the page with respect to the |
| + * document. A value of 3 means it's the third page of the document. |
| + * @param {string} previewUid Unique identifier of the preview. |
| + * @private |
| + */ |
| + dispatchPageReadyEvent_: function(previewIndex, pageNumber, previewUid) { |
| + var pageGenEvt = new cr.Event(PreviewGenerator.Event.PAGE_READY); |
| + pageGenEvt.previewIndex = previewIndex; |
| + pageGenEvt.previewUrl = |
| + 'chrome://print/' + previewUid + '/' + (pageNumber - 1) + |
| + '/print.pdf'; |
| + this.dispatchEvent(pageGenEvt); |
| + }, |
| + |
| + /** |
| + * Called when the page layout of the document has changed. Always occurs |
| + * as a result of a preview request. |
| + * @param {cr.Event} evt Contains layout info about the document. |
| + * @private |
| + */ |
| + onPageLayoutChange_: function(evt) { |
| + // NOTE: A request ID is not specified, so assuming its for the current |
| + // in-flight request. |
| + |
| + // TODO Do we need this? |
| + //var hasCustomPageSizeStyle = evt.hasCustomPageSizeStyle; |
| + |
| + // Printable area info is unavailable on linux nor Google Chrome OS. |
| + // TODO Maybe we can not have to have this if condition, and always set |
| + // printable area? |
| + log(JSON.stringify(evt.pageLayout)); |
| + if (!cr.isLinux && !cr.isChromeOS) { |
| + var origin = new print_preview.Coordinate2d( |
| + evt.pageLayout.printableAreaX, |
| + evt.pageLayout.printableAreaY); |
| + var size = new print_preview.Size( |
| + evt.pageLayout.printableAreaWidth, |
| + evt.pageLayout.printableAreaHeight); |
| + this.printTicketStore_.updatePrintableArea( |
| + new print_preview.PrintableArea(origin, size)); |
| + } // TODO else create a default printable area? |
| + |
| + var margins = new print_preview.Margins( |
| + evt.pageLayout.marginTop, |
| + evt.pageLayout.marginRight, |
| + evt.pageLayout.marginBottom, |
| + evt.pageLayout.marginLeft); |
| + if (this.printTicketStore_.hasMarginsCapability()) { |
| + this.printTicketStore_.updateCustomMargins(margins); |
| + } |
| + |
| + var pageSize = new print_preview.Size( |
| + evt.pageLayout.contentWidth + margins.left + margins.right, |
| + evt.pageLayout.contentHeight + margins.top + margins.bottom); |
| + this.printTicketStore_.updatePageSize(pageSize); |
| + }, |
| + |
| + /** |
| + * Called when the document page count is received from the native layer. |
| + * Always occurs as a result of a preview request. |
| + * @param {cr.Event} evt Contains the document's page count. |
| + * @private |
| + */ |
| + onPageCountChange_: function(evt) { |
| + if (this.inFlightRequestId_ != evt.previewResponseId) { |
| + return; // Ignore old response. |
| + } |
| + this.printTicketStore_.updatePageCount(evt.pageCount); |
| + }, |
| + |
| + /** |
| + * Called when the print preview should be reloaded. |
| + * @param {cr.Event} evt Contains the preview UID and request ID. |
| + * @private |
| + */ |
| + onPreviewReload_: function(evt) { |
| + if (this.inFlightRequestId_ != evt.previewResponseId) { |
| + return; // Ignore old response. |
| + } |
| + var pageNumberSet = this.printTicketStore_.getPageNumberSet(); |
| + for (var i = 0; i < pageNumberSet.size; i++) { |
| + var pageNumber = pageNumberSet.getPageNumberAt(i); |
| + this.dispatchPageReadyEvent_(i, pageNumber, evt.previewUid); |
| + } |
| + }, |
| + |
| + /** |
| + * Called when a page's preview has been generated. Dispatches a |
| + * PAGE_READY event. |
| + * @param {cr.Event} evt Contains the page index and preview UID. |
| + * @private |
| + */ |
| + onPagePreviewReady_: function(evt) { |
| + if (this.inFlightRequestId_ != evt.previewResponseId) { |
| + return; // Ignore old response. |
| + } |
| + var pageNumber = evt.pageIndex + 1; |
| + if (this.printTicketStore_.getPageNumberSet().hasPageNumber(pageNumber)) { |
| + var previewIndex = this.printTicketStore_.getPageNumberSet() |
| + .getPageNumberIndex(pageNumber); |
| + this.dispatchPageReadyEvent_(previewIndex, pageNumber, evt.previewUid); |
| + } |
| + }, |
| + |
| + /** |
| + * Called when the preview generation is complete. Dispatches a |
| + * DOCUMENT_READY event. |
| + * @param {cr.Event} evt Contains the preview UID and response ID. |
| + * @private |
| + */ |
| + onPreviewGenerationDone_: function(evt) { |
| + if (this.inFlightRequestId_ != evt.previewResponseId) { |
| + return; // Ignore old response. |
| + } |
| + }, |
| + |
| + /** |
| + * Called when the preview generation fails. |
| + * @private |
| + */ |
| + onPreviewGenerationFail_: function() { |
| + // NOTE: No request ID is returned from Chromium so its assumed its the |
| + // current one. |
| + cr.dispatchSimpleEvent(this, PreviewGenerator.Event.FAIL); |
| + }, |
| + |
| + /** |
| + * @return {boolean} Whether the print ticket has changed sufficiently to |
| + * determine whether a new preview request should be issued. |
| + * @private |
| + */ |
| + hasPreviewChanged_: function() { |
| + var ticketStore = this.printTicketStore_; |
| + return this.inFlightRequestId_ == -1 || |
| + ticketStore.isLandscapeEnabled() != this.isLandscapeEnabled_ || |
| + ticketStore.isHeaderFooterEnabled() != this.isHeaderFooterEnabled_ || |
| + ticketStore.isColorEnabled() != this.isColorEnabled_ || |
| + !ticketStore.getPageNumberSet().equals(this.pageNumberSet_) || |
| + ticketStore.getMarginsType() != this.marginsType_ || |
| + (this.marginsType_ == print_preview.Margins.Type.CUSTOM && |
| + !ticketStore.getCustomMargins().equals(this.customMargins_)); |
| + } |
| + }; |
| + |
| + // Export |
| + return { |
| + PreviewGenerator: PreviewGenerator |
| + }; |
| +}); |