提交 4c25b4c3 编写于 作者: A Alex Dima

Fixes #3859: announce that suggestion has details, announce suggestion details when opening them

上级 76591595
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import 'vs/css!./suggest'; import 'vs/css!./suggest';
import * as nls from 'vs/nls'; import * as nls from 'vs/nls';
import * as strings from 'vs/base/common/strings';
import {isPromiseCanceledError, onUnexpectedError} from 'vs/base/common/errors'; import {isPromiseCanceledError, onUnexpectedError} from 'vs/base/common/errors';
import Event, { Emitter } from 'vs/base/common/event'; import Event, { Emitter } from 'vs/base/common/event';
import {IDisposable, disposeAll} from 'vs/base/common/lifecycle'; import {IDisposable, disposeAll} from 'vs/base/common/lifecycle';
...@@ -76,7 +77,12 @@ class Renderer implements IRenderer<CompletionItem, ISuggestionTemplateData> { ...@@ -76,7 +77,12 @@ class Renderer implements IRenderer<CompletionItem, ISuggestionTemplateData> {
const data = <ISuggestionTemplateData>templateData; const data = <ISuggestionTemplateData>templateData;
const suggestion = (<CompletionItem>element).suggestion; const suggestion = (<CompletionItem>element).suggestion;
data.root.setAttribute('aria-label', nls.localize('suggestionAriaLabel', "{0}, suggestion", suggestion.label)); if (suggestion.documentationLabel) {
data.root.setAttribute('aria-label', nls.localize('suggestionWithDetailsAriaLabel', "{0}, suggestion, has details", suggestion.label));
} else {
data.root.setAttribute('aria-label', nls.localize('suggestionAriaLabel', "{0}, suggestion", suggestion.label));
}
if (suggestion.type && suggestion.type.charAt(0) === '#') { if (suggestion.type && suggestion.type.charAt(0) === '#') {
data.icon.className = 'icon customcolor'; data.icon.className = 'icon customcolor';
data.colorspan.style.backgroundColor = suggestion.type.substring(1); data.colorspan.style.backgroundColor = suggestion.type.substring(1);
...@@ -178,6 +184,7 @@ class SuggestionDetails { ...@@ -178,6 +184,7 @@ class SuggestionDetails {
private body: HTMLElement; private body: HTMLElement;
private type: HTMLElement; private type: HTMLElement;
private docs: HTMLElement; private docs: HTMLElement;
private ariaLabel:string;
constructor(container: HTMLElement, private widget: SuggestWidget) { constructor(container: HTMLElement, private widget: SuggestWidget) {
this.el = append(container, $('.details')); this.el = append(container, $('.details'));
...@@ -190,6 +197,8 @@ class SuggestionDetails { ...@@ -190,6 +197,8 @@ class SuggestionDetails {
append(this.el, this.scrollable.getDomNode()); append(this.el, this.scrollable.getDomNode());
this.type = append(this.body, $('p.type')); this.type = append(this.body, $('p.type'));
this.docs = append(this.body, $('p.docs')); this.docs = append(this.body, $('p.docs'));
this.ariaLabel = null;
} }
get element() { get element() {
...@@ -201,6 +210,7 @@ class SuggestionDetails { ...@@ -201,6 +210,7 @@ class SuggestionDetails {
this.title.textContent = ''; this.title.textContent = '';
this.type.textContent = ''; this.type.textContent = '';
this.docs.textContent = ''; this.docs.textContent = '';
this.ariaLabel = null;
return; return;
} }
...@@ -219,6 +229,12 @@ class SuggestionDetails { ...@@ -219,6 +229,12 @@ class SuggestionDetails {
this.scrollable.onElementDimensions(); this.scrollable.onElementDimensions();
this.scrollable.onElementInternalDimensions(); this.scrollable.onElementInternalDimensions();
this.ariaLabel = strings.format('{0}\n{1}\n{2}', item.suggestion.label, item.suggestion.typeLabel, item.suggestion.documentationLabel);
}
getAriaLabel(): string {
return this.ariaLabel;
} }
scrollDown(much = 8): void { scrollDown(much = 8): void {
...@@ -384,7 +400,25 @@ export class SuggestWidget implements IContentWidget, IDisposable { ...@@ -384,7 +400,25 @@ export class SuggestWidget implements IContentWidget, IDisposable {
}, 0); }, 0);
} }
private _lastSuggestionLabel: string; private _getSuggestionAriaAlertLabel(item:CompletionItem): string {
if (item.suggestion.documentationLabel) {
return nls.localize('ariaCurrentSuggestionWithDetails',"{0}, suggestion, has details", item.suggestion.label);
} else {
return nls.localize('ariaCurrentSuggestion',"{0}, suggestion", item.suggestion.label);
}
}
private _lastAriaAlertLabel: string;
private _ariaAlert(newAriaAlertLabel:string): void {
if (this._lastAriaAlertLabel === newAriaAlertLabel) {
return;
}
this._lastAriaAlertLabel = newAriaAlertLabel;
if (this._lastAriaAlertLabel) {
alert(this._lastAriaAlertLabel);
}
}
private onListFocus(e: IFocusChangeEvent<CompletionItem>): void { private onListFocus(e: IFocusChangeEvent<CompletionItem>): void {
if (this.currentSuggestionDetails) { if (this.currentSuggestionDetails) {
this.currentSuggestionDetails.cancel(); this.currentSuggestionDetails.cancel();
...@@ -392,7 +426,7 @@ export class SuggestWidget implements IContentWidget, IDisposable { ...@@ -392,7 +426,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
} }
if (!e.elements.length) { if (!e.elements.length) {
this._lastSuggestionLabel = null; this._ariaAlert(null);
// TODO@Alex: Chromium bug // TODO@Alex: Chromium bug
// this.editor.setAriaActiveDescendant(null); // this.editor.setAriaActiveDescendant(null);
...@@ -401,10 +435,7 @@ export class SuggestWidget implements IContentWidget, IDisposable { ...@@ -401,10 +435,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
} }
const item = e.elements[0]; const item = e.elements[0];
if (item.suggestion.label !== this._lastSuggestionLabel) { this._ariaAlert(this._getSuggestionAriaAlertLabel(item));
this._lastSuggestionLabel = item.suggestion.label;
alert(nls.localize('ariaCurrentSuggestion',"{0}, suggestion", this._lastSuggestionLabel));
}
// TODO@Alex: Chromium bug // TODO@Alex: Chromium bug
// // TODO@Alex: the list is not done rendering... // // TODO@Alex: the list is not done rendering...
...@@ -433,6 +464,8 @@ export class SuggestWidget implements IContentWidget, IDisposable { ...@@ -433,6 +464,8 @@ export class SuggestWidget implements IContentWidget, IDisposable {
this.list.setFocus(index); this.list.setFocus(index);
this.updateWidgetHeight(); this.updateWidgetHeight();
this.list.reveal(index); this.list.reveal(index);
this._ariaAlert(this._getSuggestionAriaAlertLabel(item));
}) })
.then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err)) .then(null, err => !isPromiseCanceledError(err) && onUnexpectedError(err))
.then(() => this.currentSuggestionDetails = null); .then(() => this.currentSuggestionDetails = null);
...@@ -485,6 +518,7 @@ export class SuggestWidget implements IContentWidget, IDisposable { ...@@ -485,6 +518,7 @@ export class SuggestWidget implements IContentWidget, IDisposable {
hide(this.messageElement, this.listElement); hide(this.messageElement, this.listElement);
show(this.details.element); show(this.details.element);
this.show(); this.show();
this._ariaAlert(this.details.getAriaLabel());
break; break;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册