blob: 67e445bd70f636d3ecd16908a528473436f93cf0 [file] [log] [blame]
// 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;
/**
* Whether the print button is enabled.
* @type {boolean}
* @private
*/
this.isPrintButtonEnabled_ = 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'
};
PrintHeader.prototype = {
__proto__: print_preview.Component.prototype,
set isEnabled(isEnabled) {
this.isEnabled_ = isEnabled;
this.updatePrintButtonEnabledState_();
this.isCancelButtonEnabled = isEnabled;
},
get isPrintButtonEnabled() {
return !this.getChildElement('button.print').disabled;
},
set isPrintButtonEnabled(isEnabled) {
this.isPrintButtonEnabled_ = isEnabled;
this.updatePrintButtonEnabledState_();
},
set isCancelButtonEnabled(isEnabled) {
this.getChildElement('button.cancel').disabled = !isEnabled;
},
/** @param {string} message Error message to display in the print header. */
setErrorMessage: function(message) {
const summaryEl = this.getChildElement('.summary');
summaryEl.innerHTML = '';
summaryEl.textContent = message;
this.getChildElement('button.print').classList.toggle('loading', false);
this.getChildElement('button.cancel').classList.toggle('loading', false);
},
/** @override */
decorateInternal: function() {
cr.ui.reverseButtonStrips(this.getElement());
},
/** @override */
enterDocument: function() {
print_preview.Component.prototype.enterDocument.call(this);
// User events
this.tracker.add(
this.getChildElement('button.cancel'), 'click',
this.onCancelButtonClick_.bind(this));
this.tracker.add(
this.getChildElement('button.print'), '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.destinationStore_,
print_preview.DestinationStore.EventType.DESTINATION_SELECT,
this.onDestinationSelect_.bind(this));
this.tracker.add(
this.printTicketStore_.duplex,
print_preview.ticket_items.TicketItem.EventType.CHANGE,
this.onTicketChange.bind(this));
},
/**
* Updates Print Button state.
* @private
*/
updatePrintButtonEnabledState_: function() {
this.getChildElement('button.print').disabled =
this.destinationStore_.selectedDestination == null ||
!this.isEnabled_ || !this.isPrintButtonEnabled_ ||
!this.printTicketStore_.isTicketValid();
},
/**
* Updates the summary element based on the currently selected user options.
* @private
*/
updateSummary_: function() {
if (!this.printTicketStore_.isTicketValid()) {
this.getChildElement('.summary').innerHTML = '';
return;
}
const saveToPdfOrDrive = this.destinationStore_.selectedDestination &&
(this.destinationStore_.selectedDestination.id ==
print_preview.Destination.GooglePromotedId.SAVE_AS_PDF ||
this.destinationStore_.selectedDestination.id ==
print_preview.Destination.GooglePromotedId.DOCS);
let numPages = this.printTicketStore_.pageRange.getPageNumberSet().size;
let numSheets = numPages;
if (!saveToPdfOrDrive && this.printTicketStore_.duplex.getValue()) {
numSheets = Math.ceil(numPages / 2);
}
const copies = this.printTicketStore_.copies.getValueAsNumber();
numSheets *= copies;
numPages *= copies;
const pagesLabel = loadTimeData.getString('printPreviewPageLabelPlural');
let summaryLabel;
if (numSheets > 1) {
summaryLabel = saveToPdfOrDrive ?
pagesLabel :
loadTimeData.getString('printPreviewSheetsLabelPlural');
} else {
summaryLabel = loadTimeData.getString(
saveToPdfOrDrive ? 'printPreviewPageLabelSingular' :
'printPreviewSheetsLabelSingular');
}
let html;
let label;
if (numPages != numSheets) {
html = loadTimeData.getStringF(
'printPreviewSummaryFormatLong',
'<b>' + numSheets.toLocaleString() + '</b>',
'<b>' + summaryLabel + '</b>', numPages.toLocaleString(),
pagesLabel);
label = loadTimeData.getStringF(
'printPreviewSummaryFormatLong', numSheets.toLocaleString(),
summaryLabel, numPages.toLocaleString(), pagesLabel);
} else {
html = loadTimeData.getStringF(
'printPreviewSummaryFormatShort',
'<b>' + numSheets.toLocaleString() + '</b>',
'<b>' + summaryLabel + '</b>');
label = loadTimeData.getStringF(
'printPreviewSummaryFormatShort', numSheets.toLocaleString(),
summaryLabel);
}
// Removing extra spaces from within the string.
html = html.replace(/\s{2,}/g, ' ');
const summary = this.getChildElement('.summary');
summary.innerHTML = html;
summary.setAttribute('aria-label', label);
},
/**
* 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.getChildElement('button.print').classList.add('loading');
this.getChildElement('button.cancel').classList.add('loading');
const isSaveLabel =
(this.destinationStore_.selectedDestination.id ==
print_preview.Destination.GooglePromotedId.DOCS);
this.getChildElement('.summary').innerHTML =
loadTimeData.getString(isSaveLabel ? 'saving' : '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() {
const isSaveLabel = this.destinationStore_.selectedDestination &&
(this.destinationStore_.selectedDestination.id ==
print_preview.Destination.GooglePromotedId.SAVE_AS_PDF ||
this.destinationStore_.selectedDestination.id ==
print_preview.Destination.GooglePromotedId.DOCS);
this.getChildElement('button.print').textContent =
loadTimeData.getString(isSaveLabel ? 'saveButton' : 'printButton');
if (this.destinationStore_.selectedDestination) {
this.getChildElement('button.print').focus();
}
},
/**
* Called when the print ticket has changed. Disables the print button if
* any of the settings are invalid.
*/
onTicketChange: function() {
this.updatePrintButtonEnabledState_();
this.updateSummary_();
if (document.activeElement == null ||
document.activeElement == document.body) {
this.getChildElement('button.print').focus();
}
}
};
// Export
return {PrintHeader: PrintHeader};
});