diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java index 0cfff68d3037..3c75c7de16b3 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java @@ -64,6 +64,8 @@ import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; import javax.swing.*; import java.awt.*; import java.awt.event.*; @@ -112,6 +114,7 @@ public class EditorTextField extends NonOpaquePanel implements EditorTextCompone private Disposable myDisposable; private Disposable myManualDisposable; private boolean myInHierarchy; + private @Nls String myAccessibleName; public EditorTextField() { this(""); @@ -731,6 +734,21 @@ public class EditorTextField extends NonOpaquePanel implements EditorTextCompone editor.setPlaceholder(myHintText); editor.setShowPlaceholderWhenFocused(myShowPlaceholderWhenFocused); + String accessibleName = myAccessibleName; + // Fallback to using the label as accessible name, similar to AccessibleJComponent.getAccessibleName. + if (accessibleName == null) { + Object label = getClientProperty("labeledBy"); + if (label instanceof Accessible a) { + AccessibleContext ac = a.getAccessibleContext(); + if (ac != null) { + accessibleName = ac.getAccessibleName(); + } + } + } + if (accessibleName != null) { + editor.getContentComponent().getAccessibleContext().setAccessibleName(accessibleName); + } + initOneLineMode(editor); if (myIsRendererWithSelection) { @@ -1174,4 +1192,27 @@ public class EditorTextField extends NonOpaquePanel implements EditorTextCompone return aContainer; } } + + @Override + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleJPanel() { + @Override + public String getAccessibleName() { + // Accessible name is not needed on the wrapper, only on the editor component itself. Otherwise, it may be read twice. + return null; + } + + @Override + public void setAccessibleName(@Nls String s) { + myAccessibleName = s; + EditorEx editor = getEditor(false); + if (editor != null) { + editor.getContentComponent().getAccessibleContext().setAccessibleName(s); + } + } + }; + } + return accessibleContext; + } }