Skip to content

Commit a292900

Browse files
committed
microsoft#7205 decorations
1 parent 067428f commit a292900

6 files changed

Lines changed: 76 additions & 53 deletions

File tree

src/vs/base/browser/ui/fileLabel/fileLabel.ts

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,23 @@ import dom = require('vs/base/browser/dom');
99
import uri from 'vs/base/common/uri';
1010
import paths = require('vs/base/common/paths');
1111
import types = require('vs/base/common/types');
12+
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
13+
import { IMatch } from 'vs/base/common/filters';
1214
import {IWorkspaceProvider, getPathLabel} from 'vs/base/common/labels';
1315

1416
export class FileLabel {
1517

1618
private domNode: HTMLElement;
19+
private labelNode: HighlightedLabel;
20+
private directoryNode: HTMLElement;
1721
private basepath: string;
1822
private path: string;
19-
private renderedOnce: boolean;
23+
private labelHighlights: IMatch[]= [];
2024

2125
constructor(container: HTMLElement, arg2?: uri | string, arg3?: uri | string | IWorkspaceProvider) {
22-
this.domNode = document.createElement('span');
23-
this.domNode.className = 'monaco-file-label';
24-
container.appendChild(this.domNode);
26+
this.domNode = dom.append(container, dom.emmet('.monaco-file-label'));
27+
this.labelNode= new HighlightedLabel(dom.append(this.domNode, dom.emmet('span.file-name')));
28+
this.directoryNode= dom.append(this.domNode, dom.emmet('span.file-path'));
2529

2630
if (arg3) {
2731
this.basepath = getPath(arg3);
@@ -36,38 +40,18 @@ export class FileLabel {
3640
return this.domNode;
3741
}
3842

39-
public setValue(arg1: uri | string): void {
43+
public setValue(arg1: uri | string, labelHighlights?: IMatch[]): void {
4044
let newPath = getPath(arg1);
41-
42-
if (this.renderedOnce && this.path === newPath) {
43-
// don't render again if nothing has changed
44-
return;
45-
}
46-
4745
this.path = newPath;
46+
this.labelHighlights= labelHighlights;
4847
this.render();
49-
this.renderedOnce = true;
5048
}
5149

5250
private render(): void {
53-
dom.clearNode(this.domNode);
54-
55-
let htmlContent: string[] = [];
56-
57-
htmlContent.push('<span class="file-name">');
58-
htmlContent.push(paths.basename(this.path));
59-
htmlContent.push('</span>');
60-
61-
let parent = paths.dirname(this.path);
62-
if (parent && parent !== '.') {
63-
let pathLabel = getPathLabel(parent, this.basepath);
64-
htmlContent.push('<span class="file-path">');
65-
htmlContent.push(pathLabel);
66-
htmlContent.push('</span>');
67-
}
68-
6951
this.domNode.title = this.path;
70-
this.domNode.innerHTML = htmlContent.join('');
52+
this.labelNode.set(paths.basename(this.path), this.labelHighlights);
53+
let parent = paths.dirname(this.path);
54+
this.directoryNode.textContent= parent && parent !== '.' ? getPathLabel(parent, this.basepath) : '';
7155
}
7256
}
7357

src/vs/workbench/parts/markers/browser/markersPanel.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as errors from 'vs/base/common/errors';
99
import * as Set from 'vs/base/common/set';
1010
import URI from 'vs/base/common/uri';
1111
import { TPromise } from 'vs/base/common/winjs.base';
12+
import { Delayer } from 'vs/base/common/async';
1213
import dom = require('vs/base/browser/dom');
1314
import lifecycle = require('vs/base/common/lifecycle');
1415
import builder = require('vs/base/browser/builder');
@@ -34,8 +35,10 @@ import { FilterAction, FilterInputBoxActionItem } from 'vs/workbench/parts/marke
3435
export class MarkersPanel extends Panel {
3536

3637
public markersModel: MarkersModel;
37-
private tree: Tree.ITree;
3838
private toDispose: lifecycle.IDisposable[];
39+
private delayedRefresh: Delayer<void>;
40+
41+
private tree: Tree.ITree;
3942
private autoExpanded: Set.ArraySet<string>;
4043

4144
private actions: IAction[];
@@ -56,6 +59,7 @@ export class MarkersPanel extends Panel {
5659
super(Constants.MARKERS_PANEL_ID, telemetryService);
5760
this.markersModel= new MarkersModel();
5861
this.toDispose = [];
62+
this.delayedRefresh= new Delayer<void>(1000);
5963
this.autoExpanded= new Set.ArraySet<string>();
6064
}
6165

@@ -153,6 +157,7 @@ export class MarkersPanel extends Panel {
153157

154158
private onMarkerChanged(changedResources: URI[]) {
155159
this.updateResources(changedResources);
160+
// this.delayedRefresh.trigger(() => {this.refreshPanel(true);});
156161
this.refreshPanel(true);
157162
}
158163

@@ -206,6 +211,7 @@ export class MarkersPanel extends Panel {
206211
}
207212

208213
public dispose(): void {
214+
this.delayedRefresh.cancel();
209215
this.toDispose = lifecycle.dispose(this.toDispose);
210216
super.dispose();
211217
}

src/vs/workbench/parts/markers/browser/markersTreeViewer.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/c
1313
import { ActionProvider } from 'vs/workbench/parts/markers/browser/markersActionProvider';
1414
import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge';
1515
import { FileLabel } from 'vs/base/browser/ui/fileLabel/fileLabel';
16+
import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel';
1617
import { IMarker } from 'vs/platform/markers/common/markers';
1718
import { MarkersModel, Resource, Marker } from 'vs/workbench/parts/markers/common/markersModel';
1819
import MarkersStatisticsWidget from 'vs/workbench/parts/markers/browser/markersStatisticsWidget';
@@ -26,7 +27,8 @@ interface IResourceTemplateData {
2627

2728
interface IMarkerTemplateData {
2829
icon: HTMLElement;
29-
label: HTMLElement;
30+
line: HTMLElement;
31+
description: HighlightedLabel;
3032
}
3133

3234
export class DataSource implements IDataSource {
@@ -99,7 +101,8 @@ export class Renderer implements IRenderer {
99101

100102
private renderResourceTemplate(container: HTMLElement): IResourceTemplateData {
101103
var data: IResourceTemplateData = Object.create(null);
102-
data.file = new FileLabel(container, null, this.contextService);
104+
const resourceLabelContainer = dom.append(container, dom.emmet('.resource-label-container'));
105+
data.file = new FileLabel(resourceLabelContainer, null, this.contextService);
103106

104107
// data.statistics= new MarkersStatisticsWidget(dom.append(container, dom.emmet('.marker-stats')));
105108

@@ -112,7 +115,8 @@ export class Renderer implements IRenderer {
112115
private renderMarkerTemplate(container: HTMLElement): IMarkerTemplateData {
113116
var data: IMarkerTemplateData = Object.create(null);
114117
data.icon = dom.append(container, dom.emmet('.marker-icon'));
115-
data.label = dom.append(container, dom.emmet('span.label'));
118+
data.line = dom.append(container, dom.emmet('span.marker-line'));
119+
data.description = new HighlightedLabel(dom.append(container, dom.emmet('.marker-description')));
116120
return data;
117121
}
118122

@@ -121,19 +125,21 @@ export class Renderer implements IRenderer {
121125
case Renderer.RESOURCE_TEMPLATE_ID:
122126
return this.renderResourceElement(tree, <Resource> element, templateData);
123127
case Renderer.MARKER_TEMPLATE_ID:
124-
return this.renderMarkerElement(tree, (<Marker>element).marker, templateData);
128+
return this.renderMarkerElement(tree, (<Marker>element), templateData);
125129
}
126130
}
127131

128132
private renderResourceElement(tree: ITree, element: Resource, templateData: IResourceTemplateData) {
129-
templateData.file.setValue(element.uri);
133+
templateData.file.setValue(element.uri, element.matches);
130134
// templateData.statistics.setStatistics(element.statistics);
131135
templateData.count.setCount(element.markers.length);
132136
}
133137

134-
private renderMarkerElement(tree: ITree, element: IMarker, templateData: IMarkerTemplateData) {
135-
templateData.icon.className = 'icon ' + Renderer.iconClassNameFor(element);
136-
templateData.label.textContent = Messages.MARKERS_PANEL_AT_LINE_NUMBER(element.startLineNumber) + element.message;
138+
private renderMarkerElement(tree: ITree, element: Marker, templateData: IMarkerTemplateData) {
139+
let marker= element.marker;
140+
templateData.icon.className = 'icon ' + Renderer.iconClassNameFor(marker);
141+
templateData.line.textContent= Messages.MARKERS_PANEL_AT_LINE_NUMBER(marker.startLineNumber);
142+
templateData.description.set(marker.message, element.labelMatches);
137143
}
138144

139145
private static iconClassNameFor(element: IMarker): string {

src/vs/workbench/parts/markers/browser/media/markers.css

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,16 +43,34 @@
4343
line-height: 22px;
4444
}
4545

46+
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry > * {
47+
display: inline-block;
48+
}
49+
4650
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-stats {
4751
display: inline-block;
4852
margin-left: 10px;
4953
}
5054

5155
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .count-badge-wrapper {
52-
display: inline-block;
5356
margin-left: 10px;
5457
}
5558

59+
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-description {
60+
margin-left: 3px;
61+
}
62+
63+
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .resource-label-container .highlight,
64+
.markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-description .highlight {
65+
background-color: rgba(234, 92, 0, 0.3);
66+
}
67+
68+
.hc-black .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .resource-label-container .highlight,
69+
.hc-black .markers-panel .markers-panel-container .tree-container .markers-panel-tree-entry .marker-description .highlight {
70+
background: none !important;
71+
border: 1px dotted #f38518;
72+
}
73+
5674
.markers-panel .icon {
5775
float: left;
5876
display: block;

src/vs/workbench/parts/markers/common/markersModel.ts

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,34 @@
66

77
import * as strings from 'vs/base/common/strings';
88
import * as paths from 'vs/base/common/paths';
9+
import * as types from 'vs/base/common/types';
910
import * as Map from 'vs/base/common/map';
1011
import Severity from 'vs/base/common/severity';
1112
import URI from 'vs/base/common/uri';
1213
import { Range } from 'vs/editor/common/core/range';
1314
import { IMarker, MarkerStatistics } from 'vs/platform/markers/common/markers';
14-
import {IFilter, or, matchesContiguousSubString, matchesPrefix} from 'vs/base/common/filters';
15+
import {IFilter, IMatch, or, matchesContiguousSubString, matchesPrefix} from 'vs/base/common/filters';
1516
import Messages from 'vs/workbench/parts/markers/common/messages';
1617

1718
export class Resource {
1819
public name: string;
1920
public path: string;
20-
constructor(public uri: URI, public markers: Marker[], public statistics: MarkerStatistics){
21+
constructor(public uri: URI, public markers: Marker[],
22+
public statistics: MarkerStatistics,
23+
public matches: IMatch[] = []){
2124
this.path= uri.fsPath;
2225
this.name= paths.basename(uri.fsPath);
2326
}
2427
}
2528

2629
export class Marker {
27-
static _filter: IFilter = or(matchesPrefix, matchesContiguousSubString);
28-
constructor(public id:string, public marker: IMarker){}
30+
constructor(public id:string, public marker: IMarker, public labelMatches: IMatch[] = []){}
2931
}
3032

3133
export class FilterOptions {
3234

35+
static _filter: IFilter = or(matchesPrefix, matchesContiguousSubString);
36+
3337
private _filterErrors: boolean= false;
3438
private _filterWarnings: boolean= false;
3539
private _filterInfos: boolean= false;
@@ -130,7 +134,7 @@ export class MarkersModel {
130134
this.updateResource(arg1, arg2);
131135
}
132136

133-
if (arg1 instanceof Array) {
137+
if (types.isArray(arg1)) {
134138
this.updateMarkers(arg1);
135139
}
136140

@@ -178,22 +182,21 @@ export class MarkersModel {
178182
}
179183

180184
private toFilteredResource(entry: Map.Entry<URI, IMarker[]>) {
181-
let markers:Marker[]= entry.value.filter(this.filterMarker.bind(this)).map(this.toMarker);
185+
let markers:Marker[]= entry.value.filter(this.filterMarker.bind(this)).map((marker, index) => {
186+
return this.toMarker(marker, index);
187+
});
182188
markers.sort(this.compareMarkers.bind(this));
183-
return new Resource(entry.key, markers, this.getStatistics(entry.value));
189+
const matches = FilterOptions._filter(this._filterOptions.filter, paths.basename(entry.key.fsPath));
190+
return new Resource(entry.key, markers, this.getStatistics(entry.value), matches || []);
184191
}
185192

186193
private toMarker(marker: IMarker, index: number):Marker {
187-
return new Marker(marker.resource.toString() + index, marker);
194+
const labelMatches = FilterOptions._filter(this._filterOptions.filter, marker.message);
195+
return new Marker(marker.resource.toString() + index, marker, labelMatches || []);
188196
}
189197

190198
private filterMarker(marker: IMarker):boolean {
191199
if (this._filterOptions.filter) {
192-
const labelHighlights = Marker._filter(this._filterOptions.filter, marker.message);
193-
const descHighlights = Marker._filter(this._filterOptions.filter, marker.resource.toString());
194-
if (!!labelHighlights || !!descHighlights) {
195-
return true;
196-
}
197200
if (this._filterOptions.filterErrors && Severity.Error === marker.severity) {
198201
return true;
199202
}
@@ -203,6 +206,12 @@ export class MarkersModel {
203206
if (this._filterOptions.filterInfos && Severity.Info === marker.severity) {
204207
return true;
205208
}
209+
if (!!FilterOptions._filter(this._filterOptions.filter, marker.message)) {
210+
return true;
211+
}
212+
if (!!FilterOptions._filter(this._filterOptions.filter, paths.basename(marker.resource.fsPath))) {
213+
return true;
214+
}
206215
return false;
207216
}
208217
return true;

src/vs/workbench/parts/markers/common/messages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,5 @@ export default class Messages {
3131
public static MARKERS_PANEL_SINGLE_UNKNOWN_LABEL:string= nls.localize('markers.panel.single.unknown.label', "1 Unknown");
3232
public static MARKERS_PANEL_MULTIPLE_UNKNOWNS_LABEL=(noOfUnknowns: number):string=>{return nls.localize('markers.panel.multiple.unknowns.label', "{0} Unknowns", ''+noOfUnknowns);};
3333

34-
public static MARKERS_PANEL_AT_LINE_NUMBER= (lineNumber: number):string=>{return nls.localize('markers.panel.at.line.number', "Line {0}: ", '' + lineNumber);}
34+
public static MARKERS_PANEL_AT_LINE_NUMBER= (lineNumber: number):string=>{return nls.localize('markers.panel.at.line.number', "Line {0}:", '' + lineNumber);}
3535
}

0 commit comments

Comments
 (0)