diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index 5a95b9a7335e5..f8155b33a4a8d 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -1129,9 +1129,8 @@ export interface IModelDecorationOptions { className?: string; /** * Message to be rendered when hovering over the glyph margin decoration. - * @internal */ - glyphMarginHoverMessage?: string; + glyphMarginHoverMessage?: MarkedString | MarkedString[]; /** * Array of MarkedString to render as the decoration message. */ diff --git a/src/vs/editor/common/model/textModelWithDecorations.ts b/src/vs/editor/common/model/textModelWithDecorations.ts index 654172d534470..58d135c4ac7b7 100644 --- a/src/vs/editor/common/model/textModelWithDecorations.ts +++ b/src/vs/editor/common/model/textModelWithDecorations.ts @@ -834,8 +834,8 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti stickiness: editorCommon.TrackedRangeStickiness; className: string; - glyphMarginHoverMessage: string; hoverMessage: MarkedString | MarkedString[]; + glyphMarginHoverMessage: MarkedString | MarkedString[]; isWholeLine: boolean; showInOverviewRuler: string; overviewRuler: editorCommon.IModelDecorationOverviewRulerOptions; @@ -849,8 +849,8 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti constructor(options: editorCommon.IModelDecorationOptions) { this.stickiness = options.stickiness || editorCommon.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges; this.className = options.className ? cleanClassName(options.className) : strings.empty; - this.glyphMarginHoverMessage = options.glyphMarginHoverMessage || strings.empty; this.hoverMessage = options.hoverMessage || []; + this.glyphMarginHoverMessage = options.glyphMarginHoverMessage || strings.empty; this.isWholeLine = options.isWholeLine || false; this.overviewRuler = _normalizeOverviewRulerOptions(options.overviewRuler, options.showInOverviewRuler); this.glyphMarginClassName = options.glyphMarginClassName ? cleanClassName(options.glyphMarginClassName) : strings.empty; @@ -873,7 +873,6 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti return ( this.stickiness === other.stickiness && this.className === other.className - && this.glyphMarginHoverMessage === other.glyphMarginHoverMessage && this.isWholeLine === other.isWholeLine && this.showInOverviewRuler === other.showInOverviewRuler && this.glyphMarginClassName === other.glyphMarginClassName @@ -883,6 +882,7 @@ export class ModelDecorationOptions implements editorCommon.IModelDecorationOpti && this.beforeContentClassName === other.beforeContentClassName && this.afterContentClassName === other.afterContentClassName && markedStringsEquals(this.hoverMessage, other.hoverMessage) + && markedStringsEquals(this.glyphMarginHoverMessage, other.glyphMarginHoverMessage) && ModelDecorationOptions._overviewRulerEquals(this.overviewRuler, other.overviewRuler) ); } diff --git a/src/vs/editor/contrib/hover/browser/modesGlyphHover.ts b/src/vs/editor/contrib/hover/browser/modesGlyphHover.ts index 09e18e1c90dd3..3180bb7c383f5 100644 --- a/src/vs/editor/contrib/hover/browser/modesGlyphHover.ts +++ b/src/vs/editor/contrib/hover/browser/modesGlyphHover.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IModelDecoration, IRange } from 'vs/editor/common/editorCommon'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { HoverOperation, IHoverComputer } from './hoverOperation'; import { GlyphHoverWidget } from './hoverWidgets'; @@ -16,11 +15,10 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { TPromise } from 'vs/base/common/winjs.base'; import { IModeService } from 'vs/editor/common/services/modeService'; import { tokenizeToString } from 'vs/editor/common/modes/textToHtmlTokenizer'; +import { MarkedString } from 'vs/base/common/htmlContent'; export interface IHoverMessage { - value?: string; - range?: IRange; - className?: string; + value: MarkedString; } class MarginComputer implements IHoverComputer { @@ -44,19 +42,35 @@ class MarginComputer implements IHoverComputer { } public computeSync(): IHoverMessage[] { - var result: IHoverMessage[] = [], - lineDecorations = this._editor.getLineDecorations(this._lineNumber), - i: number, - len: number, - d: IModelDecoration; - - for (i = 0, len = lineDecorations.length; i < len; i++) { - d = lineDecorations[i]; - - if (d.options.glyphMarginClassName && d.options.glyphMarginHoverMessage) { - result.push({ - value: d.options.glyphMarginHoverMessage - }); + const hasHoverContent = (contents: MarkedString | MarkedString[]) => { + return contents && (!Array.isArray(contents) || (contents).length > 0); + }; + const toHoverMessage = (contents: MarkedString): IHoverMessage => { + return { + value: contents + }; + }; + + let lineDecorations = this._editor.getLineDecorations(this._lineNumber); + + let result: IHoverMessage[] = []; + for (let i = 0, len = lineDecorations.length; i < len; i++) { + let d = lineDecorations[i]; + + if (!d.options.glyphMarginClassName) { + continue; + } + + let hoverMessage = d.options.glyphMarginHoverMessage; + + if (!hasHoverContent(hoverMessage)) { + continue; + } + + if (Array.isArray(hoverMessage)) { + result = result.concat(hoverMessage.map(toHoverMessage)); + } else { + result.push(toHoverMessage(hoverMessage)); } } diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 3dad2cce5835f..92a8a5dc3c772 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -1612,6 +1612,10 @@ declare module monaco.editor { * CSS class name describing the decoration. */ className?: string; + /** + * Message to be rendered when hovering over the glyph margin decoration. + */ + glyphMarginHoverMessage?: MarkedString | MarkedString[]; /** * Array of MarkedString to render as the decoration message. */