From cf5123fb4e15af451d70ff6038c11c1798234d06 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Tue, 22 Oct 2019 09:50:49 +1000 Subject: [PATCH] rewrote terrible sort routine --- .../diskbrowser/prodos/ProdosDisk.java | 109 ++++++------------ 1 file changed, 38 insertions(+), 71 deletions(-) diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java index 126a504..44ccadf 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java @@ -4,6 +4,8 @@ import java.awt.Color; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import javax.swing.tree.DefaultMutableTreeNode; @@ -36,6 +38,7 @@ public class ProdosDisk extends AbstractFormattedDisk private final List headerEntries = new ArrayList (); protected VolumeDirectoryHeader vdh; private final DefaultMutableTreeNode volumeNode; + private final NodeComparator nodeComparator = new NodeComparator (); private static final boolean debug = false; @@ -86,86 +89,32 @@ public class ProdosDisk extends AbstractFormattedDisk if (ProdosDisk.prodosPreferences.sortDirectories) { - sortLeaves (volumeNode); - sortFolders (volumeNode); + sortNodes (volumeNode); ((DefaultTreeModel) catalogTree.getModel ()).reload (); } } - public void sortLeaves (DefaultMutableTreeNode node) + public void sortNodes (DefaultMutableTreeNode node) { - for (int i = 0; i < node.getChildCount (); i++) + int totalNodes = node.getChildCount (); + if (totalNodes == 0) + return; + + List children = new ArrayList<> (totalNodes); + for (int i = 0; i < totalNodes; i++) { - DefaultMutableTreeNode baseNode = (DefaultMutableTreeNode) node.getChildAt (i); - if (!baseNode.isLeaf ()) - { - sortLeaves (baseNode); - continue; - } - - String childName = ((FileEntry) baseNode.getUserObject ()).name; - DefaultMutableTreeNode smallestNode = null; - String smallestName = childName; - int smallestPos = -1; - - for (int j = i + 1; j < node.getChildCount (); j++) - { - DefaultMutableTreeNode compareNode = (DefaultMutableTreeNode) node.getChildAt (j); - if (!compareNode.isLeaf ()) - continue; - - String compareName = ((FileEntry) compareNode.getUserObject ()).name; - if (smallestName.compareToIgnoreCase (compareName) > 0) - { - smallestNode = compareNode; - smallestName = compareName; - smallestPos = j; - } - } - - if (smallestNode != null) - { - node.insert (baseNode, smallestPos); - node.insert (smallestNode, i); - } + DefaultMutableTreeNode child = (DefaultMutableTreeNode) node.getChildAt (i); + children.add (child); + if (!child.isLeaf ()) + sortNodes (child); } - } - public void sortFolders (DefaultMutableTreeNode node) - { - for (int i = 0; i < node.getChildCount (); i++) + if (totalNodes > 1) { - DefaultMutableTreeNode baseNode = (DefaultMutableTreeNode) node.getChildAt (i); - if (baseNode.isLeaf ()) - continue; - - sortFolders (baseNode); - - String childName = ((FileEntry) baseNode.getUserObject ()).name; - DefaultMutableTreeNode smallestNode = null; - String smallestName = childName; - int smallestPos = -1; - - for (int j = i + 1; j < node.getChildCount (); j++) - { - DefaultMutableTreeNode compareNode = (DefaultMutableTreeNode) node.getChildAt (j); - if (compareNode.isLeaf ()) - continue; - - String compareName = ((FileEntry) compareNode.getUserObject ()).name; - if (smallestName.compareToIgnoreCase (compareName) > 0) - { - smallestNode = compareNode; - smallestName = compareName; - smallestPos = j; - } - } - - if (smallestNode != null) - { - node.insert (baseNode, smallestPos); - node.insert (smallestNode, i); - } + node.removeAllChildren (); + Collections.sort (children, nodeComparator); + for (DefaultMutableTreeNode child : children) + node.add (child); } } @@ -369,4 +318,22 @@ public class ProdosDisk extends AbstractFormattedDisk return text.toString (); } + + class NodeComparator implements Comparator + { + @Override + public int compare (DefaultMutableTreeNode o1, DefaultMutableTreeNode o2) + { + String name1 = ((FileEntry) o1.getUserObject ()).name; + String name2 = ((FileEntry) o2.getUserObject ()).name; + + if (o1.isLeaf () && !o2.isLeaf ()) + return -1; + if (!o1.isLeaf () && o2.isLeaf ()) + return 1; + + return name1.compareTo (name2); + } + + } } \ No newline at end of file