diff --git a/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts b/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts index 06d9970b2..ba15478a5 100755 --- a/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/contribution/exec-terminal-contribution.ts @@ -19,9 +19,10 @@ import { MenuBar as MenuBarWidget } from '@phosphor/widgets'; import { TerminalKeybindingContext } from './keybinding-context'; import { CHEWorkspaceService } from '../../common/workspace-service'; import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget'; -import { REMOTE_TERMINAL_WIDGET_FACTORY_ID } from '../terminal-widget/remote-terminal-widget'; +import { REMOTE_TERMINAL_WIDGET_FACTORY_ID, RemoteTerminalWidget, RemoteTerminalWidgetFactoryOptions } from '../terminal-widget/remote-terminal-widget'; import { filterRecipeContainers } from './terminal-command-filter'; import URI from '@theia/core/lib/common/uri'; +import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; export const NewTerminalInSpecificContainer = { id: 'terminal-in-specific-container:new', @@ -50,7 +51,11 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi @inject(CHEWorkspaceService) protected readonly cheWorkspaceService: CHEWorkspaceService; + @inject(EnvVariablesServer) + protected readonly baseEnvVariablesServer: EnvVariablesServer; + private readonly mainMenuId = 'theia:menubar'; + private editorContainerName; async registerCommands(registry: CommandRegistry) { const serverUrl = await this.termApiEndPointProvider(); @@ -86,12 +91,45 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi } } + public async newTerminalPerContainer(containerName: string, options?: TerminalWidgetOptions): Promise { + try { + const workspaceId = await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined); + const termApiEndPoint = await this.termApiEndPointProvider(); + + const widget = await this.widgetManager.getOrCreateWidget(REMOTE_TERMINAL_WIDGET_FACTORY_ID, { + created: new Date().toString(), + machineName: containerName, + workspaceId: workspaceId, + endpoint: termApiEndPoint.toString(true), + ...options + }); + return widget; + } catch (err) { + console.error('Failed to create terminal widget. Cause: ', err); + } + throw new Error('Unable to create new terminal for machine: ' + containerName); + } + async openTerminalByContainerName(containerName: string): Promise { - const termWidget = await this.terminalQuickOpen.newTerminalPerContainer(containerName, {}); - this.open(termWidget, {}); + const editorContainer = await this.getEditorContainerName(); + let cwd: string; + // use information about volumes to cover cwd for development containers too. Depends on https://github.com/eclipse/che/issues/13290 + if (containerName === editorContainer) { + cwd = await this.selectTerminalCwd(); + } + + const termWidget = await this.newTerminalPerContainer(containerName, { cwd }); + this.open(termWidget); termWidget.start(); } + async getEditorContainerName() { + if (!this.editorContainerName) { + this.editorContainerName = await this.cheWorkspaceService.findEditorMachineName(); + } + return this.editorContainerName; + } + async newTerminal(options: TerminalWidgetOptions): Promise { let containerName; @@ -100,11 +138,11 @@ export class ExecTerminalFrontendContribution extends TerminalFrontendContributi } if (!containerName) { - containerName = await this.cheWorkspaceService.findEditorMachineName(); + containerName = await this.getEditorContainerName(); } if (containerName) { - const termWidget = await this.terminalQuickOpen.newTerminalPerContainer(containerName, options); + const termWidget = await this.newTerminalPerContainer(containerName, options); return termWidget; } diff --git a/extensions/eclipse-che-theia-terminal/src/browser/contribution/terminal-quick-open.ts b/extensions/eclipse-che-theia-terminal/src/browser/contribution/terminal-quick-open.ts index a61de346b..7053625eb 100755 --- a/extensions/eclipse-che-theia-terminal/src/browser/contribution/terminal-quick-open.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/contribution/terminal-quick-open.ts @@ -9,17 +9,14 @@ **********************************************************************/ import { injectable, inject } from 'inversify'; -import { QuickOpenModel, QuickOpenItem, QuickOpenHandler, QuickOpenService } from '@theia/core/lib/browser/quick-open/'; -import { QuickOpenMode, QuickOpenOptions, WidgetManager, ApplicationShell, KeybindingRegistry } from '@theia/core/lib/browser'; -import { EnvVariablesServer } from '@theia/core/lib/common/env-variables'; -import { REMOTE_TERMINAL_WIDGET_FACTORY_ID, RemoteTerminalWidgetFactoryOptions } from '../terminal-widget/remote-terminal-widget'; +import { + QuickOpenMode, QuickOpenOptions, ApplicationShell, KeybindingRegistry, + QuickOpenModel, QuickOpenItem, QuickOpenHandler, QuickOpenService +} from '@theia/core/lib/browser'; import { CHEWorkspaceService } from '../../common/workspace-service'; import { TerminalApiEndPointProvider } from '../server-definition/terminal-proxy-creator'; -import { TerminalWidget, TerminalWidgetOptions } from '@theia/terminal/lib/browser/base/terminal-widget'; -import { RemoteTerminalWidget } from '../terminal-widget/remote-terminal-widget'; import { OpenTerminalHandler } from './exec-terminal-contribution'; import { filterRecipeContainers } from './terminal-command-filter'; -import URI from '@theia/core/lib/common/uri'; @injectable() export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenModel { @@ -32,12 +29,6 @@ export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenMode @inject(QuickOpenService) private readonly quickOpenService: QuickOpenService; - @inject(WidgetManager) - private readonly widgetManager: WidgetManager; - - @inject(EnvVariablesServer) - protected readonly baseEnvVariablesServer: EnvVariablesServer; - @inject('TerminalApiEndPointProvider') protected readonly termApiEndPointProvider: TerminalApiEndPointProvider; @@ -53,25 +44,6 @@ export class TerminalQuickOpenService implements QuickOpenHandler, QuickOpenMode @inject('terminal-in-specific-container-command-id') protected readonly terminalInSpecificContainerCommandId: string; - public async newTerminalPerContainer(containerName: string, options?: TerminalWidgetOptions): Promise { - try { - const workspaceId = await this.baseEnvVariablesServer.getValue('CHE_WORKSPACE_ID').then(v => v ? v.value : undefined); - const termApiEndPoint = await this.termApiEndPointProvider(); - - const widget = await this.widgetManager.getOrCreateWidget(REMOTE_TERMINAL_WIDGET_FACTORY_ID, { - created: new Date().toString(), - machineName: containerName, - workspaceId: workspaceId, - endpoint: termApiEndPoint.toString(true), - ...options - }); - return widget; - } catch (err) { - console.error('Failed to create terminal widget. Cause: ', err); - } - throw new Error('Unable to create new terminal for machine: ' + containerName); - } - async displayListMachines(doOpen: OpenTerminalHandler) { const items: QuickOpenItem[] = []; diff --git a/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts b/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts index 89af9f97d..00e5af0e3 100644 --- a/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts +++ b/extensions/eclipse-che-theia-terminal/src/browser/terminal-widget/remote-terminal-widget.ts @@ -174,6 +174,7 @@ export class RemoteTerminalWidget extends TerminalWidgetImpl { workspaceId: this.options.workspaceId }, cmd: cmd, + cwd: this.options.cwd, cols, rows, tty: true,