From 7d5c56282de3d5effa6aeb5e40464a410ca5cb36 Mon Sep 17 00:00:00 2001 From: Artem Semenov Date: Wed, 10 Jun 2020 16:51:12 +0300 Subject: [PATCH] In screen reader mode is not possible to select a JDK for a project: IDEA-236480 GitOrigin-RevId: 9d7634ad4398ea1ee24716ae597cd57059716e08 --- .../configuration/ProjectJdkConfigurable.java | 4 +- .../ui/configuration/SdkListPresenter.java | 44 ++++++++++++++++++- .../messages/ProjectBundle.properties | 1 + 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectJdkConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectJdkConfigurable.java index 7ac473fe98c9..6a2964bec3f1 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectJdkConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectJdkConfigurable.java @@ -98,7 +98,9 @@ public class ProjectJdkConfigurable implements UnnamedConfigurable { clearCaches(); } }); - myJdkPanel.add(new JLabel(JavaUiBundle.message("module.libraries.target.jdk.project.radio")), new GridBagConstraints(0, 0, 3, 1, 0, 0, NORTHWEST, NONE, JBUI.insetsBottom(4), 0, 0)); + JLabel myCbProjectJdkLabel = new JLabel(JavaUiBundle.message("module.libraries.target.jdk.project.radio")); + myCbProjectJdkLabel.setLabelFor(myCbProjectJdk); + myJdkPanel.add(myCbProjectJdkLabel, new GridBagConstraints(0, 0, 3, 1, 0, 0, NORTHWEST, NONE, JBUI.insetsBottom(4), 0, 0)); myJdkPanel.add(myCbProjectJdk, new GridBagConstraints(0, 1, 1, 1, 0, 1.0, NORTHWEST, NONE, JBUI.insetsLeft(4), 0, 0)); final JButton editButton = new JButton(ApplicationBundle.message("button.edit")); myCbProjectJdk.setEditButton(editButton, myProject, () -> myJdksModel.getProjectSdk()); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java index 9de1a823d971..154b40b3e125 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/SdkListPresenter.java @@ -18,9 +18,11 @@ import com.intellij.util.Function; import com.intellij.util.IconUtil; import com.intellij.util.Producer; import com.intellij.util.ui.EmptyIcon; +import com.intellij.util.ui.accessibility.AccessibleContextDelegate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.accessibility.AccessibleContext; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; @@ -62,6 +64,13 @@ public final class SdkListPresenter extends ColoredListCellRenderer SimpleColoredComponent component = (SimpleColoredComponent)super.getListCellRendererComponent(list, value, index, selected, hasFocus); JPanel panel = new JPanel(new BorderLayout()) { + private final AccessibleContext myContext = component.getAccessibleContext(); + + @Override + public AccessibleContext getAccessibleContext() { + return myContext; + } + @Override public void setBorder(Border border) { // we do not want to outer UI to add a border to that JPanel @@ -119,6 +128,7 @@ public final class SdkListPresenter extends ColoredListCellRenderer boolean hasFocus) { setIcon(EMPTY_ICON); // to fix vertical size + getAccessibleContext().setAccessibleName(null); if (value instanceof InvalidSdkItem) { InvalidSdkItem item = (InvalidSdkItem)value; final String str = ProjectBundle.message("jdk.combo.box.invalid.item", item.getSdkName()); @@ -203,8 +213,9 @@ public final class SdkListPresenter extends ColoredListCellRenderer SdkAppearanceService.getInstance() .forNullSdk(selected) .customize(this); + getAccessibleContext().setAccessibleName(ProjectBundle.message("jdk.combo.box.no.sdk.item.accessibility")); } - else if(value instanceof SdkReferenceItem) { + else if (value instanceof SdkReferenceItem) { SdkReferenceItem item = (SdkReferenceItem)value; SdkAppearanceService.getInstance() @@ -237,4 +248,35 @@ public final class SdkListPresenter extends ColoredListCellRenderer home = StringUtil.shortenTextWithEllipsis(home, maxLength, suffixLength); return home; } + + @Override + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new AccessibleSdkListPresenter(super.getAccessibleContext()); + } + return accessibleContext; + } + + static private class AccessibleSdkListPresenter extends AccessibleContextDelegate { + private String myAccessibleString = null; + + AccessibleSdkListPresenter(AccessibleContext context) { + super(context); + } + + @Override + protected Container getDelegateParent() { + return null; + } + + @Override + public String getAccessibleName() { + return myAccessibleString == null ? super.getDelegate().getAccessibleName() : myAccessibleString; + } + + @Override + public void setAccessibleName(String s) { + myAccessibleString = s; + } + } } diff --git a/platform/platform-api/resources/messages/ProjectBundle.properties b/platform/platform-api/resources/messages/ProjectBundle.properties index f4a44aab1e32..aeef9f97b8b9 100644 --- a/platform/platform-api/resources/messages/ProjectBundle.properties +++ b/platform/platform-api/resources/messages/ProjectBundle.properties @@ -107,6 +107,7 @@ jdk.combo.box.autodetected=Detected SDKs jdk.combo.box.search.of.sdks=Detecting SDKs... jdk.combo.box.project.item= jdk.combo.box.invalid.item={0} [Invalid] +jdk.combo.box.no.sdk.item.accessibility=No SDK progress.title.jdk.combo.box.resolving.jdk.home=Scanning JDK Home progress.text.jdk.combo.box.resolving.jdk.home=Refreshing {0}... module.libraries.javadoc.url.button=Specify Documentation &URL...