Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2016 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. | |
| 4 | |
| 5 QuickOpen.QuickOpen = class extends QuickOpen.FilteredListWidget.Delegate { | |
| 6 constructor() { | |
| 7 super(); | |
| 8 this._prefix = []; | |
| 9 self.runtime.extensions('quick-open').forEach(this._addPrefix.bind(this)); | |
| 10 this._currentDelegate = new QuickOpen.Loading(); | |
|
pfeldman
2017/02/07 02:10:03
nit: here and below, remove _current prefix - I do
einbinder
2017/02/28 23:59:07
Done.
| |
| 11 this._currentPrefix = ''; | |
| 12 this._currentQuery = ''; | |
| 13 } | |
| 14 | |
| 15 /** | |
| 16 * @param {!Runtime.Extension} extension | |
| 17 */ | |
| 18 _addPrefix(extension) { | |
| 19 this._prefix.push( | |
| 20 {prefix: extension.descriptor().prefix, delegate: null, instance: extens ion.instance.bind(extension)}); | |
| 21 this._prefix.sort((a, b) => b.prefix.length - a.prefix.length); | |
|
pfeldman
2017/02/07 02:10:02
They are already sorter by "order" extension prope
einbinder
2017/02/28 23:59:07
This is important so that longer prefix go first.
| |
| 22 } | |
| 23 | |
| 24 /** | |
| 25 * @param {string} query | |
| 26 * @return {!QuickOpen.FilteredListWidget.Delegate} | |
| 27 */ | |
| 28 _delegate(query) { | |
| 29 for (var i = 0; i < this._prefix.length; i++) { | |
|
pfeldman
2017/02/07 02:10:02
for (var provider of this._providers)
einbinder
2017/02/28 23:59:07
Done.
| |
| 30 if (query.startsWith(this._prefix[i].prefix)) { | |
| 31 this._currentPrefix = this._prefix[i].prefix; | |
| 32 var delegate = this._prefix[i].delegate; | |
| 33 if (!delegate) { | |
| 34 delegate = new QuickOpen.Loading(); | |
| 35 this._prefix[i].instance().then(instance => { | |
| 36 instance.setRefreshCallback(this.refresh.bind(this)); | |
| 37 this._prefix[i].delegate = instance; | |
|
pfeldman
2017/02/07 02:10:02
Store extension in this._providers and simply chai
einbinder
2017/02/28 23:59:07
It is much easier if this method is synchronous. O
| |
| 38 this.queryChanged(this._currentQuery); | |
| 39 }); | |
| 40 } | |
| 41 return delegate; | |
| 42 } | |
| 43 } | |
| 44 this._currentPrefix = ''; | |
| 45 return this._currentDelegate || new QuickOpen.FilteredListWidget.Delegate(); | |
|
pfeldman
2017/02/07 02:10:02
Oh, so QuickOpen.Loading() is not the same!
einbinder
2017/02/28 23:59:07
There was no path to get to the blank delegate, I
| |
| 46 } | |
| 47 | |
| 48 /** | |
| 49 * @param {string} query | |
| 50 * @return {string} | |
| 51 */ | |
| 52 _cleanQuery(query) { | |
| 53 return query.substring(this._currentPrefix.length); | |
| 54 } | |
| 55 | |
| 56 /** | |
| 57 * @override | |
| 58 * @param {string} query | |
| 59 */ | |
| 60 queryChanged(query) { | |
| 61 this._currentQuery = query; | |
| 62 var lastDelegate = this._currentDelegate; | |
| 63 this._currentDelegate = this._delegate(query); | |
| 64 this._currentDelegate.queryChanged(this._cleanQuery(query)); | |
| 65 if (this._currentDelegate !== lastDelegate) | |
| 66 this.refresh(); | |
| 67 if (!(this._currentDelegate instanceof QuickOpen.Loading)) | |
| 68 this._delegateLoadedForTest(this._currentDelegate); | |
| 69 } | |
| 70 | |
| 71 /** | |
| 72 * @param {!QuickOpen.FilteredListWidget.Delegate} delegate | |
| 73 */ | |
| 74 _delegateLoadedForTest(delegate) { | |
| 75 } | |
| 76 | |
| 77 /** | |
| 78 * @override | |
| 79 * @param {string} query | |
| 80 * @return {string} | |
| 81 */ | |
| 82 notFoundText(query) { | |
| 83 return this._currentDelegate.notFoundText(this._cleanQuery(query)); | |
| 84 } | |
| 85 | |
| 86 /** | |
| 87 * @override | |
| 88 * @param {function():void} refreshCallback | |
| 89 */ | |
| 90 setRefreshCallback(refreshCallback) { | |
|
pfeldman
2017/02/07 02:10:02
Is this to make sure that JavaScript works?
einbinder
2017/02/28 23:59:07
I was suspicious.
| |
| 91 super.setRefreshCallback(refreshCallback); | |
| 92 } | |
| 93 | |
| 94 /** | |
| 95 * @override | |
| 96 * @return {number} | |
| 97 */ | |
| 98 itemCount() { | |
| 99 return this._currentDelegate.itemCount(); | |
| 100 } | |
| 101 | |
| 102 /** | |
| 103 * @override | |
| 104 * @param {number} itemIndex | |
| 105 * @return {string} | |
| 106 */ | |
| 107 itemKeyAt(itemIndex) { | |
| 108 return this._currentDelegate.itemKeyAt(itemIndex); | |
| 109 } | |
| 110 | |
| 111 /** | |
| 112 * @override | |
| 113 * @param {number} itemIndex | |
| 114 * @param {string} query | |
| 115 * @return {number} | |
| 116 */ | |
| 117 itemScoreAt(itemIndex, query) { | |
| 118 return this._currentDelegate.itemScoreAt(itemIndex, query); | |
| 119 } | |
| 120 | |
| 121 /** | |
| 122 * @override | |
| 123 * @param {number} itemIndex | |
| 124 * @param {string} query | |
| 125 * @param {!Element} titleElement | |
| 126 * @param {!Element} subtitleElement | |
| 127 */ | |
| 128 renderItem(itemIndex, query, titleElement, subtitleElement) { | |
| 129 this._delegate(query).renderItem(itemIndex, this._cleanQuery(query), titleEl ement, subtitleElement); | |
| 130 } | |
| 131 | |
| 132 /** | |
| 133 * @override | |
| 134 * @return {boolean} | |
| 135 */ | |
| 136 renderAsTwoRows() { | |
| 137 return this._currentDelegate.renderAsTwoRows(); | |
| 138 } | |
| 139 | |
| 140 /** | |
| 141 * @override | |
| 142 * @param {null|number} itemIndex | |
| 143 * @param {string} promptValue | |
| 144 */ | |
| 145 selectItem(itemIndex, promptValue) { | |
| 146 this._currentDelegate.selectItem(itemIndex, this._cleanQuery(promptValue)); | |
| 147 } | |
| 148 | |
| 149 /** | |
| 150 * @override | |
| 151 * @param {string} query | |
| 152 * @return {string} | |
| 153 */ | |
| 154 rewriteQuery(query) { | |
| 155 return this._delegate(query).rewriteQuery(this._cleanQuery(query)); | |
| 156 } | |
| 157 | |
| 158 /** | |
| 159 * @override | |
| 160 */ | |
| 161 dispose() { | |
| 162 for (var i = 0; i < this._prefix.length; i++) { | |
|
pfeldman
2017/02/07 02:10:02
I now see why you need delegates, but I'd manage s
einbinder
2017/02/28 23:59:07
Dispose is to remove the event listeners on Filter
| |
| 163 if (this._prefix[i].delegate) | |
| 164 this._prefix[i].delegate.dispose(); | |
| 165 } | |
| 166 super.dispose(); | |
| 167 } | |
| 168 | |
| 169 /** | |
| 170 * @param {string} query | |
| 171 */ | |
| 172 static show(query) { | |
|
pfeldman
2017/02/07 02:10:03
move up.
einbinder
2017/02/28 23:59:07
Done.
| |
| 173 var filteredItemSelectionDialog = | |
| 174 new QuickOpen.FilteredListWidget(new QuickOpen.QuickOpen(), QuickOpen.Qu ickOpen._history); | |
|
pfeldman
2017/02/07 02:10:03
QuickOpen.QuickOpen again - why do you need to spe
einbinder
2017/02/28 23:59:07
Fixed :)
| |
| 175 filteredItemSelectionDialog.showAsDialog(); | |
| 176 filteredItemSelectionDialog.setQuery(query); | |
| 177 } | |
| 178 }; | |
| 179 | |
| 180 QuickOpen.QuickOpen._history = []; | |
| 181 | |
| 182 /** | |
| 183 * @implements {UI.ActionDelegate} | |
| 184 */ | |
| 185 QuickOpen.QuickOpen.ShowActionDelegate = class { | |
| 186 /** | |
| 187 * @override | |
| 188 * @param {!UI.Context} context | |
| 189 * @param {string} actionId | |
| 190 * @return {boolean} | |
| 191 */ | |
| 192 handleAction(context, actionId) { | |
| 193 switch (actionId) { | |
| 194 case 'quickOpen.show': | |
| 195 QuickOpen.QuickOpen.show(''); | |
| 196 return true; | |
| 197 } | |
| 198 return false; | |
| 199 } | |
| 200 }; | |
| 201 | |
| 202 QuickOpen.Loading = class extends QuickOpen.FilteredListWidget.Delegate { | |
|
pfeldman
2017/02/07 02:10:02
QuickOpen.QuickOpen.Loading :)
einbinder
2017/02/28 23:59:07
Done.
| |
| 203 /** | |
| 204 * @override | |
| 205 */ | |
| 206 notFoundText() { | |
| 207 return Common.UIString('Loading...'); | |
| 208 } | |
| 209 }; | |
| OLD | NEW |