From 7a510553151912865c566d966e38137f987d22f8 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sat, 7 Sep 2024 11:25:06 +0200 Subject: [PATCH] Properly sort groupable items in combobox --- .../GroupableAndSearchableComboBox.java | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java b/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java index 66c74cc3f..59a5a66b0 100644 --- a/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java +++ b/swing/src/main/java/info/openrocket/swing/gui/widgets/GroupableAndSearchableComboBox.java @@ -130,20 +130,34 @@ public class GroupableAndSearchableComboBox> constructItemGroupMapFromList(List items) { - Map> itemGroupMap = new TreeMap<>(new Comparator() { - @Override - public int compare(G g1, G g2) { - return Integer.compare(g1.getPriority(), g2.getPriority()); - } - }); + Map> itemGroupMap = new TreeMap<>(Comparator.comparing(Group::getPriority)); for (T item : items) { G group = item.getGroup(); itemGroupMap.computeIfAbsent(group, k -> new ArrayList<>()).add(item); } + + // Sort items within each group + for (List groupItems : itemGroupMap.values()) { + groupItems.sort(new ItemComparator()); + } + return itemGroupMap; } + private class ItemComparator implements Comparator { + @Override + @SuppressWarnings("unchecked") + public int compare(T item1, T item2) { + if (item1 instanceof Comparable && item2 instanceof Comparable) { + return ((Comparable) item1).compareTo(item2); + } else { + // Fall back to alphabetical sorting using the display string + return getDisplayString(item1).compareToIgnoreCase(getDisplayString(item2)); + } + } + } + public void setupMainRenderer() { setRenderer(new DefaultListCellRenderer() { @Override