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 57de16800b57..84663ef0e60b 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 @@ -257,7 +257,7 @@ final class KeymapSchemeManager extends AbstractSchemeActions impl Keymap active = selected == null ? null : selected.getOriginal(); if (!Objects.equals(active, KeymapManager.getInstance().getActiveKeymap())) return true; - Iterator keymaps = getKeymaps().iterator(); + Iterator keymaps = getKeymaps().stream().sorted(KEYMAP_COMPARATOR).iterator(); Iterator schemes = this.list.iterator(); while (keymaps.hasNext() && schemes.hasNext()) { if (!Objects.equals(keymaps.next(), schemes.next().getCurrent())) return true; @@ -266,20 +266,17 @@ final class KeymapSchemeManager extends AbstractSchemeActions impl } List getSchemes() { - list.sort(COMPARATOR); + list.sort(SCHEME_COMPARATOR); return list; } - static final Comparator COMPARATOR = (scheme1, scheme2) -> { - if (scheme1 == scheme2) return 0; - if (scheme1 == null) return -1; - if (scheme2 == null) return 1; + private static final Comparator KEYMAP_COMPARATOR = (keymap1, keymap2) -> { + if (keymap1 == keymap2) return 0; + if (keymap1 == null) return -1; + if (keymap2 == null) return 1; - Keymap keymap1 = scheme1.getCurrent(); - Keymap keymap2 = scheme2.getCurrent(); - - Keymap parent1 = scheme1.getParent(); - Keymap parent2 = scheme2.getParent(); + Keymap parent1 = !keymap1.canModify() ? null : keymap1.getParent(); + Keymap parent2 = !keymap2.canModify() ? null : keymap2.getParent(); if (parent1 == null) parent1 = keymap1; if (parent2 == null) parent2 = keymap2; @@ -294,4 +291,11 @@ final class KeymapSchemeManager extends AbstractSchemeActions impl return naturalCompare(parent1.getPresentableName(), parent2.getPresentableName()); } }; + + private static final Comparator SCHEME_COMPARATOR = (scheme1, scheme2) -> { + if (scheme1 == scheme2) return 0; + if (scheme1 == null) return -1; + if (scheme2 == null) return 1; + return KEYMAP_COMPARATOR.compare(scheme1.getCurrent(), scheme2.getCurrent()); + }; }