@codingame/monaco-vscode-accessibility-service-override 37.2.0 → 37.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +1 -0
- package/package.json +2 -2
- package/vscode/src/vs/workbench/contrib/accessibility/browser/accessibilityStatus.js +6 -6
- package/vscode/src/vs/workbench/contrib/accessibility/browser/accessibleView.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/accessibility/browser/accessibleView.js +28 -28
- package/vscode/src/vs/workbench/contrib/accessibilitySignals/browser/commands.js +16 -16
- package/vscode/src/vs/workbench/contrib/accessibilitySignals/browser/editorTextPropertySignalsContribution.js +2 -2
- package/vscode/src/vs/workbench/contrib/accessibilitySignals/browser/openDiffEditorAnnouncement.js +1 -1
- package/vscode/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.js +6 -6
- package/vscode/src/vs/workbench/contrib/codeEditor/browser/editorFindAccessibilityHelp.d.ts +75 -0
- package/vscode/src/vs/workbench/contrib/codeEditor/browser/editorFindAccessibilityHelp.js +442 -0
package/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import { AccessibilityService } from '@codingame/monaco-vscode-api/vscode/vs/pla
|
|
|
13
13
|
import { registerAssets } from '@codingame/monaco-vscode-api/assets';
|
|
14
14
|
import './vscode/src/vs/workbench/contrib/accessibility/browser/accessibility.contribution.js';
|
|
15
15
|
import './vscode/src/vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.js';
|
|
16
|
+
import './vscode/src/vs/workbench/contrib/codeEditor/browser/editorFindAccessibilityHelp.js';
|
|
16
17
|
import './vscode/src/vs/workbench/contrib/accessibilitySignals/browser/accessibilitySignal.contribution.js';
|
|
17
18
|
|
|
18
19
|
registerAssets(audioAssets);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-accessibility-service-override",
|
|
3
|
-
"version": "37.
|
|
3
|
+
"version": "37.3.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "VSCode public API plugged on the monaco editor - accessibility service-override",
|
|
6
6
|
"keywords": [],
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"type": "module",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@codingame/monaco-vscode-api": "37.
|
|
18
|
+
"@codingame/monaco-vscode-api": "37.3.1",
|
|
19
19
|
"marked": "14.0.0"
|
|
20
20
|
},
|
|
21
21
|
"main": "index.js",
|
|
@@ -53,21 +53,21 @@ let AccessibilityStatus = class AccessibilityStatus extends Disposable {
|
|
|
53
53
|
}
|
|
54
54
|
showScreenReaderNotification() {
|
|
55
55
|
this.screenReaderNotification = this.notificationService.prompt(Severity.Info, ( localize(
|
|
56
|
-
|
|
56
|
+
7028,
|
|
57
57
|
"Screen reader usage detected. Do you want to enable {0} to optimize the editor for screen reader usage?",
|
|
58
58
|
"editor.accessibilitySupport"
|
|
59
59
|
)), [{
|
|
60
|
-
label: ( localize(
|
|
60
|
+
label: ( localize(7029, "Yes")),
|
|
61
61
|
run: () => {
|
|
62
62
|
this.configurationService.updateValue("editor.accessibilitySupport", "on", ConfigurationTarget.USER);
|
|
63
63
|
}
|
|
64
64
|
}, {
|
|
65
|
-
label: ( localize(
|
|
65
|
+
label: ( localize(7030, "No")),
|
|
66
66
|
run: () => {
|
|
67
67
|
this.configurationService.updateValue("editor.accessibilitySupport", "off", ConfigurationTarget.USER);
|
|
68
68
|
}
|
|
69
69
|
}, {
|
|
70
|
-
label: ( localize(
|
|
70
|
+
label: ( localize(7031, "Learn More")),
|
|
71
71
|
run: () => {
|
|
72
72
|
this.openerService.open("https://code.visualstudio.com/docs/editor/accessibility#_screen-readers");
|
|
73
73
|
}
|
|
@@ -80,9 +80,9 @@ let AccessibilityStatus = class AccessibilityStatus extends Disposable {
|
|
|
80
80
|
updateScreenReaderModeElement(visible) {
|
|
81
81
|
if (visible) {
|
|
82
82
|
if (!this.screenReaderModeElement.value) {
|
|
83
|
-
const text = ( localize(
|
|
83
|
+
const text = ( localize(7032, "Screen Reader Optimized"));
|
|
84
84
|
this.screenReaderModeElement.value = this.statusbarService.addEntry({
|
|
85
|
-
name: ( localize(
|
|
85
|
+
name: ( localize(7033, "Screen Reader Mode")),
|
|
86
86
|
text,
|
|
87
87
|
ariaLabel: text,
|
|
88
88
|
command: "showEditorScreenReaderNotification",
|
|
@@ -18,7 +18,7 @@ import { IOpenerService } from "@codingame/monaco-vscode-api/vscode/vs/platform/
|
|
|
18
18
|
import { IQuickInputService } from "@codingame/monaco-vscode-api/vscode/vs/platform/quickinput/common/quickInput.service";
|
|
19
19
|
import { IStorageService } from "@codingame/monaco-vscode-api/vscode/vs/platform/storage/common/storage.service";
|
|
20
20
|
import { IChatCodeBlockContextProviderService } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/chat.service";
|
|
21
|
-
import { ICodeBlockActionContext } from "@codingame/monaco-vscode-
|
|
21
|
+
import { ICodeBlockActionContext } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/chat/browser/widget/chatContentParts/codeBlockPart";
|
|
22
22
|
import { AccessibilityVerbositySettingId } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration";
|
|
23
23
|
export type AccesibleViewContentProvider = AccessibleContentProvider | ExtensionContentProvider;
|
|
24
24
|
export declare class AccessibleView extends Disposable {
|
|
@@ -474,8 +474,8 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
474
474
|
const disposables = this._register(( new DisposableStore()));
|
|
475
475
|
const quickPick = disposables.add(this._quickInputService.createQuickPick());
|
|
476
476
|
quickPick.items = items;
|
|
477
|
-
quickPick.title = ( localize(
|
|
478
|
-
quickPick.placeholder = ( localize(
|
|
477
|
+
quickPick.title = ( localize(7034, "Configure keybindings"));
|
|
478
|
+
quickPick.placeholder = ( localize(7035, "Select a command ID to configure a keybinding for it"));
|
|
479
479
|
quickPick.show();
|
|
480
480
|
disposables.add(quickPick.onDidAccept(async () => {
|
|
481
481
|
const item = quickPick.selectedItems[0];
|
|
@@ -510,7 +510,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
510
510
|
break;
|
|
511
511
|
}
|
|
512
512
|
firstListItem = `- ${firstItem.text}`;
|
|
513
|
-
label =
|
|
513
|
+
label = token.items.map(i => i.text).join(", ");
|
|
514
514
|
break;
|
|
515
515
|
}
|
|
516
516
|
}
|
|
@@ -518,8 +518,8 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
518
518
|
if (label) {
|
|
519
519
|
symbols.push({
|
|
520
520
|
markdownToParse: label,
|
|
521
|
-
label: ( localize(
|
|
522
|
-
ariaLabel: ( localize(
|
|
521
|
+
label: ( localize(7036, "({0}) {1}", token.type, label)),
|
|
522
|
+
ariaLabel: ( localize(7037, "({0}) {1}", token.type, label)),
|
|
523
523
|
firstListItem
|
|
524
524
|
});
|
|
525
525
|
firstListItem = undefined;
|
|
@@ -559,7 +559,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
559
559
|
}
|
|
560
560
|
this._configurationService.updateValue(this._currentProvider?.verbositySettingKey, false);
|
|
561
561
|
alert(( localize(
|
|
562
|
-
|
|
562
|
+
7038,
|
|
563
563
|
"{0} accessibility verbosity is now disabled",
|
|
564
564
|
this._currentProvider.verbositySettingKey
|
|
565
565
|
)));
|
|
@@ -654,16 +654,16 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
654
654
|
const hasActions = this._accessibleViewSupportsNavigation.get() || this._accessibleViewVerbosityEnabled.get() || this._accessibleViewGoToSymbolSupported.get() || provider.actions?.length;
|
|
655
655
|
if (verbose && !showAccessibleViewHelp && hasActions) {
|
|
656
656
|
actionsHint = provider.options.position ? ( localize(
|
|
657
|
-
|
|
657
|
+
7039,
|
|
658
658
|
"Explore actions such as disabling this hint (Shift+Tab), use Escape to exit this dialog."
|
|
659
|
-
)) : ( localize(
|
|
659
|
+
)) : ( localize(7040, "Explore actions such as disabling this hint (Shift+Tab)."));
|
|
660
660
|
}
|
|
661
|
-
let ariaLabel = provider.options.type === AccessibleViewType.Help ? ( localize(
|
|
661
|
+
let ariaLabel = provider.options.type === AccessibleViewType.Help ? ( localize(7041, "Accessibility Help")) : ( localize(7042, "Accessible View"));
|
|
662
662
|
this._title.textContent = ariaLabel;
|
|
663
663
|
if (actionsHint && provider.options.type === AccessibleViewType.View) {
|
|
664
|
-
ariaLabel = ( localize(
|
|
664
|
+
ariaLabel = ( localize(7043, "Accessible View, {0}", actionsHint));
|
|
665
665
|
} else if (actionsHint) {
|
|
666
|
-
ariaLabel = ( localize(
|
|
666
|
+
ariaLabel = ( localize(7044, "Accessibility Help, {0}", actionsHint));
|
|
667
667
|
}
|
|
668
668
|
if (isWindows && widgetIsFocused) {
|
|
669
669
|
ariaLabel = "";
|
|
@@ -767,7 +767,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
767
767
|
return disposableStore;
|
|
768
768
|
}
|
|
769
769
|
_updateToolbar(providedActions, type) {
|
|
770
|
-
this._toolbar.setAriaLabel(type === AccessibleViewType.Help ? ( localize(
|
|
770
|
+
this._toolbar.setAriaLabel(type === AccessibleViewType.Help ? ( localize(7045, "Accessibility Help")) : ( localize(7046, "Accessible View")));
|
|
771
771
|
const toolbarMenu = this._menuService.createMenu(MenuId.AccessibleView, this._contextKeyService);
|
|
772
772
|
this._toolbarMenu.value = toolbarMenu;
|
|
773
773
|
const menuActions = getFlatActionBarActions(toolbarMenu.getActions({}));
|
|
@@ -864,9 +864,9 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
864
864
|
_accessibleViewHelpDialogContent(providerHasSymbols) {
|
|
865
865
|
const navigationHint = this._navigationHint();
|
|
866
866
|
const goToSymbolHint = this._goToSymbolHint(providerHasSymbols);
|
|
867
|
-
const toolbarHint = ( localize(
|
|
867
|
+
const toolbarHint = ( localize(7047, "Navigate to the toolbar (Shift+Tab)."));
|
|
868
868
|
const chatHints = this._getChatHints();
|
|
869
|
-
let hint = ( localize(
|
|
869
|
+
let hint = ( localize(7048, "In the accessible view, you can:\n"));
|
|
870
870
|
if (navigationHint) {
|
|
871
871
|
hint += " - " + navigationHint + "\n";
|
|
872
872
|
}
|
|
@@ -886,22 +886,22 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
886
886
|
return;
|
|
887
887
|
}
|
|
888
888
|
return [( localize(
|
|
889
|
-
|
|
889
|
+
7049,
|
|
890
890
|
" - Insert the code block at the cursor{0}.",
|
|
891
891
|
"<keybinding:workbench.action.chat.insertCodeBlock>"
|
|
892
892
|
)), ( localize(
|
|
893
|
-
|
|
893
|
+
7050,
|
|
894
894
|
" - Insert the code block into a new file{0}.",
|
|
895
895
|
"<keybinding:workbench.action.chat.insertIntoNewFile>"
|
|
896
896
|
)), ( localize(
|
|
897
|
-
|
|
897
|
+
7051,
|
|
898
898
|
" - Run the code block in the terminal{0}.\n",
|
|
899
899
|
"<keybinding:workbench.action.chat.runInTerminal>"
|
|
900
900
|
))].join("\n");
|
|
901
901
|
}
|
|
902
902
|
_navigationHint() {
|
|
903
903
|
return localize(
|
|
904
|
-
|
|
904
|
+
7052,
|
|
905
905
|
"Show the next item{0} or previous item{1}.",
|
|
906
906
|
`<keybinding:${AccessibilityCommandId.ShowNext}>`,
|
|
907
907
|
`<keybinding:${AccessibilityCommandId.ShowPrevious}>`
|
|
@@ -910,7 +910,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
910
910
|
_disableVerbosityHint(provider) {
|
|
911
911
|
if (provider.options.type === AccessibleViewType.Help && this._verbosityEnabled()) {
|
|
912
912
|
return localize(
|
|
913
|
-
|
|
913
|
+
7053,
|
|
914
914
|
"\nDisable accessibility verbosity for this feature{0}.",
|
|
915
915
|
`<keybinding:${AccessibilityCommandId.DisableVerbosityHint}>`
|
|
916
916
|
);
|
|
@@ -922,7 +922,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
922
922
|
return;
|
|
923
923
|
}
|
|
924
924
|
return localize(
|
|
925
|
-
|
|
925
|
+
7054,
|
|
926
926
|
"Go to a symbol{0}.",
|
|
927
927
|
`<keybinding:${AccessibilityCommandId.GoToSymbol}>`
|
|
928
928
|
);
|
|
@@ -931,7 +931,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
931
931
|
const configureKb = this._keybindingService.lookupKeybinding(AccessibilityCommandId.AccessibilityHelpConfigureKeybindings)?.getAriaLabel();
|
|
932
932
|
const keybindingToConfigureQuickPick = configureKb ? "(" + configureKb + ")" : "by assigning a keybinding to the command Accessibility Help Configure Unassigned Keybindings.";
|
|
933
933
|
return localize(
|
|
934
|
-
|
|
934
|
+
7055,
|
|
935
935
|
"\nConfigure keybindings for commands that lack them {0}.",
|
|
936
936
|
keybindingToConfigureQuickPick
|
|
937
937
|
);
|
|
@@ -940,7 +940,7 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
940
940
|
const configureKb = this._keybindingService.lookupKeybinding(AccessibilityCommandId.AccessibilityHelpConfigureAssignedKeybindings)?.getAriaLabel();
|
|
941
941
|
const keybindingToConfigureQuickPick = configureKb ? "(" + configureKb + ")" : "by assigning a keybinding to the command Accessibility Help Configure Assigned Keybindings.";
|
|
942
942
|
return localize(
|
|
943
|
-
|
|
943
|
+
7056,
|
|
944
944
|
"\nConfigure keybindings for commands that already have assignments {0}.",
|
|
945
945
|
keybindingToConfigureQuickPick
|
|
946
946
|
);
|
|
@@ -959,11 +959,11 @@ let AccessibleView = class AccessibleView extends Disposable {
|
|
|
959
959
|
return screenReaderModeHint;
|
|
960
960
|
}
|
|
961
961
|
_exitDialogHint(provider) {
|
|
962
|
-
return this._verbosityEnabled() && !provider.options.position ? ( localize(
|
|
962
|
+
return this._verbosityEnabled() && !provider.options.position ? ( localize(7057, "\nExit this dialog (Escape).")) : "";
|
|
963
963
|
}
|
|
964
964
|
_readMoreHint(provider) {
|
|
965
965
|
return provider.options.readMoreUrl ? ( localize(
|
|
966
|
-
|
|
966
|
+
7058,
|
|
967
967
|
"\nOpen a browser window with more information related to accessibility{0}.",
|
|
968
968
|
`<keybinding:${AccessibilityCommandId.AccessibilityHelpOpenHelpLink}>`
|
|
969
969
|
)) : "";
|
|
@@ -1008,10 +1008,10 @@ let AccessibleViewService = class AccessibleViewService extends Disposable {
|
|
|
1008
1008
|
const keybinding = this._keybindingService.lookupKeybinding(AccessibilityCommandId.OpenAccessibleView)?.getAriaLabel();
|
|
1009
1009
|
let hint = null;
|
|
1010
1010
|
if (keybinding) {
|
|
1011
|
-
hint = ( localize(
|
|
1011
|
+
hint = ( localize(7059, "Inspect this in the accessible view with {0}", keybinding));
|
|
1012
1012
|
} else {
|
|
1013
1013
|
hint = ( localize(
|
|
1014
|
-
|
|
1014
|
+
7060,
|
|
1015
1015
|
"Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding."
|
|
1016
1016
|
));
|
|
1017
1017
|
}
|
|
@@ -1049,8 +1049,8 @@ let AccessibleViewSymbolQuickPick = class AccessibleViewSymbolQuickPick {
|
|
|
1049
1049
|
show(provider) {
|
|
1050
1050
|
const disposables = ( new DisposableStore());
|
|
1051
1051
|
const quickPick = disposables.add(this._quickInputService.createQuickPick());
|
|
1052
|
-
quickPick.placeholder = ( localize(
|
|
1053
|
-
quickPick.title = ( localize(
|
|
1052
|
+
quickPick.placeholder = ( localize(7061, "Type to search symbols"));
|
|
1053
|
+
quickPick.title = ( localize(7062, "Go to Symbol Accessible View"));
|
|
1054
1054
|
const picks = [];
|
|
1055
1055
|
const symbols = this._accessibleView.getSymbols();
|
|
1056
1056
|
if (!symbols) {
|
|
@@ -18,11 +18,11 @@ class ShowSignalSoundHelp extends Action2 {
|
|
|
18
18
|
constructor() {
|
|
19
19
|
super({
|
|
20
20
|
id: ShowSignalSoundHelp.ID,
|
|
21
|
-
title: ( localize2(
|
|
21
|
+
title: ( localize2(7075, "Help: List Signal Sounds")),
|
|
22
22
|
f1: true,
|
|
23
23
|
metadata: {
|
|
24
24
|
description: ( localize(
|
|
25
|
-
|
|
25
|
+
7076,
|
|
26
26
|
"List all accessibility sounds, noises, or audio cues and configure their settings"
|
|
27
27
|
))
|
|
28
28
|
}
|
|
@@ -35,15 +35,15 @@ class ShowSignalSoundHelp extends Action2 {
|
|
|
35
35
|
const accessibilityService = accessor.get(IAccessibilityService);
|
|
36
36
|
const preferencesService = accessor.get(IPreferencesService);
|
|
37
37
|
const userGestureSignals = [AccessibilitySignal.save, AccessibilitySignal.format];
|
|
38
|
-
const items =
|
|
38
|
+
const items = AccessibilitySignal.allAccessibilitySignals.map((signal, idx) => ({
|
|
39
39
|
label: userGestureSignals.includes(signal) ? `${signal.name} (${configurationService.getValue(signal.settingsKey + ".sound")})` : signal.name,
|
|
40
40
|
signal,
|
|
41
41
|
buttons: userGestureSignals.includes(signal) ? [{
|
|
42
42
|
iconClass: ThemeIcon.asClassName(Codicon.settingsGear),
|
|
43
|
-
tooltip: ( localize(
|
|
43
|
+
tooltip: ( localize(7077, "Configure Sound")),
|
|
44
44
|
alwaysVisible: true
|
|
45
45
|
}] : []
|
|
46
|
-
}))
|
|
46
|
+
})).sort((a, b) => a.label.localeCompare(b.label));
|
|
47
47
|
const disposables = ( new DisposableStore());
|
|
48
48
|
const qp = disposables.add(quickInputService.createQuickPick());
|
|
49
49
|
qp.items = items;
|
|
@@ -51,8 +51,8 @@ class ShowSignalSoundHelp extends Action2 {
|
|
|
51
51
|
i => accessibilitySignalService.isSoundEnabled(i.signal) || userGestureSignals.includes(i.signal) && configurationService.getValue(i.signal.settingsKey + ".sound") !== "never"
|
|
52
52
|
);
|
|
53
53
|
disposables.add(qp.onDidAccept(() => {
|
|
54
|
-
const enabledSounds =
|
|
55
|
-
const disabledSounds =
|
|
54
|
+
const enabledSounds = qp.selectedItems.map(i => i.signal);
|
|
55
|
+
const disabledSounds = qp.items.map(i => i.signal).filter(i => !enabledSounds.includes(i));
|
|
56
56
|
for (const signal of enabledSounds) {
|
|
57
57
|
let {
|
|
58
58
|
sound,
|
|
@@ -103,7 +103,7 @@ class ShowSignalSoundHelp extends Action2 {
|
|
|
103
103
|
);
|
|
104
104
|
}));
|
|
105
105
|
disposables.add(qp.onDidHide(() => disposables.dispose()));
|
|
106
|
-
qp.placeholder = ( localize(
|
|
106
|
+
qp.placeholder = ( localize(7078, "Select a sound to play and configure"));
|
|
107
107
|
qp.canSelectMany = true;
|
|
108
108
|
await qp.show();
|
|
109
109
|
}
|
|
@@ -118,11 +118,11 @@ class ShowAccessibilityAnnouncementHelp extends Action2 {
|
|
|
118
118
|
constructor() {
|
|
119
119
|
super({
|
|
120
120
|
id: ShowAccessibilityAnnouncementHelp.ID,
|
|
121
|
-
title: ( localize2(
|
|
121
|
+
title: ( localize2(7079, "Help: List Signal Announcements")),
|
|
122
122
|
f1: true,
|
|
123
123
|
metadata: {
|
|
124
124
|
description: ( localize(
|
|
125
|
-
|
|
125
|
+
7080,
|
|
126
126
|
"List all accessibility announcements, alerts, braille messages, and configure their settings"
|
|
127
127
|
))
|
|
128
128
|
}
|
|
@@ -135,15 +135,15 @@ class ShowAccessibilityAnnouncementHelp extends Action2 {
|
|
|
135
135
|
const accessibilityService = accessor.get(IAccessibilityService);
|
|
136
136
|
const preferencesService = accessor.get(IPreferencesService);
|
|
137
137
|
const userGestureSignals = [AccessibilitySignal.save, AccessibilitySignal.format];
|
|
138
|
-
const items =
|
|
138
|
+
const items = AccessibilitySignal.allAccessibilitySignals.filter(c => !!c.legacyAnnouncementSettingsKey).map((signal, idx) => ({
|
|
139
139
|
label: userGestureSignals.includes(signal) ? `${signal.name} (${configurationService.getValue(signal.settingsKey + ".announcement")})` : signal.name,
|
|
140
140
|
signal,
|
|
141
141
|
buttons: userGestureSignals.includes(signal) ? [{
|
|
142
142
|
iconClass: ThemeIcon.asClassName(Codicon.settingsGear),
|
|
143
|
-
tooltip: ( localize(
|
|
143
|
+
tooltip: ( localize(7081, "Configure Announcement")),
|
|
144
144
|
alwaysVisible: true
|
|
145
145
|
}] : []
|
|
146
|
-
}))
|
|
146
|
+
})).sort((a, b) => a.label.localeCompare(b.label));
|
|
147
147
|
const disposables = ( new DisposableStore());
|
|
148
148
|
const qp = disposables.add(quickInputService.createQuickPick());
|
|
149
149
|
qp.items = items;
|
|
@@ -156,7 +156,7 @@ class ShowAccessibilityAnnouncementHelp extends Action2 {
|
|
|
156
156
|
qp.hide();
|
|
157
157
|
return;
|
|
158
158
|
}
|
|
159
|
-
const enabledAnnouncements =
|
|
159
|
+
const enabledAnnouncements = qp.selectedItems.map(i => i.signal);
|
|
160
160
|
const disabledAnnouncements = AccessibilitySignal.allAccessibilitySignals.filter(
|
|
161
161
|
cue => !!cue.legacyAnnouncementSettingsKey && !enabledAnnouncements.includes(cue)
|
|
162
162
|
);
|
|
@@ -194,8 +194,8 @@ class ShowAccessibilityAnnouncementHelp extends Action2 {
|
|
|
194
194
|
});
|
|
195
195
|
}));
|
|
196
196
|
disposables.add(qp.onDidHide(() => disposables.dispose()));
|
|
197
|
-
qp.placeholder = screenReaderOptimized ? ( localize(
|
|
198
|
-
|
|
197
|
+
qp.placeholder = screenReaderOptimized ? ( localize(7082, "Select an announcement to configure")) : ( localize(
|
|
198
|
+
7083,
|
|
199
199
|
"Screen reader is not active, announcements are disabled by default."
|
|
200
200
|
));
|
|
201
201
|
qp.canSelectMany = true;
|
|
@@ -63,10 +63,10 @@ let EditorTextPropertySignalsContribution = class EditorTextPropertySignalsContr
|
|
|
63
63
|
let lastLine = -1;
|
|
64
64
|
const ignoredLineSignalsForCurrentLine = ( new Set());
|
|
65
65
|
const timeouts = store.add(( new DisposableStore()));
|
|
66
|
-
const propertySources =
|
|
66
|
+
const propertySources = this._textProperties.map(p => ({
|
|
67
67
|
source: p.createSource(editor, editorModel),
|
|
68
68
|
property: p
|
|
69
|
-
}))
|
|
69
|
+
}));
|
|
70
70
|
const didType = wasEventTriggeredRecently(editor.onDidChangeModelContent, 100, store);
|
|
71
71
|
store.add(editor.onDidChangeCursorPosition(args => {
|
|
72
72
|
timeouts.clear();
|
package/vscode/src/vs/workbench/contrib/accessibilitySignals/browser/openDiffEditorAnnouncement.js
CHANGED
|
@@ -41,7 +41,7 @@ let DiffEditorActiveAnnouncementContribution = class DiffEditorActiveAnnouncemen
|
|
|
41
41
|
}
|
|
42
42
|
this._onDidActiveEditorChangeListener = this._register(this._editorService.onDidActiveEditorChange(() => {
|
|
43
43
|
if (isDiffEditor(this._editorService.activeTextEditorControl)) {
|
|
44
|
-
this._accessibilityService.alert(( localize(
|
|
44
|
+
this._accessibilityService.alert(( localize(7084, "Diff editor")));
|
|
45
45
|
}
|
|
46
46
|
}));
|
|
47
47
|
}
|
|
@@ -17,15 +17,15 @@ import { CursorColumns } from '@codingame/monaco-vscode-api/vscode/vs/editor/com
|
|
|
17
17
|
import { EditorContextKeys } from '@codingame/monaco-vscode-api/vscode/vs/editor/common/editorContextKeys';
|
|
18
18
|
import { ContextKeyExpr } from '@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey';
|
|
19
19
|
|
|
20
|
-
registerCss(accessibility);
|
|
20
|
+
registerCss(accessibility, 1);
|
|
21
21
|
class ToggleScreenReaderMode extends Action2 {
|
|
22
22
|
constructor() {
|
|
23
23
|
super({
|
|
24
24
|
id: "editor.action.toggleScreenReaderAccessibilityMode",
|
|
25
|
-
title: ( localize2(
|
|
25
|
+
title: ( localize2(12975, "Toggle Screen Reader Accessibility Mode")),
|
|
26
26
|
metadata: {
|
|
27
27
|
description: ( localize2(
|
|
28
|
-
|
|
28
|
+
12976,
|
|
29
29
|
"Toggles an optimized mode for usage with screen readers, braille devices, and other assistive technologies."
|
|
30
30
|
))
|
|
31
31
|
},
|
|
@@ -62,11 +62,11 @@ class AnnounceCursorPosition extends Action2 {
|
|
|
62
62
|
constructor() {
|
|
63
63
|
super({
|
|
64
64
|
id: "editor.action.announceCursorPosition",
|
|
65
|
-
title: ( localize2(
|
|
65
|
+
title: ( localize2(12977, "Announce Cursor Position")),
|
|
66
66
|
f1: true,
|
|
67
67
|
metadata: {
|
|
68
68
|
description: ( localize2(
|
|
69
|
-
|
|
69
|
+
12978,
|
|
70
70
|
"Announce the current cursor position (line and column) via screen reader."
|
|
71
71
|
))
|
|
72
72
|
},
|
|
@@ -91,7 +91,7 @@ class AnnounceCursorPosition extends Action2 {
|
|
|
91
91
|
const tabSize = model.getOptions().tabSize;
|
|
92
92
|
const lineContent = model.getLineContent(position.lineNumber);
|
|
93
93
|
const visibleColumn = CursorColumns.visibleColumnFromColumn(lineContent, position.column, tabSize) + 1;
|
|
94
|
-
alert(( localize(
|
|
94
|
+
alert(( localize(12979, "Line {0}, Column {1}", position.lineNumber, visibleColumn)));
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
registerAction2(AnnounceCursorPosition);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
|
|
2
|
+
import { CommonFindController } from "@codingame/monaco-vscode-api/vscode/vs/editor/contrib/find/browser/findController";
|
|
3
|
+
import { AccessibleViewProviderId, AccessibleViewType, IAccessibleViewContentProvider, IAccessibleViewOptions } from "@codingame/monaco-vscode-api/vscode/vs/platform/accessibility/browser/accessibleView";
|
|
4
|
+
import { IAccessibleViewImplementation } from "@codingame/monaco-vscode-api/vscode/vs/platform/accessibility/browser/accessibleViewRegistry";
|
|
5
|
+
import { ServicesAccessor } from "@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation";
|
|
6
|
+
import { AccessibilityVerbositySettingId } from "@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration";
|
|
7
|
+
/**
|
|
8
|
+
* Accessible view implementation for Find and Replace help in the code editor.
|
|
9
|
+
* Provides comprehensive accessibility support for the Find dialog, including:
|
|
10
|
+
* - Search status information (current term, match count, position)
|
|
11
|
+
* - Navigation instructions for keyboard control
|
|
12
|
+
* - Focus behavior explanation
|
|
13
|
+
* - Available settings and options
|
|
14
|
+
* - Platform-specific guidance
|
|
15
|
+
*
|
|
16
|
+
* Activated via Alt+F1 when any element in the Find widget is focused.
|
|
17
|
+
*/
|
|
18
|
+
export declare class EditorFindAccessibilityHelp implements IAccessibleViewImplementation {
|
|
19
|
+
readonly priority = 105;
|
|
20
|
+
readonly name = "editor-find";
|
|
21
|
+
readonly when: import("@codingame/monaco-vscode-api/vscode/vs/platform/contextkey/common/contextkey").RawContextKey<boolean>;
|
|
22
|
+
readonly type = AccessibleViewType.Help;
|
|
23
|
+
/**
|
|
24
|
+
* Creates an accessible view content provider for the active code editor's Find/Replace dialog.
|
|
25
|
+
* @param accessor Service accessor for retrieving the code editor service
|
|
26
|
+
* @returns The provider instance, or undefined if no active editor or find controller is found
|
|
27
|
+
*/
|
|
28
|
+
getProvider(accessor: ServicesAccessor): EditorFindAccessibilityHelpProvider | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Content provider for the Find and Replace accessibility help.
|
|
32
|
+
* Generates localized, context-aware help information based on the current Find state.
|
|
33
|
+
*
|
|
34
|
+
* The implementation:
|
|
35
|
+
* - Adapts content based on whether Replace mode is active
|
|
36
|
+
* - Provides current search status (term, match count, position)
|
|
37
|
+
* - Explains focus behavior (how focus moves between Find input, Replace input, and editor)
|
|
38
|
+
* - Lists keyboard navigation shortcuts for different contexts
|
|
39
|
+
* - Documents available Find and Replace options
|
|
40
|
+
* - References relevant settings that affect Find behavior
|
|
41
|
+
* - Includes platform-specific guidance where applicable
|
|
42
|
+
*/
|
|
43
|
+
declare class EditorFindAccessibilityHelpProvider extends Disposable implements IAccessibleViewContentProvider {
|
|
44
|
+
private readonly _findController;
|
|
45
|
+
readonly id = AccessibleViewProviderId.EditorFindHelp;
|
|
46
|
+
readonly verbositySettingKey = AccessibilityVerbositySettingId.Find;
|
|
47
|
+
readonly options: IAccessibleViewOptions;
|
|
48
|
+
constructor(_findController: CommonFindController);
|
|
49
|
+
/**
|
|
50
|
+
* Returns focus to the last focused element in the Find widget when the accessibility help is closed.
|
|
51
|
+
* This handles focus restoration for any element (inputs, checkboxes, buttons) not just the text inputs.
|
|
52
|
+
*/
|
|
53
|
+
onClose(): void;
|
|
54
|
+
/**
|
|
55
|
+
* Generates the complete accessibility help content for Find and Replace.
|
|
56
|
+
* The content structure varies based on whether Replace mode is visible:
|
|
57
|
+
*
|
|
58
|
+
* Replace Mode Content:
|
|
59
|
+
* - Header identifying the dialog
|
|
60
|
+
* - Context explaining what the dialog does
|
|
61
|
+
* - Current search and replace status
|
|
62
|
+
* - Focus behavior explanation
|
|
63
|
+
* - Keyboard shortcuts for Find, Replace, and Editor contexts
|
|
64
|
+
* - Find and Replace options explanation
|
|
65
|
+
* - Configurable settings documentation
|
|
66
|
+
* - Platform-specific settings (macOS)
|
|
67
|
+
*
|
|
68
|
+
* Find-Only Mode Content:
|
|
69
|
+
* - Similar structure but without Replace-specific sections
|
|
70
|
+
*
|
|
71
|
+
* @returns The complete help text as a newline-joined string for audio announcement
|
|
72
|
+
*/
|
|
73
|
+
provideContent(): string;
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
|
|
2
|
+
import { Disposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
3
|
+
import { isMacintosh } from '@codingame/monaco-vscode-api/vscode/vs/base/common/platform';
|
|
4
|
+
import { ICodeEditorService } from '@codingame/monaco-vscode-api/vscode/vs/editor/browser/services/codeEditorService.service';
|
|
5
|
+
import { CommonFindController } from '@codingame/monaco-vscode-api/vscode/vs/editor/contrib/find/browser/findController';
|
|
6
|
+
import { CONTEXT_FIND_WIDGET_FOCUSED } from '@codingame/monaco-vscode-api/vscode/vs/editor/contrib/find/browser/findModel';
|
|
7
|
+
import { localize } from '@codingame/monaco-vscode-api/vscode/vs/nls';
|
|
8
|
+
import { AccessibleViewType, AccessibleViewProviderId } from '@codingame/monaco-vscode-api/vscode/vs/platform/accessibility/browser/accessibleView';
|
|
9
|
+
import { AccessibleViewRegistry } from '@codingame/monaco-vscode-api/vscode/vs/platform/accessibility/browser/accessibleViewRegistry';
|
|
10
|
+
import { AccessibilityVerbositySettingId } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/accessibility/browser/accessibilityConfiguration';
|
|
11
|
+
|
|
12
|
+
class EditorFindAccessibilityHelp {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.priority = 105;
|
|
15
|
+
this.name = "editor-find";
|
|
16
|
+
this.when = CONTEXT_FIND_WIDGET_FOCUSED;
|
|
17
|
+
this.type = AccessibleViewType.Help;
|
|
18
|
+
}
|
|
19
|
+
getProvider(accessor) {
|
|
20
|
+
const codeEditorService = accessor.get(ICodeEditorService);
|
|
21
|
+
const codeEditor = codeEditorService.getActiveCodeEditor() || codeEditorService.getFocusedCodeEditor();
|
|
22
|
+
if (!codeEditor) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const findController = CommonFindController.get(codeEditor);
|
|
26
|
+
if (!findController) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
return ( new EditorFindAccessibilityHelpProvider(findController));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
class EditorFindAccessibilityHelpProvider extends Disposable {
|
|
33
|
+
constructor(_findController) {
|
|
34
|
+
super();
|
|
35
|
+
this._findController = _findController;
|
|
36
|
+
this.id = AccessibleViewProviderId.EditorFindHelp;
|
|
37
|
+
this.verbositySettingKey = AccessibilityVerbositySettingId.Find;
|
|
38
|
+
this.options = {
|
|
39
|
+
type: AccessibleViewType.Help
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
onClose() {
|
|
43
|
+
this._findController.focusLastElement();
|
|
44
|
+
}
|
|
45
|
+
provideContent() {
|
|
46
|
+
const state = this._findController.getState();
|
|
47
|
+
const isReplaceVisible = state.isReplaceRevealed;
|
|
48
|
+
const searchString = state.searchString;
|
|
49
|
+
const matchCount = state.matchesCount;
|
|
50
|
+
const matchPosition = state.matchesPosition;
|
|
51
|
+
const content = [];
|
|
52
|
+
if (isReplaceVisible) {
|
|
53
|
+
content.push(( localize(12994, "Accessibility Help: Editor Find and Replace")));
|
|
54
|
+
content.push(( localize(
|
|
55
|
+
12995,
|
|
56
|
+
"You are in the Find and Replace dialog for the active editor. This dialog lets you locate text and replace it. The editor is a separate surface that shows each match and the surrounding context."
|
|
57
|
+
)));
|
|
58
|
+
content.push("");
|
|
59
|
+
content.push(( localize(12996, "Current Search Status:")));
|
|
60
|
+
if (searchString) {
|
|
61
|
+
content.push(( localize(12997, "You are searching for: \"{0}\".", searchString)));
|
|
62
|
+
if (matchCount !== undefined && matchPosition !== undefined) {
|
|
63
|
+
if (matchCount === 0) {
|
|
64
|
+
content.push(( localize(
|
|
65
|
+
12998,
|
|
66
|
+
"No matches found in the current file. Try adjusting your search text or the options below."
|
|
67
|
+
)));
|
|
68
|
+
} else {
|
|
69
|
+
content.push(( localize(12999, "Match {0} of {1}.", matchPosition, matchCount)));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
content.push(( localize(
|
|
74
|
+
13000,
|
|
75
|
+
"No search text entered yet. Start typing to find matches in the editor."
|
|
76
|
+
)));
|
|
77
|
+
}
|
|
78
|
+
const replaceString = state.replaceString;
|
|
79
|
+
if (replaceString) {
|
|
80
|
+
content.push(( localize(13001, "Replacement text: \"{0}\".", replaceString)));
|
|
81
|
+
} else {
|
|
82
|
+
content.push(( localize(
|
|
83
|
+
13002,
|
|
84
|
+
"No replacement text entered yet. Press Tab to move to the Replace input and type your replacement."
|
|
85
|
+
)));
|
|
86
|
+
}
|
|
87
|
+
content.push("");
|
|
88
|
+
content.push(( localize(13003, "Inside the Find and Replace Dialog (What It Does):")));
|
|
89
|
+
content.push(( localize(
|
|
90
|
+
13004,
|
|
91
|
+
"While you are in either input, your focus stays in that input. You can type, edit, or navigate matches without leaving. When you navigate to a match from the Find input, the editor updates in the background, but your focus remains in the dialog. Tab moves you from Find to Replace and back."
|
|
92
|
+
)));
|
|
93
|
+
content.push("");
|
|
94
|
+
content.push(( localize(13005, "What You Hear Each Time You Move to a Match:")));
|
|
95
|
+
content.push(( localize(13006, "Each navigation step gives you a complete spoken update:")));
|
|
96
|
+
content.push(( localize(
|
|
97
|
+
13007,
|
|
98
|
+
"1) The full line that contains the match is read first, so you get immediate context."
|
|
99
|
+
)));
|
|
100
|
+
content.push(( localize(
|
|
101
|
+
13008,
|
|
102
|
+
"2) Your position among the matches is announced, so you know how far you are through the results."
|
|
103
|
+
)));
|
|
104
|
+
content.push(( localize(
|
|
105
|
+
13009,
|
|
106
|
+
"3) The exact line and column are announced, so you know precisely where the match is in the file."
|
|
107
|
+
)));
|
|
108
|
+
content.push("");
|
|
109
|
+
content.push(( localize(13010, "Focus Behavior (Important):")));
|
|
110
|
+
content.push(( localize(
|
|
111
|
+
13011,
|
|
112
|
+
"When you navigate from inside the Find dialog, the editor updates while your focus stays in the input. This is intentional, so you can keep adjusting your search without losing your place."
|
|
113
|
+
)));
|
|
114
|
+
content.push(( localize(
|
|
115
|
+
13012,
|
|
116
|
+
"When you replace from the Replace input, the match is replaced and focus moves to the next match. If you have replaced all matches, the dialog remains open."
|
|
117
|
+
)));
|
|
118
|
+
content.push(( localize(
|
|
119
|
+
13013,
|
|
120
|
+
"If you want to move focus into the editor to edit text, press Escape to close the dialog. Focus returns to the editor at the last replacement location."
|
|
121
|
+
)));
|
|
122
|
+
content.push("");
|
|
123
|
+
content.push(( localize(13014, "Keyboard Navigation Summary:")));
|
|
124
|
+
content.push("");
|
|
125
|
+
content.push(( localize(13015, "While focused IN the Find input:")));
|
|
126
|
+
content.push(( localize(13016, "- Enter: Move to the next match while staying in Find.")));
|
|
127
|
+
content.push(( localize(13017, "- Shift+Enter: Move to the previous match while staying in Find.")));
|
|
128
|
+
content.push(( localize(13018, "- Tab: Move between Find and Replace inputs.")));
|
|
129
|
+
content.push("");
|
|
130
|
+
content.push(( localize(13019, "While focused IN the Replace input:")));
|
|
131
|
+
content.push(( localize(13020, "- Enter: Replace the current match and move to the next.")));
|
|
132
|
+
content.push(( localize(
|
|
133
|
+
13021,
|
|
134
|
+
"- {0}: Replace only the current match.",
|
|
135
|
+
"<keybinding:editor.action.replaceOne>"
|
|
136
|
+
)));
|
|
137
|
+
content.push(( localize(
|
|
138
|
+
13022,
|
|
139
|
+
"- {0}: Replace all matches at once.",
|
|
140
|
+
"<keybinding:editor.action.replaceAll>"
|
|
141
|
+
)));
|
|
142
|
+
content.push("");
|
|
143
|
+
content.push(( localize(13023, "While focused IN the editor (not the Find input):")));
|
|
144
|
+
content.push(( localize(
|
|
145
|
+
13024,
|
|
146
|
+
"- {0}: Move to the next match.",
|
|
147
|
+
"<keybinding:editor.action.nextMatchFindAction>"
|
|
148
|
+
)));
|
|
149
|
+
content.push(( localize(
|
|
150
|
+
13025,
|
|
151
|
+
"- {0}: Move to the previous match.",
|
|
152
|
+
"<keybinding:editor.action.previousMatchFindAction>"
|
|
153
|
+
)));
|
|
154
|
+
content.push("");
|
|
155
|
+
content.push(( localize(
|
|
156
|
+
13026,
|
|
157
|
+
"Note: Don't press Enter or Shift+Enter when focused in the editor - these will insert line breaks instead of navigating."
|
|
158
|
+
)));
|
|
159
|
+
content.push("");
|
|
160
|
+
content.push(( localize(13027, "Find and Replace Options in the Dialog:")));
|
|
161
|
+
content.push(( localize(13028, "- Match Case: Only exact case matches are included.")));
|
|
162
|
+
content.push(( localize(13029, "- Whole Word: Only full words are matched.")));
|
|
163
|
+
content.push(( localize(13030, "- Regular Expression: Use pattern matching for advanced searches.")));
|
|
164
|
+
content.push(( localize(13031, "- Find in Selection: Limit matches to the current selection.")));
|
|
165
|
+
content.push(( localize(
|
|
166
|
+
13032,
|
|
167
|
+
"- Preserve Case: When replacing, maintains the case of the original match."
|
|
168
|
+
)));
|
|
169
|
+
content.push("");
|
|
170
|
+
content.push(( localize(
|
|
171
|
+
13033,
|
|
172
|
+
"Settings You Can Adjust ({0} opens Settings):",
|
|
173
|
+
"<keybinding:workbench.action.openSettings>"
|
|
174
|
+
)));
|
|
175
|
+
content.push(( localize(
|
|
176
|
+
13034,
|
|
177
|
+
"These settings affect how Find and Replace behave or how matches are highlighted."
|
|
178
|
+
)));
|
|
179
|
+
content.push(( localize(
|
|
180
|
+
13035,
|
|
181
|
+
"- `accessibility.verbosity.find`: Controls whether the Find and Replace inputs announce the Accessibility Help hint."
|
|
182
|
+
)));
|
|
183
|
+
content.push(( localize(13036, "- `editor.find.findOnType`: Runs Find as you type.")));
|
|
184
|
+
content.push(( localize(
|
|
185
|
+
13037,
|
|
186
|
+
"- `editor.find.cursorMoveOnType`: Moves the cursor to the best match while you type."
|
|
187
|
+
)));
|
|
188
|
+
content.push(( localize(
|
|
189
|
+
13038,
|
|
190
|
+
"- `editor.find.seedSearchStringFromSelection`: Controls when selection text is used to seed Find."
|
|
191
|
+
)));
|
|
192
|
+
content.push(( localize(
|
|
193
|
+
13039,
|
|
194
|
+
"- `editor.find.autoFindInSelection`: Automatically enables Find in Selection based on selection type."
|
|
195
|
+
)));
|
|
196
|
+
content.push(( localize(
|
|
197
|
+
13040,
|
|
198
|
+
"- `editor.find.loop`: Wraps search at the beginning or end of the file."
|
|
199
|
+
)));
|
|
200
|
+
content.push(( localize(
|
|
201
|
+
13041,
|
|
202
|
+
"- `editor.find.addExtraSpaceOnTop`: Adds extra scroll space so matches are not hidden behind the Find and Replace dialog."
|
|
203
|
+
)));
|
|
204
|
+
content.push(( localize(
|
|
205
|
+
13042,
|
|
206
|
+
"- `editor.find.history`: Controls whether Find search history is stored."
|
|
207
|
+
)));
|
|
208
|
+
content.push(( localize(
|
|
209
|
+
13043,
|
|
210
|
+
"- `editor.find.replaceHistory`: Controls whether Replace history is stored."
|
|
211
|
+
)));
|
|
212
|
+
content.push(( localize(
|
|
213
|
+
13044,
|
|
214
|
+
"- `editor.occurrencesHighlight`: Highlights other occurrences of the current symbol."
|
|
215
|
+
)));
|
|
216
|
+
content.push(( localize(
|
|
217
|
+
13045,
|
|
218
|
+
"- `editor.occurrencesHighlightDelay`: Controls how soon occurrences are highlighted."
|
|
219
|
+
)));
|
|
220
|
+
content.push(( localize(
|
|
221
|
+
13046,
|
|
222
|
+
"- `editor.selectionHighlight`: Highlights other matches of the current selection."
|
|
223
|
+
)));
|
|
224
|
+
content.push(( localize(
|
|
225
|
+
13047,
|
|
226
|
+
"- `editor.selectionHighlightMaxLength`: Limits selection highlight length."
|
|
227
|
+
)));
|
|
228
|
+
content.push(( localize(
|
|
229
|
+
13048,
|
|
230
|
+
"- `editor.selectionHighlightMultiline`: Controls whether multi-line selections are highlighted."
|
|
231
|
+
)));
|
|
232
|
+
if (isMacintosh) {
|
|
233
|
+
content.push("");
|
|
234
|
+
content.push(( localize(13049, "Platform-Specific Setting (macOS only):")));
|
|
235
|
+
content.push(( localize(
|
|
236
|
+
13050,
|
|
237
|
+
"- `editor.find.globalFindClipboard`: Uses the shared macOS Find clipboard when available."
|
|
238
|
+
)));
|
|
239
|
+
}
|
|
240
|
+
content.push("");
|
|
241
|
+
content.push(( localize(13051, "Closing:")));
|
|
242
|
+
content.push(( localize(
|
|
243
|
+
13052,
|
|
244
|
+
"Press Escape to close Find and Replace. Focus returns to the editor at the last replacement location, and your search and replace history is preserved."
|
|
245
|
+
)));
|
|
246
|
+
} else {
|
|
247
|
+
content.push(( localize(13053, "Accessibility Help: Editor Find")));
|
|
248
|
+
content.push(( localize(
|
|
249
|
+
13054,
|
|
250
|
+
"You are in the Find dialog for the active editor. This dialog is where you type what you want to locate. The editor is a separate surface that shows each match and its surrounding context."
|
|
251
|
+
)));
|
|
252
|
+
content.push("");
|
|
253
|
+
content.push(( localize(13055, "Current Search Status:")));
|
|
254
|
+
if (searchString) {
|
|
255
|
+
content.push(( localize(13056, "You are searching for: \"{0}\".", searchString)));
|
|
256
|
+
if (matchCount !== undefined && matchPosition !== undefined) {
|
|
257
|
+
if (matchCount === 0) {
|
|
258
|
+
content.push(( localize(
|
|
259
|
+
13057,
|
|
260
|
+
"No matches found in the current file. Try adjusting your search text or the options below."
|
|
261
|
+
)));
|
|
262
|
+
} else {
|
|
263
|
+
content.push(( localize(13058, "Match {0} of {1}.", matchPosition, matchCount)));
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
} else {
|
|
267
|
+
content.push(( localize(
|
|
268
|
+
13059,
|
|
269
|
+
"No search text entered yet. Start typing to find matches in the editor."
|
|
270
|
+
)));
|
|
271
|
+
}
|
|
272
|
+
content.push("");
|
|
273
|
+
content.push(( localize(13060, "Inside the Find Dialog (What It Does):")));
|
|
274
|
+
content.push(( localize(
|
|
275
|
+
13061,
|
|
276
|
+
"While you are in the Find dialog, your focus stays in the input. You can keep typing, edit your search text, or move through matches without leaving the dialog. When you navigate to a match from here, the editor updates in the background, but your focus remains in the Find dialog."
|
|
277
|
+
)));
|
|
278
|
+
content.push("");
|
|
279
|
+
content.push(( localize(13062, "What You Hear Each Time You Move to a Match:")));
|
|
280
|
+
content.push(( localize(
|
|
281
|
+
13063,
|
|
282
|
+
"Each navigation step gives you a complete spoken update so you always know where you are. The order is consistent:"
|
|
283
|
+
)));
|
|
284
|
+
content.push(( localize(
|
|
285
|
+
13064,
|
|
286
|
+
"1) The full line that contains the match is read first, so you get immediate context."
|
|
287
|
+
)));
|
|
288
|
+
content.push(( localize(
|
|
289
|
+
13065,
|
|
290
|
+
"2) Your position among the matches is announced, so you know how far you are through the results."
|
|
291
|
+
)));
|
|
292
|
+
content.push(( localize(
|
|
293
|
+
13066,
|
|
294
|
+
"3) The exact line and column are announced, so you know precisely where the match is in the file."
|
|
295
|
+
)));
|
|
296
|
+
content.push(( localize(13067, "This sequence happens every time you move forward or backward.")));
|
|
297
|
+
content.push("");
|
|
298
|
+
content.push(( localize(13068, "Outside the Find Dialog (Inside the Editor):")));
|
|
299
|
+
content.push(( localize(
|
|
300
|
+
13069,
|
|
301
|
+
"When you are focused in the editor instead of the Find dialog, you can still navigate matches."
|
|
302
|
+
)));
|
|
303
|
+
content.push(( localize(
|
|
304
|
+
13070,
|
|
305
|
+
"- Press {0} to move to the next match.",
|
|
306
|
+
"<keybinding:editor.action.nextMatchFindAction>"
|
|
307
|
+
)));
|
|
308
|
+
content.push(( localize(
|
|
309
|
+
13071,
|
|
310
|
+
"- Press {0} to move to the previous match.",
|
|
311
|
+
"<keybinding:editor.action.previousMatchFindAction>"
|
|
312
|
+
)));
|
|
313
|
+
content.push(( localize(
|
|
314
|
+
13072,
|
|
315
|
+
"You hear the same three-step sequence: full line, match position, then line and column."
|
|
316
|
+
)));
|
|
317
|
+
content.push("");
|
|
318
|
+
content.push(( localize(13073, "Focus Behavior (Important):")));
|
|
319
|
+
content.push(( localize(
|
|
320
|
+
13074,
|
|
321
|
+
"When you navigate from inside the Find dialog, the editor updates while your focus stays in the input. This is intentional, so you can keep adjusting your search without losing your place."
|
|
322
|
+
)));
|
|
323
|
+
content.push(( localize(
|
|
324
|
+
13075,
|
|
325
|
+
"If you want to move focus into the editor to edit text or inspect surrounding code, press Escape to close Find. Focus returns to the editor at the most recent match."
|
|
326
|
+
)));
|
|
327
|
+
content.push("");
|
|
328
|
+
content.push(( localize(13076, "Keyboard Navigation Summary:")));
|
|
329
|
+
content.push("");
|
|
330
|
+
content.push(( localize(13077, "While focused IN the Find input:")));
|
|
331
|
+
content.push(( localize(13078, "- Enter: Move to the next match while staying in the Find dialog.")));
|
|
332
|
+
content.push(( localize(
|
|
333
|
+
13079,
|
|
334
|
+
"- Shift+Enter: Move to the previous match while staying in the Find dialog."
|
|
335
|
+
)));
|
|
336
|
+
content.push("");
|
|
337
|
+
content.push(( localize(13080, "While focused IN the editor (not the Find input):")));
|
|
338
|
+
content.push(( localize(
|
|
339
|
+
13081,
|
|
340
|
+
"- {0}: Move to the next match.",
|
|
341
|
+
"<keybinding:editor.action.nextMatchFindAction>"
|
|
342
|
+
)));
|
|
343
|
+
content.push(( localize(
|
|
344
|
+
13082,
|
|
345
|
+
"- {0}: Move to the previous match.",
|
|
346
|
+
"<keybinding:editor.action.previousMatchFindAction>"
|
|
347
|
+
)));
|
|
348
|
+
content.push("");
|
|
349
|
+
content.push(( localize(
|
|
350
|
+
13083,
|
|
351
|
+
"Note: Don't press Enter or Shift+Enter when focused in the editor - these will insert line breaks instead of navigating."
|
|
352
|
+
)));
|
|
353
|
+
content.push("");
|
|
354
|
+
content.push(( localize(13084, "Find Options in the Dialog:")));
|
|
355
|
+
content.push(( localize(13085, "- Match Case: Only exact case matches are included.")));
|
|
356
|
+
content.push(( localize(13086, "- Whole Word: Only full words are matched.")));
|
|
357
|
+
content.push(( localize(13087, "- Regular Expression: Use pattern matching for advanced searches.")));
|
|
358
|
+
content.push(( localize(13088, "- Find in Selection: Limit matches to the current selection.")));
|
|
359
|
+
content.push("");
|
|
360
|
+
content.push(( localize(
|
|
361
|
+
13089,
|
|
362
|
+
"Settings You Can Adjust ({0} opens Settings):",
|
|
363
|
+
"<keybinding:workbench.action.openSettings>"
|
|
364
|
+
)));
|
|
365
|
+
content.push(( localize(
|
|
366
|
+
13090,
|
|
367
|
+
"These settings affect how Find behaves or how matches are highlighted."
|
|
368
|
+
)));
|
|
369
|
+
content.push(( localize(
|
|
370
|
+
13091,
|
|
371
|
+
"- `accessibility.verbosity.find`: Controls whether the Find input announces the Accessibility Help hint."
|
|
372
|
+
)));
|
|
373
|
+
content.push(( localize(13092, "- `editor.find.findOnType`: Runs Find as you type.")));
|
|
374
|
+
content.push(( localize(
|
|
375
|
+
13093,
|
|
376
|
+
"- `editor.find.cursorMoveOnType`: Moves the cursor to the best match while you type."
|
|
377
|
+
)));
|
|
378
|
+
content.push(( localize(
|
|
379
|
+
13094,
|
|
380
|
+
"- `editor.find.seedSearchStringFromSelection`: Controls when selection text is used to seed Find."
|
|
381
|
+
)));
|
|
382
|
+
content.push(( localize(
|
|
383
|
+
13095,
|
|
384
|
+
"- `editor.find.autoFindInSelection`: Automatically enables Find in Selection based on selection type."
|
|
385
|
+
)));
|
|
386
|
+
content.push(( localize(
|
|
387
|
+
13096,
|
|
388
|
+
"- `editor.find.loop`: Wraps search at the beginning or end of the file."
|
|
389
|
+
)));
|
|
390
|
+
content.push(( localize(
|
|
391
|
+
13097,
|
|
392
|
+
"- `editor.find.closeOnResult`: Closes the Find dialog after an explicit find navigation command lands on a match."
|
|
393
|
+
)));
|
|
394
|
+
content.push(( localize(
|
|
395
|
+
13098,
|
|
396
|
+
"- `editor.find.addExtraSpaceOnTop`: Adds extra scroll space so matches are not hidden behind the Find dialog."
|
|
397
|
+
)));
|
|
398
|
+
content.push(( localize(
|
|
399
|
+
13099,
|
|
400
|
+
"- `editor.find.history`: Controls whether Find search history is stored."
|
|
401
|
+
)));
|
|
402
|
+
content.push(( localize(
|
|
403
|
+
13100,
|
|
404
|
+
"- `editor.occurrencesHighlight`: Highlights other occurrences of the current symbol."
|
|
405
|
+
)));
|
|
406
|
+
content.push(( localize(
|
|
407
|
+
13101,
|
|
408
|
+
"- `editor.occurrencesHighlightDelay`: Controls how soon occurrences are highlighted."
|
|
409
|
+
)));
|
|
410
|
+
content.push(( localize(
|
|
411
|
+
13102,
|
|
412
|
+
"- `editor.selectionHighlight`: Highlights other matches of the current selection."
|
|
413
|
+
)));
|
|
414
|
+
content.push(( localize(
|
|
415
|
+
13103,
|
|
416
|
+
"- `editor.selectionHighlightMaxLength`: Limits selection highlight length."
|
|
417
|
+
)));
|
|
418
|
+
content.push(( localize(
|
|
419
|
+
13104,
|
|
420
|
+
"- `editor.selectionHighlightMultiline`: Controls whether multi-line selections are highlighted."
|
|
421
|
+
)));
|
|
422
|
+
if (isMacintosh) {
|
|
423
|
+
content.push("");
|
|
424
|
+
content.push(( localize(13105, "Platform-Specific Setting (macOS only):")));
|
|
425
|
+
content.push(( localize(
|
|
426
|
+
13106,
|
|
427
|
+
"- `editor.find.globalFindClipboard`: Uses the shared macOS Find clipboard when available."
|
|
428
|
+
)));
|
|
429
|
+
}
|
|
430
|
+
content.push("");
|
|
431
|
+
content.push(( localize(13107, "Closing:")));
|
|
432
|
+
content.push(( localize(
|
|
433
|
+
13108,
|
|
434
|
+
"Press Escape to close Find. Focus returns to the editor at the most recent match, and your search history is preserved."
|
|
435
|
+
)));
|
|
436
|
+
}
|
|
437
|
+
return content.join("\n");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
AccessibleViewRegistry.register(( new EditorFindAccessibilityHelp()));
|
|
441
|
+
|
|
442
|
+
export { EditorFindAccessibilityHelp };
|