mirror of
https://github.com/microsoft/vscode.git
synced 2026-05-24 17:31:37 +01:00
tree view implementation. update model
This commit is contained in:
@@ -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')
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user