dmolony-DiskBrowser/src/com/bytezone/diskbrowser/duplicates/RootFolderData.java

298 lines
7.8 KiB
Java
Raw Normal View History

2016-12-12 08:31:58 +00:00
package com.bytezone.diskbrowser.duplicates;
2016-12-15 00:01:42 +00:00
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
2016-12-12 23:46:09 +00:00
import java.io.File;
import java.util.ArrayList;
2016-12-12 08:31:58 +00:00
import java.util.HashMap;
2016-12-12 23:46:09 +00:00
import java.util.List;
2016-12-12 08:31:58 +00:00
import java.util.Map;
import java.util.TreeMap;
2016-12-15 00:01:42 +00:00
import javax.swing.JButton;
2016-12-16 20:45:08 +00:00
import javax.swing.JFrame;
2016-12-12 23:46:09 +00:00
import javax.swing.JPanel;
import com.bytezone.diskbrowser.gui.DuplicateAction.DiskTableSelectionListener;
2016-12-13 10:03:15 +00:00
import com.bytezone.diskbrowser.utilities.Utility;
2016-12-12 23:46:09 +00:00
2016-12-12 08:31:58 +00:00
public class RootFolderData
{
2016-12-13 22:26:47 +00:00
private static final String header =
" type uncmp .gz .zip total";
private static final String line = "-------------- ------- ------- ------- -------";
private static final Font font = new Font ("Monospaced", Font.BOLD, 15);
2016-12-13 10:03:15 +00:00
private File rootFolder;
2016-12-13 22:26:47 +00:00
private int rootFolderNameLength;
2016-12-12 23:46:09 +00:00
2016-12-13 10:03:15 +00:00
final Map<Long, DiskDetails> checksumMap = new HashMap<Long, DiskDetails> ();
final Map<String, DiskDetails> fileNameMap = new TreeMap<String, DiskDetails> ();
2016-12-12 23:46:09 +00:00
2016-12-15 00:01:42 +00:00
public DisksWindow disksWindow;
2016-12-12 23:46:09 +00:00
public final List<DiskTableSelectionListener> listeners =
new ArrayList<DiskTableSelectionListener> ();
public boolean doChecksums;
2016-12-13 10:03:15 +00:00
int totalDisks;
int totalFolders;
// total files for each suffix (uncompressed, .gz, .zip, total)
int[][] typeTotals;
2016-12-12 23:46:09 +00:00
2016-12-15 00:01:42 +00:00
// Progress dialog
ProgressPanel progressPanel;
2016-12-16 20:45:08 +00:00
public JFrame dialogTotals;
2016-12-15 00:01:42 +00:00
JPanel southPanel;
JButton btnCancel;
JButton btnOK;
private void createWindows ()
2016-12-12 23:46:09 +00:00
{
2016-12-15 00:01:42 +00:00
southPanel = new JPanel ();
btnCancel = new JButton ("Cancel");
btnOK = new JButton ("OK");
2016-12-12 23:46:09 +00:00
progressPanel = new ProgressPanel ();
2016-12-16 20:45:08 +00:00
progressPanel.setPreferredSize (new Dimension (560, 340));
2016-12-13 10:03:15 +00:00
2016-12-16 20:45:08 +00:00
dialogTotals = new JFrame ("Disk Totals");
2016-12-15 00:01:42 +00:00
dialogTotals.add (progressPanel, BorderLayout.CENTER);
2016-12-15 07:27:38 +00:00
southPanel.add (btnCancel); // needs to be here for the pack()
2016-12-15 00:01:42 +00:00
dialogTotals.add (southPanel, BorderLayout.SOUTH);
2016-12-16 20:45:08 +00:00
// dialogTotals.setTitle ("Disk Totals");
2016-12-13 22:26:47 +00:00
dialogTotals.pack ();
dialogTotals.setLocationRelativeTo (null);
2016-12-15 00:01:42 +00:00
btnCancel.addActionListener (new ActionListener ()
{
@Override
public void actionPerformed (ActionEvent e)
{
progressPanel.cancelled = true;
dialogTotals.setVisible (false);
}
});
btnOK.addActionListener (new ActionListener ()
{
@Override
public void actionPerformed (ActionEvent e)
{
dialogTotals.setVisible (false);
}
});
}
public void count (boolean doChecksums)
{
if (dialogTotals == null)
createWindows ();
clear ();
setButton (btnCancel);
this.doChecksums = doChecksums;
progressPanel.cancelled = false;
disksWindow = new DisksWindow (this);
dialogTotals.setVisible (true);
new DuplicateSwingWorker (this).execute (); // start SwingWorker
}
public void done () // SwingWorker has completed
{
print ();
dialogTotals.repaint ();
dialogTotals.setVisible (false);
if (progressPanel.cancelled)
disksWindow = null;
else
{
disksWindow.setTableData (this);
setButton (btnOK);
}
}
private void setButton (JButton button)
{
southPanel.removeAll ();
southPanel.add (button);
dialogTotals.revalidate ();
dialogTotals.repaint ();
2016-12-12 23:46:09 +00:00
}
2016-12-12 08:31:58 +00:00
2016-12-13 10:03:15 +00:00
public void setRootFolder (File rootFolder)
{
this.rootFolder = rootFolder;
2016-12-15 00:01:42 +00:00
rootFolderNameLength = rootFolder.getAbsolutePath ().length ();
disksWindow = null; // force a recount
}
private void clear ()
{
2016-12-13 10:03:15 +00:00
typeTotals = new int[4][Utility.suffixes.size ()];
totalDisks = 0;
totalFolders = 0;
checksumMap.clear ();
fileNameMap.clear ();
}
public File getRootFolder ()
{
return rootFolder;
}
public void incrementFolders ()
{
++totalFolders;
}
public void incrementType (File file, String filename)
{
int pos = Utility.getSuffixNo (filename);
if (pos >= 0)
{
int cmp = 0;
if (filename.endsWith (".gz"))
cmp = 1;
else if (filename.endsWith (".zip"))
cmp = 2;
typeTotals[cmp][pos]++;
typeTotals[3][pos]++;
++totalDisks;
}
else
System.out.println ("no suffix: " + filename);
2016-12-13 22:26:47 +00:00
checkDuplicates (file, filename);
}
private void checkDuplicates (File file, String filename)
{
String rootName = file.getAbsolutePath ().substring (rootFolderNameLength);
DiskDetails diskDetails = new DiskDetails (file, rootName, filename, doChecksums);
if (fileNameMap.containsKey (filename))
fileNameMap.get (filename).addDuplicateName (diskDetails);
else
fileNameMap.put (filename, diskDetails);
if (doChecksums)
{
long checksum = diskDetails.getChecksum ();
if (checksumMap.containsKey (checksum))
checksumMap.get (checksum).addDuplicateChecksum (diskDetails);
else
checksumMap.put (checksum, diskDetails);
}
2016-12-13 10:03:15 +00:00
}
2016-12-16 20:45:08 +00:00
public List<DiskDetails> listDuplicates (long checksum)
{
List<DiskDetails> list = new ArrayList<DiskDetails> ();
DiskDetails original = checksumMap.get (checksum);
if (original != null)
{
list.add (original);
for (DiskDetails dd : original.getDuplicateChecksums ())
list.add (dd);
}
return list;
}
2016-12-15 00:01:42 +00:00
public int getTotalType (int type)
{
return typeTotals[0][type] + typeTotals[1][type] + typeTotals[2][type];
}
2016-12-13 10:03:15 +00:00
public void print ()
{
System.out.printf ("%nFolders ...... %,7d%n", totalFolders);
System.out.printf ("Disks ........ %,7d%n%n", totalDisks);
int grandTotal[] = new int[4];
System.out.println (header);
System.out.println (line);
for (int i = 0; i < typeTotals[0].length; i++)
{
System.out.printf ("%14.14s ", Utility.suffixes.get (i) + " ...........");
for (int j = 0; j < typeTotals.length; j++)
{
System.out.printf ("%,7d ", typeTotals[j][i]);
grandTotal[j] += typeTotals[j][i];
}
System.out.println ();
}
System.out.println (line);
System.out.printf ("Total %,7d %,7d %,7d %,7d%n%n", grandTotal[0],
grandTotal[1], grandTotal[2], grandTotal[3]);
2016-12-15 07:27:38 +00:00
if (doChecksums)
{
System.out.printf ("Unique checksums: %,7d%n", checksumMap.size ());
System.out.printf ("Duplicate disks : %,7d%n", totalDisks - checksumMap.size ());
}
2016-12-13 10:03:15 +00:00
}
2016-12-12 23:46:09 +00:00
class ProgressPanel extends JPanel
{
2016-12-15 00:01:42 +00:00
public volatile boolean cancelled;
2016-12-12 23:46:09 +00:00
@Override
protected void paintComponent (Graphics graphics)
{
super.paintComponent (graphics);
2016-12-13 10:03:15 +00:00
Graphics2D g = (Graphics2D) graphics;
g.setColor (Color.BLACK);
g.setFont (font);
int x = 55;
int y = 25;
int lineHeight = 23;
String line;
g.drawString (header, x, y);
y += lineHeight + 10;
int grandTotal[] = new int[4];
for (int i = 0; i < typeTotals[0].length; i++)
{
line = String.format ("%14.14s %,7d %,7d %,7d %,7d",
Utility.suffixes.get (i) + " ...........", typeTotals[0][i], typeTotals[1][i],
typeTotals[2][i], typeTotals[3][i]);
g.drawString (line, x, y);
for (int j = 0; j < typeTotals.length; j++)
grandTotal[j] += typeTotals[j][i];
y += lineHeight;
}
line = String.format ("Total %,7d %,7d %,7d %,7d%n%n", grandTotal[0],
grandTotal[1], grandTotal[2], grandTotal[3]);
y += 10;
g.drawString (line, x, y);
2016-12-16 20:45:08 +00:00
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;
g.drawString (line, x, y);
}
2016-12-12 23:46:09 +00:00
}
}
2016-12-12 08:31:58 +00:00
}