Skip to content

Commit fdf2910

Browse files
committed
repl: simplify filter work
1 parent f03b141 commit fdf2910

5 files changed

Lines changed: 46 additions & 121 deletions

File tree

src/vs/workbench/contrib/debug/browser/repl.ts

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ import { ReplGroup } from 'vs/workbench/contrib/debug/common/replModel';
5959
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
6060
import { EDITOR_FONT_DEFAULTS, EditorOption } from 'vs/editor/common/config/editorOptions';
6161
import { MOUSE_CURSOR_TEXT_CSS_CLASS_NAME } from 'vs/base/browser/ui/mouseCursor/mouseCursor';
62-
import { ReplFilter, TreeFilterState, TreeFilterPanelActionViewItem } from 'vs/workbench/contrib/debug/browser/replFilter';
62+
import { ReplFilter, ReplFilterState, ReplFilterActionViewItem } from 'vs/workbench/contrib/debug/browser/replFilter';
6363

6464
const $ = dom.$;
6565

@@ -95,8 +95,8 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
9595
private completionItemProvider: IDisposable | undefined;
9696
private modelChangeListener: IDisposable = Disposable.None;
9797
private filter: ReplFilter;
98-
private filterState: TreeFilterState;
99-
private filterActionViewItem: TreeFilterPanelActionViewItem | undefined;
98+
private filterState: ReplFilterState;
99+
private filterActionViewItem: ReplFilterActionViewItem | undefined;
100100

101101
constructor(
102102
options: IViewPaneOptions,
@@ -121,11 +121,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
121121

122122
this.history = new HistoryNavigator(JSON.parse(this.storageService.get(HISTORY_STORAGE_KEY, StorageScope.WORKSPACE, '[]')), 50);
123123
this.filter = new ReplFilter();
124-
this.filterState = this._register(new TreeFilterState({
125-
filterText: '',
126-
filterHistory: [],
127-
layout: new dom.Dimension(0, 0),
128-
}));
124+
this.filterState = new ReplFilterState();
129125

130126
codeEditorService.registerDecorationType(DECORATION_KEY, {});
131127
this.registerListeners();
@@ -249,13 +245,10 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
249245
this.setMode();
250246
}));
251247

