Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(200)

Unified Diff: chrome/browser/resources/print_preview/preview_generator.js

Issue 10108001: Refactor print preview web ui (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Resolve conflicts Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..4787dc4f061bc07118bc0d6bc55fb6f05fc0bd2e
--- /dev/null
+++ b/chrome/browser/resources/print_preview/preview_generator.js
@@ -0,0 +1,392 @@
+// 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';
+
+ /**
+ * 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;
+
+ /**
+ * Whether the document should be fitted to the page.
+ * @type {boolean}
+ * @private
+ */
+ this.isFitToPageEnabled_ = 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.ticket_items.MarginsType.Value}
+ * @private
+ */
+ this.marginsType_ = print_preview.ticket_items.MarginsType.Value.DEFAULT;
+
+ /**
+ * Destination that was selected for the last preview.
+ * @type {print_preview.Destination}
+ * @private
+ */
+ this.selectedDestination_ = null;
+
+ /**
+ * Event tracker used to keep track of native layer events.
+ * @type {!EventTracker}
+ * @private
+ */
+ this.tracker_ = new EventTracker();
+
+ this.addEventListeners_();
+ };
+
+ /**
+ * Event types dispatched by the preview generator.
+ * @enum {string}
+ */
+ PreviewGenerator.EventType = {
+ // 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 document preview starts to be generated.
+ PREVIEW_START: 'print_preview.PreviewGenerator.PREVIEW_START',
+
+ // Dispatched when the current print preview request fails.
+ FAIL: 'print_preview.PreviewGenerator.FAIL'
+ };
+
+ PreviewGenerator.prototype = {
+ __proto__: cr.EventTarget.prototype,
+
+ /**
+ * Request that new preview be generated. A preview request will not be
+ * generated if the print ticket has not changed sufficiently.
+ * @return {boolean} Whether a new preview was actually requested.
+ */
+ requestPreview: function() {
+ if (!this.printTicketStore_.isTicketValidForPreview()) {
+ return false;
+ }
+ if (!this.hasPreviewChanged_()) {
+ // Changes to these ticket items might not trigger a new preview, but
+ // they still need to be recorded.
+ this.marginsType_ = this.printTicketStore_.getMarginsType();
+ return false;
+ }
+ this.isLandscapeEnabled_ = this.printTicketStore_.isLandscapeEnabled();
+ this.isHeaderFooterEnabled_ =
+ this.printTicketStore_.isHeaderFooterEnabled();
+ this.isColorEnabled_ = this.printTicketStore_.isColorEnabled();
+ this.isFitToPageEnabled_ = this.printTicketStore_.isFitToPageEnabled();
+ this.pageNumberSet_ = this.printTicketStore_.getPageNumberSet();
+ this.marginsType_ = this.printTicketStore_.getMarginsType();
+ this.selectedDestination_ = this.destinationStore_.selectedDestination;
+
+ this.inFlightRequestId_++;
+ this.nativeLayer_.startGetPreview(
+ this.destinationStore_.selectedDestination,
+ this.printTicketStore_,
+ this.inFlightRequestId_);
+ return true;
+ },
+
+ /** 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.EventType.PAGE_LAYOUT_READY,
+ this.onPageLayoutReady_.bind(this));
+ this.tracker_.add(
+ this.nativeLayer_,
+ print_preview.NativeLayer.EventType.PAGE_COUNT_READY,
+ this.onPageCountReady_.bind(this));
+ this.tracker_.add(
+ this.nativeLayer_,
+ print_preview.NativeLayer.EventType.PREVIEW_RELOAD,
+ this.onPreviewReload_.bind(this));
+ this.tracker_.add(
+ this.nativeLayer_,
+ print_preview.NativeLayer.EventType.PAGE_PREVIEW_READY,
+ this.onPagePreviewReady_.bind(this));
+ this.tracker_.add(
+ this.nativeLayer_,
+ print_preview.NativeLayer.EventType.PREVIEW_GENERATION_DONE,
+ this.onPreviewGenerationDone_.bind(this));
+ this.tracker_.add(
+ this.nativeLayer_,
+ print_preview.NativeLayer.EventType.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 is the first displayed page,
+ * but not necessarily the first original document page.
+ * @param {number} pageNumber Number of the page with respect to the
+ * document. A value of 3 means it's the third page of the original
+ * document.
+ * @param {string} previewUid Unique identifier of the preview.
+ * @private
+ */
+ dispatchPageReadyEvent_: function(previewIndex, pageNumber, previewUid) {
+ var pageGenEvent = new cr.Event(PreviewGenerator.EventType.PAGE_READY);
+ pageGenEvent.previewIndex = previewIndex;
+ pageGenEvent.previewUrl =
+ 'chrome://print/' + previewUid + '/' + (pageNumber - 1) +
+ '/print.pdf';
+ this.dispatchEvent(pageGenEvent);
+ },
+
+ /**
+ * Dispatches a PREVIEW_START event. Signals that the preview should be
+ * reloaded.
+ * @param {string} previewUid Unique identifier of the preview.
+ * @private
+ */
+ dispatchPreviewStartEvent_: function(previewUid) {
+ var previewStartEvent = new cr.Event(
+ PreviewGenerator.EventType.PREVIEW_START);
+ var index = -1;
+ if (this.printTicketStore_.isDocumentModifiable) {
+ index = 0;
+ }
+ previewStartEvent.previewUrl =
+ 'chrome://print/' + previewUid + '/' + index + '/print.pdf';
+ this.dispatchEvent(previewStartEvent);
+ },
+
+ /**
+ * @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.isFitToPageEnabled() != this.isFitToPageEnabled_ ||
+ !ticketStore.getPageNumberSet().equals(this.pageNumberSet_) ||
+ (ticketStore.getMarginsType() != this.marginsType_ &&
+ ticketStore.getMarginsType() !=
+ print_preview.ticket_items.MarginsType.Value.CUSTOM) ||
+ (ticketStore.getMarginsType() ==
+ print_preview.ticket_items.MarginsType.Value.CUSTOM &&
+ !ticketStore.getCustomMargins().equals(
+ ticketStore.getDocumentMargins())) ||
+ (this.selectedDestination_ !=
+ this.destinationStore_.selectedDestination &&
+ (this.destinationStore_.selectedDestination.id ==
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF ||
+ this.selectedDestination_.id ==
+ print_preview.Destination.GooglePromotedId.SAVE_AS_PDF));
+ },
+
+ /**
+ * Called when the page layout of the document is ready. Always occurs
+ * as a result of a preview request.
+ * @param {cr.Event} event Contains layout info about the document.
+ * @private
+ */
+ onPageLayoutReady_: function(event) {
+ // NOTE: A request ID is not specified, so assuming its for the current
+ // in-flight request.
+
+ var origin = new print_preview.Coordinate2d(
+ event.pageLayout.printableAreaX,
+ event.pageLayout.printableAreaY);
+ var size = new print_preview.Size(
+ event.pageLayout.printableAreaWidth,
+ event.pageLayout.printableAreaHeight);
+
+ var margins = new print_preview.Margins(
+ Math.round(event.pageLayout.marginTop),
+ Math.round(event.pageLayout.marginRight),
+ Math.round(event.pageLayout.marginBottom),
+ Math.round(event.pageLayout.marginLeft));
+
+ var o = print_preview.ticket_items.CustomMargins.Orientation;
+ var pageSize = new print_preview.Size(
+ event.pageLayout.contentWidth +
+ margins.get(o.LEFT) + margins.get(o.RIGHT),
+ event.pageLayout.contentHeight +
+ margins.get(o.TOP) + margins.get(o.BOTTOM));
+
+ this.printTicketStore_.updateDocumentPageInfo(
+ new print_preview.PrintableArea(origin, size),
+ pageSize,
+ event.hasCustomPageSizeStyle,
+ margins);
+ },
+
+ /**
+ * Called when the document page count is received from the native layer.
+ * Always occurs as a result of a preview request.
+ * @param {cr.Event} event Contains the document's page count.
+ * @private
+ */
+ onPageCountReady_: function(event) {
+ if (this.inFlightRequestId_ != event.previewResponseId) {
+ return; // Ignore old response.
+ }
+ this.printTicketStore_.updatePageCount(event.pageCount);
+ this.pageNumberSet_ = this.printTicketStore_.getPageNumberSet();
+ },
+
+ /**
+ * Called when the print preview should be reloaded.
+ * @param {cr.Event} event Contains the preview UID and request ID.
+ * @private
+ */
+ onPreviewReload_: function(event) {
+ if (this.inFlightRequestId_ != event.previewResponseId) {
+ return; // Ignore old response.
+ }
+ this.dispatchPreviewStartEvent_(event.previewUid);
+ var pageNumberSet = this.printTicketStore_.getPageNumberSet();
+ for (var i = 0; i < pageNumberSet.size; i++) {
+ var pageNumber = pageNumberSet.getPageNumberAt(i);
+ this.dispatchPageReadyEvent_(i, pageNumber, event.previewUid);
+ }
+ cr.dispatchSimpleEvent(this, PreviewGenerator.EventType.DOCUMENT_READY);
+ },
+
+ /**
+ * Called when a page's preview has been generated. Dispatches a
+ * PAGE_READY event.
+ * @param {cr.Event} event Contains the page index and preview UID.
+ * @private
+ */
+ onPagePreviewReady_: function(event) {
+ if (this.inFlightRequestId_ != event.previewResponseId) {
+ return; // Ignore old response.
+ }
+ var pageNumber = event.pageIndex + 1;
+ if (this.printTicketStore_.getPageNumberSet().hasPageNumber(pageNumber)) {
+ var previewIndex = this.printTicketStore_.getPageNumberSet()
+ .getPageNumberIndex(pageNumber);
+ if (previewIndex == 0) {
+ this.dispatchPreviewStartEvent_(event.previewUid);
+ }
+ this.dispatchPageReadyEvent_(
+ previewIndex, pageNumber, event.previewUid);
+ }
+ },
+
+ /**
+ * Called when the preview generation is complete. Dispatches a
+ * DOCUMENT_READY event.
+ * @param {cr.Event} event Contains the preview UID and response ID.
+ * @private
+ */
+ onPreviewGenerationDone_: function(event) {
+ if (this.inFlightRequestId_ != event.previewResponseId) {
+ return; // Ignore old response.
+ }
+ // Dispatch a PREVIEW_START event since non-modifiable documents don't
+ // trigger PAGE_READY events.
+ if (!this.printTicketStore_.isDocumentModifiable) {
+ this.dispatchPreviewStartEvent_(event.previewUid);
+ }
+ cr.dispatchSimpleEvent(this, PreviewGenerator.EventType.DOCUMENT_READY);
+ },
+
+ /**
+ * 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.EventType.FAIL);
+ }
+ };
+
+ // Export
+ return {
+ PreviewGenerator: PreviewGenerator
+ };
+});

Powered by Google App Engine
This is Rietveld 408576698