diff --git a/src/vs/workbench/parts/markers/electron-browser/markersModel.ts b/src/vs/workbench/parts/markers/electron-browser/markersModel.ts index 6249d0085671b832fbecd1caa6f8f60a27128a82..d0dbabbde7505365960d34fd60223b61abef205e 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersModel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersModel.ts @@ -11,28 +11,38 @@ import { IMarker, MarkerSeverity, IRelatedInformation } from 'vs/platform/marker import { IFilter, IMatch, or, matchesContiguousSubString, matchesPrefix, matchesFuzzy } from 'vs/base/common/filters'; import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import { Schemas } from 'vs/base/common/network'; -import { groupBy, isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { groupBy, isFalsyOrEmpty, flatten } from 'vs/base/common/arrays'; import { values } from 'vs/base/common/map'; +function compareUris(a: URI, b: URI) { + if (a.toString() < b.toString()) { + return -1; + } else if (a.toString() > b.toString()) { + return 1; + } else { + return 0; + } +} + export abstract class NodeWithId { constructor(readonly id: string) { } } -export class ResourceData extends NodeWithId { +export class ResourceMarkers extends NodeWithId { private _name: string = null; private _path: string = null; - count: number = 0; + readonly markers: Marker[]; + filteredCount: number = 0; uriMatches: IMatch[] = []; constructor( - id: string, readonly uri: URI, - readonly data: T[] + markers: Marker[] ) { - super(id); - this.count = this.data.length; + super(uri.toString()); + this.markers = markers.sort(Marker.compare); } public get path(): string { @@ -48,21 +58,10 @@ export class ResourceData extends NodeWithId { } return this._name; } -} - -export class ResourceMarkers extends ResourceData { - - constructor( - uri: URI, - markers: Marker[] - ) { - const sorted = markers.sort(Marker.compare); - super(uri.toString(), uri, sorted); - } static compare(a: ResourceMarkers, b: ResourceMarkers): number { - let [firstMarkerOfA] = a.data; - let [firstMarkerOfB] = b.data; + let [firstMarkerOfA] = a.markers; + let [firstMarkerOfB] = b.markers; let res = 0; if (firstMarkerOfA && firstMarkerOfB) { res = MarkerSeverity.compare(firstMarkerOfA.raw.severity, firstMarkerOfB.raw.severity); @@ -79,7 +78,7 @@ export class Marker extends NodeWithId { isSelected: boolean = false; messageMatches: IMatch[] = []; sourceMatches: IMatch[] = []; - resourceRelatedInformation: ResourceData[] = []; + resourceRelatedInformation: RelatedInformation[] = []; constructor( id: string, @@ -114,10 +113,11 @@ export class Marker extends NodeWithId { } export class RelatedInformation extends NodeWithId { - constructor( - id: string, - readonly relatedInformation: IRelatedInformation, - public matches: IMatch[]) { + + messageMatches: IMatch[]; + uriMatches: IMatch[]; + + constructor(id: string, readonly raw: IRelatedInformation) { super(id); } } @@ -170,13 +170,7 @@ export class MarkersModel { } private static _compareMarkersByUri(a: IMarker, b: IMarker) { - if (a.resource.toString() < b.resource.toString()) { - return -1; - } else if (a.resource.toString() > b.resource.toString()) { - return 1; - } else { - return 0; - } + return compareUris(a.resource, b.resource); } public get filterOptions(): FilterOptions { @@ -192,7 +186,7 @@ export class MarkersModel { public forEachFilteredResource(callback: (resource: ResourceMarkers) => any) { this._markersByResource.forEach(resource => { - if (resource.count > 0) { + if (resource.filteredCount > 0) { callback(resource); } }); @@ -201,7 +195,7 @@ export class MarkersModel { public hasFilteredResources(): boolean { let res = false; this._markersByResource.forEach(resource => { - res = res || resource.count > 0; + res = res || resource.filteredCount > 0; }); return res; } @@ -218,8 +212,8 @@ export class MarkersModel { let total = 0; let filtered = 0; this._markersByResource.forEach(resource => { - total += resource.data.length; - filtered += resource.count; + total += resource.markers.length; + filtered += resource.filteredCount; }); return { total, filtered }; @@ -241,16 +235,16 @@ export class MarkersModel { if (!this._filterOptions.hasFilters()) { // reset all filters/matches this._markersByResource.forEach(resource => { - resource.count = resource.data.length; + resource.filteredCount = resource.markers.length; resource.uriMatches = []; - for (const marker of resource.data) { + for (const marker of resource.markers) { marker.isSelected = true; marker.messageMatches = []; marker.sourceMatches = []; marker.resourceRelatedInformation.forEach(r => { r.uriMatches = []; - r.data.forEach(d => d.matches = []); + r.messageMatches = []; }); } }); @@ -259,18 +253,18 @@ export class MarkersModel { this._markersByResource.forEach(resource => { resource.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(resource.uri.fsPath)) : []; - resource.count = 0; + resource.filteredCount = 0; - for (const marker of resource.data) { + for (const marker of resource.markers) { marker.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, marker.raw.message) : []; marker.sourceMatches = marker.raw.source && this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, marker.raw.source) : []; marker.isSelected = this.filterMarker(marker.raw); if (marker.isSelected) { - resource.count += 1; + resource.filteredCount += 1; } marker.resourceRelatedInformation.forEach(r => { - r.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.uri.fsPath)) : []; - r.data.forEach(d => d.matches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, d.relatedInformation.message) : []); + r.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.raw.resource.fsPath)) : []; + r.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, r.raw.message) : []; }); } }); @@ -290,7 +284,7 @@ export class MarkersModel { } const resource = new ResourceMarkers(uri, markers); - resource.count = filteredCount; + resource.filteredCount = filteredCount; resource.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(uri.fsPath)) : []; return resource; @@ -302,21 +296,14 @@ export class MarkersModel { marker.sourceMatches = rawMarker.source && this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, rawMarker.source) : []; marker.isSelected = this.filterMarker(rawMarker); if (rawMarker.relatedInformation) { - marker.resourceRelatedInformation = groupBy(rawMarker.relatedInformation, MarkersModel._compareMarkersByUri) - .map(group => { - const id = uri + index + uri + index.toString(); - const r = new ResourceData( - id, - group[0].resource, - group.map((relatedInformation, index) => - new RelatedInformation( - id + index, - relatedInformation, - this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, relatedInformation.message) : [] - ))); - r.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.uri.fsPath)) : []; - return r; - }); + const groupedByResource = groupBy(rawMarker.relatedInformation, MarkersModel._compareMarkersByUri); + groupedByResource.sort((a, b) => compareUris(a[0].resource, b[0].resource)); + marker.resourceRelatedInformation = flatten(groupedByResource).map((r, index) => { + const relatedInformation = new RelatedInformation(marker.id + index, r); + relatedInformation.uriMatches = this._filterOptions.hasFilters() ? FilterOptions._filter(this._filterOptions.filter, paths.basename(r.resource.fsPath)) : []; + relatedInformation.messageMatches = this._filterOptions.hasFilters() ? FilterOptions._fuzzyFilter(this._filterOptions.filter, r.message) : []; + return relatedInformation; + }); } return marker; } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts index 7eece96e64d6206d41fd60feb4096549e4e64438..913ce14a87312e21600807566d8b0cec43c35cd2 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts @@ -135,7 +135,7 @@ export class MarkersPanel extends Panel { public openFileAtElement(element: any, preserveFocus: boolean, sideByside: boolean, pinned: boolean): boolean { const { resource, selection } = element instanceof Marker ? { resource: element.resource, selection: element.range } : - element instanceof RelatedInformation ? { resource: element.relatedInformation.resource, selection: element.relatedInformation } : { resource: null, selection: null }; + element instanceof RelatedInformation ? { resource: element.raw.resource, selection: element.raw } : { resource: null, selection: null }; if (resource && selection) { this.editorService.openEditor({ resource, diff --git a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts index baffdcbe2667de9761055e199f09d7789eff2992..6c9640dba0a64443496ebf64a2796d54b8e86924 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts @@ -7,23 +7,26 @@ import { TPromise, Promise } from 'vs/base/common/winjs.base'; import * as dom from 'vs/base/browser/dom'; import * as network from 'vs/base/common/network'; +import * as paths from 'vs/base/common/paths'; import { IDataSource, ITree, IRenderer, IAccessibilityProvider, IFilter } from 'vs/base/parts/tree/browser/tree'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { FileLabel, ResourceLabel } from 'vs/workbench/browser/labels'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers'; -import { MarkersModel, ResourceMarkers, Marker, ResourceData, RelatedInformation, NodeWithId } from 'vs/workbench/parts/markers/electron-browser/markersModel'; +import { MarkersModel, ResourceMarkers, Marker, RelatedInformation, NodeWithId } from 'vs/workbench/parts/markers/electron-browser/markersModel'; import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; +import { getPathLabel } from 'vs/base/common/labels'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { dirname } from 'vs/base/common/resources'; -interface IResourceTemplateData { +interface IResourceMarkersTemplateData { resourceLabel: ResourceLabel; -} - -interface IProblemResourceTemplateData extends IResourceTemplateData { count: CountBadge; styler: IDisposable; } @@ -37,6 +40,7 @@ interface IMarkerTemplateData { interface IRelatedInformationTemplateData { description: HighlightedLabel; + resourceLabel: IconLabel; lnCol: HTMLElement; } @@ -52,15 +56,15 @@ export class DataSource implements IDataSource { } public hasChildren(tree: ITree, element: any): boolean { - return element instanceof MarkersModel || element instanceof ResourceData || (element instanceof Marker && element.resourceRelatedInformation.length > 0); + return element instanceof MarkersModel || element instanceof ResourceMarkers || (element instanceof Marker && element.resourceRelatedInformation.length > 0); } public getChildren(tree: ITree, element: any): Promise { if (element instanceof MarkersModel) { return Promise.as(element.resources); } - if (element instanceof ResourceData) { - return Promise.as(element.data); + if (element instanceof ResourceMarkers) { + return Promise.as(element.markers); } if (element instanceof Marker && element.resourceRelatedInformation.length > 0) { return Promise.as(element.resourceRelatedInformation); @@ -76,7 +80,7 @@ export class DataSource implements IDataSource { export class DataFilter implements IFilter { public isVisible(tree: ITree, element: any): boolean { if (element instanceof ResourceMarkers) { - return element.count > 0; + return element.filteredCount > 0; } if (element instanceof Marker) { return element.isSelected; @@ -87,16 +91,16 @@ export class DataFilter implements IFilter { export class Renderer implements IRenderer { - private static readonly PROBLEM_RESOURCE_TEMPLATE_ID = 'problem-resource-template'; - private static readonly PROBLEM_FILE_RESOURCE_TEMPLATE_ID = 'problem-file-resource-template'; - private static readonly RELATED_RESOURCE_TEMPLATE_ID = 'related-resource-template'; - private static readonly RELATED_FILE_RESOURCE_TEMPLATE_ID = 'related-file-resource-template'; + private static readonly RESOURCE_MARKERS_TEMPLATE_ID = 'resource-markers-template'; + private static readonly FILE_RESOURCE_MARKERS_TEMPLATE_ID = 'file-resource-markers-template'; private static readonly MARKER_TEMPLATE_ID = 'marker-template'; - private static readonly RELATED_INFORMATION_TEMPLATE_ID = 'related-info-template'; + private static readonly RELATED_INFO_TEMPLATE_ID = 'related-info-template'; constructor( @IInstantiationService private instantiationService: IInstantiationService, - @IThemeService private themeService: IThemeService + @IThemeService private themeService: IThemeService, + @IWorkspaceContextService private contextService: IWorkspaceContextService, + @IEnvironmentService private environmentService: IEnvironmentService ) { } @@ -107,23 +111,16 @@ export class Renderer implements IRenderer { public getTemplateId(tree: ITree, element: any): string { if (element instanceof ResourceMarkers) { if ((element).uri.scheme === network.Schemas.file || (element).uri.scheme === network.Schemas.untitled) { - return Renderer.PROBLEM_FILE_RESOURCE_TEMPLATE_ID; + return Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID; } else { - return Renderer.PROBLEM_RESOURCE_TEMPLATE_ID; - } - } - if (element instanceof ResourceData) { - if ((element).uri.scheme === network.Schemas.file || (element).uri.scheme === network.Schemas.untitled) { - return Renderer.RELATED_FILE_RESOURCE_TEMPLATE_ID; - } else { - return Renderer.RELATED_RESOURCE_TEMPLATE_ID; + return Renderer.RESOURCE_MARKERS_TEMPLATE_ID; } } if (element instanceof Marker) { return Renderer.MARKER_TEMPLATE_ID; } if (element instanceof RelatedInformation) { - return Renderer.RELATED_INFORMATION_TEMPLATE_ID; + return Renderer.RELATED_INFO_TEMPLATE_ID; } return ''; } @@ -131,37 +128,35 @@ export class Renderer implements IRenderer { public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { dom.addClass(container, 'markers-panel-tree-entry'); switch (templateId) { - case Renderer.PROBLEM_FILE_RESOURCE_TEMPLATE_ID: - return this.renderProblemFileResourceTemplate(container); - case Renderer.PROBLEM_RESOURCE_TEMPLATE_ID: - return this.renderProblemResourceTemplate(container); - case Renderer.RELATED_FILE_RESOURCE_TEMPLATE_ID: - return this.renderFileResourceTemplate(container); - case Renderer.RELATED_RESOURCE_TEMPLATE_ID: - return this.renderResourceTemplate(container); + case Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID: + return this.renderFileResourceMarkersTemplate(container); + case Renderer.RESOURCE_MARKERS_TEMPLATE_ID: + return this.renderResourceMarkersTemplate(container); case Renderer.MARKER_TEMPLATE_ID: return this.renderMarkerTemplate(container); - case Renderer.RELATED_INFORMATION_TEMPLATE_ID: - return this.renderRelatedInformationTemplate(container); + case Renderer.RELATED_INFO_TEMPLATE_ID: + return this.renderRelatedInfoTemplate(container); } } - private renderFileResourceTemplate(container: HTMLElement): IResourceTemplateData { - const data: IProblemResourceTemplateData = Object.create(null); + private renderFileResourceMarkersTemplate(container: HTMLElement): IResourceMarkersTemplateData { + const data = Object.create(null); + const resourceLabelContainer = dom.append(container, dom.$('.resource-label-container')); data.resourceLabel = this.instantiationService.createInstance(FileLabel, resourceLabelContainer, { supportHighlights: true }); + + const badgeWrapper = dom.append(container, dom.$('.count-badge-wrapper')); + data.count = new CountBadge(badgeWrapper); + data.styler = attachBadgeStyler(data.count, this.themeService); + return data; } - private renderResourceTemplate(container: HTMLElement): IResourceTemplateData { - const data: IProblemResourceTemplateData = Object.create(null); + private renderResourceMarkersTemplate(container: HTMLElement): IResourceMarkersTemplateData { + const data = Object.create(null); + const resourceLabelContainer = dom.append(container, dom.$('.resource-label-container')); data.resourceLabel = this.instantiationService.createInstance(ResourceLabel, resourceLabelContainer, { supportHighlights: true }); - return data; - } - - private renderProblemFileResourceTemplate(container: HTMLElement): IProblemResourceTemplateData { - const data = this.renderFileResourceTemplate(container); const badgeWrapper = dom.append(container, dom.$('.count-badge-wrapper')); data.count = new CountBadge(badgeWrapper); @@ -170,13 +165,18 @@ export class Renderer implements IRenderer { return data; } - private renderProblemResourceTemplate(container: HTMLElement): IProblemResourceTemplateData { - const data = this.renderResourceTemplate(container); + private renderRelatedInfoTemplate(container: HTMLElement): IRelatedInformationTemplateData { + const data: IRelatedInformationTemplateData = Object.create(null); + data.description = new HighlightedLabel(dom.append(container, dom.$('.marker-description'))); - const badgeWrapper = dom.append(container, dom.$('.count-badge-wrapper')); - data.count = new CountBadge(badgeWrapper); - data.styler = attachBadgeStyler(data.count, this.themeService); + const separator = dom.append(container, dom.$('')); + separator.textContent = '-'; + separator.style.padding = '0 4px'; + + const resourceLabelContainer = dom.append(container, dom.$('.resource-label-container')); + data.resourceLabel = this.instantiationService.createInstance(IconLabel, resourceLabelContainer, { supportHighlights: true }); + data.lnCol = dom.append(container, dom.$('span.marker-line')); return data; } @@ -189,36 +189,25 @@ export class Renderer implements IRenderer { return data; } - private renderRelatedInformationTemplate(container: HTMLElement): IRelatedInformationTemplateData { - const data: IRelatedInformationTemplateData = Object.create(null); - data.description = new HighlightedLabel(dom.append(container, dom.$('.marker-description'))); - data.lnCol = dom.append(container, dom.$('span.marker-line')); - return data; - } - public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { switch (templateId) { - case Renderer.PROBLEM_FILE_RESOURCE_TEMPLATE_ID: - case Renderer.PROBLEM_RESOURCE_TEMPLATE_ID: - case Renderer.RELATED_FILE_RESOURCE_TEMPLATE_ID: - case Renderer.RELATED_RESOURCE_TEMPLATE_ID: - return this.renderResourceElement(tree, >element, templateData); + case Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID: + case Renderer.RESOURCE_MARKERS_TEMPLATE_ID: + return this.renderResourceMarkersElement(tree, element, templateData); case Renderer.MARKER_TEMPLATE_ID: return this.renderMarkerElement(tree, (element), templateData); - case Renderer.RELATED_INFORMATION_TEMPLATE_ID: - return this.renderRelatedInformationElement(tree, (element), templateData); + case Renderer.RELATED_INFO_TEMPLATE_ID: + return this.renderRelatedInfoElement(tree, element, templateData); } } - private renderResourceElement(tree: ITree, element: ResourceData, templateData: IResourceTemplateData | IProblemResourceTemplateData) { + private renderResourceMarkersElement(tree: ITree, element: ResourceMarkers, templateData: IResourceMarkersTemplateData) { if (templateData.resourceLabel instanceof FileLabel) { templateData.resourceLabel.setFile(element.uri, { matches: element.uriMatches }); } else { templateData.resourceLabel.setLabel({ name: element.name, description: element.uri.toString(), resource: element.uri }, { matches: element.uriMatches }); } - if ((templateData).count) { - (templateData).count.setCount(element.count); - } + (templateData).count.setCount(element.filteredCount); } private renderMarkerElement(tree: ITree, element: Marker, templateData: IMarkerTemplateData) { @@ -233,10 +222,11 @@ export class Renderer implements IRenderer { templateData.lnCol.textContent = Messages.MARKERS_PANEL_AT_LINE_COL_NUMBER(marker.startLineNumber, marker.startColumn); } - private renderRelatedInformationElement(tree: ITree, element: RelatedInformation, templateData: IRelatedInformationTemplateData) { - templateData.description.set(element.relatedInformation.message, element.matches); - templateData.description.element.title = element.relatedInformation.message; - templateData.lnCol.textContent = Messages.MARKERS_PANEL_AT_LINE_COL_NUMBER(element.relatedInformation.startLineNumber, element.relatedInformation.startColumn); + private renderRelatedInfoElement(tree: ITree, element: RelatedInformation, templateData: IRelatedInformationTemplateData) { + templateData.description.set(element.raw.message, element.messageMatches); + templateData.description.element.title = element.raw.message; + templateData.lnCol.textContent = Messages.MARKERS_PANEL_AT_LINE_COL_NUMBER(element.raw.startLineNumber, element.raw.startColumn); + templateData.resourceLabel.setValue(paths.basename(element.raw.resource.fsPath), getPathLabel(dirname(element.raw.resource), this.contextService, this.environmentService), { matches: element.uriMatches }); } private static iconClassNameFor(element: IMarker): string { @@ -254,16 +244,15 @@ export class Renderer implements IRenderer { } public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { - if (templateId === Renderer.PROBLEM_RESOURCE_TEMPLATE_ID || templateId === Renderer.PROBLEM_FILE_RESOURCE_TEMPLATE_ID) { - (templateData).resourceLabel.dispose(); - (templateData).styler.dispose(); - } else if (templateId === Renderer.RELATED_RESOURCE_TEMPLATE_ID || templateId === Renderer.RELATED_FILE_RESOURCE_TEMPLATE_ID) { - (templateData).resourceLabel.dispose(); + if (templateId === Renderer.RESOURCE_MARKERS_TEMPLATE_ID || templateId === Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID) { + (templateData).resourceLabel.dispose(); + (templateData).styler.dispose(); } else if (templateId === Renderer.MARKER_TEMPLATE_ID) { (templateData).description.dispose(); (templateData).source.dispose(); - } else if (templateId === Renderer.RELATED_INFORMATION_TEMPLATE_ID) { + } else if (templateId === Renderer.RELATED_INFO_TEMPLATE_ID) { (templateData).description.dispose(); + (templateData).resourceLabel.dispose(); } } } @@ -272,16 +261,13 @@ export class MarkersTreeAccessibilityProvider implements IAccessibilityProvider public getAriaLabel(tree: ITree, element: any): string { if (element instanceof ResourceMarkers) { - return Messages.MARKERS_TREE_ARIA_LABEL_RESOURCE(element.name, element.count); + return Messages.MARKERS_TREE_ARIA_LABEL_RESOURCE(element.name, element.filteredCount); } if (element instanceof Marker) { return Messages.MARKERS_TREE_ARIA_LABEL_MARKER(element); } - if (element instanceof ResourceData) { - return element.name; - } if (element instanceof RelatedInformation) { - return Messages.MARKERS_TREE_ARIA_LABEL_RELATED_INFORMATION(element.relatedInformation); + return Messages.MARKERS_TREE_ARIA_LABEL_RELATED_INFORMATION(element.raw); } return null; } diff --git a/src/vs/workbench/parts/markers/electron-browser/media/markers.css b/src/vs/workbench/parts/markers/electron-browser/media/markers.css index 91252ec8466856b3a95dcf2575a59edeabd81f24..e14cbf63b5c502afe8de14d00355314d709d4c1e 100644 --- a/src/vs/workbench/parts/markers/electron-browser/media/markers.css +++ b/src/vs/workbench/parts/markers/electron-browser/media/markers.css @@ -66,7 +66,6 @@ } .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-description { - margin-right: 5px; text-overflow: ellipsis; overflow: hidden; } @@ -82,7 +81,7 @@ .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-source, .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-line { opacity: 0.7; - margin-right: 5px; + margin-left: 5px; } .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .highlight { @@ -91,8 +90,7 @@ .markers-panel .icon { height: 22px; - margin-right: 4px; - margin-left: 4px; + margin-right: 6px; flex: 0 0 16px; } diff --git a/src/vs/workbench/parts/markers/electron-browser/messages.ts b/src/vs/workbench/parts/markers/electron-browser/messages.ts index a0357bec1da1cd379c080300bae740a938bf309b..03bc507f5d7fc1241312f919d0eac85819f420b3 100644 --- a/src/vs/workbench/parts/markers/electron-browser/messages.ts +++ b/src/vs/workbench/parts/markers/electron-browser/messages.ts @@ -5,6 +5,7 @@ 'use strict'; import * as nls from 'vs/nls'; +import * as paths from 'vs/base/common/paths'; import { MarkerSeverity, IRelatedInformation } from 'vs/platform/markers/common/markers'; import { Marker } from './markersModel'; @@ -42,7 +43,7 @@ export default class Messages { public static readonly MARKERS_TREE_ARIA_LABEL_RESOURCE = (fileName: string, noOfProblems: number): string => { return nls.localize('problems.tree.aria.label.resource', "{0} with {1} problems", fileName, noOfProblems); }; public static readonly MARKERS_TREE_ARIA_LABEL_MARKER = (marker: Marker): string => { - const relatedInformationMessage = marker.resourceRelatedInformation.length ? nls.localize('problems.tree.aria.label.marker.relatedInformation', " This problem has references to {0} locations.", marker.resourceRelatedInformation.reduce((count, r) => count + r.count, 0)) : ''; + const relatedInformationMessage = marker.resourceRelatedInformation.length ? nls.localize('problems.tree.aria.label.marker.relatedInformation', " This problem has references to {0} locations.", marker.resourceRelatedInformation.length) : ''; switch (marker.raw.severity) { case MarkerSeverity.Error: return marker.raw.source ? nls.localize('problems.tree.aria.label.error.marker', "Error generated by {0}: {1} at line {2} and character {3}.{4}", marker.raw.source, marker.raw.message, marker.raw.startLineNumber, marker.raw.startColumn, relatedInformationMessage) @@ -59,6 +60,6 @@ export default class Messages { : nls.localize('problems.tree.aria.label.marker.nosource', "Problem: {0} at line {1} and character {2}.{3}", marker.raw.message, marker.raw.startLineNumber, marker.raw.startColumn, relatedInformationMessage); } } - public static readonly MARKERS_TREE_ARIA_LABEL_RELATED_INFORMATION = (relatedInformation: IRelatedInformation): string => nls.localize('problems.tree.aria.label.relatedinfo.message', "{0} at line {1} and character {2}", relatedInformation.message, relatedInformation.startLineNumber, relatedInformation.startColumn); + public static readonly MARKERS_TREE_ARIA_LABEL_RELATED_INFORMATION = (relatedInformation: IRelatedInformation): string => nls.localize('problems.tree.aria.label.relatedinfo.message', "{0} at line {1} and character {2} in {3}", relatedInformation.message, relatedInformation.startLineNumber, relatedInformation.startColumn, paths.basename(relatedInformation.resource.fsPath)); public static SHOW_ERRORS_WARNINGS_ACTION_LABEL: string = nls.localize('errors.warnings.show.label', "Show Errors and Warnings"); } diff --git a/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts b/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts index af1c476e33a33c602e5bd9c2e6e90d7a84df6bb8..043b5f9c53679a1dea881ba735df4ddfafd276c5 100644 --- a/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts +++ b/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts @@ -45,22 +45,22 @@ suite('MarkersModel Test', () => { assert.equal(4, actuals.length); assert.ok(compareResource(actuals[0], 'res1')); - assert.equal(2, actuals[0].data.length); - assert.ok(hasMarker(actuals[0].data, marker1)); - assert.ok(hasMarker(actuals[0].data, marker3)); + assert.equal(2, actuals[0].markers.length); + assert.ok(hasMarker(actuals[0].markers, marker1)); + assert.ok(hasMarker(actuals[0].markers, marker3)); assert.ok(compareResource(actuals[1], 'res2')); - assert.equal(2, actuals[1].data.length); - assert.ok(hasMarker(actuals[1].data, marker2)); - assert.ok(hasMarker(actuals[1].data, marker6)); + assert.equal(2, actuals[1].markers.length); + assert.ok(hasMarker(actuals[1].markers, marker2)); + assert.ok(hasMarker(actuals[1].markers, marker6)); assert.ok(compareResource(actuals[2], 'res3')); - assert.equal(1, actuals[2].data.length); - assert.ok(hasMarker(actuals[2].data, marker4)); + assert.equal(1, actuals[2].markers.length); + assert.ok(hasMarker(actuals[2].markers, marker4)); assert.ok(compareResource(actuals[3], 'res4')); - assert.equal(1, actuals[3].data.length); - assert.ok(hasMarker(actuals[3].data, marker5)); + assert.equal(1, actuals[3].markers.length); + assert.ok(hasMarker(actuals[3].markers, marker5)); }); test('sort palces resources with no errors at the end', function () { @@ -119,7 +119,7 @@ suite('MarkersModel Test', () => { let marker15 = anErrorWithRange(8, 2, 8, 4); let testObject = new TestMarkersModel([marker1, marker2, marker3, marker4, marker5, marker6, marker7, marker8, marker9, marker10, marker11, marker12, marker13, marker14, marker15]); - let actuals = testObject.filteredResources[0].data.sort(TestMarkersModel.compare); + let actuals = testObject.filteredResources[0].markers.sort(TestMarkersModel.compare); assert.equal(actuals[0].raw, marker6); assert.equal(actuals[1].raw, marker14);