Restored duplicate functionality

This commit is contained in:
Denis Molony 2019-10-24 13:13:01 +10:00
parent 8f1974def9
commit b4d7c60495
7 changed files with 84 additions and 80 deletions

View File

@ -15,9 +15,10 @@ import javax.swing.JFrame;
import javax.swing.JPanel;
import com.bytezone.diskbrowser.gui.DuplicateAction.DiskTableSelectionListener;
import com.bytezone.diskbrowser.gui.RootDirectoryChangeListener;
import com.bytezone.diskbrowser.utilities.Utility;
public class RootFolderData
public class RootFolderData implements RootDirectoryChangeListener
{
private static final String header =
" type uncmp .gz .zip total";
@ -63,7 +64,6 @@ public class RootFolderData
dialogTotals.add (progressPanel, BorderLayout.CENTER);
southPanel.add (btnCancel); // needs to be here for the pack()
dialogTotals.add (southPanel, BorderLayout.SOUTH);
// dialogTotals.setTitle ("Disk Totals");
dialogTotals.pack ();
dialogTotals.setLocationRelativeTo (null);
@ -125,13 +125,6 @@ public class RootFolderData
dialogTotals.repaint ();
}
public void setRootFolder (File rootFolder)
{
this.rootFolder = rootFolder;
rootFolderNameLength = rootFolder.getAbsolutePath ().length ();
disksWindow = null; // force a recount
}
String getRootFolderPathText ()
{
String text = rootFolder.getAbsolutePath ();
@ -251,6 +244,18 @@ public class RootFolderData
}
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
text.append (String.format ("Root folder ....... %s%n", rootFolder));
text.append (String.format ("Disks ............. %,d%n", totalDisks));
text.append (String.format ("Folders ........... %,d", totalFolders));
return text.toString ();
}
class ProgressPanel extends JPanel
{
public volatile boolean cancelled;
@ -293,10 +298,6 @@ public class RootFolderData
if (doChecksums)
{
// line = String.format ("Unique checksums: %,7d%n",
// checksumMap.size ());
// y += lineHeight;
// g.drawString (line, x, y);
line = String.format ("duplicates ... %,7d%n",
totalDisks - checksumMap.size ());
y += lineHeight + 10;
@ -304,4 +305,12 @@ public class RootFolderData
}
}
}
@Override
public void rootDirectoryChanged (File rootFolder)
{
this.rootFolder = rootFolder;
rootFolderNameLength = rootFolder.getAbsolutePath ().length ();
disksWindow = null; // force a recount
}
}

View File

