// 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'; /** * Creates a PrintHeader object. This object encapsulates all the elements * and logic related to the top part of the left pane in print_preview.html. * @param {!print_preview.PrintTicketStore} printTicketStore Used to read * information about the document. * @param {!print_preview.DestinationStore} destinationStore Used to get the * selected destination. * @constructor * @extends {print_preview.Component} */ function PrintHeader(printTicketStore, destinationStore) { print_preview.Component.call(this); /** * Used to read information about the document. * @type {!print_preview.PrintTicketStore} * @private */ this.printTicketStore_ = printTicketStore; /** * Used to get the selected destination. * @type {!print_preview.DestinationStore} * @private */ this.destinationStore_ = destinationStore; /** * Whether the component is enabled. * @type {boolean} * @private */ this.isEnabled_ = true; }; /** * Event types dispatched by the print header. * @enum {string} */ PrintHeader.EventType = { PRINT_BUTTON_CLICK: 'print_preview.PrintHeader.PRINT_BUTTON_CLICK', CANCEL_BUTTON_CLICK: 'print_preview.PrintHeader.CANCEL_BUTTON_CLICK' }, /** * CSS classes used by the print header. * @enum {string} * @private */ PrintHeader.Classes_ = { CANCEL_BUTTON: 'print-header-cancel-button', PRINT_BUTTON: 'print-header-print-button', SUMMARY: 'print-header-summary' }; PrintHeader.prototype = { __proto__: print_preview.Component.prototype, set isEnabled(isEnabled) { this.isEnabled_ = isEnabled; this.printButton_.disabled = !isEnabled; this.cancelButton_.disabled = !isEnabled; }, setErrorMessage: function(message) { var summaryEl = this.getElement().getElementsByClassName( PrintHeader.Classes_.SUMMARY)[0]; summaryEl.innerHTML = ''; summaryEl.textContent = message; }, /** @override */ enterDocument: function() { print_preview.Component.prototype.enterDocument.call(this); this.printButton_.focus(); // User events this.tracker.add( this.cancelButton_, 'click', this.onCancelButtonClick_.bind(this)); this.tracker.add( this.printButton_, 'click', this.onPrintButtonClick_.bind(this)); // Data events. this.tracker.add( this.printTicketStore_, print_preview.PrintTicketStore.EventType.INITIALIZE, this.onTicketChange_.bind(this)); this.tracker.add( this.printTicketStore_, print_preview.PrintTicketStore.EventType.DOCUMENT_CHANGE, this.onTicketChange_.bind(this)); this.tracker.add( this.printTicketStore_, print_preview.PrintTicketStore.EventType.TICKET_CHANGE, this.onTicketChange_.bind(this)); this.tracker.add( this.destinationStore_, print_preview.DestinationStore.EventType.DESTINATION_SELECT, this.onDestinationSelect_.bind(this)); }, /** * @return {Element} Print button element. * @private */ get printButton_() { return this.getElement().getElementsByClassName( PrintHeader.Classes_.PRINT_BUTTON)[0]; }, /** * @return {Element} Cancel button element. * @private */ get cancelButton_() { return this.getElement().getElementsByClassName( PrintHeader.Classes_.CANCEL_BUTTON)[0]; }, /** * Updates the summary element based on the currently selected user options. * @private */ updateSummary_: function() { var summaryEl = this.getElement().getElementsByClassName( PrintHeader.Classes_.SUMMARY)[0]; if (!this.printTicketStore_.isTicketValid()) { summaryEl.innerHTML = ''; return; } var summaryLabel = localStrings.getString('printPreviewSheetsLabelSingular'); var pagesLabel = localStrings.getString('printPreviewPageLabelPlural'); var saveToPdf = this.destinationStore_.selectedDestination && this.destinationStore_.selectedDestination.id == print_preview.Destination.GooglePromotedId.SAVE_AS_PDF; if (saveToPdf) { summaryLabel = localStrings.getString('printPreviewPageLabelSingular'); } var numPages = this.printTicketStore_.getPageNumberSet().size; var numSheets = numPages; if (!saveToPdf && this.printTicketStore_.isDuplexEnabled()) { numSheets = Math.ceil(numPages / 2); } var copies = this.printTicketStore_.getCopies(); numSheets *= copies; numPages *= copies; if (numSheets > 1) { summaryLabel = saveToPdf ? pagesLabel : localStrings.getString('printPreviewSheetsLabelPlural'); } var html; if (numPages != numSheets) { html = localStrings.getStringF('printPreviewSummaryFormatLong', '' + numSheets + '', '' + summaryLabel + '', numPages, pagesLabel); } else { html = localStrings.getStringF('printPreviewSummaryFormatShort', '' + numSheets + '', '' + summaryLabel + ''); } // Removing extra spaces from within the string. html = html.replace(/\s{2,}/g, ' '); summaryEl.innerHTML = html; }, /** * Called when the print button is clicked. Dispatches a PRINT_DOCUMENT * common event. * @private */ onPrintButtonClick_: function() { if (this.destinationStore_.selectedDestination.id != print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) { this.printButton_.classList.add('loading'); this.cancelButton_.classList.add('loading'); var summaryEl = this.getElement().getElementsByClassName( PrintHeader.Classes_.SUMMARY)[0]; summaryEl.innerHTML = localStrings.getString('printing'); } cr.dispatchSimpleEvent(this, PrintHeader.EventType.PRINT_BUTTON_CLICK); }, /** * Called when the cancel button is clicked. Dispatches a * CLOSE_PRINT_PREVIEW event. * @private */ onCancelButtonClick_: function() { cr.dispatchSimpleEvent(this, PrintHeader.EventType.CANCEL_BUTTON_CLICK); }, /** * Called when a new destination is selected. Updates the text on the print * button. * @private */ onDestinationSelect_: function() { if (this.destinationStore_.selectedDestination.id == print_preview.Destination.GooglePromotedId.SAVE_AS_PDF || this.destinationStore_.selectedDestination.id == print_preview.Destination.GooglePromotedId.DOCS) { this.printButton_.textContent = localStrings.getString('saveButton'); } else { this.printButton_.textContent = localStrings.getString('printButton'); } }, /** * Called when the print ticket has changed. Disables the print button if * any of the settings are invalid. * @private */ onTicketChange_: function() { this.printButton_.disabled = !this.printTicketStore_.isTicketValid() || !this.isEnabled_; this.updateSummary_(); } }; // Export return { PrintHeader: PrintHeader }; });