@@ -15,7 +15,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
1515import { ITree } from 'vs/base/parts/tree/browser/tree' ;
1616import { INavigator } from 'vs/base/common/iterator' ;
1717import { 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' ;
1919import { IReplaceService } from 'vs/workbench/parts/search/common/replace' ;
2020import * as Constants from 'vs/workbench/parts/search/common/constants' ;
2121import { 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
505508export 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
0 commit comments