OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 cr.define('print_preview', function() { | 5 cr.define('print_preview', function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 /** | 8 /** |
9 * Creates a PrintHeader object. This object encapsulates all the elements | 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. | 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. |
11 * @constructor | 15 * @constructor |
| 16 * @extends {print_preview.Component} |
12 */ | 17 */ |
13 function PrintHeader() { | 18 function PrintHeader(printTicketStore, destinationStore) { |
14 this.printButton_ = $('print-button'); | 19 print_preview.Component.call(this); |
15 this.cancelButton_ = $('cancel-button'); | 20 |
16 this.summary_ = $('print-summary'); | 21 /** |
17 this.printButton_.focus(); | 22 * Used to read information about the document. |
18 this.addEventListeners_(); | 23 * @type {!print_preview.PrintTicketStore} |
19 } | 24 * @private |
20 | 25 */ |
21 cr.addSingletonGetter(PrintHeader); | 26 this.printTicketStore_ = printTicketStore; |
| 27 |
| 28 /** |
| 29 * Used to get the selected destination. |
| 30 * @type {!print_preview.DestinationStore} |
| 31 * @private |
| 32 */ |
| 33 this.destinationStore_ = destinationStore; |
| 34 |
| 35 /** |
| 36 * Whether the component is enabled. |
| 37 * @type {boolean} |
| 38 * @private |
| 39 */ |
| 40 this.isEnabled_ = true; |
| 41 }; |
| 42 |
| 43 /** |
| 44 * Event types dispatched by the print header. |
| 45 * @enum {string} |
| 46 */ |
| 47 PrintHeader.EventType = { |
| 48 PRINT_BUTTON_CLICK: 'print_preview.PrintHeader.PRINT_BUTTON_CLICK', |
| 49 CANCEL_BUTTON_CLICK: 'print_preview.PrintHeader.CANCEL_BUTTON_CLICK' |
| 50 }, |
| 51 |
| 52 /** |
| 53 * CSS classes used by the print header. |
| 54 * @enum {string} |
| 55 * @private |
| 56 */ |
| 57 PrintHeader.Classes_ = { |
| 58 CANCEL_BUTTON: 'print-header-cancel-button', |
| 59 PRINT_BUTTON: 'print-header-print-button', |
| 60 SUMMARY: 'print-header-summary' |
| 61 }; |
22 | 62 |
23 PrintHeader.prototype = { | 63 PrintHeader.prototype = { |
24 get printButton() { | 64 __proto__: print_preview.Component.prototype, |
25 return this.printButton_; | 65 |
26 }, | 66 set isEnabled(isEnabled) { |
27 | 67 this.isEnabled_ = isEnabled; |
28 get cancelButton() { | 68 this.printButton_.disabled = !isEnabled; |
29 return this.cancelButton_; | 69 this.cancelButton_.disabled = !isEnabled; |
30 }, | 70 }, |
31 | 71 |
32 get summary() { | 72 setErrorMessage: function(message) { |
33 return this.summary_; | 73 var summaryEl = this.getElement().getElementsByClassName( |
34 }, | 74 PrintHeader.Classes_.SUMMARY)[0]; |
35 | 75 summaryEl.innerHTML = ''; |
36 /** | 76 summaryEl.textContent = message; |
37 * Adding event listeners where necessary. Listeners take care of changing | 77 }, |
38 * their behavior depending on the current state, no need to remove them. | 78 |
39 * @private | 79 /** @override */ |
40 */ | 80 enterDocument: function() { |
41 addEventListeners_: function() { | 81 print_preview.Component.prototype.enterDocument.call(this); |
42 this.cancelButton_.onclick = function() { | 82 this.printButton_.focus(); |
43 this.disableCancelButton(); | 83 |
44 closePrintPreviewTab(); | 84 // User events |
45 }.bind(this); | 85 this.tracker.add( |
46 this.printButton_.onclick = this.onPrintRequested.bind(this); | 86 this.cancelButton_, 'click', this.onCancelButtonClick_.bind(this)); |
47 document.addEventListener(customEvents.UPDATE_SUMMARY, | 87 this.tracker.add( |
48 this.updateSummary_.bind(this)); | 88 this.printButton_, 'click', this.onPrintButtonClick_.bind(this)); |
49 document.addEventListener(customEvents.UPDATE_PRINT_BUTTON, | 89 |
50 this.updatePrintButton_.bind(this)); | 90 // Data events. |
51 document.addEventListener(customEvents.PDF_GENERATION_ERROR, | 91 this.tracker.add( |
52 this.onPDFGenerationError_.bind(this)); | 92 this.printTicketStore_, |
53 document.addEventListener(customEvents.PRINTER_CAPABILITIES_UPDATED, | 93 print_preview.PrintTicketStore.EventType.INITIALIZE, |
54 this.onPrinterCapabilitiesUpdated_.bind(this)); | 94 this.onTicketChange_.bind(this)); |
55 }, | 95 this.tracker.add( |
56 | 96 this.printTicketStore_, |
57 /** | 97 print_preview.PrintTicketStore.EventType.DOCUMENT_CHANGE, |
58 * Enables the cancel button and attaches its keydown event listener. | 98 this.onTicketChange_.bind(this)); |
59 */ | 99 this.tracker.add( |
60 enableCancelButton: function() { | 100 this.printTicketStore_, |
61 window.onkeydown = onKeyDown; | 101 print_preview.PrintTicketStore.EventType.TICKET_CHANGE, |
62 this.cancelButton_.disabled = false; | 102 this.onTicketChange_.bind(this)); |
63 }, | 103 this.tracker.add( |
64 | 104 this.destinationStore_, |
65 /** | 105 print_preview.DestinationStore.EventType.DESTINATION_SELECT, |
66 * Executes when a |customEvents.PDF_GENERATION_ERROR| event occurs. | 106 this.onDestinationSelect_.bind(this)); |
67 * @private | 107 }, |
68 */ | 108 |
69 onPDFGenerationError_: function() { | 109 /** |
70 this.printButton_.disabled = true; | 110 * @return {Element} Print button element. |
71 }, | 111 * @private |
72 | 112 */ |
73 /** | 113 get printButton_() { |
74 * Executes when a |customEvents.PRINTER_CAPABILITIES_UPDATED| event occurs. | 114 return this.getElement().getElementsByClassName( |
75 * @private | 115 PrintHeader.Classes_.PRINT_BUTTON)[0]; |
76 */ | 116 }, |
77 onPrinterCapabilitiesUpdated_: function() { | 117 |
78 getSelectedPrinterName() == PRINT_TO_PDF ? | 118 /** |
79 this.printButton.textContent = localStrings.getString('saveButton') : | 119 * @return {Element} Cancel button element. |
80 this.printButton.textContent = localStrings.getString('printButton'); | 120 * @private |
81 }, | 121 */ |
82 | 122 get cancelButton_() { |
83 /** | 123 return this.getElement().getElementsByClassName( |
84 * Disables the cancel button and removes its keydown event listener. | 124 PrintHeader.Classes_.CANCEL_BUTTON)[0]; |
85 */ | 125 }, |
86 disableCancelButton: function() { | 126 |
87 window.onkeydown = null; | 127 /** |
88 this.cancelButton_.disabled = true; | 128 * Updates the summary element based on the currently selected user options. |
89 }, | 129 * @private |
90 | 130 */ |
91 /** | 131 updateSummary_: function() { |
92 * Listener executing whenever the print button is clicked or user presses | 132 var summaryEl = this.getElement().getElementsByClassName( |
93 * the enter button while focus is in the pages field. | 133 PrintHeader.Classes_.SUMMARY)[0]; |
94 */ | 134 if (!this.printTicketStore_.isTicketValid()) { |
95 onPrintRequested: function() { | 135 summaryEl.innerHTML = ''; |
96 var printToPDF = getSelectedPrinterName() == PRINT_TO_PDF; | 136 return; |
97 if (!printToPDF) { | 137 } |
| 138 |
| 139 var summaryLabel = |
| 140 localStrings.getString('printPreviewSheetsLabelSingular'); |
| 141 var pagesLabel = localStrings.getString('printPreviewPageLabelPlural'); |
| 142 |
| 143 var saveToPdf = this.destinationStore_.selectedDestination && |
| 144 this.destinationStore_.selectedDestination.id == |
| 145 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF; |
| 146 if (saveToPdf) { |
| 147 summaryLabel = localStrings.getString('printPreviewPageLabelSingular'); |
| 148 } |
| 149 |
| 150 var numPages = this.printTicketStore_.getPageNumberSet().size; |
| 151 var numSheets = numPages; |
| 152 if (!saveToPdf && this.printTicketStore_.isDuplexEnabled()) { |
| 153 numSheets = Math.ceil(numPages / 2); |
| 154 } |
| 155 |
| 156 var copies = this.printTicketStore_.getCopies(); |
| 157 numSheets *= copies; |
| 158 numPages *= copies; |
| 159 |
| 160 if (numSheets > 1) { |
| 161 summaryLabel = saveToPdf ? pagesLabel : |
| 162 localStrings.getString('printPreviewSheetsLabelPlural'); |
| 163 } |
| 164 |
| 165 var html; |
| 166 if (numPages != numSheets) { |
| 167 html = localStrings.getStringF('printPreviewSummaryFormatLong', |
| 168 '<b>' + numSheets + '</b>', |
| 169 '<b>' + summaryLabel + '</b>', |
| 170 numPages, |
| 171 pagesLabel); |
| 172 } else { |
| 173 html = localStrings.getStringF('printPreviewSummaryFormatShort', |
| 174 '<b>' + numSheets + '</b>', |
| 175 '<b>' + summaryLabel + '</b>'); |
| 176 } |
| 177 |
| 178 // Removing extra spaces from within the string. |
| 179 html = html.replace(/\s{2,}/g, ' '); |
| 180 summaryEl.innerHTML = html; |
| 181 }, |
| 182 |
| 183 /** |
| 184 * Called when the print button is clicked. Dispatches a PRINT_DOCUMENT |
| 185 * common event. |
| 186 * @private |
| 187 */ |
| 188 onPrintButtonClick_: function() { |
| 189 if (this.destinationStore_.selectedDestination.id != |
| 190 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) { |
98 this.printButton_.classList.add('loading'); | 191 this.printButton_.classList.add('loading'); |
99 this.cancelButton_.classList.add('loading'); | 192 this.cancelButton_.classList.add('loading'); |
100 this.summary_.innerHTML = localStrings.getString('printing'); | 193 var summaryEl = this.getElement().getElementsByClassName( |
101 } | 194 PrintHeader.Classes_.SUMMARY)[0]; |
102 this.disableCancelButton(); | 195 summaryEl.innerHTML = localStrings.getString('printing'); |
103 requestToPrintDocument(); | 196 } |
104 }, | 197 cr.dispatchSimpleEvent(this, PrintHeader.EventType.PRINT_BUTTON_CLICK); |
105 | 198 }, |
106 /** | 199 |
107 * Updates the state of |this.printButton_| depending on the user selection. | 200 /** |
108 * The button is enabled only when the following conditions are true. | 201 * Called when the cancel button is clicked. Dispatches a |
109 * 1) The selected page ranges are valid. | 202 * CLOSE_PRINT_PREVIEW event. |
110 * 2) The number of copies is valid (if applicable). | 203 * @private |
111 * @private | 204 */ |
112 */ | 205 onCancelButtonClick_: function() { |
113 updatePrintButton_: function() { | 206 cr.dispatchSimpleEvent(this, PrintHeader.EventType.CANCEL_BUTTON_CLICK); |
114 if (showingSystemDialog) | 207 }, |
115 return; | 208 |
116 this.printButton_.disabled = !areSettingsValid(); | 209 /** |
117 }, | 210 * Called when a new destination is selected. Updates the text on the print |
118 | 211 * button. |
119 /** | 212 * @private |
120 * Updates |this.summary_| based on the currently selected user options. | 213 */ |
121 * @private | 214 onDestinationSelect_: function() { |
122 */ | 215 if (this.destinationStore_.selectedDestination.id == |
123 updateSummary_: function() { | 216 print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) { |
124 var printToPDF = getSelectedPrinterName() == PRINT_TO_PDF; | 217 this.printButton_.textContent = localStrings.getString('saveButton'); |
125 var copies = printToPDF ? 1 : copiesSettings.numberOfCopies; | |
126 | |
127 if ((!printToPDF && !copiesSettings.isValid()) || | |
128 !pageSettings.isPageSelectionValid()) { | |
129 this.summary_.innerHTML = ''; | |
130 return; | |
131 } | |
132 | |
133 if (!marginSettings.areMarginSettingsValid()) { | |
134 this.summary_.innerHTML = ''; | |
135 return; | |
136 } | |
137 | |
138 var pageSet = pageSettings.selectedPagesSet; | |
139 var numOfSheets = pageSet.length; | |
140 if (numOfSheets == 0) | |
141 return; | |
142 | |
143 var summaryLabel = | |
144 localStrings.getString('printPreviewSheetsLabelSingular'); | |
145 var numOfPagesText = ''; | |
146 var pagesLabel = localStrings.getString('printPreviewPageLabelPlural'); | |
147 | |
148 if (printToPDF) | |
149 summaryLabel = localStrings.getString('printPreviewPageLabelSingular'); | |
150 | |
151 if (!printToPDF && | |
152 copiesSettings.duplexMode == print_preview.CopiesSettings.LONG_EDGE) { | |
153 numOfSheets = Math.ceil(numOfSheets / 2); | |
154 } | |
155 numOfSheets *= copies; | |
156 | |
157 if (numOfSheets > 1) { | |
158 summaryLabel = printToPDF ? pagesLabel : | |
159 localStrings.getString('printPreviewSheetsLabelPlural'); | |
160 } | |
161 | |
162 var html = ''; | |
163 if (pageSet.length * copies != numOfSheets) { | |
164 numOfPagesText = pageSet.length * copies; | |
165 html = localStrings.getStringF('printPreviewSummaryFormatLong', | |
166 '<b>' + numOfSheets + '</b>', | |
167 '<b>' + summaryLabel + '</b>', | |
168 numOfPagesText, pagesLabel); | |
169 } else { | 218 } else { |
170 html = localStrings.getStringF('printPreviewSummaryFormatShort', | 219 this.printButton_.textContent = localStrings.getString('printButton'); |
171 '<b>' + numOfSheets + '</b>', | 220 } |
172 '<b>' + summaryLabel + '</b>'); | 221 }, |
173 } | 222 |
174 | 223 /** |
175 // Removing extra spaces from within the string. | 224 * Called when the print ticket has changed. Disables the print button if |
176 html = html.replace(/\s{2,}/g, ' '); | 225 * any of the settings are invalid. |
177 this.summary_.innerHTML = html; | 226 * @private |
| 227 */ |
| 228 onTicketChange_: function() { |
| 229 this.printButton_.disabled = |
| 230 !this.printTicketStore_.isTicketValid() || |
| 231 !this.isEnabled_; |
| 232 this.updateSummary_(); |
178 } | 233 } |
179 }; | 234 }; |
180 | 235 |
| 236 // Export |
181 return { | 237 return { |
182 PrintHeader: PrintHeader | 238 PrintHeader: PrintHeader |
183 }; | 239 }; |
184 }); | 240 }); |
OLD | NEW |