From b5e45cb4fffcb1f6e5bbb632ea525f2ceed63362 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 26 May 2016 15:00:55 +0200 Subject: [PATCH] tree view implementation. update model --- .../parts/markers/browser/MarkersPanel.ts | 31 +++++++++- .../markers/browser/MarkersTreeViewer.ts | 58 ++++++++++--------- .../browser/markersWorkbenchContributions.ts | 2 +- .../parts/markers/browser/media/markers.css | 5 -- .../parts/markers/common/MarkersModel.ts | 56 ++++++++++-------- .../parts/markers/common/Messages.ts | 2 +- 6 files changed, 95 insertions(+), 59 deletions(-) diff --git a/src/vs/workbench/parts/markers/browser/MarkersPanel.ts b/src/vs/workbench/parts/markers/browser/MarkersPanel.ts index f40b363ab35..48127cbd347 100644 --- a/src/vs/workbench/parts/markers/browser/MarkersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/MarkersPanel.ts @@ -13,13 +13,14 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Panel } from 'vs/workbench/browser/panel'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import Constants from 'vs/workbench/parts/markers/common/Constants'; -import * as MarkersModel from 'vs/workbench/parts/markers/common/MarkersModel'; +import { MarkersModel } from 'vs/workbench/parts/markers/common/MarkersModel'; import {Controller} from 'vs/workbench/parts/markers/browser/MarkersTreeController'; import Tree = require('vs/base/parts/tree/browser/tree'); import TreeImpl = require('vs/base/parts/tree/browser/treeImpl'); import * as Viewer from 'vs/workbench/parts/markers/browser/MarkersTreeViewer'; import {IInstantiationService} from 'vs/platform/instantiation/common/instantiation'; import { ActionProvider } from 'vs/workbench/parts/markers/browser/MarkersActionProvider'; +import Messages from 'vs/workbench/parts/markers/common/Messages'; export class MarkersPanel extends Panel { @@ -59,13 +60,39 @@ export class MarkersPanel extends Panel { return TPromise.as(null); } + public getTitle():string { + let title= ''; + let marketStatistics= this.markerService.getStatistics(); + let addPipe= false; + if (marketStatistics.errors > 0) { + title += ' ' + marketStatistics.errors + ' Errors'; + addPipe= true; + } + if (marketStatistics.warnings > 0) { + title= addPipe ? title + ', ' : title; + title += ' ' + marketStatistics.warnings + ' Warnings'; + addPipe= true; + } + if (marketStatistics.infos > 0) { + title= addPipe ? title + ', ' : title; + title += ' ' + marketStatistics.infos + ' Info'; + addPipe= true; + } + if (marketStatistics.unknwons > 0) { + title= addPipe ? title + ', ' : title; + title += ' ' + marketStatistics.unknwons + ' Unknowns'; + } + return title ? title : Messages.MARKERS_PANEL_NO_PROBLEMS_TITLE; + } + public layout(dimension: builder.Dimension): void { this.tree.layout(dimension.height); } private render(): void { + this.updateTitleArea(); let allMarkers = this.markerService.read().slice(0); - let model= MarkersModel.toModel(allMarkers); + let model= new MarkersModel(allMarkers); this.tree.setInput(model); } diff --git a/src/vs/workbench/parts/markers/browser/MarkersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/MarkersTreeViewer.ts index 672057a8c07..2e143e82046 100644 --- a/src/vs/workbench/parts/markers/browser/MarkersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/MarkersTreeViewer.ts @@ -7,7 +7,6 @@ import {TPromise, Promise} from 'vs/base/common/winjs.base'; import * as dom from 'vs/base/browser/dom'; import {IDataSource, ITree, IRenderer} from 'vs/base/parts/tree/browser/tree'; -import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { IActionRunner } from 'vs/base/common/actions'; import Severity from 'vs/base/common/severity'; import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/contextService'; @@ -15,12 +14,11 @@ import { ActionProvider } from 'vs/workbench/parts/markers/browser/MarkersAction import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { FileLabel } from 'vs/base/browser/ui/fileLabel/fileLabel'; import { IMarker } from 'vs/platform/markers/common/markers'; -import { Marker, Resource } from 'vs/workbench/parts/markers/common/MarkersModel'; +import { MarkersModel, Resource, Marker } from 'vs/workbench/parts/markers/common/MarkersModel'; interface IResourceTemplateData { file: FileLabel; count: CountBadge; - actionBar: ActionBar; } interface IMarkerTemplateData { @@ -30,24 +28,30 @@ interface IMarkerTemplateData { export class DataSource implements IDataSource { public getId(tree: ITree, element: any): string { + if (element instanceof MarkersModel) { + return 'root'; + } if (element instanceof Resource) { - return 'resource' + (element).uri.toString(); + return element.uri.toString(); } if (element instanceof Marker) { return (element).id; } - return 'root'; + return ''; } public hasChildren(tree: ITree, element: any): boolean { - return !(element instanceof Marker); + return element instanceof MarkersModel || element instanceof Resource; } public getChildren(tree: ITree, element: any): Promise { - if (element instanceof Resource) { - return TPromise.as((element).markers); + if (element instanceof MarkersModel) { + return TPromise.as(element.getResources()); } - return TPromise.as(element['resources']); + if (element instanceof Resource) { + return TPromise.as(element.markers); + } + return null; } public getParent(tree: ITree, element: any): Promise { @@ -57,6 +61,9 @@ export class DataSource implements IDataSource { export class Renderer implements IRenderer { + private static RESOURCE_TEMPLATE_ID= 'resource-template'; + private static MARKER_TEMPLATE_ID= 'marker-template'; + constructor(private actionRunner: IActionRunner, private actionProvider:ActionProvider, @IWorkspaceContextService private contextService: IWorkspaceContextService @@ -69,16 +76,20 @@ export class Renderer implements IRenderer { public getTemplateId(tree:ITree, element:any): string { if (element instanceof Resource) { - return 'resource'; + return Renderer.RESOURCE_TEMPLATE_ID; } - return 'marker'; + if (element instanceof Marker) { + return Renderer.MARKER_TEMPLATE_ID; + } + return ''; } public renderTemplate(tree: ITree, templateId: string, container: HTMLElement): any { - if ('resource' === templateId) { - return this.renderResourceTemplate(container); - } else { - return this.renderMarkerTemplate(container); + switch (templateId) { + case Renderer.RESOURCE_TEMPLATE_ID: + return this.renderResourceTemplate(container); + case Renderer.MARKER_TEMPLATE_ID: + return this.renderMarkerTemplate(container); } } @@ -89,8 +100,6 @@ export class Renderer implements IRenderer { const badgeWrapper = dom.append(container, dom.emmet('.count-badge-wrapper')); data.count = new CountBadge(badgeWrapper); - data.actionBar = new ActionBar(container, { actionRunner: this.actionRunner }); - data.actionBar.push(this.actionProvider.getActionsForResource(), { icon: true, label: false }); return data; } @@ -102,20 +111,17 @@ export class Renderer implements IRenderer { } public renderElement(tree: ITree, element: any, templateId: string, templateData: any): void { - if ('resource' === templateId) { - return this.renderResourceElement(tree, element, templateData); - } else { - return this.renderMarkerElement(tree, (element).marker, templateData); + switch (templateId) { + case Renderer.RESOURCE_TEMPLATE_ID: + return this.renderResourceElement(tree, element, templateData); + case Renderer.MARKER_TEMPLATE_ID: + return this.renderMarkerElement(tree, (element).marker, templateData); } } private renderResourceElement(tree: ITree, element: Resource, templateData: IResourceTemplateData) { templateData.file.setValue(element.uri); - templateData.count.setCount(10); - templateData.actionBar.context= { - tree: tree, - element: element - }; + templateData.count.setCount(element.markers.length); } private renderMarkerElement(tree: ITree, element: IMarker, templateData: IMarkerTemplateData) { diff --git a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts index 6e9e245bc13..a9443218d85 100644 --- a/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts +++ b/src/vs/workbench/parts/markers/browser/markersWorkbenchContributions.ts @@ -44,7 +44,7 @@ export function registerContributions(): void { 'vs/workbench/parts/markers/browser/MarkersPanel', 'MarkersPanel', Constants.MARKERS_PANEL_ID, - Messages.MARKERS_PANEL_LABEL, + Messages.MARKERS_PANEL_NO_PROBLEMS_TITLE, 'markersPanel' )); diff --git a/src/vs/workbench/parts/markers/browser/media/markers.css b/src/vs/workbench/parts/markers/browser/media/markers.css index 5811932615e..0bdfc8845d7 100644 --- a/src/vs/workbench/parts/markers/browser/media/markers.css +++ b/src/vs/workbench/parts/markers/browser/media/markers.css @@ -23,11 +23,6 @@ line-height: 22px; } -.markers-panel > .monaco-tree .monaco-tree-row:hover .content .count-badge-wrapper, -.markers-panel > .monaco-tree.focused .monaco-tree-row.focused .content .count-badge-wrapper { - display: none; -} - .markers-panel > .monaco-tree .monaco-tree-row:hover .content .monaco-action-bar, .markers-panel > .monaco-tree.focused .monaco-tree-row.focused .content .monaco-action-bar { display: block; diff --git a/src/vs/workbench/parts/markers/common/MarkersModel.ts b/src/vs/workbench/parts/markers/common/MarkersModel.ts index 2705021ec9b..d64c4b88332 100644 --- a/src/vs/workbench/parts/markers/common/MarkersModel.ts +++ b/src/vs/workbench/parts/markers/common/MarkersModel.ts @@ -4,38 +4,46 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; +import * as Map from 'vs/base/common/map'; import URI from 'vs/base/common/uri'; import { IMarker } from 'vs/platform/markers/common/markers'; export class Resource { - constructor(public uri:URI, public markers:Marker[]){}; + constructor(public uri: URI, public markers: Marker[]){}; } export class Marker { constructor(public id:string, public marker: IMarker){}; } -export function toModel(markers: IMarker[]) { - let markersByResource: { [uri: string]: IMarker[] }= Object.create(null); - markers.forEach((marker:IMarker) => { - let uri:string= marker.resource.path; - let markers:IMarker[]= markersByResource[uri]; - if (!markers) { - markers= []; - markersByResource[uri]= markers; - } - markers.push(marker); - }); - let resources:Resource[]= []; - for (let uri in markersByResource) { - let markers = markersByResource[uri].map((marker:IMarker, index:number) => { - return new Marker(uri.toString() + index, marker); - }); - let resource= new Resource(URI.file(uri), markers); - resources.push(resource); +export class MarkersModel { + + private markersByResource: Map.SimpleMap; + + constructor(private markers: IMarker[]= []) { + this.markersByResource= new Map.SimpleMap(); + this.process(markers); } - resources.sort((a: Resource, b: Resource):number => { - return a.markers.length > b.markers.length ? -1 : 1; - }); - return {resources: resources}; -}; \ No newline at end of file + + public getResources():Resource[] { + return this.markersByResource.entries().map((entry) => { + return new Resource(entry.key, entry.value.map(this.toMarker)); + }); + } + + private process(markers: IMarker[]) { + markers.forEach((marker:IMarker) => { + let uri:URI= marker.resource; + let markers:IMarker[]= this.markersByResource.get(uri); + if (!markers) { + markers= []; + this.markersByResource.set(uri, markers); + } + markers.push(marker); + }); + } + + private toMarker(marker: IMarker, index: number):Marker { + return new Marker(marker.resource.toString() + index, marker); + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/common/Messages.ts b/src/vs/workbench/parts/markers/common/Messages.ts index 5a749c83982..478abd4301d 100644 --- a/src/vs/workbench/parts/markers/common/Messages.ts +++ b/src/vs/workbench/parts/markers/common/Messages.ts @@ -8,5 +8,5 @@ import nls = require('vs/nls'); export default { MARKERS_PANEL_TOGGLE_ACTION_LABEL: nls.localize('markers.panel.toggle.label', 'Toggle Problems'), - MARKERS_PANEL_LABEL: nls.localize('markers.panel.label', 'Problems') + MARKERS_PANEL_NO_PROBLEMS_TITLE: nls.localize('markers.panel.label', 'No Problems') };