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