From 0974aa1be7fbbbcac7bb5782e73c1d5cdb4c10f0 Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Mon, 21 Oct 2019 17:30:27 +1000 Subject: [PATCH] Include folders in prodos sort --- .../applefile/ApplesoftBasicProgram.java | 16 ------ .../disk/AbstractFormattedDisk.java | 11 ++-- .../diskbrowser/gui/AppleDiskTab.java | 25 +++++---- .../diskbrowser/gui/CatalogPanel.java | 6 +-- src/com/bytezone/diskbrowser/gui/Tab.java | 6 +-- .../bytezone/diskbrowser/gui/TreeBuilder.java | 14 +++-- .../diskbrowser/prodos/ProdosDisk.java | 53 ++++++++++++++++--- 7 files changed, 71 insertions(+), 60 deletions(-) diff --git a/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java b/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java index 9d28e80..4c090d3 100644 --- a/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java +++ b/src/com/bytezone/diskbrowser/applefile/ApplesoftBasicProgram.java @@ -635,7 +635,6 @@ public class ApplesoftBasicProgram extends BasicProgram System.out.println (target); System.out.println (HexFormatter.format (buffer, startPtr, length - 1)); System.out.println (e); - // assert false; } } // else if (basicPreferences.alignAssign) @@ -692,21 +691,6 @@ public class ApplesoftBasicProgram extends BasicProgram return false; } - // private boolean isToken (byte value) - // { - // return (value & 0x80) > 0; - // } - - // private boolean isControlCharacter (byte value) - // { - // return value < 32; - // } - - // private boolean isDigit (byte value) - // { - // return value >= 48 && value <= 57; - // } - public int getAddress () { return getLoadAddress () + startPtr; diff --git a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java index 8fd36aa..ef0f607 100755 --- a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java +++ b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java @@ -181,12 +181,10 @@ public abstract class AbstractFormattedDisk implements FormattedDisk { this.originalPath = path; - DefaultMutableTreeNode root = - (DefaultMutableTreeNode) catalogTree.getModel ().getRoot (); - DefaultAppleFileSource afs = - new DefaultAppleFileSource (getName (), disk.toString (), this); + DefaultMutableTreeNode root = getCatalogTreeRoot (); if (root.getUserObject () == null) - root.setUserObject (afs); + root.setUserObject ( + new DefaultAppleFileSource (getName (), disk.toString (), this)); } @Override @@ -405,8 +403,7 @@ public abstract class AbstractFormattedDisk implements FormattedDisk @Override public boolean stillAvailable (DiskAddress da) { - return sectorTypes[da.getBlock ()] == usedSector - || sectorTypes[da.getBlock ()] == emptySector; + return stillAvailable (da.getBlock ()); } @Override diff --git a/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java b/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java index 2712d54..14db86e 100755 --- a/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java +++ b/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java @@ -24,6 +24,7 @@ class AppleDiskTab extends AbstractTab { FormattedDisk disk; + // restoring from a file selection public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler redoHandler, Font font, FileSelectedEvent event) { @@ -32,6 +33,7 @@ class AppleDiskTab extends AbstractTab redoHandler.fileSelected (event); } + // restoring from a sector selection public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler redoHandler, Font font, SectorSelectedEvent event) { @@ -44,9 +46,9 @@ class AppleDiskTab extends AbstractTab // couldn't find the file entry. Either the file has been deleted, or it is a disk // with redefined files (Wizardry, Infocom etc). public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, - RedoHandler navMan, Font font, String lastFileUsed) + RedoHandler redoHandler, Font font, String lastFileUsed) { - super (navMan, selector, font); + super (redoHandler, selector, font); create (disk); // System.out.println ("ooh - couldn't find the previous file"); DefaultMutableTreeNode node = findNode (lastFileUsed); @@ -54,21 +56,21 @@ class AppleDiskTab extends AbstractTab { AppleFileSource afs = (AppleFileSource) node.getUserObject (); FileSelectedEvent event = new FileSelectedEvent (this, afs); - navMan.fileSelected (event); + redoHandler.fileSelected (event); } } // User is selecting a new disk from the catalog public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, - RedoHandler navMan, Font font) + RedoHandler redoHandler, Font font) { - super (navMan, selector, font); + super (redoHandler, selector, font); create (disk); AppleFileSource afs = (AppleFileSource) findNode (2).getUserObject (); // select Catalog if (afs == null) afs = (AppleFileSource) findNode (1).getUserObject (); // select Disk - navMan.fileSelected (new FileSelectedEvent (this, afs)); + redoHandler.fileSelected (new FileSelectedEvent (this, afs)); } private void create (FormattedDisk disk) @@ -125,13 +127,10 @@ class AppleDiskTab extends AbstractTab while (children.hasMoreElements ()) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement (); - Object o = node.getUserObject (); - if (o instanceof AppleFileSource) - { - AppleFileSource afs = (AppleFileSource) node.getUserObject (); - if (nodeName.equals (afs.getUniqueName ())) - return node; - } + Object userObject = node.getUserObject (); + if (userObject instanceof AppleFileSource + && nodeName.equals (((AppleFileSource) userObject).getUniqueName ())) + return node; } return null; } diff --git a/src/com/bytezone/diskbrowser/gui/CatalogPanel.java b/src/com/bytezone/diskbrowser/gui/CatalogPanel.java index a80d877..e3b8e40 100755 --- a/src/com/bytezone/diskbrowser/gui/CatalogPanel.java +++ b/src/com/bytezone/diskbrowser/gui/CatalogPanel.java @@ -49,7 +49,7 @@ class CatalogPanel extends JTabbedPane private Font font; private FileSystemTab fileTab; - private final List diskTabs = new ArrayList (); + private final List diskTabs = new ArrayList<> (); private final DiskAndFileSelector selector = new DiskAndFileSelector (); private final RedoHandler redoHandler; private CloseTabAction closeTabAction; @@ -61,9 +61,6 @@ class CatalogPanel extends JTabbedPane setTabPlacement (SwingConstants.BOTTOM); setPreferredSize (new Dimension (360, 802)); // width, height - - // createTabs (prefs); - // addChangeListener (new TabChangeListener ()); } RootFolderData getRootFolderData () @@ -84,7 +81,6 @@ class CatalogPanel extends JTabbedPane rootFolderData.setRootFolder (rootDirectoryFile); - // move to restore() String lastDiskUsed = prefs.get (prefsLastDiskUsed, ""); int lastDosUsed = prefs.getInt (prefsLastDosUsed, -1); String lastFileUsed = prefs.get (prefsLastFileUsed, ""); diff --git a/src/com/bytezone/diskbrowser/gui/Tab.java b/src/com/bytezone/diskbrowser/gui/Tab.java index 64c324f..8045493 100755 --- a/src/com/bytezone/diskbrowser/gui/Tab.java +++ b/src/com/bytezone/diskbrowser/gui/Tab.java @@ -2,8 +2,8 @@ package com.bytezone.diskbrowser.gui; /*********************************************************************************************** * Interface implemented by AbstractTab, and in turn FileSystemTab and AppleDiskTab. - * - * + * + * ***********************************************************************************************/ import javax.swing.tree.DefaultMutableTreeNode; @@ -16,5 +16,3 @@ interface Tab public DefaultMutableTreeNode getRootNode (); } - -// public void addMouseListener (MouseAdapter ma) \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/gui/TreeBuilder.java b/src/com/bytezone/diskbrowser/gui/TreeBuilder.java index 63a5dd2..55d2bce 100755 --- a/src/com/bytezone/diskbrowser/gui/TreeBuilder.java +++ b/src/com/bytezone/diskbrowser/gui/TreeBuilder.java @@ -26,16 +26,16 @@ public class TreeBuilder private final FileComparator fileComparator = new FileComparator (); private final JTree tree; - public TreeBuilder (File folder) + public TreeBuilder (File rootFolder) { - assert (folder.exists ()); - assert (folder.isDirectory ()); + assert (rootFolder.exists ()); + assert (rootFolder.isDirectory ()); - FileNode fileNode = new FileNode (folder); + FileNode fileNode = new FileNode (rootFolder); DefaultMutableTreeNode root = new DefaultMutableTreeNode (fileNode); fileNode.setTreeNode (root); - addFiles (root, folder); + addFiles (root, rootFolder); DefaultTreeModel treeModel = new DefaultTreeModel (root); tree = new JTree (treeModel); @@ -98,7 +98,7 @@ public class TreeBuilder /* * Class used to control the text displayed by the JTree. */ - public class FileNode implements DataSource + public class FileNode implements DataSource // why does it implement DataSource? { DefaultMutableTreeNode parentNode; public final File file; @@ -185,8 +185,6 @@ public class TreeBuilder if (f.isHidden ()) continue; String name = f.getName (); - // if (name.startsWith (".")) - // continue; Date d = new Date (f.lastModified ()); int pos = name.lastIndexOf ('.'); diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java index e002c62..126a504 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java @@ -86,19 +86,20 @@ public class ProdosDisk extends AbstractFormattedDisk if (ProdosDisk.prodosPreferences.sortDirectories) { - sort (volumeNode); + sortLeaves (volumeNode); + sortFolders (volumeNode); ((DefaultTreeModel) catalogTree.getModel ()).reload (); } } - public void sort (DefaultMutableTreeNode node) + public void sortLeaves (DefaultMutableTreeNode node) { - for (int base = 0; base < node.getChildCount (); base++) + for (int i = 0; i < node.getChildCount (); i++) { - DefaultMutableTreeNode baseNode = (DefaultMutableTreeNode) node.getChildAt (base); + DefaultMutableTreeNode baseNode = (DefaultMutableTreeNode) node.getChildAt (i); if (!baseNode.isLeaf ()) { - sort (baseNode); + sortLeaves (baseNode); continue; } @@ -107,7 +108,7 @@ public class ProdosDisk extends AbstractFormattedDisk String smallestName = childName; int smallestPos = -1; - for (int j = base + 1; j < node.getChildCount (); j++) + for (int j = i + 1; j < node.getChildCount (); j++) { DefaultMutableTreeNode compareNode = (DefaultMutableTreeNode) node.getChildAt (j); if (!compareNode.isLeaf ()) @@ -125,7 +126,45 @@ public class ProdosDisk extends AbstractFormattedDisk if (smallestNode != null) { node.insert (baseNode, smallestPos); - node.insert (smallestNode, base); + node.insert (smallestNode, i); + } + } + } + + public void sortFolders (DefaultMutableTreeNode node) + { + for (int i = 0; i < node.getChildCount (); i++) + { + 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); } } }