Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: chrome/browser/resources/print_preview/previewarea/margin_control.js

Issue 308943002: Reset margin input controls error state when error is cleared. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 * Draggable control for setting a page margin. 9 * Draggable control for setting a page margin.
10 * @param {!print_preview.ticket_items.CustomMargins.Orientation} orientation 10 * @param {!print_preview.ticket_items.CustomMargins.Orientation} orientation
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 this.mouseStartPositionInPixels_ = null; 66 this.mouseStartPositionInPixels_ = null;
67 67
68 /** 68 /**
69 * Processing timeout for the textbox. 69 * Processing timeout for the textbox.
70 * @type {?number} 70 * @type {?number}
71 * @private 71 * @private
72 */ 72 */
73 this.textTimeout_ = null; 73 this.textTimeout_ = null;
74 74
75 /** 75 /**
76 * Value of the textbox when the timeout was started.
77 * @type {?string}
78 * @private
79 */
80 this.preTimeoutValue_ = null;
81
82 /**
83 * Textbox used to display and receive the value of the margin. 76 * Textbox used to display and receive the value of the margin.
84 * @type {HTMLInputElement} 77 * @type {HTMLInputElement}
85 * @private 78 * @private
86 */ 79 */
87 this.textbox_ = null; 80 this.textbox_ = null;
88 81
89 /** 82 /**
90 * Element of the margin control line. 83 * Element of the margin control line.
91 * @type {HTMLElement} 84 * @type {HTMLElement}
92 * @private 85 * @private
(...skipping 26 matching lines...) Expand all
119 // Dispatched when the text in the margin control's textbox changes. 112 // Dispatched when the text in the margin control's textbox changes.
120 TEXT_CHANGE: 'print_preview.MarginControl.TEXT_CHANGE' 113 TEXT_CHANGE: 'print_preview.MarginControl.TEXT_CHANGE'
121 }; 114 };
122 115
123 /** 116 /**
124 * CSS classes used by this component. 117 * CSS classes used by this component.
125 * @enum {string} 118 * @enum {string}
126 * @private 119 * @private
127 */ 120 */
128 MarginControl.Classes_ = { 121 MarginControl.Classes_ = {
129 TOP: 'margin-control-top',
130 RIGHT: 'margin-control-right',
131 BOTTOM: 'margin-control-bottom',
132 LEFT: 'margin-control-left',
133 TEXTBOX: 'margin-control-textbox', 122 TEXTBOX: 'margin-control-textbox',
134 INVALID: 'invalid',
135 INVISIBLE: 'invisible',
136 DISABLED: 'margin-control-disabled',
137 DRAGGING: 'margin-control-dragging', 123 DRAGGING: 'margin-control-dragging',
138 LINE: 'margin-control-line' 124 LINE: 'margin-control-line'
139 }; 125 };
140 126
141 /** 127 /**
142 * Map from orientation to CSS class name.
143 * @type {!Object.<
144 * !print_preview.ticket_items.CustomMargins.Orientation,
145 * !MarginControl.Classes_>}
146 * @private
147 */
148 MarginControl.OrientationToClass_ = {};
149 MarginControl.OrientationToClass_[
150 print_preview.ticket_items.CustomMargins.Orientation.TOP] =
151 MarginControl.Classes_.TOP;
152 MarginControl.OrientationToClass_[
153 print_preview.ticket_items.CustomMargins.Orientation.RIGHT] =
154 MarginControl.Classes_.RIGHT;
155 MarginControl.OrientationToClass_[
156 print_preview.ticket_items.CustomMargins.Orientation.BOTTOM] =
157 MarginControl.Classes_.BOTTOM;
158 MarginControl.OrientationToClass_[
159 print_preview.ticket_items.CustomMargins.Orientation.LEFT] =
160 MarginControl.Classes_.LEFT;
161
162 /**
163 * Radius of the margin control in pixels. Padding of control + 1 for border. 128 * Radius of the margin control in pixels. Padding of control + 1 for border.
164 * @type {number} 129 * @type {number}
165 * @const 130 * @const
166 * @private 131 * @private
167 */ 132 */
168 MarginControl.RADIUS_ = 9; 133 MarginControl.RADIUS_ = 9;
169 134
170 /** 135 /**
171 * Timeout after a text change after which the text in the textbox is saved to 136 * Timeout after a text change after which the text in the textbox is saved to
172 * the print ticket. Value in milliseconds. 137 * the print ticket. Value in milliseconds.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 /** 179 /**
215 * @param {!print_preview.Size} pageSize New size of the document's pages. 180 * @param {!print_preview.Size} pageSize New size of the document's pages.
216 */ 181 */
217 setPageSize: function(pageSize) { 182 setPageSize: function(pageSize) {
218 this.pageSize_ = pageSize; 183 this.pageSize_ = pageSize;
219 this.setPositionInPts(this.positionInPts_); 184 this.setPositionInPts(this.positionInPts_);
220 }, 185 },
221 186
222 /** @param {boolean} isVisible Whether the margin control is visible. */ 187 /** @param {boolean} isVisible Whether the margin control is visible. */
223 setIsVisible: function(isVisible) { 188 setIsVisible: function(isVisible) {
224 if (isVisible) { 189 this.getElement().classList.toggle('invisible', !isVisible);
225 this.getElement().classList.remove(MarginControl.Classes_.INVISIBLE);
226 } else {
227 this.getElement().classList.add(MarginControl.Classes_.INVISIBLE);
228 }
229 }, 190 },
230 191
231 /** @return {boolean} Whether the margin control is in an error state. */ 192 /** @return {boolean} Whether the margin control is in an error state. */
232 getIsInError: function() { 193 getIsInError: function() {
233 return this.isInError_; 194 return this.isInError_;
234 }, 195 },
235 196
236 /** 197 /**
237 * @param {boolean} isInError Whether the margin control is in an error 198 * @param {boolean} isInError Whether the margin control is in an error
238 * state. 199 * state.
239 */ 200 */
240 setIsInError: function(isInError) { 201 setIsInError: function(isInError) {
241 this.isInError_ = isInError; 202 this.isInError_ = isInError;
242 if (isInError) { 203 this.textbox_.classList.toggle('invalid', isInError);
243 this.textbox_.classList.add(MarginControl.Classes_.INVALID);
244 } else {
245 this.textbox_.classList.remove(MarginControl.Classes_.INVALID);
246 }
247 }, 204 },
248 205
249 /** @param {boolean} isEnabled Whether to enable the margin control. */ 206 /** @param {boolean} isEnabled Whether to enable the margin control. */
250 setIsEnabled: function(isEnabled) { 207 setIsEnabled: function(isEnabled) {
251 this.textbox_.disabled = !isEnabled; 208 this.textbox_.disabled = !isEnabled;
252 if (isEnabled) { 209 this.getElement().classList.toggle('margin-control-disabled', !isEnabled);
253 this.getElement().classList.remove(MarginControl.Classes_.DISABLED);
254 } else {
255 this.getElement().classList.add(MarginControl.Classes_.DISABLED);
256 }
257 }, 210 },
258 211
259 /** @return {number} Current position of the margin control in points. */ 212 /** @return {number} Current position of the margin control in points. */
260 getPositionInPts: function() { 213 getPositionInPts: function() {
261 return this.positionInPts_; 214 return this.positionInPts_;
262 }, 215 },
263 216
264 /** 217 /**
265 * @param {number} posInPts New position of the margin control in points. 218 * @param {number} posInPts New position of the margin control in points.
266 */ 219 */
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 mousePosition.x - this.mouseStartPositionInPixels_.x + 302 mousePosition.x - this.mouseStartPositionInPixels_.x +
350 this.marginStartPositionInPixels_.x, 303 this.marginStartPositionInPixels_.x,
351 mousePosition.y - this.mouseStartPositionInPixels_.y + 304 mousePosition.y - this.mouseStartPositionInPixels_.y +
352 this.marginStartPositionInPixels_.y); 305 this.marginStartPositionInPixels_.y);
353 }, 306 },
354 307
355 /** @override */ 308 /** @override */
356 createDom: function() { 309 createDom: function() {
357 this.setElementInternal(this.cloneTemplateInternal( 310 this.setElementInternal(this.cloneTemplateInternal(
358 'margin-control-template')); 311 'margin-control-template'));
359 this.getElement().classList.add(MarginControl.OrientationToClass_[ 312 this.getElement().classList.add('margin-control-' + this.orientation_);
360 this.orientation_]);
361 this.textbox_ = this.getElement().getElementsByClassName( 313 this.textbox_ = this.getElement().getElementsByClassName(
362 MarginControl.Classes_.TEXTBOX)[0]; 314 MarginControl.Classes_.TEXTBOX)[0];
315 this.textbox_.setAttribute(
316 'aria-label', localStrings.getString(this.orientation_));
363 this.marginLineEl_ = this.getElement().getElementsByClassName( 317 this.marginLineEl_ = this.getElement().getElementsByClassName(
364 MarginControl.Classes_.LINE)[0]; 318 MarginControl.Classes_.LINE)[0];
365 }, 319 },
366 320
367 /** @override */ 321 /** @override */
368 enterDocument: function() { 322 enterDocument: function() {
369 print_preview.Component.prototype.enterDocument.call(this); 323 print_preview.Component.prototype.enterDocument.call(this);
370 this.tracker.add( 324 this.tracker.add(
371 this.getElement(), 'mousedown', this.onMouseDown_.bind(this)); 325 this.getElement(), 'mousedown', this.onMouseDown_.bind(this));
372 this.tracker.add( 326 this.tracker.add(
327 this.getElement(),
328 'webkitTransitionEnd',
329 this.onWebkitTransitionEnd_.bind(this));
330 this.tracker.add(
331 this.textbox_, 'input', this.onTextboxInput_.bind(this));
332 this.tracker.add(
373 this.textbox_, 'keydown', this.onTextboxKeyDown_.bind(this)); 333 this.textbox_, 'keydown', this.onTextboxKeyDown_.bind(this));
374 this.tracker.add( 334 this.tracker.add(
375 this.textbox_, 'focus', this.setIsFocused_.bind(this, true)); 335 this.textbox_, 'focus', this.setIsFocused_.bind(this, true));
376 this.tracker.add(this.textbox_, 'blur', this.onTexboxBlur_.bind(this)); 336 this.tracker.add(this.textbox_, 'blur', this.onTexboxBlur_.bind(this));
377 }, 337 },
378 338
379 /** @override */ 339 /** @override */
380 exitDocument: function() { 340 exitDocument: function() {
381 print_preview.Component.prototype.exitDocument.call(this); 341 print_preview.Component.prototype.exitDocument.call(this);
382 this.textbox_ = null; 342 this.textbox_ = null;
(...skipping 21 matching lines...) Expand all
404 this.mouseStartPositionInPixels_ = 364 this.mouseStartPositionInPixels_ =
405 new print_preview.Coordinate2d(event.x, event.y); 365 new print_preview.Coordinate2d(event.x, event.y);
406 this.marginStartPositionInPixels_ = new print_preview.Coordinate2d( 366 this.marginStartPositionInPixels_ = new print_preview.Coordinate2d(
407 this.getElement().offsetLeft, this.getElement().offsetTop); 367 this.getElement().offsetLeft, this.getElement().offsetTop);
408 this.setIsInError(false); 368 this.setIsInError(false);
409 cr.dispatchSimpleEvent(this, MarginControl.EventType.DRAG_START); 369 cr.dispatchSimpleEvent(this, MarginControl.EventType.DRAG_START);
410 } 370 }
411 }, 371 },
412 372
413 /** 373 /**
374 * Called when opacity CSS transition ends.
375 * @private
376 */
377 onWebkitTransitionEnd_: function(event) {
378 if (event.propertyName != 'opacity')
379 return;
380 var elStyle = window.getComputedStyle(this.getElement());
381 var opacity = parseInt(elStyle.getPropertyValue('opacity'));
382 this.textbox_.setAttribute('aria-hidden', opacity == 0);
383 },
384
385 /**
386 * Called when textbox content changes. Starts text change timeout.
387 * @private
388 */
389 onTextboxInput_: function(event) {
390 if (this.textTimeout_) {
391 clearTimeout(this.textTimeout_);
392 this.textTimeout_ = null;
393 }
394 this.textTimeout_ = setTimeout(
395 this.onTextboxTimeout_.bind(this), MarginControl.TEXTBOX_TIMEOUT_);
396 },
397
398 /**
414 * Called when a key down event occurs on the textbox. Dispatches a 399 * Called when a key down event occurs on the textbox. Dispatches a
415 * TEXT_CHANGE event if the "Enter" key was pressed. 400 * TEXT_CHANGE event if the "Enter" key was pressed.
416 * @param {Event} event Contains the key that was pressed. 401 * @param {Event} event Contains the key that was pressed.
417 * @private 402 * @private
418 */ 403 */
419 onTextboxKeyDown_: function(event) { 404 onTextboxKeyDown_: function(event) {
420 if (this.textTimeout_) { 405 if (this.textTimeout_) {
421 clearTimeout(this.textTimeout_); 406 clearTimeout(this.textTimeout_);
422 this.textTimeout_ = null; 407 this.textTimeout_ = null;
423 } 408 }
424 if (event.keyCode == 13 /*enter*/) { 409 if (event.keyCode == 13 /*enter*/) {
425 this.preTimeoutValue_ = null;
426 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE); 410 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE);
427 } else {
428 if (this.preTimeoutValue_ == null) {
429 this.preTimeoutValue_ = this.textbox_.value;
430 }
431 this.textTimeout_ = setTimeout(
432 this.onTextboxTimeout_.bind(this), MarginControl.TEXTBOX_TIMEOUT_);
433 } 411 }
434 }, 412 },
435 413
436 /** 414 /**
437 * Called after a timeout after the text in the textbox has changed. Saves 415 * Called after a timeout after the text in the textbox has changed. Saves
438 * the textbox's value to the print ticket. 416 * the textbox's value to the print ticket.
439 * @private 417 * @private
440 */ 418 */
441 onTextboxTimeout_: function() { 419 onTextboxTimeout_: function() {
442 this.textTimeout_ = null; 420 this.textTimeout_ = null;
443 if (this.textbox_.value != this.preTimeoutValue_) { 421 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE);
444 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE);
445 }
446 this.preTimeoutValue_ = null;
447 }, 422 },
448 423
449 /** 424 /**
450 * Called when the textbox loses focus. Dispatches a TEXT_CHANGE event. 425 * Called when the textbox loses focus. Dispatches a TEXT_CHANGE event.
451 */ 426 */
452 onTexboxBlur_: function() { 427 onTexboxBlur_: function() {
453 if (this.textTimeout_) { 428 if (this.textTimeout_) {
454 clearTimeout(this.textTimeout_); 429 clearTimeout(this.textTimeout_);
455 this.textTimeout_ = null; 430 this.textTimeout_ = null;
456 this.preTimeoutValue_ = null;
457 } 431 }
458 this.setIsFocused_(false); 432 this.setIsFocused_(false);
459 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE); 433 cr.dispatchSimpleEvent(this, MarginControl.EventType.TEXT_CHANGE);
460 } 434 }
461 }; 435 };
462 436
463 // Export 437 // Export
464 return { 438 return {
465 MarginControl: MarginControl 439 MarginControl: MarginControl
466 }; 440 };
467 }); 441 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698