diff --git a/src/vs/workbench/parts/files/browser/files.ts b/src/vs/workbench/parts/files/browser/files.ts index 2665af86fe910f735df67dd8465ae18373ba6307..e1c25edab60fb0ee8eb6ff2a2a4e02b9f2b8df16 100644 --- a/src/vs/workbench/parts/files/browser/files.ts +++ b/src/vs/workbench/parts/files/browser/files.ts @@ -12,7 +12,6 @@ import { ExplorerItem, OpenEditor } from 'vs/workbench/parts/files/common/explor import { toResource } from 'vs/workbench/common/editor'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { List } from 'vs/base/browser/ui/list/listWidget'; -import { IFileStat } from 'vs/platform/files/common/files'; // Commands can get exeucted from a command pallete, from a context menu or from some list using a keybinding // To cover all these cases we need to properly compute the resource on which the command is being executed @@ -23,7 +22,16 @@ export function getResourceForCommand(resource: URI | object, listService: IList let list = listService.lastFocusedList; if (list && list.isDOMFocused()) { - const focus = list.getFocus(); + let focus: any; + if (list instanceof List) { + const focused = list.getFocusedElements(); + if (focused.length) { + focus = focused[0]; + } + } else { + focus = list.getFocus(); + } + if (focus instanceof ExplorerItem) { return focus.resource; } else if (focus instanceof OpenEditor) { @@ -39,27 +47,25 @@ export function getMultiSelectedResources(resource: URI | object, listService: I if (list && list.isDOMFocused()) { // Explorer if (list instanceof Tree) { - const focus: IFileStat = list.getFocus(); + const selection = list.getSelection().map((fs: ExplorerItem) => fs.resource); + const focus = list.getFocus(); + const mainUriStr = URI.isUri(resource) ? resource.toString() : focus instanceof ExplorerItem ? focus.resource.toString() : undefined; // If the resource is passed it has to be a part of the returned context. - if (focus && (!URI.isUri(resource) || focus.resource.toString() === resource.toString())) { - const selection = list.getSelection(); - // We only respect the selection if it contains the focused element. - if (selection && selection.indexOf(focus) >= 0) { - return selection.map(fs => fs.resource); - } + // We only respect the selection if it contains the focused element. + if (selection.some(s => s.toString() === mainUriStr)) { + return selection; } } // Open editors view if (list instanceof List) { - const focus = list.getFocusedElements(); - // If the resource is passed it has to be a part of the returned context. - if (focus.length && (!URI.isUri(resource) || (focus[0] instanceof OpenEditor && focus[0].getResource().toString() === resource.toString()))) { - const selection = list.getSelectedElements(); - // We only respect the selection if it contains the focused element. - if (selection && selection.indexOf(focus[0]) >= 0) { - return selection.filter(s => s instanceof OpenEditor).map((oe: OpenEditor) => oe.getResource()); - } + const selection = list.getSelectedElements().filter(s => s instanceof OpenEditor).map((oe: OpenEditor) => oe.getResource()); + const focusedElements = list.getFocusedElements(); + const focus = focusedElements.length ? focusedElements[0] : undefined; + const mainUriStr = URI.isUri(resource) ? resource.toString() : (focus instanceof OpenEditor) ? focus.getResource().toString() : undefined; + // We only respect the selection if it contains the main element. + if (selection.some(s => s.toString() === mainUriStr)) { + return selection; } } }