From 1d5115759809fce1eb6daaf73f6fb8a31285578d Mon Sep 17 00:00:00 2001 From: Anton Tarasov Date: Thu, 17 Sep 2015 11:29:25 +0300 Subject: [PATCH] IDEA-145230 give an accessibility name to items of the list in the SearchEverywhere action popup --- .../ide/actions/SearchEverywhereAction.java | 21 ++++++++++++++- .../ide/util/PsiElementListCellRenderer.java | 26 +++++++++++++++++-- .../ExpandedItemListCellRendererWrapper.java | 2 +- .../ExpandedItemRendererComponentWrapper.java | 23 +++++++++++++++- .../src/com/intellij/ui/table/JBTable.java | 2 +- 5 files changed, 68 insertions(+), 6 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java index 15a5115fa59b..e42d2b8652e2 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/SearchEverywhereAction.java @@ -113,6 +113,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; import javax.swing.*; import javax.swing.event.DocumentEvent; import java.awt.*; @@ -1058,9 +1060,23 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA private String myLocationString; private Icon myLocationIcon; private Project myProject; - private JPanel myMainPanel = new JPanel(new BorderLayout()); + private MyAccessibleComponent myMainPanel = new MyAccessibleComponent(new BorderLayout()); private JLabel myTitle = new JLabel(); + private class MyAccessibleComponent extends JPanel { + private Accessible myAccessible; + public MyAccessibleComponent(LayoutManager layout) { + super(layout); + } + void setAccessible(Accessible comp) { + myAccessible = comp; + } + @Override + public AccessibleContext getAccessibleContext() { + return myAccessible != null ? myAccessible.getAccessibleContext() : super.getAccessibleContext(); + } + } + @Override public void clear() { super.clear(); @@ -1130,6 +1146,9 @@ public class SearchEverywhereAction extends AnAction implements CustomComponentA myMainPanel.add(createTitle(" " + title), BorderLayout.NORTH); } myMainPanel.add(cmp, BorderLayout.CENTER); + if (cmp instanceof Accessible) { + myMainPanel.setAccessible((Accessible)cmp); + } final int width = myMainPanel.getPreferredSize().width; if (width > myPopupActualWidth) { myPopupActualWidth = width; diff --git a/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java b/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java index 20a68e44ca93..73c10fd6b69d 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java +++ b/platform/lang-impl/src/com/intellij/ide/util/PsiElementListCellRenderer.java @@ -43,12 +43,16 @@ import com.intellij.util.ui.UIUtil; 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.util.Comparator; public abstract class PsiElementListCellRenderer extends JPanel implements ListCellRenderer, MatcherHolder { + private static final String LEFT = BorderLayout.WEST; + private Matcher myMatcher; private boolean myFocusBorderEnabled = true; protected int myRightComponentWidth; @@ -57,6 +61,25 @@ public abstract class PsiElementListCellRenderer extends J super(new BorderLayout()); } + private class MyAccessibleContext extends JPanel.AccessibleJPanel { + @Override + public String getAccessibleName() { + LayoutManager lm = PsiElementListCellRenderer.this.getLayout(); + assert lm instanceof BorderLayout; + Component leftCellRendererComp = ((BorderLayout)lm).getLayoutComponent(LEFT); + return leftCellRendererComp instanceof Accessible ? + leftCellRendererComp.getAccessibleContext().getAccessibleName() : super.getAccessibleName(); + } + } + + @Override + public AccessibleContext getAccessibleContext() { + if (accessibleContext == null) { + accessibleContext = new MyAccessibleContext(); + } + return accessibleContext; + } + @Override public void setPatternMatcher(final Matcher matcher) { myMatcher = matcher; @@ -153,7 +176,6 @@ public abstract class PsiElementListCellRenderer extends J } setBackground(selected ? UIUtil.getListSelectionBackground() : bgColor); } - } @Nullable @@ -191,7 +213,7 @@ public abstract class PsiElementListCellRenderer extends J ListCellRenderer leftRenderer = new LeftRenderer(null, myMatcher); final Component leftCellRendererComponent = leftRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - add(leftCellRendererComponent, BorderLayout.WEST); + add(leftCellRendererComponent, LEFT); final Color bg = isSelected ? UIUtil.getListSelectionBackground() : leftCellRendererComponent.getBackground(); setBackground(bg); if (rightCellRendererComponent != null) { diff --git a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java index bab221d90fef..ce32d367fc68 100644 --- a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java +++ b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java @@ -36,7 +36,7 @@ public class ExpandedItemListCellRendererWrapper implements ListCellRenderer { Component result = myWrappee.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (!myHandler.getExpandedItems().contains(index)) return result; Rectangle bounds = result.getBounds(); - ExpandedItemRendererComponentWrapper wrapper = new ExpandedItemRendererComponentWrapper(result); + ExpandedItemRendererComponentWrapper wrapper = ExpandedItemRendererComponentWrapper.wrap(result); if (UIUtil.getClientProperty(list, ExpandableItemsHandler.EXPANDED_RENDERER) == Boolean.TRUE) { JComponent res = ObjectUtils.tryCast(result, JComponent.class); if (res != null && UIUtil.getClientProperty(res, ExpandableItemsHandler.USE_RENDERER_BOUNDS) == Boolean.TRUE) { diff --git a/platform/platform-api/src/com/intellij/ui/ExpandedItemRendererComponentWrapper.java b/platform/platform-api/src/com/intellij/ui/ExpandedItemRendererComponentWrapper.java index eea201116350..b743d444157a 100644 --- a/platform/platform-api/src/com/intellij/ui/ExpandedItemRendererComponentWrapper.java +++ b/platform/platform-api/src/com/intellij/ui/ExpandedItemRendererComponentWrapper.java @@ -18,12 +18,14 @@ package com.intellij.ui; import com.intellij.util.ui.AbstractLayoutManager; import org.jetbrains.annotations.NotNull; +import javax.accessibility.Accessible; +import javax.accessibility.AccessibleContext; import javax.swing.*; import javax.swing.border.Border; import java.awt.*; public class ExpandedItemRendererComponentWrapper extends JComponent { - public ExpandedItemRendererComponentWrapper(@NotNull final Component rendererComponent) { + private ExpandedItemRendererComponentWrapper(@NotNull final Component rendererComponent) { add(rendererComponent); setOpaque(false); setLayout(new AbstractLayoutManager() { @@ -41,6 +43,25 @@ public class ExpandedItemRendererComponentWrapper extends JComponent { } }); } + private ExpandedItemRendererComponentWrapper() {} + + public static ExpandedItemRendererComponentWrapper wrap(@NotNull Component rendererComponent) { + if (rendererComponent instanceof Accessible) { + return new MyAccessibleComponent((Accessible)rendererComponent); + } + return new ExpandedItemRendererComponentWrapper(rendererComponent); + } + + private static class MyAccessibleComponent extends ExpandedItemRendererComponentWrapper implements Accessible { + private Accessible myAccessible; + MyAccessibleComponent(Accessible comp) { + myAccessible = comp; + } + @Override + public AccessibleContext getAccessibleContext() { + return myAccessible.getAccessibleContext(); + } + } @Override public void setBorder(Border border) { diff --git a/platform/platform-api/src/com/intellij/ui/table/JBTable.java b/platform/platform-api/src/com/intellij/ui/table/JBTable.java index a375375f1dae..762eef1dea8e 100644 --- a/platform/platform-api/src/com/intellij/ui/table/JBTable.java +++ b/platform/platform-api/src/com/intellij/ui/table/JBTable.java @@ -498,7 +498,7 @@ public class JBTable extends JTable implements ComponentWithEmptyText, Component } if (myExpandableItemsHandler.getExpandedItems().contains(new TableCell(row, column))) { - result = new ExpandedItemRendererComponentWrapper(result); + result = ExpandedItemRendererComponentWrapper.wrap(result); } return result; }