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

137 lines
3.5 KiB
Java
Raw Normal View History

2016-12-07 10:42:01 +00:00
package com.bytezone.diskbrowser.duplicates;
2016-12-12 07:43:19 +00:00
import java.awt.Dimension;
2016-12-11 21:32:18 +00:00
import java.awt.Graphics;
2016-12-07 10:42:01 +00:00
import java.io.File;
import java.util.List;
2016-12-07 10:42:01 +00:00
2016-12-11 21:32:18 +00:00
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
2016-12-07 10:42:01 +00:00
import com.bytezone.diskbrowser.utilities.Utility;
2016-12-12 08:31:58 +00:00
public class DuplicateSwingWorker extends SwingWorker<Void, ProgressState>
2016-12-07 10:42:01 +00:00
{
private final File rootFolder;
2016-12-09 11:31:03 +00:00
private final int rootFolderNameLength;
2016-12-12 10:53:28 +00:00
// private final ProgressState progressState = new ProgressState ();
2016-12-11 21:32:18 +00:00
private final DuplicateWindow owner;
private final JDialog dialog;
private final ProgressPanel progressPanel;
2016-12-12 07:43:19 +00:00
private final boolean doChecksums;
2016-12-12 08:31:58 +00:00
private final RootFolderData rootFolderData;
2016-12-07 10:42:01 +00:00
2016-12-12 10:53:28 +00:00
public DuplicateSwingWorker (File rootFolder, DuplicateWindow owner,
boolean doChecksums)
2016-12-07 10:42:01 +00:00
{
this.rootFolder = rootFolder;
this.owner = owner;
2016-12-12 07:43:19 +00:00
this.doChecksums = doChecksums;
2016-12-09 11:31:03 +00:00
rootFolderNameLength = rootFolder.getAbsolutePath ().length ();
2016-12-11 21:32:18 +00:00
2016-12-12 08:31:58 +00:00
rootFolderData = new RootFolderData ();
2016-12-11 21:32:18 +00:00
dialog = new JDialog (owner);
progressPanel = new ProgressPanel ();
2016-12-12 07:43:19 +00:00
progressPanel.setPreferredSize (new Dimension (485, 300));
2016-12-11 21:32:18 +00:00
dialog.add (progressPanel);
dialog.setTitle ("Reading disks");
2016-12-12 07:43:19 +00:00
dialog.pack ();
dialog.setLocationRelativeTo (null);
2016-12-11 21:32:18 +00:00
dialog.setVisible (true);
2016-12-09 11:31:03 +00:00
}
2016-12-08 01:19:18 +00:00
2016-12-09 11:31:03 +00:00
File getRootFolder ()
{
return rootFolder;
}
2016-12-08 01:19:18 +00:00
private void traverse (File directory)
2016-12-07 10:42:01 +00:00
{
File[] files = directory.listFiles ();
2016-12-09 11:31:03 +00:00
2016-12-07 10:42:01 +00:00
if (files == null || files.length == 0)
{
System.out.println ("Empty folder : " + directory.getAbsolutePath ());
return;
}
for (File file : files)
{
2016-12-09 11:31:03 +00:00
String fileName = file.getName ().toLowerCase ();
2016-12-07 10:42:01 +00:00
if (file.isDirectory ())
{
2016-12-12 10:53:28 +00:00
rootFolderData.progressState.incrementFolders ();
2016-12-08 01:19:18 +00:00
traverse (file);
2016-12-07 10:42:01 +00:00
}
else if (Utility.validFileType (fileName) && file.length () > 0)
2016-12-07 10:42:01 +00:00
{
2016-12-12 10:53:28 +00:00
rootFolderData.progressState.incrementType (file, fileName);
2016-12-09 11:31:03 +00:00
checkDuplicates (file, fileName);
2016-12-12 10:53:28 +00:00
if ((rootFolderData.progressState.totalDisks % 500) == 0)
publish (rootFolderData.progressState);
2016-12-07 10:42:01 +00:00
}
}
}
private void checkDuplicates (File file, String filename)
2016-12-07 10:42:01 +00:00
{
2016-12-09 11:31:03 +00:00
String rootName = file.getAbsolutePath ().substring (rootFolderNameLength);
2016-12-12 07:43:19 +00:00
DiskDetails diskDetails = new DiskDetails (file, rootName, filename, doChecksums);
2016-12-07 10:42:01 +00:00
2016-12-12 08:31:58 +00:00
if (rootFolderData.fileNameMap.containsKey (filename))
rootFolderData.fileNameMap.get (filename).addDuplicateName (diskDetails);
2016-12-09 11:31:03 +00:00
else
2016-12-12 08:31:58 +00:00
rootFolderData.fileNameMap.put (filename, diskDetails);
2016-12-07 10:42:01 +00:00
2016-12-12 07:43:19 +00:00
if (doChecksums)
{
long checksum = diskDetails.getChecksum ();
2016-12-12 08:31:58 +00:00
if (rootFolderData.checksumMap.containsKey (checksum))
rootFolderData.checksumMap.get (checksum).addDuplicateChecksum (diskDetails);
2016-12-12 07:43:19 +00:00
else
2016-12-12 08:31:58 +00:00
rootFolderData.checksumMap.put (checksum, diskDetails);
2016-12-12 07:43:19 +00:00
}
2016-12-07 10:42:01 +00:00
}
@Override
protected void done ()
2016-12-07 10:42:01 +00:00
{
try
2016-12-07 10:42:01 +00:00
{
2016-12-11 21:32:18 +00:00
dialog.setVisible (false);
2016-12-12 10:53:28 +00:00
owner.setTableData (rootFolderData);
}
catch (Exception e)
{
e.printStackTrace ();
2016-12-07 10:42:01 +00:00
}
}
@Override
protected Void doInBackground () throws Exception
{
traverse (rootFolder);
2016-12-12 10:53:28 +00:00
rootFolderData.progressState.print ();
return null;
}
@Override
protected void process (List<ProgressState> chunks)
{
2016-12-11 21:32:18 +00:00
progressPanel.repaint ();
}
class ProgressPanel extends JPanel
{
@Override
protected void paintComponent (Graphics graphics)
{
super.paintComponent (graphics);
2016-12-12 10:53:28 +00:00
rootFolderData.progressState.paintComponent (graphics);
2016-12-11 21:32:18 +00:00
}
}
2016-12-07 10:42:01 +00:00
}