From 6aff1c01b852797fad0fa76090e967b6284c10e4 Mon Sep 17 00:00:00 2001 From: "Dmitry.Krasilschikov" Date: Wed, 30 Nov 2016 16:02:08 +0300 Subject: [PATCH] IDEA-CR-16002 sort settings dropdowns sdks together only by the same sdk comparator object instance; @NotNull annotating; make SdkComparator not lazy initializable singleton --- .../roots/ui/configuration/JdkComboBox.java | 30 ++++++++++++++++--- .../openapi/projectRoots/SdkType.java | 3 +- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java index f116c84a7042..6b576f6f8b39 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JdkComboBox.java @@ -305,19 +305,41 @@ public class JdkComboBox extends ComboBoxWithWidePopup { } } + private static class MyComparatorWrapper { + @NotNull + private final Comparator myComparator; + + MyComparatorWrapper(@NotNull final Comparator comparator) { + myComparator = comparator; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + return myComparator == ((MyComparatorWrapper)o).myComparator; + } + + @Override + public int hashCode() { + return myComparator.hashCode(); + } + } + @NotNull private static Sdk[] sortSdks(@NotNull final Sdk[] sdks) { - MultiMap, Sdk> comparatorToSdkMap = new MultiMap<>(); + MultiMap comparatorToSdkMap = new MultiMap<>(); for (Sdk sdk : sdks) { final SdkTypeId sdkType = sdk.getSdkType(); if (sdkType instanceof SdkType) { - comparatorToSdkMap.putValue(((SdkType)sdkType).getComparator(), sdk); + comparatorToSdkMap.putValue(new MyComparatorWrapper(((SdkType)sdkType).getComparator()), sdk); } else { - comparatorToSdkMap.putValue(SdkType.ALPHABETICAL_COMPARATOR, sdk); + comparatorToSdkMap.putValue(new MyComparatorWrapper(SdkType.ALPHABETICAL_COMPARATOR), sdk); } } - return comparatorToSdkMap.entrySet().stream().flatMap(entry -> entry.getValue().stream().sorted(entry.getKey())) + return comparatorToSdkMap.entrySet().stream().flatMap(entry -> entry.getValue().stream().sorted(entry.getKey().myComparator)) .toArray(size -> new Sdk[size]); } diff --git a/platform/lang-api/src/com/intellij/openapi/projectRoots/SdkType.java b/platform/lang-api/src/com/intellij/openapi/projectRoots/SdkType.java index 15c81e4a7e68..9ef75f4a6fb7 100644 --- a/platform/lang-api/src/com/intellij/openapi/projectRoots/SdkType.java +++ b/platform/lang-api/src/com/intellij/openapi/projectRoots/SdkType.java @@ -94,9 +94,10 @@ public abstract class SdkType implements SdkTypeId { /** * Returns comparator which is used to order sdks in project or module settings combo boxes. - * If different sdk types return the same comparator object then they are sorted together. + * If different sdk types return the same comparator instance then they are sorted together. */ + @NotNull public Comparator getComparator() { return ALPHABETICAL_COMPARATOR; }