| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 goog.provide('cvox.ChromeVoxHTMLTimeWidget'); | 5 goog.provide('cvox.ChromeVoxHTMLTimeWidget'); |
| 6 | 6 |
| 7 /** | 7 /** |
| 8 * @fileoverview Gives the user spoken feedback as they interact with the time | 8 * @fileoverview Gives the user spoken feedback as they interact with the time |
| 9 * widget (input type=time). | 9 * widget (input type=time). |
| 10 * | 10 * |
| 11 */ | 11 */ |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * A class containing the information needed to speak | 14 * A class containing the information needed to speak |
| 15 * a text change event to the user. | 15 * a text change event to the user. |
| 16 * | 16 * |
| 17 * @constructor | 17 * @constructor |
| 18 * @param {Element} timeElem The time widget element. | 18 * @param {Element} timeElem The time widget element. |
| 19 * @param {cvox.TtsInterface} tts The TTS object from ChromeVox. | 19 * @param {cvox.TtsInterface} tts The TTS object from ChromeVox. |
| 20 */ | 20 */ |
| 21 cvox.ChromeVoxHTMLTimeWidget = function(timeElem, tts){ | 21 cvox.ChromeVoxHTMLTimeWidget = function(timeElem, tts) { |
| 22 var self = this; | 22 var self = this; |
| 23 this.timeElem_ = timeElem; | 23 this.timeElem_ = timeElem; |
| 24 this.timeTts_ = tts; | 24 this.timeTts_ = tts; |
| 25 this.pHours_ = -1; | 25 this.pHours_ = -1; |
| 26 this.pMinutes_ = -1; | 26 this.pMinutes_ = -1; |
| 27 this.pSeconds_ = 0; | 27 this.pSeconds_ = 0; |
| 28 this.pMilliseconds_ = 0; | 28 this.pMilliseconds_ = 0; |
| 29 this.pAmpm_ = ''; | 29 this.pAmpm_ = ''; |
| 30 this.pos_ = 0; | 30 this.pos_ = 0; |
| 31 this.maxPos_ = 2; | 31 this.maxPos_ = 2; |
| 32 this.keyListener_ = function(evt) { | 32 this.keyListener_ = function(evt) { |
| 33 self.eventHandler_(evt); | 33 self.eventHandler_(evt); |
| 34 } | 34 }; |
| 35 this.blurListener_ = function(evt) { | 35 this.blurListener_ = function(evt) { |
| 36 self.shutdown(); | 36 self.shutdown(); |
| 37 } | 37 }; |
| 38 if (this.timeElem_.hasAttribute('step')) { | 38 if (this.timeElem_.hasAttribute('step')) { |
| 39 var step = this.timeElem_.getAttribute('step'); | 39 var step = this.timeElem_.getAttribute('step'); |
| 40 if (step > 0) { // 0 or invalid values show hh:mm AM/PM | 40 if (step > 0) { // 0 or invalid values show hh:mm AM/PM |
| 41 if (step >= 1) { | 41 if (step >= 1) { |
| 42 this.maxPos_ = 3; // Anything larger than 1 shows hh:mm:ss AM/PM | 42 this.maxPos_ = 3; // Anything larger than 1 shows hh:mm:ss AM/PM |
| 43 } else { | 43 } else { |
| 44 this.maxPos_ = 4; // Anything less than 1 shows hh:mm:ss.ms AM/PM | 44 this.maxPos_ = 4; // Anything less than 1 shows hh:mm:ss.ms AM/PM |
| 45 } | 45 } |
| 46 } | 46 } |
| 47 } | 47 } |
| 48 | 48 |
| 49 // Ensure we have a reasonable value to start with. | 49 // Ensure we have a reasonable value to start with. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 73 /** | 73 /** |
| 74 * Removes the key listeners for the time widget. | 74 * Removes the key listeners for the time widget. |
| 75 * | 75 * |
| 76 */ | 76 */ |
| 77 cvox.ChromeVoxHTMLTimeWidget.prototype.shutdown = function() { | 77 cvox.ChromeVoxHTMLTimeWidget.prototype.shutdown = function() { |
| 78 this.timeElem_.removeEventListener('blur', this.blurListener_, false); | 78 this.timeElem_.removeEventListener('blur', this.blurListener_, false); |
| 79 this.timeElem_.removeEventListener('keydown', this.keyListener_, false); | 79 this.timeElem_.removeEventListener('keydown', this.keyListener_, false); |
| 80 this.timeElem_.removeEventListener('keyup', this.keyListener_, false); | 80 this.timeElem_.removeEventListener('keyup', this.keyListener_, false); |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 /** |
| 84 * Initialize to midnight. |
| 85 * @private |
| 86 */ |
| 83 cvox.ChromeVoxHTMLTimeWidget.prototype.forceInitTime_ = function() { | 87 cvox.ChromeVoxHTMLTimeWidget.prototype.forceInitTime_ = function() { |
| 84 this.timeElem_.setAttribute('value', '12:00'); | 88 this.timeElem_.setAttribute('value', '12:00'); |
| 85 }; | 89 }; |
| 86 | 90 |
| 91 /** |
| 92 * Called when the position changes. |
| 93 * @private |
| 94 */ |
| 87 cvox.ChromeVoxHTMLTimeWidget.prototype.handlePosChange_ = function() { | 95 cvox.ChromeVoxHTMLTimeWidget.prototype.handlePosChange_ = function() { |
| 88 if (this.pos_ < 0){ | 96 if (this.pos_ < 0) { |
| 89 this.pos_ = 0; | 97 this.pos_ = 0; |
| 90 } | 98 } |
| 91 if (this.pos_ > this.maxPos_){ | 99 if (this.pos_ > this.maxPos_) { |
| 92 this.pos_ = this.maxPos_; | 100 this.pos_ = this.maxPos_; |
| 93 } | 101 } |
| 94 // Reset the cached state of the new field so that the field will be spoken | 102 // Reset the cached state of the new field so that the field will be spoken |
| 95 // in the update. | 103 // in the update. |
| 96 if (this.pos_ == this.maxPos_){ | 104 if (this.pos_ == this.maxPos_) { |
| 97 this.pAmpm_ = ''; | 105 this.pAmpm_ = ''; |
| 98 return; | 106 return; |
| 99 } | 107 } |
| 100 switch (this.pos_){ | 108 switch (this.pos_) { |
| 101 case 0: | 109 case 0: |
| 102 this.pHours_ = -1; | 110 this.pHours_ = -1; |
| 103 break; | 111 break; |
| 104 case 1: | 112 case 1: |
| 105 this.pMinutes_ = -1; | 113 this.pMinutes_ = -1; |
| 106 break; | 114 break; |
| 107 case 2: | 115 case 2: |
| 108 this.pSeconds_ = -1; | 116 this.pSeconds_ = -1; |
| 109 break; | 117 break; |
| 110 case 3: | 118 case 3: |
| 111 this.pMilliseconds_ = -1; | 119 this.pMilliseconds_ = -1; |
| 112 break; | 120 break; |
| 113 } | 121 } |
| 114 }; | 122 }; |
| 115 | 123 |
| 116 | 124 /** |
| 125 * @param {boolean} shouldSpeakLabel True if the label should be spoken. |
| 126 * @private |
| 127 */ |
| 117 cvox.ChromeVoxHTMLTimeWidget.prototype.update_ = function(shouldSpeakLabel) { | 128 cvox.ChromeVoxHTMLTimeWidget.prototype.update_ = function(shouldSpeakLabel) { |
| 118 var splitTime = this.timeElem_.value.split(":"); | 129 var splitTime = this.timeElem_.value.split(':'); |
| 119 if (splitTime.length < 1){ | 130 if (splitTime.length < 1) { |
| 120 this.forceInitTime_(); | 131 this.forceInitTime_(); |
| 121 return; | 132 return; |
| 122 } | 133 } |
| 123 | 134 |
| 124 var hours = splitTime[0]; | 135 var hours = splitTime[0]; |
| 125 var minutes = -1; | 136 var minutes = -1; |
| 126 var seconds = 0; | 137 var seconds = 0; |
| 127 var milliseconds = 0; | 138 var milliseconds = 0; |
| 128 var ampm = cvox.ChromeVox.msgs.getMsg('timewidget_am'); | 139 var ampm = cvox.ChromeVox.msgs.getMsg('timewidget_am'); |
| 129 if (splitTime.length > 1) { | 140 if (splitTime.length > 1) { |
| 130 minutes = splitTime[1]; | 141 minutes = splitTime[1]; |
| 131 } | 142 } |
| 132 if (splitTime.length > 2) { | 143 if (splitTime.length > 2) { |
| 133 var splitSecondsAndMilliseconds = splitTime[2].split('.'); | 144 var splitSecondsAndMilliseconds = splitTime[2].split('.'); |
| 134 seconds = splitSecondsAndMilliseconds[0]; | 145 seconds = splitSecondsAndMilliseconds[0]; |
| 135 if (splitSecondsAndMilliseconds.length > 1){ | 146 if (splitSecondsAndMilliseconds.length > 1) { |
| 136 milliseconds = splitSecondsAndMilliseconds[1]; | 147 milliseconds = splitSecondsAndMilliseconds[1]; |
| 137 } | 148 } |
| 138 } | 149 } |
| 139 if (hours > 12) { | 150 if (hours > 12) { |
| 140 hours = hours - 12; | 151 hours = hours - 12; |
| 141 ampm = cvox.ChromeVox.msgs.getMsg('timewidget_pm'); | 152 ampm = cvox.ChromeVox.msgs.getMsg('timewidget_pm'); |
| 142 } | 153 } |
| 143 if (hours == 12) { | 154 if (hours == 12) { |
| 144 ampm = cvox.ChromeVox.msgs.getMsg('timewidget_pm'); | 155 ampm = cvox.ChromeVox.msgs.getMsg('timewidget_pm'); |
| 145 } | 156 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 cvox.ChromeVox.msgs.getMsg('timewidget_milliseconds') + '\n'; | 188 cvox.ChromeVox.msgs.getMsg('timewidget_milliseconds') + '\n'; |
| 178 this.pMilliseconds_ = milliseconds; | 189 this.pMilliseconds_ = milliseconds; |
| 179 } | 190 } |
| 180 | 191 |
| 181 if (ampm != this.pAmpm_) { | 192 if (ampm != this.pAmpm_) { |
| 182 changeMessage = changeMessage + ampm; | 193 changeMessage = changeMessage + ampm; |
| 183 this.pAmpm_ = ampm; | 194 this.pAmpm_ = ampm; |
| 184 } | 195 } |
| 185 | 196 |
| 186 if (changeMessage.length > 0) { | 197 if (changeMessage.length > 0) { |
| 187 this.timeTts_.speak(changeMessage, 0, null); | 198 this.timeTts_.speak(changeMessage, cvox.QueueMode.FLUSH, null); |
| 188 } | 199 } |
| 189 }; | 200 }; |
| 190 | 201 |
| 202 /** |
| 203 * @param {Object} evt The event to handle. |
| 204 * @private |
| 205 */ |
| 191 cvox.ChromeVoxHTMLTimeWidget.prototype.eventHandler_ = function(evt) { | 206 cvox.ChromeVoxHTMLTimeWidget.prototype.eventHandler_ = function(evt) { |
| 192 var shouldSpeakLabel = false; | 207 var shouldSpeakLabel = false; |
| 193 if (evt.type == 'keydown') { | 208 if (evt.type == 'keydown') { |
| 194 if (((evt.keyCode == 9) && !evt.shiftKey) || (evt.keyCode == 39)) { | 209 if (((evt.keyCode == 9) && !evt.shiftKey) || (evt.keyCode == 39)) { |
| 195 this.pos_++; | 210 this.pos_++; |
| 196 this.handlePosChange_(); | 211 this.handlePosChange_(); |
| 197 shouldSpeakLabel = true; | 212 shouldSpeakLabel = true; |
| 198 } | 213 } |
| 199 if (((evt.keyCode == 9) && evt.shiftKey) || (evt.keyCode == 37)) { | 214 if (((evt.keyCode == 9) && evt.shiftKey) || (evt.keyCode == 37)) { |
| 200 this.pos_--; | 215 this.pos_--; |
| 201 this.handlePosChange_(); | 216 this.handlePosChange_(); |
| 202 shouldSpeakLabel = true; | 217 shouldSpeakLabel = true; |
| 203 } | 218 } |
| 204 } | 219 } |
| 205 this.update_(shouldSpeakLabel); | 220 this.update_(shouldSpeakLabel); |
| 206 }; | 221 }; |
| OLD | NEW |