From 19d8d94f3390ba4d8b0865beb71b2f334459141b Mon Sep 17 00:00:00 2001 From: Sergey Malenkov Date: Fri, 28 Apr 2017 18:28:38 +0300 Subject: [PATCH] IDEA-165089 sort keymaps in settings --- .../keymap/impl/ui/KeymapSchemeManager.java | 30 ++++++++++++++++++- .../keymap/impl/ui/KeymapSelector.java | 6 ++-- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSchemeManager.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSchemeManager.java index 10cd17eef8d4..600dbd1fcb3e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSchemeManager.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSchemeManager.java @@ -22,12 +22,14 @@ import com.intellij.openapi.util.Condition; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Comparator; import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.function.Predicate; import static com.intellij.openapi.util.SystemInfo.isMac; +import static com.intellij.openapi.util.text.StringUtil.naturalCompare; import static java.util.stream.Collectors.toList; /** @@ -101,7 +103,33 @@ final class KeymapSchemeManager { return keymaps.hasNext() || schemes.hasNext(); } - List getAll() { + List getAll(boolean sorted) { + if (sorted) list.sort(COMPARATOR); return list; } + + static final Comparator COMPARATOR = (scheme1, scheme2) -> { + if (scheme1 == scheme2) return 0; + if (scheme1 == null) return -1; + if (scheme2 == null) return 1; + + Keymap keymap1 = scheme1.getCurrent(); + Keymap keymap2 = scheme2.getCurrent(); + + Keymap parent1 = scheme1.getParent(); + Keymap parent2 = scheme2.getParent(); + + if (parent1 == null) parent1 = keymap1; + if (parent2 == null) parent2 = keymap2; + + if (parent1 == parent2) { + if (!keymap1.canModify()) return -1; + if (!keymap2.canModify()) return 1; + + return naturalCompare(keymap1.getPresentableName(), keymap2.getPresentableName()); + } + else { + return naturalCompare(parent1.getPresentableName(), parent2.getPresentableName()); + } + }; } diff --git a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSelector.java b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSelector.java index 96f992fc0ed4..30da0f47facf 100644 --- a/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSelector.java +++ b/platform/platform-impl/src/com/intellij/openapi/keymap/impl/ui/KeymapSelector.java @@ -50,7 +50,7 @@ final class KeymapSelector extends SimpleSchemesPanel implements S String apply() { HashSet set = new HashSet<>(); - for (KeymapScheme scheme : manager.getAll()) { + for (KeymapScheme scheme : manager.getAll(false)) { String name = scheme.getName(); if (isEmptyOrSpaces(name)) { return message("configuration.all.keymaps.should.have.non.empty.names.error.message"); @@ -69,7 +69,7 @@ final class KeymapSelector extends SimpleSchemesPanel implements S } void visitMutableKeymaps(Consumer consumer) { - for (KeymapScheme scheme : manager.getAll()) { + for (KeymapScheme scheme : manager.getAll(false)) { if (scheme.isMutable()) { consumer.accept(scheme.getMutable()); } @@ -233,7 +233,7 @@ final class KeymapSelector extends SimpleSchemesPanel implements S private void selectKeymap(KeymapScheme scheme, boolean reset) { try { internal = true; - if (reset) resetSchemes(manager.getAll()); + if (reset) resetSchemes(manager.getAll(true)); if (scheme != null) selectScheme(scheme); } finally {