Fix infinite recursion on hiding panel when created during fullscreen mode.
[chromium-blink-merge.git] / chrome / browser / resources / print_preview / print_header.js
blobfdeea113c3d9598411e8e01f5863a090d08be497
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 cr.define('print_preview', function() {
6 'use strict';
8 /**
9 * Creates a PrintHeader object. This object encapsulates all the elements
10 * and logic related to the top part of the left pane in print_preview.html.
11 * @param {!print_preview.PrintTicketStore} printTicketStore Used to read
12 * information about the document.
13 * @param {!print_preview.DestinationStore} destinationStore Used to get the
14 * selected destination.
15 * @constructor
16 * @extends {print_preview.Component}
18 function PrintHeader(printTicketStore, destinationStore) {
19 print_preview.Component.call(this);
21 /**
22 * Used to read information about the document.
23 * @type {!print_preview.PrintTicketStore}
24 * @private
26 this.printTicketStore_ = printTicketStore;
28 /**
29 * Used to get the selected destination.
30 * @type {!print_preview.DestinationStore}
31 * @private
33 this.destinationStore_ = destinationStore;
35 /**
36 * Whether the component is enabled.
37 * @type {boolean}
38 * @private
40 this.isEnabled_ = true;
42 /**
43 * Whether the print button is enabled.
44 * @type {boolean}
45 * @private
47 this.isPrintButtonEnabled_ = true;
50 /**
51 * Event types dispatched by the print header.
52 * @enum {string}
54 PrintHeader.EventType = {
55 PRINT_BUTTON_CLICK: 'print_preview.PrintHeader.PRINT_BUTTON_CLICK',
56 CANCEL_BUTTON_CLICK: 'print_preview.PrintHeader.CANCEL_BUTTON_CLICK'
59 PrintHeader.prototype = {
60 __proto__: print_preview.Component.prototype,
62 set isEnabled(isEnabled) {
63 this.isEnabled_ = isEnabled;
64 this.updatePrintButtonEnabledState_();
65 this.isCancelButtonEnabled = isEnabled;
68 set isPrintButtonEnabled(isEnabled) {
69 this.isPrintButtonEnabled_ = isEnabled;
70 this.updatePrintButtonEnabledState_();
73 set isCancelButtonEnabled(isEnabled) {
74 this.getChildElement('button.cancel').disabled = !isEnabled;
77 /** @param {string} message Error message to display in the print header. */
78 setErrorMessage: function(message) {
79 var summaryEl = this.getChildElement('.summary');
80 summaryEl.innerHTML = '';
81 summaryEl.textContent = message;
84 /** @override */
85 enterDocument: function() {
86 print_preview.Component.prototype.enterDocument.call(this);
88 // User events
89 this.tracker.add(
90 this.getChildElement('button.cancel'),
91 'click',
92 this.onCancelButtonClick_.bind(this));
93 this.tracker.add(
94 this.getChildElement('button.print'),
95 'click',
96 this.onPrintButtonClick_.bind(this));
98 // Data events.
99 this.tracker.add(
100 this.printTicketStore_,
101 print_preview.PrintTicketStore.EventType.INITIALIZE,
102 this.onTicketChange_.bind(this));
103 this.tracker.add(
104 this.printTicketStore_,
105 print_preview.PrintTicketStore.EventType.DOCUMENT_CHANGE,
106 this.onTicketChange_.bind(this));
107 this.tracker.add(
108 this.printTicketStore_,
109 print_preview.PrintTicketStore.EventType.TICKET_CHANGE,
110 this.onTicketChange_.bind(this));
111 this.tracker.add(
112 this.destinationStore_,
113 print_preview.DestinationStore.EventType.DESTINATION_SELECT,
114 this.onDestinationSelect_.bind(this));
115 this.tracker.add(
116 this.printTicketStore_.copies,
117 print_preview.ticket_items.TicketItem.EventType.CHANGE,
118 this.onTicketChange_.bind(this));
119 this.tracker.add(
120 this.printTicketStore_.duplex,
121 print_preview.ticket_items.TicketItem.EventType.CHANGE,
122 this.onTicketChange_.bind(this));
123 this.tracker.add(
124 this.printTicketStore_.pageRange,
125 print_preview.ticket_items.TicketItem.EventType.CHANGE,
126 this.onTicketChange_.bind(this));
130 * Updates Print Button state.
131 * @private
133 updatePrintButtonEnabledState_: function() {
134 this.getChildElement('button.print').disabled =
135 !this.isEnabled_ ||
136 !this.isPrintButtonEnabled_ ||
137 !this.printTicketStore_.isTicketValid();
141 * Updates the summary element based on the currently selected user options.
142 * @private
144 updateSummary_: function() {
145 if (!this.printTicketStore_.isTicketValid()) {
146 this.getChildElement('.summary').innerHTML = '';
147 return;
150 var summaryLabel =
151 localStrings.getString('printPreviewSheetsLabelSingular');
152 var pagesLabel = localStrings.getString('printPreviewPageLabelPlural');
154 var saveToPdf = this.destinationStore_.selectedDestination &&
155 this.destinationStore_.selectedDestination.id ==
156 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF;
157 if (saveToPdf) {
158 summaryLabel = localStrings.getString('printPreviewPageLabelSingular');
161 var numPages = this.printTicketStore_.pageRange.getPageNumberSet().size;
162 var numSheets = numPages;
163 if (!saveToPdf && this.printTicketStore_.duplex.getValue()) {
164 numSheets = Math.ceil(numPages / 2);
167 var copies = this.printTicketStore_.copies.getValueAsNumber();
168 numSheets *= copies;
169 numPages *= copies;
171 if (numSheets > 1) {
172 summaryLabel = saveToPdf ? pagesLabel :
173 localStrings.getString('printPreviewSheetsLabelPlural');
176 var html;
177 if (numPages != numSheets) {
178 html = localStrings.getStringF('printPreviewSummaryFormatLong',
179 '<b>' + numSheets + '</b>',
180 '<b>' + summaryLabel + '</b>',
181 numPages,
182 pagesLabel);
183 } else {
184 html = localStrings.getStringF('printPreviewSummaryFormatShort',
185 '<b>' + numSheets + '</b>',
186 '<b>' + summaryLabel + '</b>');
189 // Removing extra spaces from within the string.
190 html = html.replace(/\s{2,}/g, ' ');
191 this.getChildElement('.summary').innerHTML = html;
195 * Called when the print button is clicked. Dispatches a PRINT_DOCUMENT
196 * common event.
197 * @private
199 onPrintButtonClick_: function() {
200 if (this.destinationStore_.selectedDestination.id !=
201 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) {
202 this.getChildElement('button.print').classList.add('loading');
203 this.getChildElement('button.cancel').classList.add('loading');
204 this.getChildElement('.summary').innerHTML =
205 localStrings.getString('printing');
207 cr.dispatchSimpleEvent(this, PrintHeader.EventType.PRINT_BUTTON_CLICK);
211 * Called when the cancel button is clicked. Dispatches a
212 * CLOSE_PRINT_PREVIEW event.
213 * @private
215 onCancelButtonClick_: function() {
216 cr.dispatchSimpleEvent(this, PrintHeader.EventType.CANCEL_BUTTON_CLICK);
220 * Called when a new destination is selected. Updates the text on the print
221 * button.
222 * @private
224 onDestinationSelect_: function() {
225 var isSaveLabel = this.destinationStore_.selectedDestination.id ==
226 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF ||
227 this.destinationStore_.selectedDestination.id ==
228 print_preview.Destination.GooglePromotedId.DOCS;
229 this.getChildElement('button.print').textContent = isSaveLabel ?
230 localStrings.getString('saveButton') :
231 localStrings.getString('printButton');
232 this.getChildElement('button.print').focus();
236 * Called when the print ticket has changed. Disables the print button if
237 * any of the settings are invalid.
238 * @private
240 onTicketChange_: function() {
241 this.updatePrintButtonEnabledState_();
242 this.updateSummary_();
243 if (document.activeElement == null ||
244 document.activeElement == document.body) {
245 this.getChildElement('button.print').focus();
250 // Export
251 return {
252 PrintHeader: PrintHeader