tree view implementation. update model

This commit is contained in:
Sandeep Somavarapu
2016-05-26 15:00:55 +02:00
parent 446d0e6e97
commit b5e45cb4ff
6 changed files with 95 additions and 59 deletions
@@ -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);
}
@@ -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' + (<Resource>element).uri.toString();
return element.uri.toString();
}
if (element instanceof Marker) {
return (<Marker>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((<Resource>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, <Resource> element, templateData);
} else {
return this.renderMarkerElement(tree, (<Marker>element).marker, templateData);
switch (templateId) {
case Renderer.RESOURCE_TEMPLATE_ID:
return this.renderResourceElement(tree, <Resource> element, templateData);
case Renderer.MARKER_TEMPLATE_ID:
return this.renderMarkerElement(tree, (<Marker>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) {
@@ -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'
));
@@ -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;
@@ -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<URI, IMarker[]>;
constructor(private markers: IMarker[]= []) {
this.markersByResource= new Map.SimpleMap<URI, IMarker[]>();
this.process(markers);
}
resources.sort((a: Resource, b: Resource):number => {
return a.markers.length > b.markers.length ? -1 : 1;
});
return {resources: resources};
};
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);
}
}
@@ -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')
};