提交 12481101 编写于 作者: S Sandeep Somavarapu

#10271 Show related informations as list

上级 1ab1a3d6
......@@ -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<T> 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<T> extends NodeWithId {
}
return this._name;
}
}
export class ResourceMarkers extends ResourceData<Marker> {
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<RelatedInformation>[] = [];
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<RelatedInformation>(
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;
}
......
......@@ -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,
......
......@@ -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 || (<ResourceMarkers>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 || (<ResourceMarkers>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 = <IResourceMarkersTemplateData>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 = <IResourceMarkersTemplateData>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 = <IProblemResourceTemplateData>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 = <IProblemResourceTemplateData>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, <ResourceData<any>>element, templateData);
case Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID:
case Renderer.RESOURCE_MARKERS_TEMPLATE_ID:
return this.renderResourceMarkersElement(tree, <ResourceMarkers>element, templateData);
case Renderer.MARKER_TEMPLATE_ID:
return this.renderMarkerElement(tree, (<Marker>element), templateData);
case Renderer.RELATED_INFORMATION_TEMPLATE_ID:
return this.renderRelatedInformationElement(tree, (<RelatedInformation>element), templateData);
case Renderer.RELATED_INFO_TEMPLATE_ID:
return this.renderRelatedInfoElement(tree, <RelatedInformation>element, templateData);
}
}
private renderResourceElement(tree: ITree, element: ResourceData<any>, 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 ((<IProblemResourceTemplateData>templateData).count) {
(<IProblemResourceTemplateData>templateData).count.setCount(element.count);
}
(<IResourceMarkersTemplateData>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) {
(<IProblemResourceTemplateData>templateData).resourceLabel.dispose();
(<IProblemResourceTemplateData>templateData).styler.dispose();
} else if (templateId === Renderer.RELATED_RESOURCE_TEMPLATE_ID || templateId === Renderer.RELATED_FILE_RESOURCE_TEMPLATE_ID) {
(<IProblemResourceTemplateData>templateData).resourceLabel.dispose();
if (templateId === Renderer.RESOURCE_MARKERS_TEMPLATE_ID || templateId === Renderer.FILE_RESOURCE_MARKERS_TEMPLATE_ID) {
(<IResourceMarkersTemplateData>templateData).resourceLabel.dispose();
(<IResourceMarkersTemplateData>templateData).styler.dispose();
} else if (templateId === Renderer.MARKER_TEMPLATE_ID) {
(<IMarkerTemplateData>templateData).description.dispose();
(<IMarkerTemplateData>templateData).source.dispose();
} else if (templateId === Renderer.RELATED_INFORMATION_TEMPLATE_ID) {
} else if (templateId === Renderer.RELATED_INFO_TEMPLATE_ID) {
(<IRelatedInformationTemplateData>templateData).description.dispose();
(<IRelatedInformationTemplateData>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;
}
......
......@@ -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;
}
......
......@@ -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");
}
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册