Disable view source for Developer Tools.
[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}
17    */
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
25      */
26     this.printTicketStore_ = printTicketStore;
28     /**
29      * Used to get the selected destination.
30      * @type {!print_preview.DestinationStore}
31      * @private
32      */
33     this.destinationStore_ = destinationStore;
35     /**
36      * Whether the component is enabled.
37      * @type {boolean}
38      * @private
39      */
40     this.isEnabled_ = true;
42     /**
43      * Whether the print button is enabled.
44      * @type {boolean}
45      * @private
46      */
47     this.isPrintButtonEnabled_ = true;
48   };
50   /**
51    * Event types dispatched by the print header.
52    * @enum {string}
53    */
54   PrintHeader.EventType = {
55     PRINT_BUTTON_CLICK: 'print_preview.PrintHeader.PRINT_BUTTON_CLICK',
56     CANCEL_BUTTON_CLICK: 'print_preview.PrintHeader.CANCEL_BUTTON_CLICK'
57   };
59   PrintHeader.prototype = {
60     __proto__: print_preview.Component.prototype,
62     set isEnabled(isEnabled) {
63       this.isEnabled_ = isEnabled;
64       this.updatePrintButtonEnabledState_();
65       this.isCancelButtonEnabled = isEnabled;
66     },
68     set isPrintButtonEnabled(isEnabled) {
69       this.isPrintButtonEnabled_ = isEnabled;
70       this.updatePrintButtonEnabledState_();
71     },
73     set isCancelButtonEnabled(isEnabled) {
74       this.getChildElement('button.cancel').disabled = !isEnabled;
75     },
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;
82     },
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));
127     },
129     /**
130      * Updates Print Button state.
131      * @private
132      */
133     updatePrintButtonEnabledState_: function() {
134       this.getChildElement('button.print').disabled =
135           !this.isEnabled_ ||
136           !this.isPrintButtonEnabled_ ||
137           !this.printTicketStore_.isTicketValid();
138     },
140     /**
141      * Updates the summary element based on the currently selected user options.
142      * @private
143      */
144     updateSummary_: function() {
145       if (!this.printTicketStore_.isTicketValid()) {
146         this.getChildElement('.summary').innerHTML = '';
147         return;
148       }
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');
159       }
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);
165       }
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');
174       }
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>');
187       }
189       // Removing extra spaces from within the string.
190       html = html.replace(/\s{2,}/g, ' ');
191       this.getChildElement('.summary').innerHTML = html;
192     },
194     /**
195      * Called when the print button is clicked. Dispatches a PRINT_DOCUMENT
196      * common event.
197      * @private
198      */
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');
206       }
207       cr.dispatchSimpleEvent(this, PrintHeader.EventType.PRINT_BUTTON_CLICK);
208     },
210     /**
211      * Called when the cancel button is clicked. Dispatches a
212      * CLOSE_PRINT_PREVIEW event.
213      * @private
214      */
215     onCancelButtonClick_: function() {
216       cr.dispatchSimpleEvent(this, PrintHeader.EventType.CANCEL_BUTTON_CLICK);
217     },
219     /**
220      * Called when a new destination is selected. Updates the text on the print
221      * button.
222      * @private
223      */
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();
233     },
235     /**
236      * Called when the print ticket has changed. Disables the print button if
237      * any of the settings are invalid.
238      * @private
239      */
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();
246       }
247     }
248   };
250   // Export
251   return {
252     PrintHeader: PrintHeader
253   };