提交 ccdaf127 编写于 作者: I isidor

debug: dighlights in trees

上级 7cb0746b
......@@ -14,6 +14,8 @@ import { IThemeService } from 'vs/platform/theme/common/themeService';
import { attachInputBoxStyler } from 'vs/platform/theme/common/styler';
import { KeyCode } from 'vs/base/common/keyCodes';
import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent';
import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
export const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024;
export const twistiePixels = 20;
......@@ -33,6 +35,7 @@ export interface IVariableTemplateData {
expression: HTMLElement;
name: HTMLElement;
value: HTMLElement;
label: HighlightedLabel;
}
export function renderViewTree(container: HTMLElement): HTMLElement {
......@@ -88,11 +91,16 @@ export function renderExpressionValue(expressionOrValue: IExpression | string, c
}
}
export function renderVariable(variable: Variable, data: IVariableTemplateData, showChanged: boolean): void {
export function renderVariable(variable: Variable, data: IVariableTemplateData, showChanged: boolean, highlights: IHighlight[]): void {
if (variable.available) {
data.name.textContent = replaceWhitespace(variable.name);
data.name.title = variable.type ? variable.type : variable.name;
let text = replaceWhitespace(variable.name);
if (variable.value && typeof variable.name === 'string') {
text += ':';
}
data.label.set(text, highlights, variable.type ? variable.type : variable.name);
dom.toggleClass(data.name, 'virtual', !!variable.presentationHint && variable.presentationHint.kind === 'virtual');
} else if (variable.value && typeof variable.name === 'string') {
data.label.set(':');
}
renderExpressionValue(variable, data.value, {
......@@ -102,9 +110,6 @@ export function renderVariable(variable: Variable, data: IVariableTemplateData,
showHover: true,
colorize: true
});
if (variable.value && typeof variable.name === 'string') {
data.name.textContent += ':';
}
}
export interface IInputBoxOptions {
......@@ -122,9 +127,10 @@ export interface IExpressionTemplateData {
inputBoxContainer: HTMLElement;
enableInputBox(expression: IExpression, options: IInputBoxOptions);
toDispose: IDisposable[];
label: HighlightedLabel;
}
export abstract class AbstractExpressionsRenderer implements ITreeRenderer<IExpression, void, IExpressionTemplateData> {
export abstract class AbstractExpressionsRenderer implements ITreeRenderer<IExpression, FuzzyScore, IExpressionTemplateData> {
constructor(
@IDebugService protected debugService: IDebugService,
......@@ -139,6 +145,8 @@ export abstract class AbstractExpressionsRenderer implements ITreeRenderer<IExpr
data.expression = dom.append(container, $('.expression'));
data.name = dom.append(data.expression, $('span.name'));
data.value = dom.append(data.expression, $('span.value'));
data.label = new HighlightedLabel(data.name, false);
data.inputBoxContainer = dom.append(data.expression, $('.inputBoxContainer'));
data.enableInputBox = (expression: IExpression, options: IInputBoxOptions) => {
......@@ -196,16 +204,16 @@ export abstract class AbstractExpressionsRenderer implements ITreeRenderer<IExpr
return data;
}
renderElement(node: ITreeNode<IExpression>, index: number, data: IExpressionTemplateData): void {
renderElement(node: ITreeNode<IExpression, FuzzyScore>, index: number, data: IExpressionTemplateData): void {
const { element } = node;
if (element === this.debugService.getViewModel().getSelectedExpression()) {
data.enableInputBox(element, this.getInputBoxOptions(element));
} else {
this.renderExpression(element, data);
this.renderExpression(element, data, createMatches(node.filterData));
}
}
protected abstract renderExpression(expression: IExpression, data: IExpressionTemplateData): void;
protected abstract renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void;
protected abstract getInputBoxOptions(expression: IExpression): IInputBoxOptions;
disposeTemplate(templateData: IExpressionTemplateData): void {
......
......@@ -803,7 +803,7 @@ export class ReverseContinueAction extends AbstractDebugAction {
}
export class ReplCollapseAllAction extends CollapseAction2 {
constructor(tree: AsyncDataTree<any, any>, private toFocus: { focus(): void; }) {
constructor(tree: AsyncDataTree<any, any, any>, private toFocus: { focus(): void; }) {
super(tree, true, undefined);
}
......
......@@ -33,6 +33,7 @@ import { WorkbenchAsyncDataTree, IListService, TreeResourceNavigator2 } from 'vs
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { DebugContentProvider } from 'vs/workbench/parts/debug/browser/debugContentProvider';
import { dispose } from 'vs/base/common/lifecycle';
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
const SMART = true;
......@@ -363,7 +364,7 @@ export class LoadedScriptsView extends ViewletPanel {
private treeContainer: HTMLElement;
private loadedScriptsItemType: IContextKey<string>;
private tree: WorkbenchAsyncDataTree<LoadedScriptsItem, LoadedScriptsItem>;
private tree: WorkbenchAsyncDataTree<LoadedScriptsItem, LoadedScriptsItem, FuzzyScore>;
private treeLabels: ResourceLabels;
private changeScheduler: RunOnceScheduler;
private treeNeedsRefreshOnVisible: boolean;
......@@ -540,7 +541,7 @@ interface ILoadedScriptsItemTemplateData {
label: IResourceLabel;
}
class LoadedScriptsRenderer implements ITreeRenderer<BaseTreeItem, void, ILoadedScriptsItemTemplateData> {
class LoadedScriptsRenderer implements ITreeRenderer<BaseTreeItem, FuzzyScore, ILoadedScriptsItemTemplateData> {
static readonly ID = 'lsrenderer';
......@@ -555,11 +556,11 @@ class LoadedScriptsRenderer implements ITreeRenderer<BaseTreeItem, void, ILoaded
renderTemplate(container: HTMLElement): ILoadedScriptsItemTemplateData {
let data: ILoadedScriptsItemTemplateData = Object.create(null);
data.label = this.labels.create(container);
data.label = this.labels.create(container, { supportHighlights: true });
return data;
}
renderElement(node: ITreeNode<BaseTreeItem, void>, index: number, data: ILoadedScriptsItemTemplateData): void {
renderElement(node: ITreeNode<BaseTreeItem, FuzzyScore>, index: number, data: ILoadedScriptsItemTemplateData): void {
const element = node.element;
......@@ -589,6 +590,7 @@ class LoadedScriptsRenderer implements ITreeRenderer<BaseTreeItem, void, ILoaded
options.fileKind = FileKind.FOLDER;
}
}
options.matches = createMatches(node.filterData);
data.label.setResource(label, options);
}
......@@ -622,7 +624,7 @@ class LoadedSciptsAccessibilityProvider implements IAccessibilityProvider<Loaded
}
}
class LoadedScriptsFilter implements ITreeFilter<BaseTreeItem> {
class LoadedScriptsFilter implements ITreeFilter<BaseTreeItem, FuzzyScore> {
private filterText: string;
......@@ -630,7 +632,7 @@ class LoadedScriptsFilter implements ITreeFilter<BaseTreeItem> {
this.filterText = filterText;
}
filter(element: BaseTreeItem, parentVisibility: TreeVisibility): TreeFilterResult<void> {
filter(element: BaseTreeItem, parentVisibility: TreeVisibility): TreeFilterResult<FuzzyScore> {
if (!this.filterText) {
return TreeVisibility.Visible;
......@@ -645,4 +647,4 @@ class LoadedScriptsFilter implements ITreeFilter<BaseTreeItem> {
}
return TreeVisibility.Recurse;
}
}
\ No newline at end of file
}
......@@ -31,6 +31,8 @@ import { ITreeRenderer, ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } fro
import { TreeResourceNavigator2, WorkbenchAsyncDataTree, IListService } from 'vs/platform/list/browser/listService';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { onUnexpectedError } from 'vs/base/common/errors';
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
const $ = dom.$;
......@@ -46,7 +48,7 @@ export class CallStackView extends ViewletPanel {
private ignoreFocusStackFrameEvent: boolean;
private callStackItemType: IContextKey<string>;
private dataSource: CallStackDataSource;
private tree: WorkbenchAsyncDataTree<IDebugModel, CallStackItem>;
private tree: WorkbenchAsyncDataTree<IDebugModel, CallStackItem, FuzzyScore>;
private contributedContextMenu: IMenu;
constructor(
......@@ -328,6 +330,7 @@ interface IThreadTemplateData {
name: HTMLElement;
state: HTMLElement;
stateLabel: HTMLSpanElement;
label: HighlightedLabel;
}
interface ISessionTemplateData {
......@@ -335,6 +338,7 @@ interface ISessionTemplateData {
name: HTMLElement;
state: HTMLElement;
stateLabel: HTMLSpanElement;
label: HighlightedLabel;
}
interface IErrorTemplateData {
......@@ -347,13 +351,13 @@ interface ILabelTemplateData {
interface IStackFrameTemplateData {
stackFrame: HTMLElement;
label: HTMLElement;
file: HTMLElement;
fileName: HTMLElement;
lineNumber: HTMLElement;
label: HighlightedLabel;
}
class SessionsRenderer implements ITreeRenderer<IDebugSession, void, ISessionTemplateData> {
class SessionsRenderer implements ITreeRenderer<IDebugSession, FuzzyScore, ISessionTemplateData> {
static readonly ID = 'session';
get templateId(): string {
......@@ -366,14 +370,15 @@ class SessionsRenderer implements ITreeRenderer<IDebugSession, void, ISessionTem
data.name = dom.append(data.session, $('.name'));
data.state = dom.append(data.session, $('.state'));
data.stateLabel = dom.append(data.state, $('span.label'));
data.label = new HighlightedLabel(data.name, false);
return data;
}
renderElement(element: ITreeNode<IDebugSession, void>, index: number, data: ISessionTemplateData): void {
renderElement(element: ITreeNode<IDebugSession, FuzzyScore>, index: number, data: ISessionTemplateData): void {
const session = element.element;
data.session.title = nls.localize({ key: 'session', comment: ['Session is a noun'] }, "Session");
data.name.textContent = session.getLabel();
data.label.set(session.getLabel(), createMatches(element.filterData));
const stoppedThread = session.getAllThreads().filter(t => t.stopped).pop();
data.stateLabel.textContent = stoppedThread ? nls.localize('paused', "Paused")
......@@ -385,7 +390,7 @@ class SessionsRenderer implements ITreeRenderer<IDebugSession, void, ISessionTem
}
}
class ThreadsRenderer implements ITreeRenderer<IThread, void, IThreadTemplateData> {
class ThreadsRenderer implements ITreeRenderer<IThread, FuzzyScore, IThreadTemplateData> {
static readonly ID = 'thread';
get templateId(): string {
......@@ -402,10 +407,10 @@ class ThreadsRenderer implements ITreeRenderer<IThread, void, IThreadTemplateDat
return data;
}
renderElement(element: ITreeNode<IThread, void>, index: number, data: IThreadTemplateData): void {
renderElement(element: ITreeNode<IThread, FuzzyScore>, index: number, data: IThreadTemplateData): void {
const thread = element.element;
data.thread.title = nls.localize('thread', "Thread");
data.name.textContent = thread.name;
data.label.set(thread.name, createMatches(element.filterData));
if (thread.stopped) {
data.stateLabel.textContent = thread.stoppedDetails.description ||
......@@ -420,7 +425,7 @@ class ThreadsRenderer implements ITreeRenderer<IThread, void, IThreadTemplateDat
}
}
class StackFramesRenderer implements ITreeRenderer<IStackFrame, void, IStackFrameTemplateData> {
class StackFramesRenderer implements ITreeRenderer<IStackFrame, FuzzyScore, IStackFrameTemplateData> {
static readonly ID = 'stackFrame';
constructor(@ILabelService private readonly labelService: ILabelService) { }
......@@ -432,16 +437,17 @@ class StackFramesRenderer implements ITreeRenderer<IStackFrame, void, IStackFram
renderTemplate(container: HTMLElement): IStackFrameTemplateData {
const data: IStackFrameTemplateData = Object.create(null);
data.stackFrame = dom.append(container, $('.stack-frame'));
data.label = dom.append(data.stackFrame, $('span.label.expression'));
const labelDiv = dom.append(data.stackFrame, $('span.label.expression'));
data.file = dom.append(data.stackFrame, $('.file'));
data.fileName = dom.append(data.file, $('span.file-name'));
const wrapper = dom.append(data.file, $('span.line-number-wrapper'));
data.lineNumber = dom.append(wrapper, $('span.line-number'));
data.label = new HighlightedLabel(labelDiv, false);
return data;
}
renderElement(element: ITreeNode<IStackFrame, void>, index: number, data: IStackFrameTemplateData): void {
renderElement(element: ITreeNode<IStackFrame, FuzzyScore>, index: number, data: IStackFrameTemplateData): void {
const stackFrame = element.element;
dom.toggleClass(data.stackFrame, 'disabled', !stackFrame.source || !stackFrame.source.available || stackFrame.source.presentationHint === 'deemphasize');
dom.toggleClass(data.stackFrame, 'label', stackFrame.presentationHint === 'label');
......@@ -451,8 +457,7 @@ class StackFramesRenderer implements ITreeRenderer<IStackFrame, void, IStackFram
if (stackFrame.source.raw.origin) {
data.file.title += `\n${stackFrame.source.raw.origin}`;
}
data.label.textContent = stackFrame.name;
data.label.title = stackFrame.name;
data.label.set(stackFrame.name, createMatches(element.filterData), stackFrame.name);
data.fileName.textContent = stackFrame.getSpecificSourceName();
if (stackFrame.range.startLineNumber !== undefined) {
data.lineNumber.textContent = `${stackFrame.range.startLineNumber}`;
......@@ -470,7 +475,7 @@ class StackFramesRenderer implements ITreeRenderer<IStackFrame, void, IStackFram
}
}
class ErrorsRenderer implements ITreeRenderer<string, void, IErrorTemplateData> {
class ErrorsRenderer implements ITreeRenderer<string, FuzzyScore, IErrorTemplateData> {
static readonly ID = 'error';
get templateId(): string {
......@@ -484,7 +489,7 @@ class ErrorsRenderer implements ITreeRenderer<string, void, IErrorTemplateData>
return data;
}
renderElement(element: ITreeNode<string, void>, index: number, data: IErrorTemplateData): void {
renderElement(element: ITreeNode<string, FuzzyScore>, index: number, data: IErrorTemplateData): void {
const error = element.element;
data.label.textContent = error;
data.label.title = error;
......@@ -495,7 +500,7 @@ class ErrorsRenderer implements ITreeRenderer<string, void, IErrorTemplateData>
}
}
class LoadMoreRenderer implements ITreeRenderer<ThreadAndSessionIds, void, ILabelTemplateData> {
class LoadMoreRenderer implements ITreeRenderer<ThreadAndSessionIds, FuzzyScore, ILabelTemplateData> {
static readonly ID = 'loadMore';
static readonly LABEL = nls.localize('loadMoreStackFrames', "Load More Stack Frames");
......@@ -510,7 +515,7 @@ class LoadMoreRenderer implements ITreeRenderer<ThreadAndSessionIds, void, ILabe
return data;
}
renderElement(element: ITreeNode<ThreadAndSessionIds, void>, index: number, data: ILabelTemplateData): void {
renderElement(element: ITreeNode<ThreadAndSessionIds, FuzzyScore>, index: number, data: ILabelTemplateData): void {
data.label.textContent = LoadMoreRenderer.LABEL;
}
......@@ -519,7 +524,7 @@ class LoadMoreRenderer implements ITreeRenderer<ThreadAndSessionIds, void, ILabe
}
}
class ShowMoreRenderer implements ITreeRenderer<IStackFrame[], void, ILabelTemplateData> {
class ShowMoreRenderer implements ITreeRenderer<IStackFrame[], FuzzyScore, ILabelTemplateData> {
static readonly ID = 'showMore';
get templateId(): string {
......@@ -533,7 +538,7 @@ class ShowMoreRenderer implements ITreeRenderer<IStackFrame[], void, ILabelTempl
return data;
}
renderElement(element: ITreeNode<IStackFrame[], void>, index: number, data: ILabelTemplateData): void {
renderElement(element: ITreeNode<IStackFrame[], FuzzyScore>, index: number, data: ILabelTemplateData): void {
const stackFrames = element.element;
if (stackFrames.every(sf => sf.source && sf.source.origin && sf.source.origin === stackFrames[0].source.origin)) {
data.label.textContent = nls.localize('showMoreAndOrigin', "Show {0} More: {1}", stackFrames.length, stackFrames[0].source.origin);
......
......@@ -45,7 +45,7 @@ export class DebugHoverWidget implements IContentWidget {
private _isVisible: boolean;
private domNode: HTMLElement;
private tree: AsyncDataTree<IExpression, IExpression>;
private tree: AsyncDataTree<IExpression, IExpression, any>;
private showAtPosition: Position;
private highlightDecorations: string[];
private complexValueContainer: HTMLElement;
......
......@@ -66,6 +66,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration';
import { RunOnceScheduler } from 'vs/base/common/async';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
const $ = dom.$;
......@@ -81,7 +83,7 @@ interface IPrivateReplService {
clearRepl(): void;
}
function revealLastElement(tree: WorkbenchAsyncDataTree<any, any>) {
function revealLastElement(tree: WorkbenchAsyncDataTree<any, any, any>) {
tree.scrollTop = tree.scrollHeight - tree.renderHeight;
}
......@@ -95,7 +97,7 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati
private static readonly REPL_INPUT_MAX_HEIGHT = 170;
private history: HistoryNavigator<string>;
private tree: WorkbenchAsyncDataTree<IDebugSession, IReplElement>;
private tree: WorkbenchAsyncDataTree<IDebugSession, IReplElement, FuzzyScore>;
private replDelegate: ReplDelegate;
private container: HTMLElement;
private treeContainer: HTMLElement;
......@@ -250,7 +252,7 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati
getVisibleContent(): string {
let text = '';
const lineDelimiter = this.textResourcePropertiesService.getEOL(this.model.uri);
const traverseAndAppend = (node: ITreeNode<IReplElement, void>) => {
const traverseAndAppend = (node: ITreeNode<IReplElement, FuzzyScore>) => {
node.children.forEach(child => {
text += child.element.toString() + lineDelimiter;
if (!child.collapsed && child.children.length) {
......@@ -507,6 +509,7 @@ interface IExpressionTemplateData {
output: HTMLElement;
value: HTMLElement;
annotation: HTMLElement;
label: HighlightedLabel;
}
interface ISimpleReplElementTemplateData {
......@@ -515,6 +518,7 @@ interface ISimpleReplElementTemplateData {
source: HTMLElement;
getReplElementSource(): IReplElementSource;
toDispose: IDisposable[];
label: HighlightedLabel;
}
interface IRawObjectReplTemplateData {
......@@ -523,9 +527,10 @@ interface IRawObjectReplTemplateData {
name: HTMLElement;
value: HTMLElement;
annotation: HTMLElement;
label: HighlightedLabel;
}
class ReplExpressionsRenderer implements ITreeRenderer<Expression, void, IExpressionTemplateData> {
class ReplExpressionsRenderer implements ITreeRenderer<Expression, FuzzyScore, IExpressionTemplateData> {
static readonly ID = 'expressionRepl';
get templateId(): string {
......@@ -536,6 +541,7 @@ class ReplExpressionsRenderer implements ITreeRenderer<Expression, void, IExpres
const data: IExpressionTemplateData = Object.create(null);
dom.addClass(container, 'input-output-pair');
data.input = dom.append(container, $('.input.expression'));
data.label = new HighlightedLabel(data.input, false);
data.output = dom.append(container, $('.output.expression'));
data.value = dom.append(data.output, $('span.value'));
data.annotation = dom.append(data.output, $('span'));
......@@ -543,9 +549,9 @@ class ReplExpressionsRenderer implements ITreeRenderer<Expression, void, IExpres
return data;
}
renderElement(element: ITreeNode<Expression, void>, index: number, templateData: IExpressionTemplateData): void {
renderElement(element: ITreeNode<Expression, FuzzyScore>, index: number, templateData: IExpressionTemplateData): void {
const expression = element.element;
templateData.input.textContent = expression.name;
templateData.label.set(expression.name, createMatches(element.filterData));
renderExpressionValue(expression, templateData.value, {
preserveWhitespace: !expression.hasChildren,
showHover: false,
......@@ -562,7 +568,7 @@ class ReplExpressionsRenderer implements ITreeRenderer<Expression, void, IExpres
}
}
class ReplSimpleElementsRenderer implements ITreeRenderer<SimpleReplElement, void, ISimpleReplElementTemplateData> {
class ReplSimpleElementsRenderer implements ITreeRenderer<SimpleReplElement, FuzzyScore, ISimpleReplElementTemplateData> {
static readonly ID = 'simpleReplElement';
constructor(
......@@ -606,7 +612,7 @@ class ReplSimpleElementsRenderer implements ITreeRenderer<SimpleReplElement, voi
return data;
}
renderElement({ element }: ITreeNode<SimpleReplElement, void>, index: number, templateData: ISimpleReplElementTemplateData): void {
renderElement({ element }: ITreeNode<SimpleReplElement, FuzzyScore>, index: number, templateData: ISimpleReplElementTemplateData): void {
// value
dom.clearNode(templateData.value);
// Reset classes to clear ansi decorations since templates are reused
......@@ -625,7 +631,7 @@ class ReplSimpleElementsRenderer implements ITreeRenderer<SimpleReplElement, voi
}
}
class ReplRawObjectsRenderer implements ITreeRenderer<RawObjectReplElement, void, IRawObjectReplTemplateData> {
class ReplRawObjectsRenderer implements ITreeRenderer<RawObjectReplElement, FuzzyScore, IRawObjectReplTemplateData> {
static readonly ID = 'rawObject';
get templateId(): string {
......@@ -639,14 +645,17 @@ class ReplRawObjectsRenderer implements ITreeRenderer<RawObjectReplElement, void
data.container = container;
data.expression = dom.append(container, $('.output.expression'));
data.name = dom.append(data.expression, $('span.name'));
data.label = new HighlightedLabel(data.name, false);
data.value = dom.append(data.expression, $('span.value'));
data.annotation = dom.append(data.expression, $('span'));
return data;
}
renderElement({ element }: ITreeNode<RawObjectReplElement, void>, index: number, templateData: IRawObjectReplTemplateData): void {
renderElement(node: ITreeNode<RawObjectReplElement, FuzzyScore>, index: number, templateData: IRawObjectReplTemplateData): void {
// key
const element = node.element;
templateData.label.set(element.name ? `${element.name}:` : '', createMatches(node.filterData));
if (element.name) {
templateData.name.textContent = `${element.name}:`;
} else {
......
......@@ -28,6 +28,8 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
import { WorkbenchAsyncDataTree, IListService } from 'vs/platform/list/browser/listService';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { onUnexpectedError } from 'vs/base/common/errors';
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
const $ = dom.$;
......@@ -37,7 +39,7 @@ export class VariablesView extends ViewletPanel {
private onFocusStackFrameScheduler: RunOnceScheduler;
private needsRefresh: boolean;
private tree: WorkbenchAsyncDataTree<IViewModel, IExpression | IScope>;
private tree: WorkbenchAsyncDataTree<IViewModel, IExpression | IScope, FuzzyScore>;
constructor(
options: IViewletViewOptions,
......@@ -178,6 +180,7 @@ export class VariablesDataSource implements IAsyncDataSource<IViewModel, IExpres
interface IScopeTemplateData {
name: HTMLElement;
label: HighlightedLabel;
}
class VariablesDelegate implements IListVirtualDelegate<IExpression | IScope> {
......@@ -198,7 +201,7 @@ class VariablesDelegate implements IListVirtualDelegate<IExpression | IScope> {
}
}
class ScopesRenderer implements ITreeRenderer<IScope, void, IScopeTemplateData> {
class ScopesRenderer implements ITreeRenderer<IScope, FuzzyScore, IScopeTemplateData> {
static readonly ID = 'scope';
......@@ -209,12 +212,13 @@ class ScopesRenderer implements ITreeRenderer<IScope, void, IScopeTemplateData>
renderTemplate(container: HTMLElement): IScopeTemplateData {
let data: IScopeTemplateData = Object.create(null);
data.name = dom.append(container, $('.scope'));
data.label = new HighlightedLabel(data.name, false);
return data;
}
renderElement(element: ITreeNode<IScope, void>, index: number, templateData: IScopeTemplateData): void {
templateData.name.textContent = element.element.name;
renderElement(element: ITreeNode<IScope, FuzzyScore>, index: number, templateData: IScopeTemplateData): void {
templateData.label.set(element.element.name, createMatches(element.filterData));
}
disposeTemplate(templateData: IScopeTemplateData): void {
......@@ -230,8 +234,8 @@ export class VariablesRenderer extends AbstractExpressionsRenderer {
return VariablesRenderer.ID;
}
protected renderExpression(expression: IExpression, data: IExpressionTemplateData): void {
renderVariable(expression as Variable, data, true);
protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void {
renderVariable(expression as Variable, data, true, highlights);
}
protected getInputBoxOptions(expression: IExpression): IInputBoxOptions {
......
......@@ -30,6 +30,8 @@ import { IAsyncDataSource, ITreeMouseEvent, ITreeContextMenuEvent, ITreeDragAndD
import { IDragAndDropData } from 'vs/base/browser/dnd';
import { onUnexpectedError } from 'vs/base/common/errors';
import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView';
import { FuzzyScore } from 'vs/base/common/filters';
import { IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
const MAX_VALUE_RENDER_LENGTH_IN_VIEWLET = 1024;
......@@ -37,7 +39,7 @@ export class WatchExpressionsView extends ViewletPanel {
private onWatchExpressionsUpdatedScheduler: RunOnceScheduler;
private needsRefresh: boolean;
private tree: WorkbenchAsyncDataTree<IDebugService, IExpression>;
private tree: WorkbenchAsyncDataTree<IDebugService, IExpression, FuzzyScore>;
constructor(
options: IViewletViewOptions,
......@@ -223,8 +225,9 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer {
return WatchExpressionsRenderer.ID;
}
protected renderExpression(expression: IExpression, data: IExpressionTemplateData): void {
data.name.textContent = expression.name;
protected renderExpression(expression: IExpression, data: IExpressionTemplateData, highlights: IHighlight[]): void {
const text = typeof expression.value === 'string' ? `${expression.name}:` : expression.name;
data.label.set(text, highlights, expression.type ? expression.type : expression.value);
renderExpressionValue(expression, data.value, {
showChanged: true,
maxValueLength: MAX_VALUE_RENDER_LENGTH_IN_VIEWLET,
......@@ -232,11 +235,6 @@ export class WatchExpressionsRenderer extends AbstractExpressionsRenderer {
showHover: true,
colorize: true
});
data.name.title = expression.type ? expression.type : expression.value;
if (typeof expression.value === 'string') {
data.name.textContent += ':';
}
}
protected getInputBoxOptions(expression: IExpression): IInputBoxOptions {
......
......@@ -8,6 +8,7 @@ import { replaceWhitespace, renderExpressionValue, renderVariable } from 'vs/wor
import * as dom from 'vs/base/browser/dom';
import { Expression, Variable, Scope, StackFrame, Thread } from 'vs/workbench/parts/debug/common/debugModel';
import { MockSession } from 'vs/workbench/parts/debug/test/common/mockDebug';
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
const $ = dom.$;
suite('Debug - Base Debug View', () => {
......@@ -61,9 +62,10 @@ suite('Debug - Base Debug View', () => {
let expression = $('.');
let name = $('.');
let value = $('.');
renderVariable(variable, { expression, name, value }, false);
let label = new HighlightedLabel(name, false);
renderVariable(variable, { expression, name, value, label }, false, []);
assert.equal(name.textContent, 'foo');
assert.equal(label.element.textContent, 'foo');
assert.equal(value.textContent, '');
assert.equal(value.title, '');
......@@ -71,19 +73,19 @@ suite('Debug - Base Debug View', () => {
expression = $('.');
name = $('.');
value = $('.');
renderVariable(variable, { expression, name, value }, false);
renderVariable(variable, { expression, name, value, label }, false, []);
assert.equal(value.textContent, 'hey');
assert.equal(name.textContent, 'foo:');
assert.equal(name.title, 'string');
assert.equal(label.element.textContent, 'foo:');
assert.equal(label.element.title, 'string');
variable = new Variable(session, scope, 2, 'console', 'console', '5', 0, 0, { kind: 'virtual' });
expression = $('.');
name = $('.');
value = $('.');
renderVariable(variable, { expression, name, value }, false);
renderVariable(variable, { expression, name, value, label }, false, []);
assert.equal(name.className, 'virtual');
assert.equal(name.textContent, 'console:');
assert.equal(name.title, 'console');
assert.equal(label.element.textContent, 'console:');
assert.equal(label.element.title, 'console');
assert.equal(value.className, 'value number');
});
});
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册