提交 b39bf4f5 编写于 作者: D Daniel Imms

Fully convert message to tooltip on hover

上级 57d032a3
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
import { ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; import { ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal';
import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle';
import { setDisposableTimeout } from 'vs/base/common/async';
export class TerminalWidgetManager { export class TerminalWidgetManager {
private _container: HTMLElement; private _container: HTMLElement;
...@@ -28,26 +27,24 @@ export class TerminalWidgetManager { ...@@ -28,26 +27,24 @@ export class TerminalWidgetManager {
private _initTerminalHeightWatcher(terminalWrapper: HTMLElement) { private _initTerminalHeightWatcher(terminalWrapper: HTMLElement) {
// Watch the xterm.js viewport for style changes and do a layout if it changes // Watch the xterm.js viewport for style changes and do a layout if it changes
this._xtermViewport = <HTMLElement>terminalWrapper.querySelector('.xterm-viewport'); this._xtermViewport = <HTMLElement>terminalWrapper.querySelector('.xterm-viewport');
const mutationObserver = new MutationObserver(() => this.refreshHeight()); const mutationObserver = new MutationObserver(() => this._refreshHeight());
mutationObserver.observe(this._xtermViewport, { attributes: true, attributeFilter: ['style'] }); mutationObserver.observe(this._xtermViewport, { attributes: true, attributeFilter: ['style'] });
} }
public showMessage(left: number, top: number, text: string): void { public showMessage(left: number, top: number, text: string): void {
dispose(this._messageWidget); dispose(this._messageWidget);
this._messageListeners = dispose(this._messageListeners); this._messageListeners = dispose(this._messageListeners);
this._messageWidget = new MessageWidget(this._container, left, top, text); this._messageWidget = new MessageWidget(this._container, left, top, text);
// close after 3s
this._messageListeners.push(setDisposableTimeout(() => this.closeMessage(), 3000));
} }
closeMessage(): void { public closeMessage(): void {
this._messageListeners = dispose(this._messageListeners); this._messageListeners = dispose(this._messageListeners);
this._messageListeners.push(MessageWidget.fadeOut(this._messageWidget)); if (this._messageWidget) {
this._messageListeners.push(MessageWidget.fadeOut(this._messageWidget));
}
} }
public refreshHeight(): void { private _refreshHeight(): void {
this._container.style.height = this._xtermViewport.style.height; this._container.style.height = this._xtermViewport.style.height;
} }
} }
...@@ -60,7 +57,7 @@ class MessageWidget { ...@@ -60,7 +57,7 @@ class MessageWidget {
public get text(): string { return this._text; } public get text(): string { return this._text; }
public get domNode(): HTMLElement { return this._domNode; } public get domNode(): HTMLElement { return this._domNode; }
static fadeOut(messageWidget: MessageWidget): IDisposable { public static fadeOut(messageWidget: MessageWidget): IDisposable {
let handle: number; let handle: number;
const dispose = () => { const dispose = () => {
messageWidget.dispose(); messageWidget.dispose();
...@@ -83,19 +80,12 @@ class MessageWidget { ...@@ -83,19 +80,12 @@ class MessageWidget {
this._domNode.style.position = 'absolute'; this._domNode.style.position = 'absolute';
this._domNode.style.left = `${_left}px`; this._domNode.style.left = `${_left}px`;
this._domNode.style.bottom = `${_container.offsetHeight - _top}px`; this._domNode.style.bottom = `${_container.offsetHeight - _top}px`;
this._domNode.classList.add('terminal-message-widget'); this._domNode.classList.add('terminal-message-widget', 'fadeIn');
this._domNode.textContent = _text; this._domNode.textContent = _text;
// const message = document.createElement('div');
// message.classList.add('message');
// message.textContent = _text;
// this._domNode.appendChild(message);
this._container.appendChild(this._domNode); this._container.appendChild(this._domNode);
this._domNode.classList.add('fadeIn');
} }
dispose() { public dispose(): void {
if (this.domNode.parentElement === this._container) { if (this.domNode.parentElement === this._container) {
this._container.removeChild(this.domNode); this._container.removeChild(this.domNode);
} }
......
...@@ -294,13 +294,4 @@ export interface ITerminalInstance { ...@@ -294,13 +294,4 @@ export interface ITerminalInstance {
* @param shell The new launch configuration. * @param shell The new launch configuration.
*/ */
reuseTerminal(shell?: IShellLaunchConfig): void; reuseTerminal(shell?: IShellLaunchConfig): void;
/**
* Show a message in the terminal for a brief period.
*
* @param left The left position to show the message at.
* @param top The top position to show the message at.
* @param text The message to show.
*/
showMessage(left: number, top: number, text: string): void;
} }
...@@ -211,8 +211,6 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -211,8 +211,6 @@ export class TerminalInstance implements ITerminalInstance {
this._xtermElement = document.createElement('div'); this._xtermElement = document.createElement('div');
this._xterm.open(this._xtermElement); this._xterm.open(this._xtermElement);
this._linkHandler = this._instantiationService.createInstance(TerminalLinkHandler, this, this._xterm, platform.platform);
this._linkHandler.registerLocalLinkHandler();
this._xterm.attachCustomKeydownHandler((event: KeyboardEvent) => { this._xterm.attachCustomKeydownHandler((event: KeyboardEvent) => {
// Disable all input if the terminal is exiting // Disable all input if the terminal is exiting
if (this._isExiting) { if (this._isExiting) {
...@@ -283,6 +281,8 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -283,6 +281,8 @@ export class TerminalInstance implements ITerminalInstance {
this._wrapperElement.appendChild(this._xtermElement); this._wrapperElement.appendChild(this._xtermElement);
this._widgetManager = new TerminalWidgetManager(this._configHelper, this._wrapperElement); this._widgetManager = new TerminalWidgetManager(this._configHelper, this._wrapperElement);
this._linkHandler = this._instantiationService.createInstance(TerminalLinkHandler, this._widgetManager, this._xterm, platform.platform);
this._linkHandler.registerLocalLinkHandler();
this._container.appendChild(this._wrapperElement); this._container.appendChild(this._wrapperElement);
const computedStyle = window.getComputedStyle(this._container); const computedStyle = window.getComputedStyle(this._container);
...@@ -711,10 +711,6 @@ export class TerminalInstance implements ITerminalInstance { ...@@ -711,10 +711,6 @@ export class TerminalInstance implements ITerminalInstance {
} }
} }
public showMessage(left: number, top: number, text: string): void {
this._widgetManager.showMessage(left, top, text);
}
public static setTerminalProcessFactory(factory: ITerminalProcessFactory): void { public static setTerminalProcessFactory(factory: ITerminalProcessFactory): void {
this._terminalProcessFactory = factory; this._terminalProcessFactory = factory;
} }
......
...@@ -10,7 +10,7 @@ import * as pfs from 'vs/base/node/pfs'; ...@@ -10,7 +10,7 @@ import * as pfs from 'vs/base/node/pfs';
import Uri from 'vs/base/common/uri'; import Uri from 'vs/base/common/uri';
import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace';
import { ITerminalInstance } from 'vs/workbench/parts/terminal/common/terminal'; import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager';
import { TPromise } from 'vs/base/common/winjs.base'; import { TPromise } from 'vs/base/common/winjs.base';
const pathPrefix = '(\\.\\.?|\\~)'; const pathPrefix = '(\\.\\.?|\\~)';
...@@ -36,7 +36,7 @@ export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElem ...@@ -36,7 +36,7 @@ export type XtermLinkMatcherValidationCallback = (uri: string, element: HTMLElem
export class TerminalLinkHandler { export class TerminalLinkHandler {
constructor( constructor(
private _instance: ITerminalInstance, private _widgetManager: TerminalWidgetManager,
private _xterm: any, private _xterm: any,
private _platform: platform.Platform, private _platform: platform.Platform,
@IWorkbenchEditorService private _editorService: IWorkbenchEditorService, @IWorkbenchEditorService private _editorService: IWorkbenchEditorService,
...@@ -72,14 +72,6 @@ export class TerminalLinkHandler { ...@@ -72,14 +72,6 @@ export class TerminalLinkHandler {
return (event: MouseEvent, uri: string) => { return (event: MouseEvent, uri: string) => {
// Require ctrl/cmd on click // Require ctrl/cmd on click
if (this._platform === platform.Platform.Mac ? !event.metaKey : !event.ctrlKey) { if (this._platform === platform.Platform.Mac ? !event.metaKey : !event.ctrlKey) {
const link = <HTMLElement>event.target;
let message: string;
if (platform.isMacintosh) {
message = nls.localize('terminalLinkHandler.followLinkCmd', 'Cmd + click to follow link');
} else {
message = nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link');
}
this._instance.showMessage(link.offsetLeft, link.offsetTop, message);
event.preventDefault(); event.preventDefault();
return false; return false;
} }
...@@ -119,11 +111,21 @@ export class TerminalLinkHandler { ...@@ -119,11 +111,21 @@ export class TerminalLinkHandler {
} }
private _addTooltipEventListeners(element: HTMLElement) { private _addTooltipEventListeners(element: HTMLElement) {
let timeout = null;
element.addEventListener('mouseenter', () => { element.addEventListener('mouseenter', () => {
console.log('enter'); timeout = setTimeout(() => {
let message: string;
if (platform.isMacintosh) {
message = nls.localize('terminalLinkHandler.followLinkCmd', 'Cmd + click to follow link');
} else {
message = nls.localize('terminalLinkHandler.followLinkCtrl', 'Ctrl + click to follow link');
}
this._widgetManager.showMessage(element.offsetLeft, element.offsetTop, message);
}, 500);
}); });
element.addEventListener('mouseleave', () => { element.addEventListener('mouseleave', () => {
console.log('leave'); clearTimeout(timeout);
this._widgetManager.closeMessage();
}); });
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册