Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 /** | 5 /** |
| 6 * @fileoverview Network drop-down implementation. | 6 * @fileoverview Network drop-down implementation. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 cr.define('cr.ui', function() { | 9 cr.define('cr.ui', function() { |
| 10 /** | 10 /** |
| 11 * Creates a new container for the drop down menu items. | 11 * Creates a new container for the drop down menu items. |
| 12 * @constructor | 12 * @constructor |
| 13 * @extends {HTMLDivElement} | 13 * @extends {HTMLDivElement} |
| 14 */ | 14 */ |
| 15 var DropDownContainer = cr.ui.define('div'); | 15 var DropDownContainer = cr.ui.define('div'); |
| 16 | 16 |
| 17 DropDownContainer.prototype = { | 17 DropDownContainer.prototype = { |
| 18 __proto__: HTMLDivElement.prototype, | 18 __proto__: HTMLDivElement.prototype, |
| 19 | 19 |
| 20 /** @inheritDoc */ | 20 /** @inheritDoc */ |
| 21 decorate: function() { | 21 decorate: function() { |
| 22 this.classList.add('dropdown-container'); | 22 this.classList.add('dropdown-container'); |
| 23 // Selected item in the menu list. | 23 // Selected item in the menu list. |
| 24 this.selectedItem = null; | 24 this.selectedItem = null; |
| 25 // First item which could be selected. | 25 // First item which could be selected. |
| 26 this.firstItem = null; | 26 this.firstItem = null; |
| 27 // Whether scroll has just happened. | |
| 28 this.scrollJustHappened = false; | |
| 29 }, | |
| 30 | |
| 31 scrollAction: function(item) { | |
|
Nikita (slow)
2011/09/21 10:44:25
nit: Function comment.
altimofeev
2011/09/21 11:49:53
Done.
| |
| 32 var thisTop = this.scrollTop; | |
| 33 var thisBottom = thisTop + this.offsetHeight; | |
| 34 var itemTop = item.offsetTop; | |
| 35 var itemBottom = itemTop + item.offsetHeight; | |
| 36 if (itemTop <= thisTop) return -1; | |
| 37 if (itemBottom >= thisBottom) return 1; | |
| 38 return 0; | |
| 27 }, | 39 }, |
| 28 | 40 |
| 29 /** | 41 /** |
| 30 * Selects new item. | 42 * Selects new item. |
| 31 * @param {!Object} selectedItem Item to be selected. | 43 * @param {!Object} selectedItem Item to be selected. |
| 44 * @param {boolean} mouseOver Is mouseover event triggered? | |
| 32 */ | 45 */ |
| 33 selectItem: function(selectedItem) { | 46 selectItem: function(selectedItem, mouseOver) { |
| 47 if (mouseOver && this.scrollJustHappened) { | |
| 48 this.scrollJustHappened = false; | |
| 49 return; | |
| 50 } | |
| 34 if (this.selectedItem) | 51 if (this.selectedItem) |
| 35 this.selectedItem.classList.remove('hover'); | 52 this.selectedItem.classList.remove('hover'); |
| 36 selectedItem.classList.add('hover'); | 53 selectedItem.classList.add('hover'); |
| 37 this.selectedItem = selectedItem; | 54 this.selectedItem = selectedItem; |
| 55 var action = this.scrollAction(selectedItem); | |
| 56 if (action != 0) { | |
| 57 selectedItem.scrollIntoView(action < 0); | |
| 58 this.scrollJustHappened = true; | |
| 59 } | |
| 38 } | 60 } |
| 39 }; | 61 }; |
| 40 | 62 |
| 41 /** | 63 /** |
| 42 * Creates a new DropDown div. | 64 * Creates a new DropDown div. |
| 43 * @constructor | 65 * @constructor |
| 44 * @extends {HTMLDivElement} | 66 * @extends {HTMLDivElement} |
| 45 */ | 67 */ |
| 46 var DropDown = cr.ui.define('div'); | 68 var DropDown = cr.ui.define('div'); |
| 47 | 69 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 69 }, | 91 }, |
| 70 | 92 |
| 71 /** | 93 /** |
| 72 * Sets dropdown menu visibility. | 94 * Sets dropdown menu visibility. |
| 73 * @param {bool} show New visibility state for dropdown menu. | 95 * @param {bool} show New visibility state for dropdown menu. |
| 74 */ | 96 */ |
| 75 set isShown(show) { | 97 set isShown(show) { |
| 76 this.firstElementChild.hidden = !show; | 98 this.firstElementChild.hidden = !show; |
| 77 this.container.hidden = !show; | 99 this.container.hidden = !show; |
| 78 if (show) | 100 if (show) |
| 79 this.container.selectItem(this.container.firstItem); | 101 this.container.selectItem(this.container.firstItem, false); |
| 80 }, | 102 }, |
| 81 | 103 |
| 82 /** | 104 /** |
| 83 * Returns title button. | 105 * Returns title button. |
| 84 */ | 106 */ |
| 85 get titleButton() { | 107 get titleButton() { |
| 86 return this.children[1]; | 108 return this.children[1]; |
| 87 }, | 109 }, |
| 88 | 110 |
| 89 /** | 111 /** |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 115 var item = items[i]; | 137 var item = items[i]; |
| 116 if ('sub' in item) { | 138 if ('sub' in item) { |
| 117 // Workaround for submenus, add items on top level. | 139 // Workaround for submenus, add items on top level. |
| 118 // TODO(altimofeev): support submenus. | 140 // TODO(altimofeev): support submenus. |
| 119 for (var j = 0; j < item.sub.length; ++j) | 141 for (var j = 0; j < item.sub.length; ++j) |
| 120 this.createItem_(this.container, item.sub[j]); | 142 this.createItem_(this.container, item.sub[j]); |
| 121 continue; | 143 continue; |
| 122 } | 144 } |
| 123 this.createItem_(this.container, item); | 145 this.createItem_(this.container, item); |
| 124 } | 146 } |
| 125 this.container.selectItem(this.container.firstItem); | 147 this.container.selectItem(this.container.firstItem, false); |
| 126 }, | 148 }, |
| 127 | 149 |
| 128 /** | 150 /** |
| 129 * Id of the active drop-down element. | 151 * Id of the active drop-down element. |
| 130 * @private | 152 * @private |
| 131 */ | 153 */ |
| 132 activeElementId_: '', | 154 activeElementId_: '', |
| 133 | 155 |
| 134 /** | 156 /** |
| 135 * Creates dropdown item element and adds into container. | 157 * Creates dropdown item element and adds into container. |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 174 wrapperDiv.addEventListener('click', function f(e) { | 196 wrapperDiv.addEventListener('click', function f(e) { |
| 175 var item = this.lastElementChild; | 197 var item = this.lastElementChild; |
| 176 if (item.iid < -1 || item.classList.contains('disabled-item')) | 198 if (item.iid < -1 || item.classList.contains('disabled-item')) |
| 177 return; | 199 return; |
| 178 item.controller.isShown = false; | 200 item.controller.isShown = false; |
| 179 if (item.iid >= 0) | 201 if (item.iid >= 0) |
| 180 chrome.send('networkItemChosen', [item.iid]); | 202 chrome.send('networkItemChosen', [item.iid]); |
| 181 this.parentNode.parentNode.titleButton.focus(); | 203 this.parentNode.parentNode.titleButton.focus(); |
| 182 }); | 204 }); |
| 183 wrapperDiv.addEventListener('mouseover', function f(e) { | 205 wrapperDiv.addEventListener('mouseover', function f(e) { |
| 184 this.parentNode.selectItem(this); | 206 this.parentNode.selectItem(this, true); |
| 185 }); | 207 }); |
| 186 itemElement = wrapperDiv; | 208 itemElement = wrapperDiv; |
| 187 } | 209 } |
| 188 container.appendChild(itemElement); | 210 container.appendChild(itemElement); |
| 189 if (!container.firstItem && item.id >= 0) { | 211 if (!container.firstItem && item.id >= 0) { |
| 190 container.firstItem = itemElement; | 212 container.firstItem = itemElement; |
| 191 } | 213 } |
| 192 }, | 214 }, |
| 193 | 215 |
| 194 /** | 216 /** |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 if (!this.isShown) | 279 if (!this.isShown) |
| 258 return; | 280 return; |
| 259 var selected = this.container.selectedItem; | 281 var selected = this.container.selectedItem; |
| 260 switch (e.keyCode) { | 282 switch (e.keyCode) { |
| 261 case 38: { // Key up. | 283 case 38: { // Key up. |
| 262 do { | 284 do { |
| 263 selected = selected.previousSibling; | 285 selected = selected.previousSibling; |
| 264 if (!selected) | 286 if (!selected) |
| 265 selected = this.container.lastElementChild; | 287 selected = this.container.lastElementChild; |
| 266 } while (selected.iid < 0); | 288 } while (selected.iid < 0); |
| 267 this.container.selectItem(selected); | 289 this.container.selectItem(selected, false); |
| 268 break; | 290 break; |
| 269 } | 291 } |
| 270 case 40: { // Key down. | 292 case 40: { // Key down. |
| 271 do { | 293 do { |
| 272 selected = selected.nextSibling; | 294 selected = selected.nextSibling; |
| 273 if (!selected) | 295 if (!selected) |
| 274 selected = this.container.firstItem; | 296 selected = this.container.firstItem; |
| 275 } while (selected.iid < 0); | 297 } while (selected.iid < 0); |
| 276 this.container.selectItem(selected); | 298 this.container.selectItem(selected, false); |
| 277 break; | 299 break; |
| 278 } | 300 } |
| 279 case 27: { // Esc. | 301 case 27: { // Esc. |
| 280 this.isShown = false; | 302 this.isShown = false; |
| 281 break; | 303 break; |
| 282 } | 304 } |
| 283 case 9: { // Tab. | 305 case 9: { // Tab. |
| 284 this.isShown = false; | 306 this.isShown = false; |
| 285 break; | 307 break; |
| 286 } | 308 } |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 DropDown.activeElementId_ = ''; | 359 DropDown.activeElementId_ = ''; |
| 338 chrome.send('networkDropdownHide', []); | 360 chrome.send('networkDropdownHide', []); |
| 339 } | 361 } |
| 340 } | 362 } |
| 341 }; | 363 }; |
| 342 | 364 |
| 343 return { | 365 return { |
| 344 DropDown: DropDown | 366 DropDown: DropDown |
| 345 }; | 367 }; |
| 346 }); | 368 }); |
| OLD | NEW |