diff --git a/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts b/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts index a2d061f99cab4719f9a71a5dbd685ae63e845bb5..10247865e6ed91499369aaf44216538757105ffb 100644 --- a/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts +++ b/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts @@ -8,18 +8,14 @@ import * as nls from 'vs/nls'; import * as env from 'vs/base/common/platform'; import { TPromise } from 'vs/base/common/winjs.base'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IAction, Action } from 'vs/base/common/actions'; +import { Action } from 'vs/base/common/actions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import paths = require('vs/base/common/paths'); -import resources = require('vs/base/common/resources'); -import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions, ActionBarContributor } from 'vs/workbench/browser/actions'; import uri from 'vs/base/common/uri'; -import { explorerItemToFileResource } from 'vs/workbench/parts/files/common/files'; import { ITerminalService } from 'vs/workbench/parts/execution/common/execution'; import { SyncActionDescriptor, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { toResource, IEditorContext } from 'vs/workbench/common/editor'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; @@ -30,7 +26,7 @@ import { WinTerminalService, MacTerminalService, LinuxTerminalService } from 'vs import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; import { EditorWithResourceFocusedInOpenEditorsContext } from 'vs/workbench/parts/files/electron-browser/fileCommands'; -import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { ResourceContextKey } from 'vs/workbench/common/resources'; if (env.isWindows) { registerSingleton(ITerminalService, WinTerminalService); @@ -109,74 +105,6 @@ class OpenConsoleAction extends Action { } } -class OpenIntegratedTerminalAction extends Action { - - public static readonly ID = 'workbench.action.terminal.openFolderInIntegratedTerminal'; - public static readonly Label = nls.localize('openFolderInIntegratedTerminal', "Open in Terminal"); - - private resource: uri; - - public setResource(resource: uri): void { - this.resource = resource; - this.enabled = !paths.isUNC(this.resource.fsPath); - } - - constructor( - id: string, - label: string, - @ICommandService private commandService: ICommandService - ) { - super(id, label); - } - - public run(event?: any): TPromise { - return this.commandService.executeCommand(OPEN_CONSOLE_COMMAND_ID, this.resource); - } -} - -export class ExplorerViewerActionContributor extends ActionBarContributor { - - constructor( - @IInstantiationService private instantiationService: IInstantiationService, - @IConfigurationService private configurationService: IConfigurationService - ) { - super(); - } - - public hasSecondaryActions(context: any): boolean { - const fileResource = explorerItemToFileResource(context.element); - return fileResource && fileResource.resource.scheme === 'file'; - } - - public getSecondaryActions(context: any): IAction[] { - let fileResource = explorerItemToFileResource(context.element); - let resource = fileResource.resource; - - // We want the parent unless this resource is a directory - if (!fileResource.isDirectory) { - resource = resources.dirname(resource); - } - - const configuration = this.configurationService.getValue(); - const explorerKind = configuration.terminal.explorerKind; - - if (explorerKind === 'integrated') { - let action = this.instantiationService.createInstance(OpenIntegratedTerminalAction, OpenIntegratedTerminalAction.ID, OpenIntegratedTerminalAction.Label); - action.setResource(resource); - - return [action]; - } else { - let action = this.instantiationService.createInstance(OpenConsoleAction, OpenConsoleAction.ID, OpenConsoleAction.ScopedLabel); - action.setResource(resource); - - return [action]; - } - } -} - -const actionBarRegistry = Registry.as(ActionBarExtensions.Actionbar); -actionBarRegistry.registerActionBarContributor(Scope.VIEWER, ExplorerViewerActionContributor); - // Register Global Action to Open Console Registry.as(ActionExtensions.WorkbenchActions).registerWorkbenchAction( new SyncActionDescriptor( @@ -191,29 +119,26 @@ Registry.as(ActionExtensions.WorkbenchActions).registe const OPEN_CONSOLE_COMMAND_ID = 'workbench.command.terminal.openNativeConsole'; -function getPathToOpen(resource: uri, historyService: IHistoryService, editorService: IWorkbenchEditorService): string { - let pathToOpen: string; - - // Try workspace path first - const root = historyService.getLastActiveWorkspaceRoot('file'); - pathToOpen = resource ? resource.fsPath : (root && root.fsPath); - - // Otherwise check if we have an active file open - if (!pathToOpen) { - const file = toResource(editorService.getActiveEditorInput(), { supportSideBySide: true, filter: 'file' }); - if (file) { - pathToOpen = paths.dirname(file.fsPath); // take parent folder of file - } - } - - return pathToOpen; -} - CommandsRegistry.registerCommand({ id: OPEN_CONSOLE_COMMAND_ID, handler: (accessor, args: IEditorContext) => { const configurationService = accessor.get(IConfigurationService); - const pathToOpen = getPathToOpen(args.resource, accessor.get(IHistoryService), accessor.get(IWorkbenchEditorService)); + const historyService = accessor.get(IHistoryService); + const editorService = accessor.get(IWorkbenchEditorService); + let pathToOpen: string; + + // Try workspace path first + const root = historyService.getLastActiveWorkspaceRoot('file'); + pathToOpen = args.resource ? args.resource.fsPath : (root && root.fsPath); + + // Otherwise check if we have an active file open + if (!pathToOpen) { + const file = toResource(editorService.getActiveEditorInput(), { supportSideBySide: true, filter: 'file' }); + if (file) { + pathToOpen = paths.dirname(file.fsPath); // take parent folder of file + } + } + if (configurationService.getValue().terminal.explorerKind === 'integrated') { const integratedTerminalService = accessor.get(IIntegratedTerminalService); @@ -231,13 +156,22 @@ CommandsRegistry.registerCommand({ } }); +const openConsoleCommand = { + id: OPEN_CONSOLE_COMMAND_ID, + title: env.isWindows ? nls.localize('scopedConsoleActionWin', "Open in Command Prompt") : + nls.localize('scopedConsoleActionMacLinux', "Open in Terminal") +}; + MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { group: '1_files', order: 30, - command: { - id: OPEN_CONSOLE_COMMAND_ID, - title: env.isWindows ? nls.localize('scopedConsoleActionWin', "Open in Command Prompt") : - nls.localize('scopedConsoleActionMacLinux', "Open in Terminal") - }, - when: ContextKeyExpr.and(EditorWithResourceFocusedInOpenEditorsContext) + command: openConsoleCommand, + when: EditorWithResourceFocusedInOpenEditorsContext +}); + +MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { + group: '1_files', + order: 30, + command: openConsoleCommand, + when: ResourceContextKey.Scheme.isEqualTo('file') });