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 |