From 38cfe56e2fbc7d5ac0222cf5786013a33eb8e43c Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 16 May 2017 21:45:59 +0300 Subject: [PATCH 1/5] cleanup --- .../ui/InspectionResultsView.java | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java index 3ca05fd45a1e..26cdf7e09f74 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionResultsView.java @@ -129,6 +129,7 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren private EditorEx myPreviewEditor; private InspectionTreeLoadingProgressAware myLoadingProgressPreview; private final ExcludedInspectionTreeNodesManager myExcludedInspectionTreeNodesManager; + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") private final FactoryMap> mySuppressedNodes = new FactoryMap>() { @Override protected Set create(String key) { @@ -390,27 +391,7 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren DefaultActionGroup group = new DefaultActionGroup(); group.add(new RerunAction(this)); group.add(new CloseAction()); - final TreeExpander treeExpander = new TreeExpander() { - @Override - public void expandAll() { - TreeUtil.expandAll(myTree); - } - - @Override - public boolean canExpand() { - return true; - } - - @Override - public void collapseAll() { - TreeUtil.collapseAll(myTree, 0); - } - - @Override - public boolean canCollapse() { - return true; - } - }; + final TreeExpander treeExpander = new DefaultTreeExpander(myTree); group.add(actionsManager.createExpandAllAction(treeExpander, myTree)); group.add(actionsManager.createCollapseAllAction(treeExpander, myTree)); group.add(actionsManager.createPrevOccurenceAction(getOccurenceNavigator())); @@ -712,7 +693,7 @@ public class InspectionResultsView extends JPanel implements Disposable, Occuren } void addProblemDescriptors(InspectionToolWrapper wrapper, RefEntity refElement, CommonProblemDescriptor[] descriptors) { - myTreeUpdater.submit((Runnable)() -> ReadAction.run(() -> { + myTreeUpdater.submit(() -> ReadAction.run(() -> { if (!isDisposed()) { ApplicationManager.getApplication().assertReadAccessAllowed(); synchronized (myTreeStructureUpdateLock) { From 708cd93d0ec4b7468235ee702f3b7d84caba5789 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Tue, 16 May 2017 22:41:16 +0300 Subject: [PATCH 2/5] inspection view: use trove map to aggregate problem count --- .../codeInspection/ui/EntryPointsNode.java | 4 +- .../codeInspection/ui/InspectionTreeNode.java | 4 +- .../ui/InspectionTreeTailRenderer.java | 43 +++++++++---------- .../ui/ProblemDescriptionNode.java | 4 +- .../codeInspection/ui/RefElementNode.java | 4 +- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInspection/ui/EntryPointsNode.java b/java/java-impl/src/com/intellij/codeInspection/ui/EntryPointsNode.java index 7558f4f96808..1f3283f768ff 100644 --- a/java/java-impl/src/com/intellij/codeInspection/ui/EntryPointsNode.java +++ b/java/java-impl/src/com/intellij/codeInspection/ui/EntryPointsNode.java @@ -21,7 +21,7 @@ import com.intellij.codeInspection.ex.GlobalInspectionContextImpl; import com.intellij.codeInspection.ex.GlobalInspectionToolWrapper; import com.intellij.codeInspection.ex.InspectionToolWrapper; import com.intellij.icons.AllIcons; -import com.intellij.util.containers.FactoryMap; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,7 +53,7 @@ public class EntryPointsNode extends InspectionNode { } @Override - public void visitProblemSeverities(FactoryMap counter) { + public void visitProblemSeverities(TObjectIntHashMap counter) { //do nothing here } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeNode.java index de0c543a2cb5..135d867b3a81 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeNode.java @@ -20,8 +20,8 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeInspection.reference.RefEntity; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.vcs.FileStatus; -import com.intellij.util.containers.FactoryMap; import com.intellij.util.ui.tree.TreeUtil; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.Nullable; import javax.swing.*; @@ -44,7 +44,7 @@ public abstract class InspectionTreeNode extends DefaultMutableTreeNode { return null; } - public void visitProblemSeverities(FactoryMap counter) { + public void visitProblemSeverities(TObjectIntHashMap counter) { Enumeration enumeration = children(); while (enumeration.hasMoreElements()) { InspectionTreeNode child = (InspectionTreeNode)enumeration.nextElement(); diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeTailRenderer.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeTailRenderer.java index 51cb086b270d..8f3759a94668 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeTailRenderer.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/InspectionTreeTailRenderer.java @@ -24,14 +24,14 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.Gray; import com.intellij.ui.JBColor; import com.intellij.ui.SimpleTextAttributes; -import com.intellij.util.containers.FactoryMap; import com.intellij.util.containers.SoftHashMap; -import org.jetbrains.annotations.Nullable; +import gnu.trove.TObjectIntHashMap; import java.awt.*; +import java.util.Arrays; +import java.util.Comparator; import java.util.Locale; import java.util.Map; -import java.util.TreeMap; /** * @author Dmitry Batkovich @@ -45,26 +45,13 @@ public abstract class InspectionTreeTailRenderer { private final Map myPluralizedSeverityNames = new SoftHashMap<>(); private final Map myUnpluralizedSeverityNames = new SoftHashMap<>(); - private final FactoryMap myItemCounter; + private final TObjectIntHashMap myItemCounter = new TObjectIntHashMap<>(); private final SeverityRegistrar myRegistrar; private final GlobalInspectionContextImpl myContext; public InspectionTreeTailRenderer(GlobalInspectionContextImpl context) { myRegistrar = SeverityRegistrar.getSeverityRegistrar(context.getProject()); myContext = context; - myItemCounter = new FactoryMap() { - - @Nullable - @Override - protected Integer create(HighlightDisplayLevel key) { - return 0; - } - - @Override - protected Map createMap() { - return new TreeMap<>((o1, o2) -> -myRegistrar.compare(o1.getSeverity(), o2.getSeverity())); - } - }; } public void appendTailText(InspectionTreeNode node) { @@ -78,14 +65,16 @@ public abstract class InspectionTreeTailRenderer { myItemCounter.clear(); node.visitProblemSeverities(myItemCounter); if (myItemCounter.size() > MAX_LEVEL_TYPES) { - appendText(InspectionsBundle.message("inspection.problem.descriptor.count", - myItemCounter.values().stream().mapToInt(Integer::intValue).sum()) + " ", - SimpleTextAttributes.GRAYED_ATTRIBUTES); + appendText(InspectionsBundle.message("inspection.problem.descriptor.count", sum(myItemCounter.getValues()) + " ", + SimpleTextAttributes.GRAYED_ATTRIBUTES)); } else { - for (Map.Entry entry : myItemCounter.entrySet()) { - final HighlightDisplayLevel level = entry.getKey(); - final Integer occur = entry.getValue(); + Object[] levels = myItemCounter.keys(); + Arrays.sort(levels, Comparator.comparing(l -> ((HighlightDisplayLevel) l).getSeverity()).reversed()); + for (Object o : levels) { + HighlightDisplayLevel level = (HighlightDisplayLevel) o; + + int occur = myItemCounter.get(level); SimpleTextAttributes attrs = SimpleTextAttributes.GRAY_ATTRIBUTES; attrs = attrs.derive(-1, level == HighlightDisplayLevel.ERROR && !myContext.getUIOptions().GROUP_BY_SEVERITY @@ -121,4 +110,12 @@ public abstract class InspectionTreeTailRenderer { return name; } } + + private static int sum(int[] numbers) { + int result = 0; + for (int number : numbers) { + result += number; + } + return result; + } } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java index f3c6406f8a6d..0169513158d4 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/ProblemDescriptionNode.java @@ -28,8 +28,8 @@ import com.intellij.codeInspection.reference.RefEntity; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FileStatus; import com.intellij.psi.PsiElement; -import com.intellij.util.containers.FactoryMap; import com.intellij.xml.util.XmlStringUtil; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,7 +105,7 @@ public class ProblemDescriptionNode extends SuppressableInspectionTreeNode { } @Override - public void visitProblemSeverities(FactoryMap counter) { + public void visitProblemSeverities(TObjectIntHashMap counter) { if (!myPresentation.isProblemResolved(getElement(), myDescriptor)) { counter.put(myLevel, counter.get(myLevel) + 1); } diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ui/RefElementNode.java b/platform/lang-impl/src/com/intellij/codeInspection/ui/RefElementNode.java index bb92904bef59..b57514602395 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ui/RefElementNode.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ui/RefElementNode.java @@ -23,7 +23,7 @@ import com.intellij.codeInspection.reference.RefDirectory; import com.intellij.codeInspection.reference.RefElement; import com.intellij.codeInspection.reference.RefEntity; import com.intellij.openapi.vcs.FileStatus; -import com.intellij.util.containers.FactoryMap; +import gnu.trove.TObjectIntHashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -126,7 +126,7 @@ public class RefElementNode extends SuppressableInspectionTreeNode { } @Override - public void visitProblemSeverities(FactoryMap counter) { + public void visitProblemSeverities(TObjectIntHashMap counter) { if (isLeaf() && !myPresentation.isElementIgnored(getElement())) { counter.put(HighlightDisplayLevel.WARNING, counter.get(HighlightDisplayLevel.WARNING) + 1); return; From 27dee2f8d5cb66d7da9771c5f55abf125f6a96ca Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 16 May 2017 21:12:19 +0200 Subject: [PATCH 3/5] don't update LayeredLexerEditorHighlighter layers on each editor paint (IDEA-172756) --- .../editor/ex/util/LayeredLexerEditorHighlighter.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/platform/editor-ui-ex/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java b/platform/editor-ui-ex/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java index 8719c0735840..ecf2729bc1a8 100644 --- a/platform/editor-ui-ex/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java +++ b/platform/editor-ui-ex/src/com/intellij/openapi/editor/ex/util/LayeredLexerEditorHighlighter.java @@ -188,17 +188,8 @@ public class LayeredLexerEditorHighlighter extends LexerEditorHighlighter { @NotNull @Override public HighlighterIterator createIterator(int startOffset) { - // do NOT synchronize before updateLayers due to deadlock with PsiLock - final boolean changed = updateLayers(); - //noinspection SynchronizeOnThis synchronized (this) { - if (changed) { - Document document = getDocument(); - if (document != null) { - resetText(document.getImmutableCharSequence()); - } - } return new LayeredHighlighterIteratorImpl(startOffset); } } From a79d7060994d8d214d869b3d1da0b95620d0846f Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 16 May 2017 21:44:44 +0200 Subject: [PATCH 4/5] generify and cleanup a bit around ListSpeedSearch --- .../TurnRefsToSuperDialog.java | 2 +- .../editor/GutterIconsConfigurable.java | 4 +- .../AbstractNewProjectDialog.java | 4 +- .../src/com/intellij/ui/CheckBoxList.java | 20 +++++----- .../ExpandedItemListCellRendererWrapper.java | 8 ++-- .../com/intellij/ui/components/JBList.java | 28 ++++++++------ .../impl/welcomeScreen/FlatWelcomeFrame.java | 37 ++++++++----------- .../src/com/intellij/ui/ListSpeedSearch.java | 33 ++++++++++++----- .../src/com/intellij/ui/TreeUIHelperImpl.java | 3 +- .../plugin/ui/ExistingTemplatesComponent.java | 4 +- .../util/src/com/intellij/util/ui/UIUtil.java | 5 ++- 11 files changed, 79 insertions(+), 69 deletions(-) diff --git a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperDialog.java b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperDialog.java index 95712d769d51..9a7d30f70343 100644 --- a/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperDialog.java +++ b/java/java-impl/src/com/intellij/refactoring/turnRefsToSuper/TurnRefsToSuperDialog.java @@ -80,7 +80,7 @@ public class TurnRefsToSuperDialog extends RefactoringDialog { final JLabel classListLabel = new JLabel(); panel.add(classListLabel, BorderLayout.NORTH); - mySuperClassesList = new JBList<>(mySuperClasses.toArray()); + mySuperClassesList = new JBList<>(mySuperClasses); mySuperClassesList.setCellRenderer(new ClassCellRenderer(mySuperClassesList.getCellRenderer())); mySuperClassesList.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); classListLabel.setText(RefactoringBundle.message("turnRefsToSuper.change.usages.to", mySubClass.getQualifiedName())); diff --git a/platform/lang-impl/src/com/intellij/application/options/editor/GutterIconsConfigurable.java b/platform/lang-impl/src/com/intellij/application/options/editor/GutterIconsConfigurable.java index 3c5abb0f0b4d..da9865e71b74 100644 --- a/platform/lang-impl/src/com/intellij/application/options/editor/GutterIconsConfigurable.java +++ b/platform/lang-impl/src/com/intellij/application/options/editor/GutterIconsConfigurable.java @@ -33,10 +33,10 @@ import com.intellij.ui.ListSpeedSearch; import com.intellij.ui.SeparatorWithText; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.speedSearch.SpeedSearchSupply; +import com.intellij.util.Function; import com.intellij.util.NullableFunction; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.Convertor; import com.intellij.util.containers.MultiMap; import com.intellij.util.containers.hash.HashSet; import com.intellij.util.ui.EmptyIcon; @@ -221,7 +221,7 @@ public class GutterIconsConfigurable implements SearchableConfigurable, Configur }; myList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); myList.setBorder(BorderFactory.createEmptyBorder()); - new ListSpeedSearch(myList, (Convertor)o -> o instanceof JCheckBox ? ((JCheckBox)o).getText() : null); + new ListSpeedSearch<>(myList, (Function)JCheckBox::getText); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectDialog.java b/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectDialog.java index 05a3c6a7fc03..3387311ca661 100644 --- a/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectDialog.java +++ b/platform/lang-impl/src/com/intellij/ide/util/projectWizard/AbstractNewProjectDialog.java @@ -41,7 +41,7 @@ import java.awt.event.KeyEvent; * @author Dennis.Ushakov */ public abstract class AbstractNewProjectDialog extends DialogWrapper { - private Pair myPair; + private Pair> myPair; public AbstractNewProjectDialog() { super(ProjectManager.getInstance().getDefaultProject()); @@ -68,7 +68,7 @@ public abstract class AbstractNewProjectDialog extends DialogWrapper { DefaultActionGroup root = createRootStep(); Disposer.register(getDisposable(), () -> root.removeAll()); - Pair pair = FlatWelcomeFrame.createActionGroupPanel(root, getRootPane(), null, getDisposable()); + Pair> pair = FlatWelcomeFrame.createActionGroupPanel(root, getRootPane(), null, getDisposable()); JPanel component = pair.first; new AnAction() { @Override diff --git a/platform/platform-api/src/com/intellij/ui/CheckBoxList.java b/platform/platform-api/src/com/intellij/ui/CheckBoxList.java index 03298b1968a0..fdbf91e0feb2 100644 --- a/platform/platform-api/src/com/intellij/ui/CheckBoxList.java +++ b/platform/platform-api/src/com/intellij/ui/CheckBoxList.java @@ -40,16 +40,16 @@ import java.util.Map; /** * @author oleg */ -public class CheckBoxList extends JBList { +public class CheckBoxList extends JBList { private final CellRenderer myCellRenderer; private CheckBoxListListener checkBoxListListener; private final BidirectionalMap myItemMap = new BidirectionalMap<>(); public CheckBoxList(final CheckBoxListListener checkBoxListListener) { - this(new DefaultListModel(), checkBoxListListener); + this(new DefaultListModel<>(), checkBoxListListener); } - public CheckBoxList(final DefaultListModel dataModel, final CheckBoxListListener checkBoxListListener) { + public CheckBoxList(DefaultListModel dataModel, CheckBoxListListener checkBoxListListener) { this(dataModel); setCheckBoxListListener(checkBoxListListener); } @@ -189,7 +189,7 @@ public class CheckBoxList extends JBList { @NotNull private JCheckBox getCheckBoxAt(int index) { - return (JCheckBox)getModel().getElementAt(index); + return getModel().getElementAt(index); } public void setStringItems(final Map items) { @@ -220,7 +220,7 @@ public class CheckBoxList extends JBList { JCheckBox checkBox = myItemMap.remove(oldItem); myItemMap.put(newItem, checkBox); checkBox.setText(newText); - DefaultListModel model = (DefaultListModel)getModel(); + DefaultListModel model = (DefaultListModel)getModel(); int ind = model.indexOf(checkBox); if (ind >= 0) { model.set(ind, checkBox); // to fire contentsChanged event @@ -229,7 +229,7 @@ public class CheckBoxList extends JBList { @Nullable public T getItemAt(int index) { - JCheckBox checkBox = (JCheckBox)getModel().getElementAt(index); + JCheckBox checkBox = getModel().getElementAt(index); List value = myItemMap.getKeysByValue(checkBox); return value == null || value.isEmpty() ? null : value.get(0); } @@ -240,7 +240,7 @@ public class CheckBoxList extends JBList { } public boolean isItemSelected(int index) { - return ((JCheckBox)getModel().getElementAt(index)).isSelected(); + return getModel().getElementAt(index).isSelected(); } public boolean isItemSelected(T item) { @@ -283,7 +283,7 @@ public class CheckBoxList extends JBList { return rootComponent; } - private class CellRenderer implements ListCellRenderer { + private class CellRenderer implements ListCellRenderer { private final Border mySelectedBorder; private final Border myBorder; private final Insets myBorderInsets; @@ -295,9 +295,7 @@ public class CheckBoxList extends JBList { } @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - JCheckBox checkbox = (JCheckBox)value; - + public Component getListCellRendererComponent(JList list, JCheckBox checkbox, int index, boolean isSelected, boolean cellHasFocus) { Color textColor = getForeground(isSelected); Color backgroundColor = getBackground(isSelected); Font font = getFont(); diff --git a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java index f9661958a26e..2c97b499dc07 100644 --- a/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java +++ b/platform/platform-api/src/com/intellij/ui/ExpandedItemListCellRendererWrapper.java @@ -23,17 +23,17 @@ import org.jetbrains.annotations.NotNull; import javax.swing.*; import java.awt.*; -public class ExpandedItemListCellRendererWrapper implements ListCellRenderer { - @NotNull private final ListCellRenderer myWrappee; +public class ExpandedItemListCellRendererWrapper implements ListCellRenderer { + @NotNull private final ListCellRenderer myWrappee; @NotNull private final ExpandableItemsHandler myHandler; - public ExpandedItemListCellRendererWrapper(@NotNull ListCellRenderer wrappee, @NotNull ExpandableItemsHandler handler) { + public ExpandedItemListCellRendererWrapper(@NotNull ListCellRenderer wrappee, @NotNull ExpandableItemsHandler handler) { myWrappee = wrappee; myHandler = handler; } @Override - public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + public Component getListCellRendererComponent(JList list, T value, int index, boolean isSelected, boolean cellHasFocus) { GraphicsUtil.setAntialiasingType(list, AntialiasingType.getAAHintForSwingComponent()); Component result = myWrappee.getListCellRendererComponent(list, UIUtil.htmlInjectionGuard(value), index, isSelected, cellHasFocus); if (!myHandler.getExpandedItems().contains(index)) return result; diff --git a/platform/platform-api/src/com/intellij/ui/components/JBList.java b/platform/platform-api/src/com/intellij/ui/components/JBList.java index b01de23bb4e9..05335527a452 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBList.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBList.java @@ -22,7 +22,6 @@ import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.*; -import com.intellij.util.ArrayUtil; import com.intellij.util.NotNullFunction; import com.intellij.util.ui.*; import org.jetbrains.annotations.NotNull; @@ -40,6 +39,7 @@ import java.awt.*; import java.awt.datatransfer.StringSelection; import java.awt.event.ActionEvent; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; /** @@ -47,38 +47,42 @@ import java.util.Collection; * @author Konstantin Bulenkov */ public class JBList extends JList implements ComponentWithEmptyText, ComponentWithExpandableItems{ - @NotNull private StatusText myEmptyText; - @NotNull private ExpandableItemsHandler myExpandableItemsHandler; + private StatusText myEmptyText; + private ExpandableItemsHandler myExpandableItemsHandler; @Nullable private AsyncProcessIcon myBusyIcon; private boolean myBusy; - public JBList() { init(); } - public JBList(@NotNull ListModel dataModel) { + public JBList(@NotNull ListModel dataModel) { super(dataModel); init(); } - public JBList(@NotNull Object... listData) { + public JBList(@NotNull E... listData) { super(createDefaultListModel(listData)); init(); } @NotNull - public static DefaultListModel createDefaultListModel(@NotNull Object... items) { - final DefaultListModel model = new DefaultListModel(); - for (Object item : items) { + public static DefaultListModel createDefaultListModel(@NotNull T... items) { + return createDefaultListModel(Arrays.asList(items)); + } + + @NotNull + public static DefaultListModel createDefaultListModel(@NotNull Iterable items) { + DefaultListModel model = new DefaultListModel<>(); + for (T item : items) { model.add(model.getSize(), item); } return model; } public JBList(@NotNull Collection items) { - this(ArrayUtil.toObjectArray(items)); + this(createDefaultListModel(items)); } @Override @@ -297,7 +301,7 @@ public class JBList extends JList implements ComponentWithEmptyText, Compo super.setCellRenderer(cellRenderer); return; } - super.setCellRenderer(new ExpandedItemListCellRendererWrapper(cellRenderer, myExpandableItemsHandler)); + super.setCellRenderer(new ExpandedItemListCellRendererWrapper<>(cellRenderer, myExpandableItemsHandler)); } public void installCellRenderer(@NotNull final NotNullFunction fun) { @@ -378,7 +382,7 @@ public class JBList extends JList implements ComponentWithEmptyText, Compo } protected class AccessibleJBListChild extends AccessibleJListChild { - public AccessibleJBListChild(JBList parent, int indexInParent) { + public AccessibleJBListChild(JBList parent, int indexInParent) { super(parent, indexInParent); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/FlatWelcomeFrame.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/FlatWelcomeFrame.java index a0a48ae14b42..d51d80c2535b 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/FlatWelcomeFrame.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/welcomeScreen/FlatWelcomeFrame.java @@ -50,9 +50,8 @@ import com.intellij.ui.components.labels.ActionLink; import com.intellij.ui.components.panels.NonOpaquePanel; import com.intellij.ui.popup.PopupFactoryImpl; import com.intellij.ui.popup.list.GroupedItemsListRenderer; -import com.intellij.util.ArrayUtil; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.Convertor; import com.intellij.util.ui.EmptyIcon; import com.intellij.util.ui.JBUI; import com.intellij.util.ui.MouseEventAdapter; @@ -204,8 +203,8 @@ public class FlatWelcomeFrame extends JFrame implements IdeFrame, Disposable, Ac return "Welcome to " + ApplicationNamesInfo.getInstance().getFullProductName(); } - @Nullable - public static JComponent getPreferredFocusedComponent(@NotNull Pair pair) { + @NotNull + public static JComponent getPreferredFocusedComponent(@NotNull Pair> pair) { if (pair.second.getModel().getSize() == 1) { JBTextField textField = UIUtil.uiTraverser(pair.first).filter(JBTextField.class).first(); if (textField != null) { @@ -476,10 +475,10 @@ public class FlatWelcomeFrame extends JFrame implements IdeFrame, Disposable, Ac private AnAction wrapGroups(AnAction action) { if (action instanceof ActionGroup && ((ActionGroup)action).isPopup()) { - final Pair panel = createActionGroupPanel((ActionGroup)action, mySlidingPanel, () -> goBack(), this); + final Pair> panel = createActionGroupPanel((ActionGroup)action, mySlidingPanel, () -> goBack(), this); final Runnable onDone = () -> { setTitle("New Project"); - final JBList list = panel.second; + final JBList list = panel.second; ScrollingUtil.ensureSelectionExists(list); final ListSelectionListener[] listeners = ((DefaultListSelectionModel)list.getSelectionModel()).getListeners(ListSelectionListener.class); @@ -489,9 +488,7 @@ public class FlatWelcomeFrame extends JFrame implements IdeFrame, Disposable, Ac listener.valueChanged(new ListSelectionEvent(list, list.getSelectedIndex(), list.getSelectedIndex(), true)); } JComponent toFocus = getPreferredFocusedComponent(panel); - if (toFocus != null) { - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(toFocus, true)); - } + IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> IdeFocusManager.getGlobalInstance().requestFocus(toFocus, true)); }; final String name = action.getClass().getName(); mySlidingPanel.add(name, panel.first); @@ -783,23 +780,19 @@ public class FlatWelcomeFrame extends JFrame implements IdeFrame, Disposable, Ac return getRootPane(); } - public static void notifyFrameClosed(JFrame frame) { - saveLocation(frame.getBounds()); - } - public static class WelcomeScreenActionsPanel { private JPanel root; private JPanel actions; } - - public static Pair createActionGroupPanel(final ActionGroup action, - final JComponent parent, - final Runnable backAction, - @NotNull Disposable parentDisposable) { + + public static Pair> createActionGroupPanel(final ActionGroup action, + final JComponent parent, + final Runnable backAction, + @NotNull Disposable parentDisposable) { JPanel actionsListPanel = new JPanel(new BorderLayout()); actionsListPanel.setBackground(getProjectsBackground()); final List groups = flattenActionGroups(action); - final DefaultListModel model = JBList.createDefaultListModel(ArrayUtil.toObjectArray(groups)); + final DefaultListModel model = JBList.createDefaultListModel(groups); final JBList list = new JBList<>(model); for (AnAction group : groups) { if (group instanceof Disposable) { @@ -957,10 +950,10 @@ public class FlatWelcomeFrame extends JFrame implements IdeFrame, Disposable, Ac return back; } - public static void installQuickSearch(JBList list) { - new ListSpeedSearch(list, (Convertor)o -> { + public static void installQuickSearch(JBList list) { + new ListSpeedSearch<>(list, (Function)o -> { if (o instanceof AbstractActionWithPanel) { //to avoid dependency mess with ProjectSettingsStepBase - return ((AbstractActionWithPanel)o).getTemplatePresentation().getText(); + return o.getTemplatePresentation().getText(); } return null; }); diff --git a/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java b/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java index 0859178ebd26..395c48b52c84 100644 --- a/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java +++ b/platform/platform-impl/src/com/intellij/ui/ListSpeedSearch.java @@ -31,21 +31,33 @@ import javax.swing.*; import java.util.Arrays; import java.util.List; -public class ListSpeedSearch extends SpeedSearchBase { - private final Convertor myToStringConvertor; +public class ListSpeedSearch extends SpeedSearchBase> { + @Nullable private final Function myToStringConvertor; - public ListSpeedSearch(JList list) { - this(list, (Convertor)null); + public ListSpeedSearch(JList list) { + super(list); + myToStringConvertor = null; + registerSelectAll(list); } - public ListSpeedSearch(final JList list, @NotNull Function convertor) { - this(list, (Convertor)convertor::fun); - } - - public ListSpeedSearch(final JList list, @Nullable Convertor convertor) { + @SuppressWarnings("LambdaUnfriendlyMethodOverload") + public ListSpeedSearch(final JList list, @NotNull Function convertor) { super(list); myToStringConvertor = convertor; + registerSelectAll(list); + } + /** + * @deprecated use {@link #ListSpeedSearch(JList, Function)} + */ + @SuppressWarnings("LambdaUnfriendlyMethodOverload") + public ListSpeedSearch(final JList list, @Nullable Convertor convertor) { + super(list); + myToStringConvertor = convertor == null ? null : convertor::convert; + registerSelectAll(list); + } + + private void registerSelectAll(JList list) { new MySelectAllAction(list, this).registerCustomShortcutSet(list, null); } @@ -86,7 +98,8 @@ public class ListSpeedSearch extends SpeedSearchBase { @Override protected String getElementText(Object element) { if (myToStringConvertor != null) { - return myToStringConvertor.convert(element); + //noinspection unchecked + return myToStringConvertor.fun((T)element); } return element == null ? null : element.toString(); } diff --git a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java index 64606b3423c1..8fcc86efd8b8 100644 --- a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java @@ -20,6 +20,7 @@ import com.intellij.ui.table.JBTable; import com.intellij.ui.treeStructure.Tree; import com.intellij.util.EditSourceOnDoubleClickHandler; import com.intellij.util.EditSourceOnEnterKeyHandler; +import com.intellij.util.Function; import com.intellij.util.containers.Convertor; import javax.swing.*; @@ -62,7 +63,7 @@ public class TreeUIHelperImpl extends TreeUIHelper { } public void installListSpeedSearch(JList list, Convertor convertor) { - new ListSpeedSearch(list, convertor); + new ListSpeedSearch(list, (Function)convertor::convert); } public void installEditSourceOnEnterKeyHandler(final JTree tree) { diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java index 8559e9a94d36..eaa75e812beb 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/plugin/ui/ExistingTemplatesComponent.java @@ -28,7 +28,7 @@ import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.ui.*; import com.intellij.ui.components.JBList; import com.intellij.ui.treeStructure.Tree; -import com.intellij.util.containers.Convertor; +import com.intellij.util.Function; import com.intellij.util.text.DateFormatUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.tree.TreeUtil; @@ -149,7 +149,7 @@ public class ExistingTemplatesComponent { historyList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); historyList.setSelectedIndex(0); - final ListSpeedSearch speedSearch = new ListSpeedSearch(historyList, (Convertor)o -> o instanceof Configuration ? ((Configuration)o).getName() : o.toString()); + ListSpeedSearch speedSearch = new ListSpeedSearch<>(historyList, (Function)Configuration::getName); historyList.setCellRenderer(new ExistingTemplatesListCellRenderer(speedSearch)); configureSelectTemplateAction(historyList); } diff --git a/platform/util/src/com/intellij/util/ui/UIUtil.java b/platform/util/src/com/intellij/util/ui/UIUtil.java index a4b925c2df65..3d0648da4ba4 100644 --- a/platform/util/src/com/intellij/util/ui/UIUtil.java +++ b/platform/util/src/com/intellij/util/ui/UIUtil.java @@ -2574,9 +2574,10 @@ public class UIUtil { } } //Escape error-prone HTML data (if any) when we use it in renderers, see IDEA-170768 - public static Object htmlInjectionGuard(Object toRender) { + public static T htmlInjectionGuard(T toRender) { if (toRender instanceof String && ((String)toRender).toLowerCase(Locale.US).startsWith("")) { - toRender = "" + StringUtil.escapeXml((String)toRender); + //noinspection unchecked + return (T) ("" + StringUtil.escapeXml((String)toRender)); } return toRender; } From f19cb757adc4f670fbd10da065d21745c98da7b8 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 16 May 2017 22:03:41 +0200 Subject: [PATCH 5/5] generify and cleanup a bit around TreeUIHelper --- .../openapi/projectRoots/ui/PathEditor.java | 28 +++++++++---------- .../src/com/intellij/ui/ListUtil.java | 2 +- .../src/com/intellij/ui/TreeUIHelper.java | 4 +-- .../src/com/intellij/ui/TreeUIHelperImpl.java | 8 +++--- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java index 9642dce5d7ac..b7d7a8924837 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/ui/PathEditor.java @@ -56,8 +56,8 @@ public class PathEditor { public static final Color INVALID_COLOR = new JBColor(new Color(210, 0, 0), JBColor.RED); protected JPanel myPanel; - private JBList myList; - private final DefaultListModel myModel; + private JBList myList; + private final DefaultListModel myModel; private final Set myAllFiles = new HashSet<>(); private boolean myModified = false; protected boolean myEnabled = false; @@ -108,9 +108,10 @@ public class PathEditor { } public JComponent createComponent() { - myList = new JBList(getListModel()); + myList = new JBList<>(getListModel()); + //noinspection unchecked myList.setCellRenderer(createListCellRenderer(myList)); - TreeUIHelper.getInstance().installListSpeedSearch(myList, file -> ((VirtualFile)file).getPresentableUrl()); + TreeUIHelper.getInstance().installListSpeedSearch(myList, VirtualFile::getPresentableUrl); ToolbarDecorator toolbarDecorator = ToolbarDecorator.createDecorator(myList) .disableUpDownActions() @@ -181,15 +182,15 @@ public class PathEditor { itemsRemoved(removedItems); } - protected DefaultListModel createListModel() { - return new DefaultListModel(); + protected DefaultListModel createListModel() { + return new DefaultListModel<>(); } protected ListCellRenderer createListCellRenderer(JBList list) { return new PathCellRenderer(); } - protected void itemsRemoved(List removedItems) { + protected void itemsRemoved(List removedItems) { myAllFiles.removeAll(removedItems); if (removedItems.size() > 0) { setModified(true); @@ -213,16 +214,15 @@ public class PathEditor { protected boolean isUrlInserted() { if (getRowCount() > 0) { - return ((VirtualFile)getListModel().lastElement()).getFileSystem() instanceof HttpFileSystem; + return getListModel().lastElement().getFileSystem() instanceof HttpFileSystem; } return false; } protected void requestDefaultFocus() { if (myList != null) { - IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown(() -> { - IdeFocusManager.getGlobalInstance().requestFocus(myList, true); - }); + IdeFocusManager.getGlobalInstance().doWhenFocusSettlesDown( + () -> IdeFocusManager.getGlobalInstance().requestFocus(myList, true)); } } @@ -249,7 +249,7 @@ public class PathEditor { indicesToRemove.add(idx); } } - final List list = ListUtil.removeIndices(myList, indicesToRemove.toNativeArray()); + final List list = ListUtil.removeIndices(myList, indicesToRemove.toNativeArray()); itemsRemoved(list); } @@ -273,7 +273,7 @@ public class PathEditor { return true; } - protected DefaultListModel getListModel() { + protected DefaultListModel getListModel() { return myModel; } @@ -313,7 +313,7 @@ public class PathEditor { } protected VirtualFile getValueAt(int row) { - return (VirtualFile)getListModel().get(row); + return getListModel().get(row); } public void clearList() { diff --git a/platform/platform-api/src/com/intellij/ui/ListUtil.java b/platform/platform-api/src/com/intellij/ui/ListUtil.java index 042256f6b14d..893bf5b55b9c 100644 --- a/platform/platform-api/src/com/intellij/ui/ListUtil.java +++ b/platform/platform-api/src/com/intellij/ui/ListUtil.java @@ -78,7 +78,7 @@ public class ListUtil { return removeSelectedItems(list, null); } - public static List removeIndices(JList list, int[] indices) { + public static List removeIndices(JList list, int[] indices) { return removeIndices(list, indices, null); } diff --git a/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java b/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java index 978b0172d780..492a4f53c661 100644 --- a/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java +++ b/platform/platform-api/src/com/intellij/ui/TreeUIHelper.java @@ -45,9 +45,9 @@ public abstract class TreeUIHelper { public abstract void installEditSourceOnDoubleClick(JTree tree); public abstract void installTreeSpeedSearch(JTree tree); - public abstract void installListSpeedSearch(JList list); + public abstract void installListSpeedSearch(JList list); public abstract void installTreeSpeedSearch(JTree tree, Convertor convertor, boolean canExpand); - public abstract void installListSpeedSearch(JList list, Convertor convertor); + public abstract void installListSpeedSearch(JList list, Convertor convertor); public abstract void installEditSourceOnEnterKeyHandler(JTree tree); diff --git a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java index 8fcc86efd8b8..43384d0b24c2 100644 --- a/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java +++ b/platform/platform-impl/src/com/intellij/ui/TreeUIHelperImpl.java @@ -58,12 +58,12 @@ public class TreeUIHelperImpl extends TreeUIHelper { new TreeSpeedSearch(tree, convertor, canExpand); } - public void installListSpeedSearch(JList list) { - new ListSpeedSearch(list); + public void installListSpeedSearch(JList list) { + new ListSpeedSearch<>(list); } - public void installListSpeedSearch(JList list, Convertor convertor) { - new ListSpeedSearch(list, (Function)convertor::convert); + public void installListSpeedSearch(JList list, Convertor convertor) { + new ListSpeedSearch<>(list, (Function)convertor::convert); } public void installEditSourceOnEnterKeyHandler(final JTree tree) {