mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-16 18:46:40 -05:00
Merge from master
This commit is contained in:
@@ -4,12 +4,12 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { coalesce } from 'vs/base/common/arrays';
|
||||
import { onUnexpectedExternalError } from 'vs/base/common/errors';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { registerDefaultLanguageCommand } from 'vs/editor/browser/editorExtensions';
|
||||
import { Hover, HoverProviderRegistry } from 'vs/editor/common/modes';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { onUnexpectedExternalError } from 'vs/base/common/errors';
|
||||
import { registerDefaultLanguageCommand } from 'vs/editor/browser/editorExtensions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { ITextModel } from 'vs/editor/common/model';
|
||||
import { Hover, HoverProviderRegistry } from 'vs/editor/common/modes';
|
||||
|
||||
export function getHover(model: ITextModel, position: Position, token: CancellationToken): Promise<Hover[]> {
|
||||
|
||||
@@ -24,7 +24,7 @@ export function getHover(model: ITextModel, position: Position, token: Cancellat
|
||||
});
|
||||
});
|
||||
|
||||
return Promise.all(promises).then(values => coalesce(values));
|
||||
return Promise.all(promises).then(coalesce);
|
||||
}
|
||||
|
||||
registerDefaultLanguageCommand('_executeHoverProvider', (model, position) => getHover(model, position, CancellationToken.None));
|
||||
|
||||
@@ -3,30 +3,28 @@
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import 'vs/css!./hover';
|
||||
import * as nls from 'vs/nls';
|
||||
import { KeyCode, KeyMod, KeyChord } from 'vs/base/common/keyCodes';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { IModeService } from 'vs/editor/common/services/modeService';
|
||||
import { KeyChord, KeyCode, KeyMod } from 'vs/base/common/keyCodes';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import * as platform from 'vs/base/common/platform';
|
||||
import { IEmptyContentData } from 'vs/editor/browser/controller/mouseTarget';
|
||||
import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser';
|
||||
import { EditorAction, ServicesAccessor, registerEditorAction, registerEditorContribution } from 'vs/editor/browser/editorExtensions';
|
||||
import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
import { IEditorContribution, IScrollEvent } from 'vs/editor/common/editorCommon';
|
||||
import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions';
|
||||
import { registerEditorAction, registerEditorContribution, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions';
|
||||
import { ICodeEditor, IEditorMouseEvent, MouseTargetType } from 'vs/editor/browser/editorBrowser';
|
||||
import { ModesContentHoverWidget } from './modesContentHover';
|
||||
import { ModesGlyphHoverWidget } from './modesGlyphHover';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { EditorContextKeys } from 'vs/editor/common/editorContextKeys';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
import { IEmptyContentData } from 'vs/editor/browser/controller/mouseTarget';
|
||||
import { IModeService } from 'vs/editor/common/services/modeService';
|
||||
import { HoverStartMode } from 'vs/editor/contrib/hover/hoverOperation';
|
||||
import { ModesContentHoverWidget } from 'vs/editor/contrib/hover/modesContentHover';
|
||||
import { ModesGlyphHoverWidget } from 'vs/editor/contrib/hover/modesGlyphHover';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { IOpenerService } from 'vs/platform/opener/common/opener';
|
||||
import { editorHoverBackground, editorHoverBorder, editorHoverHighlight, textCodeBlockBackground, textLinkForeground } from 'vs/platform/theme/common/colorRegistry';
|
||||
import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService';
|
||||
|
||||
export class ModesHoverController implements IEditorContribution {
|
||||
|
||||
@@ -191,8 +189,8 @@ export class ModesHoverController implements IEditorContribution {
|
||||
}
|
||||
|
||||
private _onKeyDown(e: IKeyboardEvent): void {
|
||||
if (e.keyCode !== KeyCode.Ctrl && e.keyCode !== KeyCode.Alt && e.keyCode !== KeyCode.Meta) {
|
||||
// Do not hide hover when Ctrl/Meta is pressed
|
||||
if (e.keyCode !== KeyCode.Ctrl && e.keyCode !== KeyCode.Alt && e.keyCode !== KeyCode.Meta && e.keyCode !== KeyCode.Shift) {
|
||||
// Do not hide hover when a modifier key is pressed
|
||||
this._hideWidgets();
|
||||
}
|
||||
}
|
||||
@@ -273,24 +271,24 @@ registerEditorAction(ShowHoverAction);
|
||||
|
||||
// theming
|
||||
registerThemingParticipant((theme, collector) => {
|
||||
let editorHoverHighlightColor = theme.getColor(editorHoverHighlight);
|
||||
const editorHoverHighlightColor = theme.getColor(editorHoverHighlight);
|
||||
if (editorHoverHighlightColor) {
|
||||
collector.addRule(`.monaco-editor .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`);
|
||||
}
|
||||
let hoverBackground = theme.getColor(editorHoverBackground);
|
||||
const hoverBackground = theme.getColor(editorHoverBackground);
|
||||
if (hoverBackground) {
|
||||
collector.addRule(`.monaco-editor .monaco-editor-hover { background-color: ${hoverBackground}; }`);
|
||||
}
|
||||
let hoverBorder = theme.getColor(editorHoverBorder);
|
||||
const hoverBorder = theme.getColor(editorHoverBorder);
|
||||
if (hoverBorder) {
|
||||
collector.addRule(`.monaco-editor .monaco-editor-hover { border: 1px solid ${hoverBorder}; }`);
|
||||
collector.addRule(`.monaco-editor .monaco-editor-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`);
|
||||
}
|
||||
let link = theme.getColor(textLinkForeground);
|
||||
const link = theme.getColor(textLinkForeground);
|
||||
if (link) {
|
||||
collector.addRule(`.monaco-editor .monaco-editor-hover a { color: ${link}; }`);
|
||||
}
|
||||
let codeBackground = theme.getColor(textCodeBlockBackground);
|
||||
const codeBackground = theme.getColor(textCodeBlockBackground);
|
||||
if (codeBackground) {
|
||||
collector.addRule(`.monaco-editor .monaco-editor-hover code { background-color: ${codeBackground}; }`);
|
||||
}
|
||||
|
||||
@@ -2,11 +2,10 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { RunOnceScheduler, CancelablePromise, createCancelablePromise } from 'vs/base/common/async';
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
import { CancelablePromise, RunOnceScheduler, createCancelablePromise } from 'vs/base/common/async';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { onUnexpectedError } from 'vs/base/common/errors';
|
||||
|
||||
export interface IHoverComputer<Result> {
|
||||
|
||||
@@ -48,8 +47,6 @@ export const enum HoverStartMode {
|
||||
|
||||
export class HoverOperation<Result> {
|
||||
|
||||
static HOVER_TIME = 300;
|
||||
|
||||
private _computer: IHoverComputer<Result>;
|
||||
private _state: ComputeHoverOperationState;
|
||||
private _hoverTime: number;
|
||||
@@ -57,17 +54,17 @@ export class HoverOperation<Result> {
|
||||
private _firstWaitScheduler: RunOnceScheduler;
|
||||
private _secondWaitScheduler: RunOnceScheduler;
|
||||
private _loadingMessageScheduler: RunOnceScheduler;
|
||||
private _asyncComputationPromise: CancelablePromise<Result>;
|
||||
private _asyncComputationPromise: CancelablePromise<Result> | null;
|
||||
private _asyncComputationPromiseDone: boolean;
|
||||
|
||||
private _completeCallback: (r: Result) => void;
|
||||
private _errorCallback: (err: any) => void;
|
||||
private _errorCallback: ((err: any) => void) | null | undefined;
|
||||
private _progressCallback: (progress: any) => void;
|
||||
|
||||
constructor(computer: IHoverComputer<Result>, success: (r: Result) => void, error: (err: any) => void, progress: (progress: any) => void) {
|
||||
constructor(computer: IHoverComputer<Result>, success: (r: Result) => void, error: ((err: any) => void) | null | undefined, progress: (progress: any) => void, hoverTime: number) {
|
||||
this._computer = computer;
|
||||
this._state = ComputeHoverOperationState.IDLE;
|
||||
this._hoverTime = HoverOperation.HOVER_TIME;
|
||||
this._hoverTime = hoverTime;
|
||||
|
||||
this._firstWaitScheduler = new RunOnceScheduler(() => this._triggerAsyncComputation(), 0);
|
||||
this._secondWaitScheduler = new RunOnceScheduler(() => this._triggerSyncComputation(), 0);
|
||||
@@ -103,7 +100,7 @@ export class HoverOperation<Result> {
|
||||
|
||||
if (this._computer.computeAsync) {
|
||||
this._asyncComputationPromiseDone = false;
|
||||
this._asyncComputationPromise = createCancelablePromise(token => this._computer.computeAsync(token));
|
||||
this._asyncComputationPromise = createCancelablePromise(token => this._computer.computeAsync!(token));
|
||||
this._asyncComputationPromise.then((asyncResult: Result) => {
|
||||
this._asyncComputationPromiseDone = true;
|
||||
this._withAsyncResult(asyncResult);
|
||||
|
||||
@@ -2,17 +2,17 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { toggleClass } from 'vs/base/browser/dom';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import * as editorBrowser from 'vs/editor/browser/editorBrowser';
|
||||
import { Widget } from 'vs/base/browser/ui/widget';
|
||||
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
|
||||
import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement';
|
||||
import { Widget } from 'vs/base/browser/ui/widget';
|
||||
import { KeyCode } from 'vs/base/common/keyCodes';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import * as editorBrowser from 'vs/editor/browser/editorBrowser';
|
||||
import { IConfigurationChangedEvent } from 'vs/editor/common/config/editorOptions';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { Range } from 'vs/editor/common/core/range';
|
||||
|
||||
export class ContentHoverWidget extends Widget implements editorBrowser.IContentWidget {
|
||||
|
||||
@@ -21,7 +21,8 @@ export class ContentHoverWidget extends Widget implements editorBrowser.IContent
|
||||
private _isVisible: boolean;
|
||||
private _containerDomNode: HTMLElement;
|
||||
private _domNode: HTMLElement;
|
||||
protected _showAtPosition: Position;
|
||||
protected _showAtPosition: Position | null;
|
||||
protected _showAtRange: Range | null;
|
||||
private _stoleFocus: boolean;
|
||||
private scrollbar: DomScrollableElement;
|
||||
private disposables: IDisposable[] = [];
|
||||
@@ -72,6 +73,7 @@ export class ContentHoverWidget extends Widget implements editorBrowser.IContent
|
||||
this.updateMaxHeight();
|
||||
this._editor.addContentWidget(this);
|
||||
this._showAtPosition = null;
|
||||
this._showAtRange = null;
|
||||
}
|
||||
|
||||
public getId(): string {
|
||||
@@ -82,9 +84,10 @@ export class ContentHoverWidget extends Widget implements editorBrowser.IContent
|
||||
return this._containerDomNode;
|
||||
}
|
||||
|
||||
public showAt(position: Position, focus: boolean): void {
|
||||
public showAt(position: Position, range: Range, focus: boolean): void {
|
||||
// Position has changed
|
||||
this._showAtPosition = new Position(position.lineNumber, position.column);
|
||||
this._showAtPosition = position;
|
||||
this._showAtRange = range;
|
||||
this.isVisible = true;
|
||||
|
||||
this._editor.layoutContentWidget(this);
|
||||
@@ -110,10 +113,11 @@ export class ContentHoverWidget extends Widget implements editorBrowser.IContent
|
||||
}
|
||||
}
|
||||
|
||||
public getPosition(): editorBrowser.IContentWidgetPosition {
|
||||
public getPosition(): editorBrowser.IContentWidgetPosition | null {
|
||||
if (this.isVisible) {
|
||||
return {
|
||||
position: this._showAtPosition,
|
||||
range: this._showAtRange,
|
||||
preference: [
|
||||
editorBrowser.ContentWidgetPositionPreference.ABOVE,
|
||||
editorBrowser.ContentWidgetPositionPreference.BELOW
|
||||
@@ -229,7 +233,7 @@ export class GlyphHoverWidget extends Widget implements editorBrowser.IOverlayWi
|
||||
this.isVisible = false;
|
||||
}
|
||||
|
||||
public getPosition(): editorBrowser.IOverlayWidgetPosition {
|
||||
public getPosition(): editorBrowser.IOverlayWidgetPosition | null {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -2,28 +2,27 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import * as nls from 'vs/nls';
|
||||
import * as dom from 'vs/base/browser/dom';
|
||||
import { IRange, Range } from 'vs/editor/common/core/range';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { HoverProviderRegistry, Hover, IColor, DocumentColorProvider } from 'vs/editor/common/modes';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { getHover } from 'vs/editor/contrib/hover/getHover';
|
||||
import { HoverOperation, IHoverComputer, HoverStartMode } from './hoverOperation';
|
||||
import { ContentHoverWidget } from './hoverWidgets';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
import { Color, RGBA } from 'vs/base/common/color';
|
||||
import { IMarkdownString, MarkdownString, isEmptyMarkdownString, markedStringsEquals } from 'vs/base/common/htmlContent';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { Position } from 'vs/editor/common/core/position';
|
||||
import { IRange, Range } from 'vs/editor/common/core/range';
|
||||
import { ModelDecorationOptions } from 'vs/editor/common/model/textModel';
|
||||
import { DocumentColorProvider, Hover, HoverProviderRegistry, IColor } from 'vs/editor/common/modes';
|
||||
import { getColorPresentations } from 'vs/editor/contrib/colorPicker/color';
|
||||
import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector';
|
||||
import { ColorPickerModel } from 'vs/editor/contrib/colorPicker/colorPickerModel';
|
||||
import { ColorPickerWidget } from 'vs/editor/contrib/colorPicker/colorPickerWidget';
|
||||
import { ColorDetector } from 'vs/editor/contrib/colorPicker/colorDetector';
|
||||
import { Color, RGBA } from 'vs/base/common/color';
|
||||
import { IDisposable, Disposable, combinedDisposable } from 'vs/base/common/lifecycle';
|
||||
import { getColorPresentations } from 'vs/editor/contrib/colorPicker/color';
|
||||
import { getHover } from 'vs/editor/contrib/hover/getHover';
|
||||
import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/hoverOperation';
|
||||
import { ContentHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
import { IThemeService } from 'vs/platform/theme/common/themeService';
|
||||
import { CancellationToken } from 'vs/base/common/cancellation';
|
||||
const $ = dom.$;
|
||||
|
||||
class ColorHover {
|
||||
@@ -41,7 +40,7 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
|
||||
|
||||
private _editor: ICodeEditor;
|
||||
private _result: HoverPart[];
|
||||
private _range: Range;
|
||||
private _range: Range | null;
|
||||
|
||||
constructor(editor: ICodeEditor) {
|
||||
this._editor = editor;
|
||||
@@ -58,10 +57,14 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
|
||||
}
|
||||
|
||||
computeAsync(token: CancellationToken): Promise<HoverPart[]> {
|
||||
if (!this._editor.hasModel() || !this._range) {
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
|
||||
const model = this._editor.getModel();
|
||||
|
||||
if (!HoverProviderRegistry.has(model)) {
|
||||
return Promise.resolve(null);
|
||||
return Promise.resolve([]);
|
||||
}
|
||||
|
||||
return getHover(model, new Position(
|
||||
@@ -71,6 +74,10 @@ class ModesContentComputer implements IHoverComputer<HoverPart[]> {
|
||||
}
|
||||
|
||||
computeSync(): HoverPart[] {
|
||||
if (!this._editor.hasModel() || !this._range) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const lineNumber = this._range.startLineNumber;
|
||||
|
||||
if (lineNumber > this._editor.getModel().getLineCount()) {
|
||||
@@ -158,14 +165,14 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
static readonly ID = 'editor.contrib.modesContentHoverWidget';
|
||||
|
||||
private _messages: HoverPart[];
|
||||
private _lastRange: Range;
|
||||
private _lastRange: Range | null;
|
||||
private _computer: ModesContentComputer;
|
||||
private _hoverOperation: HoverOperation<HoverPart[]>;
|
||||
private _highlightDecorations: string[];
|
||||
private _isChangingDecorations: boolean;
|
||||
private _markdownRenderer: MarkdownRenderer;
|
||||
private _shouldFocus: boolean;
|
||||
private _colorPicker: ColorPickerWidget;
|
||||
private _colorPicker: ColorPickerWidget | null;
|
||||
|
||||
private renderDisposable: IDisposable = Disposable.None;
|
||||
|
||||
@@ -176,6 +183,8 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
) {
|
||||
super(ModesContentHoverWidget.ID, editor);
|
||||
|
||||
this._messages = [];
|
||||
this._lastRange = null;
|
||||
this._computer = new ModesContentComputer(this._editor);
|
||||
this._highlightDecorations = [];
|
||||
this._isChangingDecorations = false;
|
||||
@@ -187,7 +196,8 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
this._computer,
|
||||
result => this._withResult(result, true),
|
||||
null,
|
||||
result => this._withResult(result, false)
|
||||
result => this._withResult(result, false),
|
||||
this._editor.getConfiguration().contribInfo.hover.delay
|
||||
);
|
||||
|
||||
this._register(dom.addStandardDisposableListener(this.getDomNode(), dom.EventType.FOCUS, () => {
|
||||
@@ -301,7 +311,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
|
||||
// update column from which to show
|
||||
let renderColumn = Number.MAX_VALUE;
|
||||
let highlightRange = messages[0].range;
|
||||
let highlightRange = Range.lift(messages[0].range);
|
||||
let fragment = document.createDocumentFragment();
|
||||
let isEmptyHoverContent = true;
|
||||
|
||||
@@ -361,6 +371,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
newRange = range.setEndPosition(range.endLineNumber, range.startColumn + model.presentation.label.length);
|
||||
}
|
||||
|
||||
this._editor.pushUndoStop();
|
||||
this._editor.executeEdits('colorpicker', textEdits);
|
||||
|
||||
if (model.presentation.additionalTextEdits) {
|
||||
@@ -392,7 +403,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
const colorChangeListener = model.onDidChangeColor(updateColorPresentations);
|
||||
|
||||
this._colorPicker = widget;
|
||||
this.showAt(new Position(renderRange.startLineNumber, renderColumn), this._shouldFocus);
|
||||
this.showAt(range.getStartPosition(), range, this._shouldFocus);
|
||||
this.updateContents(fragment);
|
||||
this._colorPicker.layout();
|
||||
|
||||
@@ -404,7 +415,7 @@ export class ModesContentHoverWidget extends ContentHoverWidget {
|
||||
// show
|
||||
|
||||
if (!containColorPicker && !isEmptyHoverContent) {
|
||||
this.showAt(new Position(renderRange.startLineNumber, renderColumn), this._shouldFocus);
|
||||
this.showAt(new Position(renderRange.startLineNumber, renderColumn), highlightRange, this._shouldFocus);
|
||||
this.updateContents(fragment);
|
||||
}
|
||||
|
||||
|
||||
@@ -2,15 +2,14 @@
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
'use strict';
|
||||
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { HoverOperation, IHoverComputer, HoverStartMode } from './hoverOperation';
|
||||
import { GlyphHoverWidget } from './hoverWidgets';
|
||||
import { $ } from 'vs/base/browser/dom';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
import { IMarkdownString, isEmptyMarkdownString } from 'vs/base/common/htmlContent';
|
||||
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contrib/hover/hoverOperation';
|
||||
import { GlyphHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets';
|
||||
import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer';
|
||||
|
||||
export interface IHoverMessage {
|
||||
value: IMarkdownString;
|
||||
@@ -47,6 +46,10 @@ class MarginComputer implements IHoverComputer<IHoverMessage[]> {
|
||||
let lineDecorations = this._editor.getLineDecorations(this._lineNumber);
|
||||
|
||||
let result: IHoverMessage[] = [];
|
||||
if (!lineDecorations) {
|
||||
return result;
|
||||
}
|
||||
|
||||
for (let i = 0, len = lineDecorations.length; i < len; i++) {
|
||||
let d = lineDecorations[i];
|
||||
|
||||
@@ -54,9 +57,9 @@ class MarginComputer implements IHoverComputer<IHoverMessage[]> {
|
||||
continue;
|
||||
}
|
||||
|
||||
let hoverMessage = d.options.glyphMarginHoverMessage;
|
||||
const hoverMessage = d.options.glyphMarginHoverMessage;
|
||||
|
||||
if (isEmptyMarkdownString(hoverMessage)) {
|
||||
if (!hoverMessage || isEmptyMarkdownString(hoverMessage)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -105,8 +108,9 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
|
||||
this._hoverOperation = new HoverOperation(
|
||||
this._computer,
|
||||
(result: IHoverMessage[]) => this._withResult(result),
|
||||
null,
|
||||
(result: any) => this._withResult(result)
|
||||
undefined,
|
||||
(result: any) => this._withResult(result),
|
||||
300
|
||||
);
|
||||
|
||||
}
|
||||
@@ -167,7 +171,7 @@ export class ModesGlyphHoverWidget extends GlyphHoverWidget {
|
||||
messages.forEach((msg) => {
|
||||
const renderedContents = this._markdownRenderer.render(msg.value);
|
||||
this._renderDisposeables.push(renderedContents);
|
||||
fragment.appendChild($('div.hover-row', null, renderedContents.element));
|
||||
fragment.appendChild($('div.hover-row', undefined, renderedContents.element));
|
||||
});
|
||||
|
||||
this.updateContents(fragment);
|
||||
|
||||
Reference in New Issue
Block a user