Skip to content

Commit 879fd0d

Browse files
committed
Add remove action for FolderMatch
1 parent a7fcaff commit 879fd0d

3 files changed

Lines changed: 36 additions & 17 deletions

File tree

src/vs/workbench/parts/search/browser/searchActions.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
1515
import { ITree } from 'vs/base/parts/tree/browser/tree';
1616
import { INavigator } from 'vs/base/common/iterator';
1717
import { SearchViewlet } from 'vs/workbench/parts/search/browser/searchViewlet';
18-
import { Match, FileMatch, FileMatchOrMatch, FolderMatch } from 'vs/workbench/parts/search/common/searchModel';
18+
import { Match, FileMatch, FileMatchOrMatch, FolderMatch, RenderableMatch } from 'vs/workbench/parts/search/common/searchModel';
1919
import { IReplaceService } from 'vs/workbench/parts/search/common/replace';
2020
import * as Constants from 'vs/workbench/parts/search/common/constants';
2121
import { CollapseAllAction as TreeCollapseAction } from 'vs/base/parts/tree/browser/treeDefaults';
@@ -465,17 +465,20 @@ export abstract class AbstractSearchAndReplaceAction extends Action {
465465
/**
466466
* Returns element to focus after removing the given element
467467
*/
468-
public getElementToFocusAfterRemoved(viewer: ITree, elementToBeRemoved: FileMatchOrMatch): FileMatchOrMatch {
468+
public getElementToFocusAfterRemoved(viewer: ITree, elementToBeRemoved: RenderableMatch): RenderableMatch {
469469
let elementToFocus = this.getNextElementAfterRemoved(viewer, elementToBeRemoved);
470470
if (!elementToFocus) {
471471
elementToFocus = this.getPreviousElementAfterRemoved(viewer, elementToBeRemoved);
472472
}
473473
return elementToFocus;
474474
}
475475

476-
public getNextElementAfterRemoved(viewer: ITree, element: FileMatchOrMatch): FileMatchOrMatch {
476+
public getNextElementAfterRemoved(viewer: ITree, element: RenderableMatch): RenderableMatch {
477477
let navigator: INavigator<any> = this.getNavigatorAt(element, viewer);
478-
if (element instanceof FileMatch) {
478+
if (element instanceof FolderMatch) {
479+
// If file match is removed then next element is the next file match
480+
while (!!navigator.next() && !(navigator.current() instanceof FolderMatch)) { };
481+
} else if (element instanceof FileMatch) {
479482
// If file match is removed then next element is the next file match
480483
while (!!navigator.next() && !(navigator.current() instanceof FileMatch)) { };
481484
} else {
@@ -484,7 +487,7 @@ export abstract class AbstractSearchAndReplaceAction extends Action {
484487
return navigator.current();
485488
}
486489

487-
public getPreviousElementAfterRemoved(viewer: ITree, element: FileMatchOrMatch): FileMatchOrMatch {
490+
public getPreviousElementAfterRemoved(viewer: ITree, element: RenderableMatch): RenderableMatch {
488491
let navigator: INavigator<any> = this.getNavigatorAt(element, viewer);
489492
let previousElement = navigator.previous();
490493
if (element instanceof Match && element.parent().matches().length === 1) {
@@ -495,7 +498,7 @@ export abstract class AbstractSearchAndReplaceAction extends Action {
495498
return previousElement;
496499
}
497500

498-
private getNavigatorAt(element: FileMatchOrMatch, viewer: ITree): INavigator<any> {
501+
private getNavigatorAt(element: RenderableMatch, viewer: ITree): INavigator<any> {
499502
let navigator: INavigator<any> = viewer.getNavigator();
500503
while (navigator.current() !== element && !!navigator.next()) { }
501504
return navigator;
@@ -504,7 +507,7 @@ export abstract class AbstractSearchAndReplaceAction extends Action {
504507

505508
export class RemoveAction extends AbstractSearchAndReplaceAction {
506509

507-
constructor(private viewer: ITree, private element: FileMatchOrMatch) {
510+
constructor(private viewer: ITree, private element: RenderableMatch) {
508511
super('remove', nls.localize('RemoveAction.label', "Remove"), 'action-remove');
509512
}
510513

@@ -515,13 +518,18 @@ export class RemoveAction extends AbstractSearchAndReplaceAction {
515518
}
516519

517520
let elementToRefresh: any;
518-
if (this.element instanceof FileMatch) {
519-
let parent: FolderMatch = <FolderMatch>this.element.parent();
520-
parent.remove(<FileMatch>this.element);
521+
const element = this.element;
522+
if (element instanceof FolderMatch) {
523+
let parent = element.parent();
524+
parent.remove(element);
521525
elementToRefresh = parent;
522-
} else {
523-
let parent: FileMatch = <FileMatch>this.element.parent();
524-
parent.remove(<Match>this.element);
526+
} else if (element instanceof FileMatch) {
527+
let parent = element.parent();
528+
parent.remove(element);
529+
elementToRefresh = parent;
530+
} else if (element instanceof Match) {
531+
let parent = element.parent();
532+
parent.remove(element);
525533
elementToRefresh = parent.count() === 0 ? parent.parent() : parent;
526534
}
527535

@@ -620,7 +628,7 @@ export class ReplaceAction extends AbstractSearchAndReplaceAction {
620628
return null;
621629
}
622630

623-
private hasSameParent(element: FileMatchOrMatch): boolean {
631+
private hasSameParent(element: RenderableMatch): boolean {
624632
return element && element instanceof Match && element.parent().resource() === this.element.parent().resource();
625633
}
626634

src/vs/workbench/parts/search/browser/searchResultsView.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export class SearchSorter implements ISorter {
114114
interface IFolderMatchTemplate {
115115
label: FileLabel;
116116
badge: CountBadge;
117+
actions: ActionBar;
117118
}
118119

119120
interface IFileMatchTemplate {
@@ -193,7 +194,8 @@ export class SearchRenderer extends Disposable implements IRenderer {
193194
const label = this.instantiationService.createInstance(FileLabel, folderMatchElement, void 0);
194195
const badge = new CountBadge(DOM.append(folderMatchElement, DOM.$('.badge')));
195196
this._register(attachBadgeStyler(badge, this.themeService));
196-
return { label, badge };
197+
const actions = new ActionBar(folderMatchElement, { animated: false });
198+
return { label, badge, actions };
197199
}
198200

199201
private renderFileMatchTemplate(tree: ITree, templateId: string, container: HTMLElement): IFileMatchTemplate {
@@ -234,6 +236,9 @@ export class SearchRenderer extends Disposable implements IRenderer {
234236
let count = folderMatch.fileCount();
235237
templateData.badge.setCount(count);
236238
templateData.badge.setTitleFormat(count > 1 ? nls.localize('searchFileMatches', "{0} files found", count) : nls.localize('searchFileMatch', "{0} file found", count));
239+
240+
templateData.actions.clear();
241+
templateData.actions.push([new RemoveAction(tree, folderMatch)], { icon: true, label: false });
237242
}
238243

239244
private renderFileMatch(tree: ITree, fileMatch: FileMatch, templateData: IFileMatchTemplate): void {

src/vs/workbench/parts/search/common/searchModel.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -549,8 +549,12 @@ export class SearchResult extends Disposable {
549549
this.disposeMatches();
550550
}
551551

552-
public remove(match: FileMatch): void {
553-
this.getFolderMatch(match.resource()).remove(match);
552+
public remove(match: FileMatch | FolderMatch): void {
553+
if (match instanceof FileMatch) {
554+
this.getFolderMatch(match.resource()).remove(match);
555+
} else {
556+
match.clear();
557+
}
554558
}
555559

556560
public replace(match: FileMatch): TPromise<any> {
@@ -788,6 +792,8 @@ export class SearchModel extends Disposable {
788792

789793
export type FileMatchOrMatch = FileMatch | Match;
790794

795+
export type RenderableMatch = FolderMatch | FileMatch | Match;
796+
791797
export class SearchWorkbenchService implements ISearchWorkbenchService {
792798

793799
_serviceBrand: any;

0 commit comments

Comments
 (0)