252-
this._register(this.filterState.onDidChange((e) => {
253-
if (e.filterText) {
254-
this.filter.filterQuery = this.filterState.filterText;
255-
if (this.tree) {
256-
this.tree.refilter();
257-
}
258-
}
248+
this._register(this.filterState.onDidChange(() => {
249+
this.filter.filterQuery = this.filterState.filterText;
250+
this.tree.refilter();
251+
revealLastElement(this.tree);
259252
}));
260253
}
261254

@@ -448,7 +441,6 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
448441
this.replInputContainer.style.height = `${replInputHeight}px`;
449442

450443
this.replInput.layout({ width: width - 30, height: replInputHeight });
451-
this.filterState.layout = new dom.Dimension(width, height);
452444
}
453445

454446
focus(): void {
@@ -459,7 +451,7 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget {
459451
if (action.id === SelectReplAction.ID) {
460452
return this.instantiationService.createInstance(SelectReplActionViewItem, this.selectReplAction);
461453
} else if (action.id === FILTER_ACTION_ID) {
462-
this.filterActionViewItem = this.instantiationService.createInstance(TreeFilterPanelActionViewItem, action, localize('workbench.debug.filter.placeholder', "Filter. E.g.: text, !exclude"), this.filterState);
454+
this.filterActionViewItem = this.instantiationService.createInstance(ReplFilterActionViewItem, action, localize('workbench.debug.filter.placeholder', "Filter (e.g. text, !exclude)"), this.filterState);
463455
return this.filterActionViewItem;
464456
}
465457

src/vs/workbench/contrib/debug/browser/replFilter.ts

Lines changed: 21 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { IAction } from 'vs/base/common/actions';
1515
import { HistoryInputBox } from 'vs/base/browser/ui/inputbox/inputBox';
1616
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1717
import { IContextViewService } from 'vs/platform/contextview/browser/contextView';
18-
import { toDisposable, Disposable } from 'vs/base/common/lifecycle';
18+
import { toDisposable } from 'vs/base/common/lifecycle';
1919
import { Event, Emitter } from 'vs/base/common/event';
2020
import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent';
2121
import { KeyCode } from 'vs/base/common/keyCodes';
@@ -76,64 +76,37 @@ export class ReplFilter implements ITreeFilter<IReplElement> {
7676
}
7777
}
7878

79-
export interface IReplFiltersChangeEvent {
80-
filterText?: boolean;
81-
layout?: boolean;
82-
}
83-
84-
export interface IReplFiltersOptions {
85-
filterText: string;
86-
filterHistory: string[];
87-
layout: DOM.Dimension;
88-
}
89-
90-
export class TreeFilterState extends Disposable {
79+
export class ReplFilterState {
9180

92-
private readonly _onDidChange: Emitter<IReplFiltersChangeEvent> = this._register(new Emitter<IReplFiltersChangeEvent>());
93-
readonly onDidChange: Event<IReplFiltersChangeEvent> = this._onDidChange.event;
94-
95-
constructor(options: IReplFiltersOptions) {
96-
super();
97-
this._filterText = options.filterText;
98-
this.filterHistory = options.filterHistory;
99-
this._layout = options.layout;
81+
private readonly _onDidChange: Emitter<void> = new Emitter<void>();
82+
get onDidChange(): Event<void> {
83+
return this._onDidChange.event;
10084
}
10185

102-
private _filterText: string;
86+
private _filterText = '';
87+
10388
get filterText(): string {
10489
return this._filterText;
10590
}
91+
10692
set filterText(filterText: string) {
10793
if (this._filterText !== filterText) {
10894
this._filterText = filterText;
109-
this._onDidChange.fire({ filterText: true });
110-
}
111-
}
112-
113-
filterHistory: string[];
114-
115-
private _layout: DOM.Dimension = new DOM.Dimension(0, 0);
116-
get layout(): DOM.Dimension {
117-
return this._layout;
118-
}
119-
set layout(layout: DOM.Dimension) {
120-
if (this._layout.width !== layout.width || this._layout.height !== layout.height) {
121-
this._layout = layout;
122-
this._onDidChange.fire(<IReplFiltersChangeEvent>{ layout: true });
95+
this._onDidChange.fire();
12396
}
12497
}
12598
}
12699

127-
export class TreeFilterPanelActionViewItem extends BaseActionViewItem {
100+
export class ReplFilterActionViewItem extends BaseActionViewItem {
128101

129102
private delayedFilterUpdate: Delayer<void>;
130-
private container: HTMLElement | undefined;
131-
private filterInputBox: HistoryInputBox | undefined;
103+
private container!: HTMLElement;
104+
private filterInputBox!: HistoryInputBox;
132105

133106
constructor(
134107
action: IAction,
135108
private placeholder: string,
136-
private filters: TreeFilterState,
109+
private filters: ReplFilterState,
137110
@IInstantiationService private readonly instantiationService: IInstantiationService,
138111
@IThemeService private readonly themeService: IThemeService,
139112
@IContextViewService private readonly contextViewService: IContextViewService) {
@@ -150,34 +123,28 @@ export class TreeFilterPanelActionViewItem extends BaseActionViewItem {
150123
this.element.className = this.class;
151124
this.createInput(this.element);
152125
this.updateClass();
153-
154-
this.adjustInputBox();
126+
this.filterInputBox.inputElement.style.paddingRight = DOM.hasClass(this.element, 'small') ? '25px' : '150px';
155127
}
156128

157129
focus(): void {
158-
if (this.filterInputBox) {
159-
this.filterInputBox.focus();
160-
}
130+
this.filterInputBox.focus();
161131
}
162132

163133
private clearFilterText(): void {
164-
if (this.filterInputBox) {
165-
this.filterInputBox.value = '';
166-
}
134+
this.filterInputBox.value = '';
167135
}
168136

169137
private createInput(container: HTMLElement): void {
170138
this.filterInputBox = this._register(this.instantiationService.createInstance(ContextScopedHistoryInputBox, container, this.contextViewService, {
171139
placeholder: this.placeholder,
172-
history: this.filters.filterHistory
140+
history: []
173141
}));
174142
this._register(attachInputBoxStyler(this.filterInputBox, this.themeService));
175143
this.filterInputBox.value = this.filters.filterText;
144+
176145
this._register(this.filterInputBox.onDidChange(() => this.delayedFilterUpdate.trigger(() => this.onDidInputChange(this.filterInputBox!))));
177-
this._register(this.filters.onDidChange((event: IReplFiltersChangeEvent) => {
178-
if (event.filterText) {
179-
this.filterInputBox!.value = this.filters.filterText;
180-
}
146+
this._register(this.filters.onDidChange(() => {
147+
this.filterInputBox.value = this.filters.filterText;
181148
}));
182149
this._register(DOM.addStandardDisposableListener(this.filterInputBox.inputElement, DOM.EventType.KEY_DOWN, (e: any) => this.onInputKeyDown(e)));
183150
this._register(DOM.addStandardDisposableListener(container, DOM.EventType.KEY_DOWN, this.handleKeyboardEvent));
@@ -186,19 +153,11 @@ export class TreeFilterPanelActionViewItem extends BaseActionViewItem {
186153
e.stopPropagation();
187154
e.preventDefault();
188155
}));
189-
this._register(this.filters.onDidChange(e => this.onDidFiltersChange(e)));
190-
}
191-
192-
private onDidFiltersChange(e: IReplFiltersChangeEvent): void {
193-
if (e.layout) {
194-
this.updateClass();
195-
}
196156
}
197157

198158
private onDidInputChange(inputbox: HistoryInputBox) {
199159
inputbox.addToHistory();
200160
this.filters.filterText = inputbox.value;
201-
this.filters.filterHistory = inputbox.getHistory();
202161
}
203162

204163
// Action toolbar is swallowing some keys for action items which should not be for an input box
@@ -220,27 +179,7 @@ export class TreeFilterPanelActionViewItem extends BaseActionViewItem {
220179
}
221180
}
222181

223-
private adjustInputBox(): void {
224-
if (this.element && this.filterInputBox) {
225-
this.filterInputBox.inputElement.style.paddingRight = DOM.hasClass(this.element, 'small') ? '25px' : '150px';
226-
}
227-
}
228-
229-
protected updateClass(): void {
230-
if (this.element && this.container) {
231-
this.element.className = this.class;
232-
DOM.toggleClass(this.container, 'grow', DOM.hasClass(this.element, 'grow'));
233-
this.adjustInputBox();
234-
}
235-
}
236-
237182
protected get class(): string {
238-
if (this.filters.layout.width > 800) {
239-
return 'panel-action-tree-filter grow';
240-
} else if (this.filters.layout.width < 600) {
241-
return 'panel-action-tree-filter small';
242-
} else {
243-
return 'panel-action-tree-filter';
244-
}
183+
return 'panel-action-tree-filter';
245184
}
246185
}

src/vs/workbench/contrib/debug/common/replModel.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -174,18 +174,13 @@ export class ReplGroup implements IReplElement {
174174
}
175175
}
176176

177-
type FilterFunc = ((element: IReplElement) => void);
178-
179177
export class ReplModel {
180178
private replElements: IReplElement[] = [];
181179
private readonly _onDidChangeElements = new Emitter<void>();
182180
readonly onDidChangeElements = this._onDidChangeElements.event;
183-
private filterFunc: FilterFunc | undefined;
184181

185182
getReplElements(): IReplElement[] {
186-
return this.replElements.filter(element =>
187-
this.filterFunc ? this.filterFunc(element) : true
188-
);
183+
return this.replElements;
189184
}
190185

191186
async addReplExpression(session: IDebugSession, stackFrame: IStackFrame | undefined, name: string): Promise<void> {
@@ -320,10 +315,6 @@ export class ReplModel {
320315
}
321316
}
322317

323-
setFilter(filterFunc: FilterFunc): void {
324-
this.filterFunc = filterFunc;
325-
}
326-
327318
removeReplExpressions(): void {
328319
if (this.replElements.length > 0) {
329320
this.replElements = [];

src/vs/workbench/contrib/debug/test/browser/repl.test.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -197,53 +197,56 @@ suite('Debug - REPL', () => {
197197
const repl = new ReplModel();
198198
const replFilter = new ReplFilter();
199199

200-
repl.setFilter((element) => {
201-
const filterResult = replFilter.filter(element, TreeVisibility.Visible);
202-
return filterResult === true || filterResult === TreeVisibility.Visible;
203-
});
200+
const getFilteredElements = () => {
201+
const elements = repl.getReplElements();
202+
return elements.filter(e => {
203+
const filterResult = replFilter.filter(e, TreeVisibility.Visible);
204+
return filterResult === true || filterResult === TreeVisibility.Visible;
205+
});
206+
};
204207

205208
repl.appendToRepl(session, 'first line\n', severity.Info);
206209
repl.appendToRepl(session, 'second line\n', severity.Info);
207210
repl.appendToRepl(session, 'third line\n', severity.Info);
208211
repl.appendToRepl(session, 'fourth line\n', severity.Info);
209212

210213
replFilter.filterQuery = 'first';
211-
let r1 = <SimpleReplElement[]>repl.getReplElements();
214+
let r1 = <SimpleReplElement[]>getFilteredElements();
212215
assert.equal(r1.length, 1);
213216
assert.equal(r1[0].value, 'first line\n');
214217

215218
replFilter.filterQuery = '!first';
216-
let r2 = <SimpleReplElement[]>repl.getReplElements();
219+
let r2 = <SimpleReplElement[]>getFilteredElements();
217220
assert.equal(r1.length, 1);
218221
assert.equal(r2[0].value, 'second line\n');
219222
assert.equal(r2[1].value, 'third line\n');
220223
assert.equal(r2[2].value, 'fourth line\n');
221224

222225
replFilter.filterQuery = 'first, line';
223-
let r3 = <SimpleReplElement[]>repl.getReplElements();
226+
let r3 = <SimpleReplElement[]>getFilteredElements();
224227
assert.equal(r3.length, 4);
225228
assert.equal(r3[0].value, 'first line\n');
226229
assert.equal(r3[1].value, 'second line\n');
227230
assert.equal(r3[2].value, 'third line\n');
228231
assert.equal(r3[3].value, 'fourth line\n');
229232

230233
replFilter.filterQuery = 'line, !second';
231-
let r4 = <SimpleReplElement[]>repl.getReplElements();
234+
let r4 = <SimpleReplElement[]>getFilteredElements();
232235
assert.equal(r4.length, 3);
233236
assert.equal(r4[0].value, 'first line\n');
234237
assert.equal(r4[1].value, 'third line\n');
235238
assert.equal(r4[2].value, 'fourth line\n');
236239

237240
replFilter.filterQuery = '!second, line';
238-
let r4_same = <SimpleReplElement[]>repl.getReplElements();
241+
let r4_same = <SimpleReplElement[]>getFilteredElements();
239242
assert.equal(r4.length, r4_same.length);
240243

241244
replFilter.filterQuery = '!line';
242-
let r5 = <SimpleReplElement[]>repl.getReplElements();
245+
let r5 = <SimpleReplElement[]>getFilteredElements();
243246
assert.equal(r5.length, 0);
244247

245248
replFilter.filterQuery = 'smth';
246-
let r6 = <SimpleReplElement[]>repl.getReplElements();
249+
let r6 = <SimpleReplElement[]>getFilteredElements();
247250
assert.equal(r6.length, 0);
248251
});
249252
});

src/vs/workbench/contrib/markers/browser/messages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ export default class Messages {
3333
public static MARKERS_PANEL_ACTION_TOOLTIP_FILTER: string = nls.localize('markers.panel.action.filter', "Filter Problems");
3434
public static MARKERS_PANEL_ACTION_TOOLTIP_QUICKFIX: string = nls.localize('markers.panel.action.quickfix', "Show fixes");
3535
public static MARKERS_PANEL_FILTER_ARIA_LABEL: string = nls.localize('markers.panel.filter.ariaLabel', "Filter Problems");
36-
public static MARKERS_PANEL_FILTER_PLACEHOLDER: string = nls.localize('markers.panel.filter.placeholder', "Filter. E.g.: text, **/*.ts, !**/node_modules/**");
36+
public static MARKERS_PANEL_FILTER_PLACEHOLDER: string = nls.localize('markers.panel.filter.placeholder', "Filter (e.g. text, **/*.ts, !**/node_modules/**)");
3737
public static MARKERS_PANEL_FILTER_ERRORS: string = nls.localize('markers.panel.filter.errors', "errors");
3838
public static MARKERS_PANEL_FILTER_WARNINGS: string = nls.localize('markers.panel.filter.warnings', "warnings");
3939
public static MARKERS_PANEL_FILTER_INFOS: string = nls.localize('markers.panel.filter.infos', "infos");

0 commit comments

Comments
 (0)