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() {
9 * Creates a PageSettings object. This object encapsulates all settings and
10 * logic related to page selection.
11 * @param {!print_preview.ticket_items.PageRange} pageRangeTicketItem Used to
12 * read and write page range settings.
14 * @extends {print_preview.SettingsSection}
16 function PageSettings(pageRangeTicketItem
) {
17 print_preview
.SettingsSection
.call(this);
20 * Used to read and write page range settings.
21 * @type {!print_preview.ticket_items.PageRange}
24 this.pageRangeTicketItem_
= pageRangeTicketItem
;
27 * Timeout used to delay processing of the custom page range input.
31 this.customInputTimeout_
= null;
34 * Custom page range input.
35 * @type {HTMLInputElement}
38 this.customInput_
= null;
41 * Custom page range radio button.
42 * @type {HTMLInputElement}
45 this.customRadio_
= null;
48 * All page rage radio button.
49 * @type {HTMLInputElement}
52 this.allRadio_
= null;
55 * Container of a hint to show when the custom page range is invalid.
59 this.customHintEl_
= null;
63 * CSS classes used by the page settings.
67 PageSettings
.Classes_
= {
68 ALL_RADIO
: 'page-settings-all-radio',
69 CUSTOM_HINT
: 'page-settings-custom-hint',
70 CUSTOM_INPUT
: 'page-settings-custom-input',
71 CUSTOM_RADIO
: 'page-settings-custom-radio'
75 * Delay in milliseconds before processing custom page range input.
79 PageSettings
.CUSTOM_INPUT_DELAY_
= 500;
81 PageSettings
.prototype = {
82 __proto__
: print_preview
.SettingsSection
.prototype,
85 isAvailable: function() {
86 return this.pageRangeTicketItem_
.isCapabilityAvailable();
90 hasCollapsibleContent: function() {
95 set isEnabled(isEnabled
) {
96 this.customInput_
.disabled
= !isEnabled
;
97 this.allRadio_
.disabled
= !isEnabled
;
98 this.customRadio_
.disabled
= !isEnabled
;
102 enterDocument: function() {
103 print_preview
.SettingsSection
.prototype.enterDocument
.call(this);
105 this.allRadio_
, 'click', this.onAllRadioClick_
.bind(this));
107 this.customRadio_
, 'click', this.onCustomRadioClick_
.bind(this));
109 this.customInput_
, 'blur', this.onCustomInputBlur_
.bind(this));
111 this.customInput_
, 'focus', this.onCustomInputFocus_
.bind(this));
113 this.customInput_
, 'keydown', this.onCustomInputKeyDown_
.bind(this));
115 this.customInput_
, 'keyup', this.onCustomInputKeyUp_
.bind(this));
117 this.pageRangeTicketItem_
,
118 print_preview
.ticket_items
.TicketItem
.EventType
.CHANGE
,
119 this.onPageRangeTicketItemChange_
.bind(this));
123 exitDocument: function() {
124 print_preview
.SettingsSection
.prototype.exitDocument
.call(this);
125 this.customInput_
= null;
126 this.customRadio_
= null;
127 this.allRadio_
= null;
128 this.customHintEl_
= null;
132 decorateInternal: function() {
133 this.customInput_
= this.getElement().getElementsByClassName(
134 PageSettings
.Classes_
.CUSTOM_INPUT
)[0];
135 this.allRadio_
= this.getElement().getElementsByClassName(
136 PageSettings
.Classes_
.ALL_RADIO
)[0];
137 this.customRadio_
= this.getElement().getElementsByClassName(
138 PageSettings
.Classes_
.CUSTOM_RADIO
)[0];
139 this.customHintEl_
= this.getElement().getElementsByClassName(
140 PageSettings
.Classes_
.CUSTOM_HINT
)[0];
141 this.customHintEl_
.textContent
= loadTimeData
.getStringF(
142 'pageRangeInstruction',
143 loadTimeData
.getString('examplePageRangeText'));
147 * @param {boolean} isVisible Whether the custom hint is visible.
150 setInvalidStateVisible_: function(isVisible
) {
152 this.customInput_
.classList
.add('invalid');
153 fadeInElement(this.customHintEl_
);
155 this.customInput_
.classList
.remove('invalid');
156 fadeOutElement(this.customHintEl_
);
161 * Called when the all radio button is clicked. Updates the print ticket.
164 onAllRadioClick_: function() {
165 this.pageRangeTicketItem_
.updateValue(null);
169 * Called when the custom radio button is clicked. Updates the print ticket.
172 onCustomRadioClick_: function() {
173 this.customInput_
.focus();
177 * Called when the custom input is blurred. Enables the all radio button if
178 * the custom input is empty.
181 onCustomInputBlur_: function(event
) {
182 if (this.customInput_
.value
== '' &&
183 event
.relatedTarget
!= this.customRadio_
) {
184 this.allRadio_
.checked
= true;
189 * Called when the custom input is focused.
192 onCustomInputFocus_: function() {
193 this.customRadio_
.checked
= true;
194 this.pageRangeTicketItem_
.updateValue(this.customInput_
.value
);
198 * Called when a key is pressed on the custom input.
199 * @param {Event} event Contains the key that was pressed.
202 onCustomInputKeyDown_: function(event
) {
203 if (event
.keyCode
== 13 /*enter*/) {
204 if (this.customInputTimeout_
) {
205 clearTimeout(this.customInputTimeout_
);
206 this.customInputTimeout_
= null;
208 this.pageRangeTicketItem_
.updateValue(this.customInput_
.value
);
213 * Called when a key is pressed on the custom input.
214 * @param {Event} event Contains the key that was pressed.
217 onCustomInputKeyUp_: function(event
) {
218 if (this.customInputTimeout_
) {
219 clearTimeout(this.customInputTimeout_
);
220 this.customInputTimeout_
= null;
222 if (event
.keyCode
!= 13 /*enter*/) {
223 this.customRadio_
.checked
= true;
224 this.customInputTimeout_
= setTimeout(
225 this.onCustomInputTimeout_
.bind(this),
226 PageSettings
.CUSTOM_INPUT_DELAY_
);
231 * Called after a delay following a key press in the custom input.
234 onCustomInputTimeout_: function() {
235 this.customInputTimeout_
= null;
236 if (this.customRadio_
.checked
) {
237 this.pageRangeTicketItem_
.updateValue(this.customInput_
.value
);
242 * Called when the print ticket changes. Updates the state of the component.
245 onPageRangeTicketItemChange_: function() {
246 if (this.isAvailable()) {
247 var pageRangeStr
= this.pageRangeTicketItem_
.getValue();
248 if (pageRangeStr
|| this.customRadio_
.checked
) {
249 if (!document
.hasFocus() ||
250 document
.activeElement
!= this.customInput_
) {
251 this.customInput_
.value
= pageRangeStr
;
253 this.customRadio_
.checked
= true;
254 this.setInvalidStateVisible_(!this.pageRangeTicketItem_
.isValid());
256 this.allRadio_
.checked
= true;
257 this.setInvalidStateVisible_(false);
260 this.updateUiStateInternal();
266 PageSettings
: PageSettings