diff --git a/src/vs/workbench/parts/markers/browser/markersPanel.ts b/src/vs/workbench/parts/markers/browser/markersPanel.ts index 5da59fcfc0042fbb73ba431e24167a0476887ca5..439964791f21387e94aca264a8852badca54a4a1 100644 --- a/src/vs/workbench/parts/markers/browser/markersPanel.ts +++ b/src/vs/workbench/parts/markers/browser/markersPanel.ts @@ -109,6 +109,8 @@ export class MarkersPanel extends Panel { if (this.markersModel.hasFilteredResources()) { this.tree.DOMFocus(); this.revealProblemsForCurrentActiveEditor(true); + } else { + this.messageBox.focus(); } } @@ -135,7 +137,8 @@ export class MarkersPanel extends Panel { private createMessageBox(parent: HTMLElement): void { this.messageBoxContainer = dom.append(parent, dom.emmet('.message-box-container')); - this.messageBox = dom.append(this.messageBoxContainer, dom.emmet('p')); + this.messageBox = dom.append(this.messageBoxContainer, dom.emmet('span')); + this.messageBox.setAttribute('tabindex', '0'); } private createTree(parent: HTMLElement): void { @@ -146,7 +149,8 @@ export class MarkersPanel extends Panel { this.tree = new TreeImpl.Tree(this.treeContainer, { dataSource: new Viewer.DataSource(), renderer: renderer, - controller: controller + controller: controller, + accessibilityProvider: new Viewer.ProblemsTreeAccessibilityProvider() }, { indentPixels: 0, twistiePixels: 20, @@ -260,6 +264,9 @@ export class MarkersPanel extends Panel { this.tree.setSelection([currentActiveResource]); } } + } else if (focus) { + this.tree.setSelection([]); + this.tree.focusFirst(); } } diff --git a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts index 5700ba16306a007ed68b16d66e9429c3d195a13c..7638ec9ce638aae917349bfe9838cc05f23e3196 100644 --- a/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts +++ b/src/vs/workbench/parts/markers/browser/markersTreeViewer.ts @@ -6,7 +6,7 @@ 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 {IDataSource, ITree, IRenderer, IAccessibilityProvider} from 'vs/base/parts/tree/browser/tree'; import { IActionRunner } from 'vs/base/common/actions'; import Severity from 'vs/base/common/severity'; import {IWorkspaceContextService} from 'vs/workbench/services/workspace/common/contextService'; @@ -174,4 +174,18 @@ export class Renderer implements IRenderer { public disposeTemplate(tree: ITree, templateId: string, templateData: any): void { } +} + +export class ProblemsTreeAccessibilityProvider implements IAccessibilityProvider { + + public getAriaLabel(tree: ITree, element: any): string { + if (element instanceof Resource) { + return Messages.PROBLEMS_TREE_ARIA_LABEL_RESOURCE(element.name, element.markers.length); + } + if (element instanceof Marker) { + return Messages.PROBLEMS_TREE_ARIA_LABEL_MARKER(element.marker); + } + return null; + } + } \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/browser/media/markers.css b/src/vs/workbench/parts/markers/browser/media/markers.css index 5015470ed87d2c9380699610be6a728266ab9d6c..98e41dfb1254de31e551a4016e5b30d0f2ce8414 100644 --- a/src/vs/workbench/parts/markers/browser/media/markers.css +++ b/src/vs/workbench/parts/markers/browser/media/markers.css @@ -27,7 +27,11 @@ } .markers-panel .markers-panel-container .message-box-container { - padding-left: 20px; + padding: 20px 0 0 20px; +} + +.markers-panel .markers-panel-container .message-box-container span:focus { + outline: none; } .markers-panel .markers-panel-container .hidden { diff --git a/src/vs/workbench/parts/markers/common/messages.ts b/src/vs/workbench/parts/markers/common/messages.ts index 263811d5b0defe8cfa5b55c759f8ec404a7c3fe8..eebe223bc0e306def10221cc1112f976e98355bd 100644 --- a/src/vs/workbench/parts/markers/common/messages.ts +++ b/src/vs/workbench/parts/markers/common/messages.ts @@ -5,6 +5,8 @@ 'use strict'; import nls = require('vs/nls'); +import Severity from 'vs/base/common/severity'; +import { IMarker } from 'vs/platform/markers/common/markers'; export default class Messages { @@ -16,7 +18,7 @@ export default class Messages { public static MARKERS_PANEL_TITLE_NO_PROBLEMS:string= nls.localize('markers.panel.title.no.problems', "No problems"); - public static MARKERS_PANEL_NO_PROBLEMS_BUILT:string= nls.localize('markers.panel.no.problems.build', "No errors have been detected in the workspace so far."); + public static MARKERS_PANEL_NO_PROBLEMS_BUILT:string= nls.localize('markers.panel.no.problems.build', "No problems have been detected in the workspace so far."); public static MARKERS_PANEL_NO_PROBLEMS_FILTERS:string= nls.localize('markers.panel.no.problems.filters', "No results found with provided filter criteria"); public static MARKERS_PANEL_ACTION_TOOLTIP_FILTER:string= nls.localize('markers.panel.action.filter', "Filter Problems"); @@ -37,4 +39,23 @@ export default class Messages { public static MARKERS_PANEL_AT_LINE_COL_NUMBER= (ln: number, col: number):string=>{return nls.localize('markers.panel.at.ln.col.number', "({0}, {1})", '' + ln, '' + col);} public static MARKERS_PANEL_TITLE_AT_LINE_COL_NUMBER= (ln: number, col: number):string=>{return nls.localize('markers.panel.title.at.ln.col.number', "At line {0}, column {1}", '' + ln, '' + col);} public static MARKERS_PANEL_TITLE_SOURCE= (source: string):string=>{return nls.localize('markers.panel.title.source', "Built by {0}", source);} + + public static PROBLEMS_TREE_ARIA_LABEL_RESOURCE= (fileName, noOfProblems):string => {return nls.localize('problems.tree.aria.label.resource', "{0} with {1} problems", fileName, noOfProblems);} + public static PROBLEMS_TREE_ARIA_LABEL_MARKER= (marker: IMarker):string => { + switch (marker.severity) { + case Severity.Error: + return marker.source ? nls.localize('problems.tree.aria.label.error.marker', "Error generated by {0}: {1} at line {2} and column {3}", marker.source, marker.message, marker.startLineNumber, marker.startColumn) + : nls.localize('problems.tree.aria.label.error.marker.nosource', "Error: {0} at line {1} and column {2}", marker.message, marker.startLineNumber, marker.startColumn); + case Severity.Warning: + return marker.source ? nls.localize('problems.tree.aria.label.warning.marker', "Warning generated by {0}: {1} at line {2} and column {3}", marker.source, marker.message, marker.startLineNumber, marker.startColumn) + : nls.localize('problems.tree.aria.label.warning.marker.nosource', "Warning: {0} at line {1} and column {2}", marker.message, marker.startLineNumber, marker.startColumn); + + case Severity.Info: + return marker.source ? nls.localize('problems.tree.aria.label.info.marker', "Info generated by {0}: {1} at line {2} and column {3}", marker.source, marker.message, marker.startLineNumber, marker.startColumn) + : nls.localize('problems.tree.aria.label.info.marker.nosource', "Info: {0} at line {1} and column {2}", marker.message, marker.startLineNumber, marker.startColumn); + default: + return marker.source ? nls.localize('problems.tree.aria.label.marker', "Problem generated by {0}: {1} at line {2} and column {3}", marker.source, marker.message, marker.startLineNumber, marker.startColumn) + : nls.localize('problems.tree.aria.label.marker.nosource', "Problem: {0} at line {1} and column {2}", marker.message, marker.startLineNumber, marker.startColumn); + } + } } \ No newline at end of file