From 639330b24d4088ec4e8a6f6a423fcf4b7ce581dc Mon Sep 17 00:00:00 2001 From: Denis Molony Date: Tue, 18 Feb 2020 17:26:32 +1000 Subject: [PATCH] sort empty prodos folders correctly --- .../diskbrowser/disk/AbstractFormattedDisk.java | 4 ++++ src/com/bytezone/diskbrowser/gui/AppleDiskTab.java | 5 +++-- src/com/bytezone/diskbrowser/prodos/FileEntry.java | 2 +- .../diskbrowser/prodos/ProdosCatalogSector.java | 12 ++++++++++++ src/com/bytezone/diskbrowser/prodos/ProdosDisk.java | 9 +++++++-- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java index 1dbb850..c1c6426 100755 --- a/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java +++ b/src/com/bytezone/diskbrowser/disk/AbstractFormattedDisk.java @@ -138,6 +138,10 @@ public abstract class AbstractFormattedDisk implements FormattedDisk gridLayout = new Dimension (16, 35); break; + case 704: + gridLayout = new Dimension (16, 44); + break; + case 768: gridLayout = new Dimension (16, 48); break; diff --git a/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java b/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java index 90937ae..4a9c636 100755 --- a/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java +++ b/src/com/bytezone/diskbrowser/gui/AppleDiskTab.java @@ -52,15 +52,16 @@ class AppleDiskTab extends AbstractTab // This constructor is only called when lastFileUsed is not null, but the disk // couldn't find the file entry. Either the file has been deleted, or it is a disk // with redefined files (Wizardry, Infocom etc). + // Or possibly a root volume folder. // ---------------------------------------------------------------------------------// public AppleDiskTab (FormattedDisk disk, DiskAndFileSelector selector, RedoHandler redoHandler, Font font, String lastFileUsed) // ---------------------------------------------------------------------------------// { super (redoHandler, selector, font); - System.out.println ("****************** File not found"); + System.out.println ("File not found: " + lastFileUsed); create (disk); - // System.out.println ("ooh - couldn't find the previous file"); + DefaultMutableTreeNode node = findNode (lastFileUsed); if (node != null) { diff --git a/src/com/bytezone/diskbrowser/prodos/FileEntry.java b/src/com/bytezone/diskbrowser/prodos/FileEntry.java index 41632e2..9f1ccbc 100755 --- a/src/com/bytezone/diskbrowser/prodos/FileEntry.java +++ b/src/com/bytezone/diskbrowser/prodos/FileEntry.java @@ -108,7 +108,7 @@ class FileEntry extends CatalogEntry implements ProdosConstants case PASCAL_ON_PROFILE: indexBlocks.add (disk.getDiskAddress (keyPtr)); - System.out.println ("PASCAL on PROFILE: " + name); + System.out.println ("PASCAL on PROFILE: " + name); // PDUCSD12.PO // are these blocks guaranteed to be contiguous? break; diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java b/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java index ff4f036..89028e3 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosCatalogSector.java @@ -124,10 +124,12 @@ class ProdosCatalogSector extends AbstractSector // ---------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); + addText (text, buffer, offset + 16, 4, "Not used"); text.append (getCommonHeader (offset)); addTextAndDecimal (text, buffer, offset + 35, 2, "Bit map pointer"); addTextAndDecimal (text, buffer, offset + 37, 2, "Total blocks"); + return text.toString (); } @@ -136,12 +138,14 @@ class ProdosCatalogSector extends AbstractSector // ---------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); + addText (text, buffer, offset + 16, 1, "Hex $75"); addText (text, buffer, offset + 17, 3, "Not used"); text.append (getCommonHeader (offset)); addTextAndDecimal (text, buffer, offset + 35, 2, "Parent block"); addTextAndDecimal (text, buffer, offset + 37, 1, "Parent entry number"); addTextAndDecimal (text, buffer, offset + 38, 1, "Parent entry length"); + return text.toString (); } @@ -150,13 +154,16 @@ class ProdosCatalogSector extends AbstractSector // ---------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); + addText (text, buffer, offset + 20, 4, "Not used"); GregorianCalendar created = HexFormatter.getAppleDate (buffer, offset + 24); String dateC = created == null ? "" : parent.df.format (created.getTime ()); addText (text, buffer, offset + 24, 4, "Creation date : " + dateC); + addText (text, buffer, offset + 28, 1, "Prodos version"); addText (text, buffer, offset + 29, 1, "Minimum version"); addText (text, buffer, offset + 30, 1, "Access"); + addTextAndDecimal (text, buffer, offset + 31, 1, "Entry length"); addTextAndDecimal (text, buffer, offset + 32, 1, "Entries per block"); addTextAndDecimal (text, buffer, offset + 33, 2, "File count"); @@ -220,13 +227,18 @@ class ProdosCatalogSector extends AbstractSector } // Deleted files leave the name intact, but set the name length to zero + // Also - the pointers in the master blocks of a sapling or tree file are + // swapped when the file is deleted. + // ---------------------------------------------------------------------------------// private String getDeletedName (int offset) // ---------------------------------------------------------------------------------// { StringBuilder text = new StringBuilder (); + for (int i = offset, max = offset + 15; i < max && buffer[i] != 0; i++) text.append ((char) (buffer[i] & 0xFF)); + return text.toString (); } } \ No newline at end of file diff --git a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java index 83cdffe..6a61430 100755 --- a/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java +++ b/src/com/bytezone/diskbrowser/prodos/ProdosDisk.java @@ -362,10 +362,15 @@ public class ProdosDisk extends AbstractFormattedDisk @Override public int compare (DefaultMutableTreeNode o1, DefaultMutableTreeNode o2) { - if (o1.isLeaf () && !o2.isLeaf ()) + boolean folder1 = o1.getAllowsChildren (); + boolean folder2 = o2.getAllowsChildren (); + + // if (o1.isLeaf () && !o2.isLeaf ()) + if (folder1 && !folder2) return -1; - if (!o1.isLeaf () && o2.isLeaf ()) + // if (!o1.isLeaf () && o2.isLeaf ()) + if (!folder1 && folder2) return 1; String name1 = ((FileEntry) o1.getUserObject ()).name;