@ -30,11 +30,9 @@ import com.bytezone.diskbrowser.applefile.AppleFileSource;
import com.bytezone.diskbrowser.disk.DualDosDisk;
import com.bytezone.diskbrowser.disk.FormattedDisk;
import com.bytezone.diskbrowser.duplicates.DiskDetails;
import com.bytezone.diskbrowser.duplicates.RootFolderData;
import com.bytezone.diskbrowser.gui.DuplicateAction.DiskTableSelectionListener;
import com.bytezone.diskbrowser.gui.RedoHandler.RedoEvent;
import com.bytezone.diskbrowser.gui.RedoHandler.RedoListener;
import com.bytezone.diskbrowser.gui.RootDirectoryAction.RootDirectoryChangeListener;
import com.bytezone.diskbrowser.gui.TreeBuilder.FileNode;
class CatalogPanel extends JTabbedPane
@ -45,7 +43,6 @@ class CatalogPanel extends JTabbedPane
private static final String prefsLastDosUsed = "Last dos used";
private static final String prefsLastFileUsed = "Last file used";
private static final String prefsLastSectorsUsed = "Last sectors used";
private static final String prefsRootDirectory = "Root directory";
private Font font;
private FileSystemTab fileTab;
@ -53,7 +50,7 @@ class CatalogPanel extends JTabbedPane
private final DiskAndFileSelector selector = new DiskAndFileSelector ();
private final RedoHandler redoHandler;
private CloseTabAction closeTabAction;
private final RootFolderData rootFolderData = new RootFolderData ();
private File rootFolder;
public CatalogPanel (RedoHandler redoHandler)
{
@ -63,24 +60,8 @@ class CatalogPanel extends JTabbedPane
setPreferredSize (new Dimension (360, 802)); // width, height
}
RootFolderData getRootFolderData ()
{
return rootFolderData;
}
private void createTabs (Preferences prefs)
{
String rootDirectory = prefs.get (prefsRootDirectory, "");
File rootDirectoryFile = new File (rootDirectory);
if (!rootDirectoryFile.exists () || !rootDirectoryFile.isDirectory ())
{
System.out.println ("No root directory");
return;
}
rootFolderData.setRootFolder (rootDirectoryFile);
String lastDiskUsed = prefs.get (prefsLastDiskUsed, "");
int lastDosUsed = prefs.getInt (prefsLastDosUsed, -1);
String lastFileUsed = prefs.get (prefsLastFileUsed, "");
@ -146,22 +127,24 @@ class CatalogPanel extends JTabbedPane
}
@Override
public void rootDirectoryChanged (RootFolderData rootFolderData)
public void rootDirectoryChanged (File rootFolder)
{
assert rootFolderData == this.rootFolderData;
this.rootFolder = rootFolder;
if (fileTab == null) // still restoring last session
return;
// is the user replacing an existing root folder?
if (fileTab != null)
{
removeTabAt (0);
insertFileSystemTab (null);
setSelectedIndex (0);
insertFileSystemTab (null);
setSelectedIndex (0);
}
}
private void insertFileSystemTab (DiskSelectedEvent diskEvent)
{
fileTab = new FileSystemTab (rootFolderData.getRootFolder (), selector, redoHandler,
font, diskEvent);
fileTab = new FileSystemTab (rootFolder, selector, redoHandler, font, diskEvent);
fileTab.addTreeMouseListener (new MouseListener ()); // listen for disk selection
insertTab ("Disk Tree", null, fileTab, "Display Apple disks", 0);
}
@ -248,7 +231,6 @@ class CatalogPanel extends JTabbedPane
{
if (fileTab == null)
{
prefs.put (prefsRootDirectory, "");
prefs.put (prefsLastDiskUsed, "");
prefs.putInt (prefsLastDosUsed, -1);
prefs.put (prefsLastFileUsed, "");
@ -256,8 +238,6 @@ class CatalogPanel extends JTabbedPane
}
else
{
prefs.put (prefsRootDirectory, fileTab.rootFolder.getAbsolutePath ());
if (diskTabs.size () == 0)
{
RedoEvent redoEvent = fileTab.redoData.getCurrentEvent ();
@ -382,20 +362,6 @@ class CatalogPanel extends JTabbedPane
((AppleDiskTab) tab).tree.setSelectionPath (null);
}
// @Override
// public void preferenceChange (PreferenceChangeEvent evt)
// {
// if (evt.getKey ().equals (PreferencesDialog.prefsCatalogFont))
// font = new Font (evt.getNewValue (), Font.PLAIN, font.getSize ());
// if (evt.getKey ().equals (PreferencesDialog.prefsCatalogFontSize))
// font = new Font (font.getFontName (),
// Font.PLAIN, Integer.parseInt (evt.getNewValue ()));
// if (fileTab != null)
// fileTab.setTreeFont (font);
// for (AppleDiskTab tab : diskTabs)
// tab.setTreeFont (font);
// }
@Override
public void changeFont (FontChangeEvent fontChangeEvent)
{

View File

@ -17,7 +17,7 @@ public class CloseTabAction extends AbstractAction
super ("Close Tab");
putValue (Action.SHORT_DESCRIPTION, "Close the current disk tab");
// putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke ("ctrl W"));
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask ();
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx ();
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke (KeyEvent.VK_W, mask));
// putValue (Action.MNEMONIC_KEY, KeyEvent.VK_W);
this.catalogPanel = catalogPanel;

View File

@ -24,6 +24,8 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
private static final String OS = System.getProperty ("os.name").toLowerCase ();
private static final boolean MAC = OS.startsWith ("mac os");
private final RootFolderData rootFolderData = new RootFolderData ();
public DiskBrowser ()
{
super (windowTitle);
@ -56,11 +58,8 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
addPanel (diskLayoutPanel, "Disk layout", BorderLayout.EAST);
// create actions
RootFolderData rootFolderData = catalogPanel.getRootFolderData ();
DuplicateAction duplicateAction = new DuplicateAction (rootFolderData);
RootDirectoryAction rootDirectoryAction = new RootDirectoryAction (rootFolderData);
rootDirectoryAction.addListener (catalogPanel);
rootDirectoryAction.addListener (duplicateAction);
RootDirectoryAction rootDirectoryAction = new RootDirectoryAction ();
RefreshTreeAction refreshTreeAction = new RefreshTreeAction (catalogPanel);
// PreferencesAction preferencesAction = new PreferencesAction (this, prefs);
@ -82,6 +81,10 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
// toolBar.add (aboutAction);
// set the listeners
rootDirectoryAction.addListener (rootFolderData);
rootDirectoryAction.addListener (catalogPanel);
rootDirectoryAction.addListener (duplicateAction);
catalogPanel.addDiskSelectionListener (this);
catalogPanel.addDiskSelectionListener (dataPanel);
catalogPanel.addDiskSelectionListener (diskLayoutPanel);
@ -121,6 +124,7 @@ public class DiskBrowser extends JFrame implements DiskSelectionListener, QuitLi
menuHandler.duplicateItem.setAction (duplicateAction);
menuHandler.closeTabItem.setAction (closeTabAction);
addQuitListener (rootDirectoryAction);
addQuitListener (menuHandler);
addQuitListener (catalogPanel);
addQuitListener (this);

View File

@ -3,6 +3,7 @@ package com.bytezone.diskbrowser.gui;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.Action;
import javax.swing.JOptionPane;
@ -11,7 +12,6 @@ import javax.swing.KeyStroke;
import com.bytezone.common.DefaultAction;
import com.bytezone.diskbrowser.duplicates.DiskDetails;
import com.bytezone.diskbrowser.duplicates.RootFolderData;
import com.bytezone.diskbrowser.gui.RootDirectoryAction.RootDirectoryChangeListener;
public class DuplicateAction extends DefaultAction implements RootDirectoryChangeListener
{
@ -26,15 +26,15 @@ public class DuplicateAction extends DefaultAction implements RootDirectoryChang
setIcon (Action.SMALL_ICON, "save_delete_16.png");
setIcon (Action.LARGE_ICON_KEY, "save_delete_32.png");
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask ();
int mask = Toolkit.getDefaultToolkit ().getMenuShortcutKeyMaskEx ();
putValue (Action.ACCELERATOR_KEY, KeyStroke.getKeyStroke (KeyEvent.VK_L, mask));
setEnabled (rootFolderData.getRootFolder () != null);
}
@Override
public void rootDirectoryChanged (RootFolderData rootFolderData)
public void rootDirectoryChanged (File rootFolder)
{
assert rootFolderData == this.rootFolderData;
assert rootFolderData.getRootFolder () == rootFolder;
setEnabled (rootFolderData.getRootFolder () != null);
}

View File

@ -5,6 +5,7 @@ import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.prefs.Preferences;
import javax.swing.Action;
import javax.swing.JFileChooser;
@ -12,15 +13,14 @@ import javax.swing.KeyStroke;
import com.bytezone.common.DefaultAction;
import com.bytezone.common.Platform;
import com.bytezone.diskbrowser.duplicates.RootFolderData;
class RootDirectoryAction extends DefaultAction
public class RootDirectoryAction extends DefaultAction implements QuitListener
{
private final RootFolderData rootFolderData;
private final List<RootDirectoryChangeListener> listeners =
new ArrayList<RootDirectoryAction.RootDirectoryChangeListener> ();
private static final String prefsRootDirectory = "Root directory";
private final List<RootDirectoryChangeListener> listeners = new ArrayList<> ();
private File rootFolder;
public RootDirectoryAction (RootFolderData rootFolderData)
public RootDirectoryAction ()
{
super ("Set HOME folder...", "Defines root folder where the disk images are kept",
"/com/bytezone/diskbrowser/icons/");
@ -29,8 +29,6 @@ class RootDirectoryAction extends DefaultAction
setIcon (Action.SMALL_ICON, "folder_explore_16.png");
setIcon (Action.LARGE_ICON_KEY, "folder_explore_32.png");
this.rootFolderData = rootFolderData;
}
@Override
@ -39,8 +37,8 @@ class RootDirectoryAction extends DefaultAction
JFileChooser chooser = new JFileChooser (Platform.userHome);
chooser.setDialogTitle ("Select FOLDER containing disk images");
chooser.setFileSelectionMode (JFileChooser.DIRECTORIES_ONLY);
if (rootFolderData.getRootFolder () != null)
chooser.setSelectedFile (rootFolderData.getRootFolder ());
if (rootFolder != null)
chooser.setSelectedFile (rootFolder);
int result = chooser.showDialog (null, "Accept");
if (result == JFileChooser.APPROVE_OPTION)
@ -50,9 +48,8 @@ class RootDirectoryAction extends DefaultAction
file = file.getParentFile ();
if (file != null)
{
rootFolderData.setRootFolder (file);
for (RootDirectoryChangeListener listener : listeners)
listener.rootDirectoryChanged (rootFolderData);
listener.rootDirectoryChanged (file);
}
}
}
@ -63,8 +60,28 @@ class RootDirectoryAction extends DefaultAction
listeners.add (listener);
}
interface RootDirectoryChangeListener
@Override
public void quit (Preferences prefs)
{
public void rootDirectoryChanged (RootFolderData rootFolderData);
if (rootFolder == null)
prefs.put (prefsRootDirectory, "");
else
prefs.put (prefsRootDirectory, rootFolder.getAbsolutePath ());
}
@Override
public void restore (Preferences prefs)
{
String rootDirectory = prefs.get (prefsRootDirectory, "");
File rootDirectoryFile = new File (rootDirectory);
if (!rootDirectoryFile.exists () || !rootDirectoryFile.isDirectory ())
{
System.out.println ("No root directory");
return;
}
this.rootFolder = rootDirectoryFile;
for (RootDirectoryChangeListener listener : listeners)
listener.rootDirectoryChanged (rootDirectoryFile);
}
}

View File

@ -0,0 +1,8 @@
package com.bytezone.diskbrowser.gui;
import java.io.File;
public interface RootDirectoryChangeListener
{
public void rootDirectoryChanged (File rootFolder);
}