From 87e8d830ce975929a958662271d86609c6a665e2 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sun, 15 Feb 2009 12:20:43 +0000 Subject: [PATCH] * full support for multiple checksum types (SFV, MD5, SHA-1) notes: * updated to MigLayout 3.6.3 * better exception handling in *TransferablePolicy * added checksum toggle button and artwork * poperly cancel computation tasks on reset * better "Total Progress" visibility behaviour * improved checksum table model classes, better update/repaint behaviour --- fw/button.checksum.png | Bin 0 -> 37070 bytes fw/button.checksum.selected.png | Bin 0 -> 38249 bytes lib/miglayout.jar | Bin 74535 -> 107221 bytes .../filebot/resources/button.checksum.png | Bin 0 -> 1048 bytes .../resources/button.checksum.selected.png | Bin 0 -> 1335 bytes .../sourceforge/filebot/ui/FileBotWindow.java | 4 +- .../ui/FileTransferableMessageHandler.java | 2 +- .../analyze/FileTreeTransferablePolicy.java | 1 + .../list/FileListTransferablePolicy.java | 38 +-- .../rename/NamesListTransferablePolicy.java | 35 +-- .../filebot/ui/panel/sfv/ChecksumButton.java | 80 +++++ .../filebot/ui/panel/sfv/ChecksumCell.java | 119 ++++--- .../ui/panel/sfv/ChecksumCellRenderer.java | 58 ++++ .../panel/sfv/ChecksumComputationService.java | 39 ++- .../ui/panel/sfv/ChecksumComputationTask.java | 59 ++-- .../filebot/ui/panel/sfv/ChecksumPanel.java | 293 ++++++++++++++++++ .../filebot/ui/panel/sfv/ChecksumRow.java | 64 +++- .../sfv/{SfvTable.java => ChecksumTable.java} | 12 +- .../panel/sfv/ChecksumTableCellRenderer.java | 115 ------- .../panel/sfv/ChecksumTableExportHandler.java | 50 ++- .../ui/panel/sfv/ChecksumTableModel.java | 218 ++++++++----- .../sfv/ChecksumTableTransferablePolicy.java | 198 ++++++++++++ .../filebot/ui/panel/sfv/HashType.java | 83 ++++- .../sfv/HighlightPatternCellRenderer.java | 19 +- .../filebot/ui/panel/sfv/SfvPanel.java | 182 ----------- .../ui/panel/sfv/SfvTransferablePolicy.java | 168 ---------- ...nderer.java => StateIconCellRenderer.java} | 4 +- .../ui/panel/sfv/SwingWorkerCellRenderer.java | 74 +++++ .../ui/panel/sfv/TotalProgressPanel.java | 104 ++++--- .../ui/panel/sfv/VerificationFilePrinter.java | 42 +++ .../ui/panel/sfv/VerificationFileScanner.java | 144 +++++++++ .../BackgroundFileTransferablePolicy.java | 88 +++--- .../ui/transfer/DefaultClipboardHandler.java | 55 ++-- .../ui/transfer/FileTransferablePolicy.java | 75 ++--- .../filebot/ui/transfer/LoadAction.java | 17 +- .../ui/transfer/TransferablePolicy.java | 7 +- .../TransferablePolicyFileFilter.java | 7 +- .../tuned/DefaultThreadFactory.java | 7 +- .../sourceforge/tuned/ExceptionUtilities.java | 2 +- source/net/sourceforge/tuned/MessageBus.java | 8 +- .../net/sourceforge/tuned/MessageHandler.java | 2 +- .../net/sourceforge/tuned/ui/ActionPopup.java | 5 + .../sourceforge/tuned/ui/TunedUtilities.java | 1 - .../sourceforge/filebot/FileBotTestSuite.java | 2 +- test/net/sourceforge/filebot/MiscSuite.java | 15 + .../sfv/VerificationFileScannerTest.java | 50 +++ 46 files changed, 1685 insertions(+), 861 deletions(-) create mode 100644 fw/button.checksum.png create mode 100644 fw/button.checksum.selected.png create mode 100644 source/net/sourceforge/filebot/resources/button.checksum.png create mode 100644 source/net/sourceforge/filebot/resources/button.checksum.selected.png create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/ChecksumButton.java create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCellRenderer.java create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java rename source/net/sourceforge/filebot/ui/panel/sfv/{SfvTable.java => ChecksumTable.java} (85%) delete mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableCellRenderer.java create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableTransferablePolicy.java delete mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java delete mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/SfvTransferablePolicy.java rename source/net/sourceforge/filebot/ui/panel/sfv/{StateIconTableCellRenderer.java => StateIconCellRenderer.java} (91%) create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/SwingWorkerCellRenderer.java create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/VerificationFilePrinter.java create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScanner.java create mode 100644 test/net/sourceforge/filebot/MiscSuite.java create mode 100644 test/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScannerTest.java diff --git a/fw/button.checksum.png b/fw/button.checksum.png new file mode 100644 index 0000000000000000000000000000000000000000..21ea583d510a392709f1c62755052765409bd999 GIT binary patch literal 37070 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

-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 ZE--39tdxrMM;%_4TV1t-RbBCk|1a>oZRY?0 literal 0 HcmV?d00001 diff --git a/fw/button.checksum.selected.png b/fw/button.checksum.selected.png new file mode 100644 index 0000000000000000000000000000000000000000..5d25e591748eef44847439acf8e8336082cda511 GIT binary patch literal 38249 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%0A@AXCd^bgMfL;^Z77 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 literal 0 HcmV?d00001 diff --git a/lib/miglayout.jar b/lib/miglayout.jar index 5c3552ac9abf1e84666a69cf6834d84d329c63d7..fdbfd884fc0670362551e353ca23dfdcaeb9b761 100644 GIT binary patch literal 107221 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%0D4`QO!cI8fZa816@^^Vtghg9${BPh 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

G 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 BqJ97X literal 74535 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 T#g4V?coSs6NOl6a^1%Ba+oJ12 diff --git a/source/net/sourceforge/filebot/resources/button.checksum.png b/source/net/sourceforge/filebot/resources/button.checksum.png new file mode 100644 index 0000000000000000000000000000000000000000..766a1b6273eddecf673fc4f5c4e2b995bd9e3015 GIT binary patch literal 1048 zcmV+z1n2vSP)w(EZ*psMAUL&X(s%#> z18qq}K~zYIt(RSk8&w#`|7YgROD40Ked|VyE{j?)Web9!MMFUFM!fMO2>Jo^3s?pH z0D_mLh__zorO=DQbZBo>kQAnims+>Ao9^aqCi8Y4FS?VRq?4J%Mq%>e76Z@$3;`SgxZ~PRuV?_92ik16-eaPvwp+TQX`fj2y;@deo%VnAtooig9*#Z-@FNFsC@Z|7Xc~lAz4q3* zNYyYPEBxhVyY(6eaHyN6waNsuW0&5}(ibF2&&5^4*a$}68yvu8BHElQEJUtA9xP+* zSvvziiDmTDSavJ`uyfsPE>{%`K%E1yL>z;XWUdIyfXz;r?dL5vjg{ri9iIpQ5F9`U zlGGz2t8B7m;@JhSQdUtA^Z`8N0DcQS?=%Hn#)>}g!f>KEFZ6s5!0#Nu{Wy${L(e}@ zD*93)6DSlMizL99G}T|!f{_OzI&y92Z^^ZtaS}y0hEJdNDM>KpB_~wYg-9SolGCS2 zJM9;_5Mt6Ebh}<0hTj4gC)3a4;ppz@^sG=I6-nD!&&w-<$ji;@51yPL3WB=;egUR0 zB@M<{XRGnz*0b~eqW((jEiDm=P50B-f+ckE$wxSQ^!Ohly6oDHHwAhQdnhZ)4@Pa{ z^@>%iNRqse@YEi<;EyP;c7+fa_XoZ|79HM zAX4FVUh{|uln4aAk8yv{jpOJiO2n7x^=>X`2Drs!=`#TD%Q6>=rWq2KOaF?@?xETE ztcf@dqagG}9P0pX5z$w!?fjajI~Q~o8o*lsQ~w(EZ*psMAUL&X(s%#> z1dK^UK~z|UrB_Xe97PoVUUg0P%#4{l{vg5a625?p>^;IF^xf91Omk#rZu~%u*+MAjD0ZFZpDZo>H z2{JSM4aWVit#xlzTsB*HPbsw?*=6*{b=?wG`Ag>*&)3he12BvkLMo30W!RImFiCqt z>Ol3hnQUE=ueX(`0(dP&n5w*J&6xS>E573!P6x>&kpa#uz+wJb_9}o=+7S(B-hJ_z zchvXSKLo;(a9#HaO!?nA?{*%iv23a-Z8A#*OC5=h964htl4CLhYXat@$}L*6jw_|^ zNC05RT#(P{X>Ziet-;*V;AFR;nA0vP@tA=fJ}IuVb_dwU3XRj zIA|Wzqb79RNdN#qqGmbu<`=wFMI;mc-b`0G>y=pvU`ki~iH^~^K~e;EIIp;vqU|xq z-g=}{b5J=b0oXleNg_onlN9Foq|+affpXZeA)6MIQa=l&)TY?Bu2yfK*0_bvk^O zVmd#C+yBM%mfe&KH?FRHGC&vrW=}r-+18=f={qm4+rxwOg9$U7T!iamvLNUYSQ2C4>hX6I_Le38iST z#J~gqO#Nrf9*x(#8-_NE3H~NPtD?hyp#x2CDy6&{bcRZJ!w{dtDBEI$Mrn*k zd)Z(bcn66oSmE$~CXyNF=t?@6T^K-b@wUHh+Q#Dse7eM%-&aa?vUm+8oFG37;7I_J t04h1q=<2>3SqHEQ;3j}Slv3S1@P8b{hTY(7sY3t&002ovPDHLkV1h5gSd;(& literal 0 HcmV?d00001 diff --git a/source/net/sourceforge/filebot/ui/FileBotWindow.java b/source/net/sourceforge/filebot/ui/FileBotWindow.java index 21ac4fc7..44c1d213 100644 --- a/source/net/sourceforge/filebot/ui/FileBotWindow.java +++ b/source/net/sourceforge/filebot/ui/FileBotWindow.java @@ -26,7 +26,7 @@ import net.sourceforge.filebot.ui.panel.analyze.AnalyzePanel; import net.sourceforge.filebot.ui.panel.episodelist.EpisodeListPanel; import net.sourceforge.filebot.ui.panel.list.ListPanel; import net.sourceforge.filebot.ui.panel.rename.RenamePanel; -import net.sourceforge.filebot.ui.panel.sfv.SfvPanel; +import net.sourceforge.filebot.ui.panel.sfv.ChecksumPanel; import net.sourceforge.filebot.ui.panel.subtitle.SubtitlePanel; import net.sourceforge.tuned.MessageBus; import net.sourceforge.tuned.MessageHandler; @@ -85,7 +85,7 @@ public class FileBotWindow extends JFrame implements ListSelectionListener { panels.add(new AnalyzePanel()); panels.add(new EpisodeListPanel()); panels.add(new SubtitlePanel()); - panels.add(new SfvPanel()); + panels.add(new ChecksumPanel()); return panels; } diff --git a/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java b/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java index 0447dd93..8f66a3ae 100644 --- a/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java +++ b/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java @@ -29,7 +29,7 @@ public class FileTransferableMessageHandler implements MessageHandler { @Override - public void handle(String topic, Object... messages) { + public void handle(String topic, Object... messages) throws Exception { // switch to panel MessageBus.getDefault().publish("panel", panel); diff --git a/source/net/sourceforge/filebot/ui/panel/analyze/FileTreeTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/analyze/FileTreeTransferablePolicy.java index 1e411e99..43b3d11e 100644 --- a/source/net/sourceforge/filebot/ui/panel/analyze/FileTreeTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/analyze/FileTreeTransferablePolicy.java @@ -62,6 +62,7 @@ class FileTreeTransferablePolicy extends BackgroundFileTransferablePolicy files) { try { for (File file : files) { + // use fast file to minimize system calls like length(), isDirectory(), isFile(), ... AbstractTreeNode node = getTreeNode(new FastFile(file.getPath())); // publish on EDT diff --git a/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java index e6932e41..c11d17cb 100644 --- a/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/list/FileListTransferablePolicy.java @@ -11,9 +11,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - import net.sourceforge.filebot.FileBotUtilities; import net.sourceforge.filebot.torrent.Torrent; import net.sourceforge.filebot.ui.FileBotList; @@ -44,7 +41,7 @@ class FileListTransferablePolicy extends FileTransferablePolicy { @Override - protected void load(List files) { + protected void load(List files) throws IOException { // set title based on parent folder of first file list.setTitle(FileUtilities.getFolderName(files.get(0).getParentFile())); @@ -70,26 +67,21 @@ class FileListTransferablePolicy extends FileTransferablePolicy { } - private void loadTorrents(List torrentFiles) { - try { - List torrents = new ArrayList(torrentFiles.size()); - - for (File file : torrentFiles) { - torrents.add(new Torrent(file)); + private void loadTorrents(List torrentFiles) throws IOException { + List torrents = new ArrayList(torrentFiles.size()); + + for (File file : torrentFiles) { + torrents.add(new Torrent(file)); + } + + if (torrentFiles.size() == 1) { + list.setTitle(FileUtilities.getNameWithoutExtension(torrents.get(0).getName())); + } + + for (Torrent torrent : torrents) { + for (Torrent.Entry entry : torrent.getFiles()) { + list.getModel().add(FileUtilities.getNameWithoutExtension(entry.getName())); } - - if (torrentFiles.size() == 1) { - list.setTitle(FileUtilities.getNameWithoutExtension(torrents.get(0).getName())); - } - - for (Torrent torrent : torrents) { - for (Torrent.Entry entry : torrent.getFiles()) { - list.getModel().add(FileUtilities.getNameWithoutExtension(entry.getName())); - } - } - } catch (IOException e) { - // should not happen - Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); } } diff --git a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java index db2b82b0..5a98c6fd 100644 --- a/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/panel/rename/NamesListTransferablePolicy.java @@ -13,6 +13,7 @@ import static net.sourceforge.tuned.FileUtilities.getNameWithoutExtension; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; +import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -45,7 +46,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override - public boolean accept(Transferable tr) { + public boolean accept(Transferable tr) throws Exception { return tr.isDataFlavorSupported(stringFlavor) || super.accept(tr); } @@ -57,7 +58,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override - public void handleTransferable(Transferable tr, TransferAction action) { + public void handleTransferable(Transferable tr, TransferAction action) throws Exception { if (action == TransferAction.PUT) { clear(); } @@ -121,7 +122,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override - protected void load(List files) { + protected void load(List files) throws FileNotFoundException { if (containsOnly(files, LIST_FILES)) { loadListFiles(files); } else if (containsOnly(files, TORRENT_FILES)) { @@ -144,28 +145,24 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { } - protected void loadListFiles(List files) { - try { - List entries = new ArrayList(); + protected void loadListFiles(List files) throws FileNotFoundException { + List entries = new ArrayList(); + + for (File file : files) { + Scanner scanner = new Scanner(file, "UTF-8").useDelimiter(LINE_SEPARATOR); - for (File file : files) { - Scanner scanner = new Scanner(file, "UTF-8").useDelimiter(LINE_SEPARATOR); + while (scanner.hasNext()) { + String line = scanner.next(); - while (scanner.hasNext()) { - String line = scanner.next(); - - if (line.trim().length() > 0) { - entries.add(new MutableString(line)); - } + if (line.trim().length() > 0) { + entries.add(new MutableString(line)); } - - scanner.close(); } - submit(entries); - } catch (IOException e) { - Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); + scanner.close(); } + + submit(entries); } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumButton.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumButton.java new file mode 100644 index 00000000..7e2f93f4 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumButton.java @@ -0,0 +1,80 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import static java.awt.Color.WHITE; +import static java.awt.Cursor.*; +import static java.awt.Font.DIALOG; +import static java.awt.Font.PLAIN; +import static java.awt.RenderingHints.KEY_RENDERING; +import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; +import static java.awt.RenderingHints.VALUE_RENDER_QUALITY; +import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON; +import static java.lang.Math.max; +import static java.lang.Math.round; + +import java.awt.Dimension; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.geom.Rectangle2D; + +import javax.swing.Action; +import javax.swing.ImageIcon; +import javax.swing.JToggleButton; + +import net.sourceforge.filebot.ResourceManager; + + +public class ChecksumButton extends JToggleButton { + + private static final ImageIcon contentArea = ResourceManager.getIcon("button.checksum"); + private static final ImageIcon contentAreaSelected = ResourceManager.getIcon("button.checksum.selected"); + + + public ChecksumButton(Action action) { + super(action); + + setPreferredSize(new Dimension(max(contentAreaSelected.getIconWidth(), contentArea.getIconWidth()), max(contentAreaSelected.getIconHeight(), contentArea.getIconHeight()))); + setMinimumSize(getPreferredSize()); + setMaximumSize(getPreferredSize()); + + setForeground(WHITE); + setFont(new Font(DIALOG, PLAIN, 11)); + + setContentAreaFilled(false); + setFocusPainted(false); + + setEnabled(true); + } + + + @Override + public void setEnabled(boolean enabled) { + super.setEnabled(enabled); + + // set appropriate cursor + setCursor(getPredefinedCursor(enabled ? HAND_CURSOR : DEFAULT_CURSOR)); + } + + + @Override + protected void paintComponent(Graphics g) { + Graphics2D g2d = (Graphics2D) g; + + g2d.setRenderingHint(KEY_TEXT_ANTIALIASING, VALUE_TEXT_ANTIALIAS_ON); + g2d.setRenderingHint(KEY_RENDERING, VALUE_RENDER_QUALITY); + + // paint background image in the center + if (isSelected()) { + contentAreaSelected.paintIcon(this, g2d, (int) round((getWidth() - contentAreaSelected.getIconWidth()) / (double) 2), (int) round((getHeight() - contentAreaSelected.getIconHeight()) / (double) 2)); + } else { + contentArea.paintIcon(this, g2d, (int) round((getWidth() - contentArea.getIconWidth()) / (double) 2), (int) round((getHeight() - contentArea.getIconHeight()) / (double) 2)); + } + + Rectangle2D textBounds = g2d.getFontMetrics().getStringBounds(getText(), g2d); + + // draw text in the center + g2d.drawString(getText(), round((getWidth() - textBounds.getWidth()) / 2) + 1, round(getHeight() / 2 - textBounds.getY() - textBounds.getHeight() / 2)); + } +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCell.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCell.java index afe4d330..69194fab 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCell.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCell.java @@ -4,12 +4,15 @@ package net.sourceforge.filebot.ui.panel.sfv; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; import java.io.File; +import java.util.EnumMap; import java.util.Map; +import java.util.concurrent.CancellationException; + +import javax.swing.SwingWorker.StateValue; +import javax.swing.event.SwingPropertyChangeSupport; import net.sourceforge.tuned.ExceptionUtilities; -import net.sourceforge.tuned.ui.SwingWorkerPropertyChangeAdapter; class ChecksumCell { @@ -37,33 +40,14 @@ class ChecksumCell { } - public ChecksumCell(String name, File root, ChecksumComputationTask computationTask) { + public ChecksumCell(String name, File root, ChecksumComputationTask task) { this.name = name; this.root = root; - this.task = computationTask; + this.hashes = new EnumMap(HashType.class); + this.task = task; // forward property change events - task.addPropertyChangeListener(new SwingWorkerPropertyChangeAdapter() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - super.propertyChange(evt); - - pcs.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); - } - - - @Override - protected void done(PropertyChangeEvent evt) { - try { - hashes = task.get(); - } catch (Exception e) { - error = ExceptionUtilities.getRootCause(e); - } finally { - task = null; - } - } - }); + task.addPropertyChangeListener(taskListener); } @@ -77,11 +61,25 @@ class ChecksumCell { } - public String getChecksum(HashType type) { - if (hashes != null) - return hashes.get(type); + public String getChecksum(HashType hash) { + return hashes.get(hash); + } + + + public void putTask(ChecksumComputationTask computationTask) { + if (task != null) { + task.removePropertyChangeListener(taskListener); + task.cancel(true); + } - return null; + task = computationTask; + error = null; + + // forward property change events + task.addPropertyChangeListener(taskListener); + + // state changed to PENDING + pcs.firePropertyChange("state", null, getState()); } @@ -96,27 +94,31 @@ class ChecksumCell { public State getState() { - if (hashes != null) - return State.READY; - if (error != null) - return State.ERROR; - - switch (task.getState()) { - case PENDING: - return State.PENDING; - default: - return State.PROGRESS; + if (task != null) { + switch (task.getState()) { + case PENDING: + return State.PENDING; + default: + return State.PROGRESS; + } } + + if (error != null) { + return State.ERROR; + } + + return State.READY; } public void dispose() { - // clear property change support first + // clear property change support for (PropertyChangeListener listener : pcs.getPropertyChangeListeners()) { pcs.removePropertyChangeListener(listener); } if (task != null) { + task.removePropertyChangeListener(taskListener); task.cancel(true); } @@ -132,7 +134,42 @@ class ChecksumCell { return String.format("%s %s", name, hashes); } - private PropertyChangeSupport pcs = new PropertyChangeSupport(this); + private final PropertyChangeListener taskListener = new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ("state".equals(evt.getPropertyName())) { + if (evt.getNewValue() == StateValue.DONE) + done(evt); + + // cell state changed because worker state changed + pcs.firePropertyChange("state", null, getState()); + } else { + // progress events + pcs.firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue()); + } + } + + + protected void done(PropertyChangeEvent evt) { + try { + hashes.putAll(task.get()); + } catch (Exception e) { + Throwable cause = ExceptionUtilities.getRootCause(e); + + // ignore cancellation + if (cause instanceof CancellationException) { + return; + } + + error = cause; + } finally { + task = null; + } + } + }; + + private SwingPropertyChangeSupport pcs = new SwingPropertyChangeSupport(this, true); public void addPropertyChangeListener(PropertyChangeListener listener) { diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCellRenderer.java new file mode 100644 index 00000000..72f161d4 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumCellRenderer.java @@ -0,0 +1,58 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import java.awt.Color; +import java.awt.Component; + +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.SwingWorker.StateValue; +import javax.swing.table.DefaultTableCellRenderer; + +import net.sourceforge.tuned.ExceptionUtilities; + + +public class ChecksumCellRenderer extends DefaultTableCellRenderer { + + private final SwingWorkerCellRenderer progressRenderer = new SwingWorkerCellRenderer(); + + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + boolean pendingWorker = false; + + if (value instanceof SwingWorker) { + if (((SwingWorker) value).getState() != StateValue.PENDING) + return progressRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + pendingWorker = true; + } + + // ignore focus + super.getTableCellRendererComponent(table, value, isSelected, false, row, column); + + // restore text color + setForeground(isSelected ? table.getSelectionForeground() : table.getForeground()); + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + + if (pendingWorker) { + setText("Pending..."); + } else if (value == null && !isSelected) { + setBackground(derive(table.getGridColor(), 0.1f)); + } else if (value instanceof Throwable) { + setText(ExceptionUtilities.getRootCauseMessage((Throwable) value)); + + if (!isSelected) { + setForeground(Color.RED); + } + } + + return this; + } + + + private Color derive(Color color, float alpha) { + return new Color(((((int) (alpha * 255)) & 0xFF) << 24) & (color.getRGB() | 0xFF000000), true); + } +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationService.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationService.java index e7ec3509..07b85044 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationService.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationService.java @@ -7,9 +7,10 @@ import static java.lang.Math.max; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -import java.util.ArrayList; -import java.util.List; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -22,7 +23,7 @@ class ChecksumComputationService { public static final String TASK_COUNT_PROPERTY = "taskCount"; - private final List executors = new ArrayList(); + private final Set executors = new HashSet(4); private final AtomicInteger completedTaskCount = new AtomicInteger(0); private final AtomicInteger totalTaskCount = new AtomicInteger(0); @@ -36,7 +37,12 @@ class ChecksumComputationService { public void reset() { synchronized (executors) { for (ExecutorService executor : executors) { - executor.shutdownNow(); + for (Runnable runnable : executor.shutdownNow()) { + // cancel all remaining tasks + if (runnable instanceof Future) { + ((Future) runnable).cancel(false); + } + } } totalTaskCount.set(0); @@ -50,7 +56,7 @@ class ChecksumComputationService { public int getTaskCount() { - return getTotalTaskCount() - getCompletedTaskCount(); + return totalTaskCount.get() - completedTaskCount.get(); } @@ -79,7 +85,10 @@ class ChecksumComputationService { super(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingQueue(), new DefaultThreadFactory("ChecksumComputationPool", Thread.MIN_PRIORITY)); synchronized (executors) { - executors.add(this); + if (executors.add(this) && executors.size() == 1) { + totalTaskCount.set(0); + completedTaskCount.set(0); + } } prestartAllCoreThreads(); @@ -133,8 +142,22 @@ class ChecksumComputationService { protected void afterExecute(Runnable r, Throwable t) { super.afterExecute(r, t); - completedTaskCount.incrementAndGet(); - fireTaskCountChanged(); + if (isValid()) { + if (r instanceof Future && ((Future) r).isCancelled()) { + totalTaskCount.decrementAndGet(); + } else { + completedTaskCount.incrementAndGet(); + } + + fireTaskCountChanged(); + } + } + + + protected boolean isValid() { + synchronized (executors) { + return executors.contains(this); + } } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationTask.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationTask.java index 6b5d8af5..8e3ca49c 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationTask.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumComputationTask.java @@ -4,9 +4,12 @@ package net.sourceforge.filebot.ui.panel.sfv; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.InputStream; import java.util.Collections; import java.util.Map; +import java.util.concurrent.CancellationException; + import javax.swing.SwingWorker; @@ -15,48 +18,52 @@ class ChecksumComputationTask extends SwingWorker, Void> { private static final int BUFFER_SIZE = 32 * 1024; private final File file; - private final HashType type; + private final HashType hashType; - public ChecksumComputationTask(File file, HashType type) { + public ChecksumComputationTask(File file, HashType hashType) { this.file = file; - this.type = type; + this.hashType = hashType; } @Override protected Map doInBackground() throws Exception { - Hash hash = type.newInstance(); + if (!file.exists()) + throw new FileNotFoundException("File not found"); + + // create hash instance + Hash hash = hashType.newHash(); + + // cache length for speed long length = file.length(); - if (length > 0) { - InputStream in = new FileInputStream(file); + // open file + InputStream in = new FileInputStream(file); + + try { + byte[] buffer = new byte[BUFFER_SIZE]; - try { - byte[] buffer = new byte[BUFFER_SIZE]; + long position = 0; + int len = 0; + + while ((len = in.read(buffer)) >= 0) { + position += len; - long position = 0; - int len = 0; + hash.update(buffer, 0, len); - while ((len = in.read(buffer)) >= 0) { - position += len; - - hash.update(buffer, 0, len); - - // update progress - setProgress((int) ((position * 100) / length)); - - // check abort status - if (isCancelled()) { - break; - } + // update progress + setProgress((int) ((position * 100) / length)); + + // check abort status + if (isCancelled() || Thread.interrupted()) { + throw new CancellationException(); } - } finally { - in.close(); } + } finally { + in.close(); } - return Collections.singletonMap(type, hash.digest()); + return Collections.singletonMap(hashType, hash.digest()); } - } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java new file mode 100644 index 00000000..3ca22bbd --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java @@ -0,0 +1,293 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import static net.sourceforge.filebot.ui.panel.sfv.ChecksumTableModel.*; +import static net.sourceforge.filebot.ui.transfer.BackgroundFileTransferablePolicy.*; +import java.awt.event.ActionEvent; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ExecutorService; + +import javax.swing.AbstractAction; +import javax.swing.ButtonGroup; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JToggleButton; +import javax.swing.KeyStroke; +import javax.swing.SwingUtilities; +import javax.swing.border.TitledBorder; +import net.miginfocom.swing.MigLayout; +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.FileBotPanel; +import net.sourceforge.filebot.ui.FileTransferableMessageHandler; +import net.sourceforge.filebot.ui.SelectDialog; +import net.sourceforge.filebot.ui.transfer.DefaultTransferHandler; +import net.sourceforge.filebot.ui.transfer.LoadAction; +import net.sourceforge.filebot.ui.transfer.SaveAction; +import net.sourceforge.tuned.FileUtilities; +import net.sourceforge.tuned.MessageHandler; +import net.sourceforge.tuned.ui.TunedUtilities; + + +public class ChecksumPanel extends FileBotPanel { + + private final ChecksumComputationService computationService = new ChecksumComputationService(); + + private final ChecksumTable table = new ChecksumTable(); + + private final ChecksumTableTransferablePolicy transferablePolicy = new ChecksumTableTransferablePolicy(table.getModel(), computationService); + private final ChecksumTableExportHandler exportHandler = new ChecksumTableExportHandler(table.getModel()); + + private final MessageHandler messageHandler = new FileTransferableMessageHandler(this, transferablePolicy); + + + public ChecksumPanel() { + super("SFV", ResourceManager.getIcon("panel.sfv")); + + table.setTransferHandler(new DefaultTransferHandler(transferablePolicy, exportHandler)); + + JPanel contentPane = new JPanel(new MigLayout("insets 0, fill", "", "[fill]10px[nogrid, bottom]4px")); + contentPane.setBorder(new TitledBorder(getPanelName())); + + setLayout(new MigLayout("insets dialog, fill")); + add(contentPane, "grow"); + + contentPane.add(new JScrollPane(table), "grow, wrap"); + + contentPane.add(new JButton(loadAction), "gap left 15px"); + contentPane.add(new JButton(saveAction)); + contentPane.add(new JButton(clearAction), "gap right 40px"); + + // hash function toggle button group + ButtonGroup group = new ButtonGroup(); + + for (HashType hash : HashType.values()) { + JToggleButton button = new ChecksumButton(new ChangeHashTypeAction(hash)); + + group.add(button); + contentPane.add(button); + } + + contentPane.add(new TotalProgressPanel(computationService), "gap left 35px:push, gap right 7px, hidemode 1"); + + // cancel and restart computations whenever the hash function has been changed + table.getModel().addPropertyChangeListener(new PropertyChangeListener() { + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (HASH_TYPE_PROPERTY.equals(evt.getPropertyName())) { + restartComputation((HashType) evt.getNewValue()); + } + } + }); + + // Shortcut DELETE + TunedUtilities.putActionForKeystroke(this, KeyStroke.getKeyStroke("pressed DELETE"), removeAction); + } + + + protected void restartComputation(HashType hash) { + // cancel all running computations + computationService.reset(); + + ChecksumTableModel model = table.getModel(); + + // calculate new hashes, one executor for each checksum column + Map executors = new HashMap(4); + + for (ChecksumRow row : model.rows()) { + for (ChecksumCell cell : row.values()) { + if (cell.getChecksum(hash) == null && cell.getRoot().isDirectory()) { + cell.putTask(new ChecksumComputationTask(new File(cell.getRoot(), cell.getName()), hash)); + + ExecutorService executor = executors.get(cell.getRoot()); + + if (executor == null) { + executor = computationService.newExecutor(); + executors.put(cell.getRoot(), executor); + } + + // start computation + executor.execute(cell.getTask()); + } + } + } + + // start shutdown sequence for all created executors + for (ExecutorService executor : executors.values()) { + executor.shutdown(); + } + } + + + @Override + public MessageHandler getMessageHandler() { + return messageHandler; + } + + private final SaveAction saveAction = new ChecksumTableSaveAction(); + + private final LoadAction loadAction = new LoadAction(transferablePolicy); + + private final AbstractAction clearAction = new AbstractAction("Clear", ResourceManager.getIcon("action.clear")) { + + public void actionPerformed(ActionEvent e) { + transferablePolicy.reset(); + computationService.reset(); + + table.getModel().clear(); + } + }; + + private final AbstractAction removeAction = new AbstractAction("Remove") { + + public void actionPerformed(ActionEvent e) { + if (table.getSelectedRowCount() < 1) + return; + + int firstSelectedRow = table.getSelectedRow(); + + // remove selected rows + table.getModel().remove(table.getSelectedRows()); + + // update computation service task count + computationService.purge(); + + // auto select next row + firstSelectedRow = Math.min(firstSelectedRow, table.getRowCount() - 1); + + table.getSelectionModel().setSelectionInterval(firstSelectedRow, firstSelectedRow); + } + }; + + + protected class ChangeHashTypeAction extends AbstractAction implements PropertyChangeListener { + + private ChangeHashTypeAction(HashType hash) { + super(hash.toString()); + putValue(HASH_TYPE_PROPERTY, hash); + + // initialize selected state + propertyChange(new PropertyChangeEvent(this, HASH_TYPE_PROPERTY, null, table.getModel().getHashType())); + + transferablePolicy.addPropertyChangeListener(this); + table.getModel().addPropertyChangeListener(this); + } + + + @Override + public void actionPerformed(ActionEvent e) { + table.getModel().setHashType((HashType) getValue(HASH_TYPE_PROPERTY)); + } + + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if (LOADING_PROPERTY.equals(evt.getPropertyName())) { + // update enabled state + setEnabled(!(Boolean) evt.getNewValue()); + } else if (HASH_TYPE_PROPERTY.equals(evt.getPropertyName())) { + // update selected state + putValue(SELECTED_KEY, evt.getNewValue() == getValue(HASH_TYPE_PROPERTY)); + } + } + + } + + + protected class ChecksumTableSaveAction extends SaveAction { + + private File selectedColumn = null; + + + public ChecksumTableSaveAction() { + super(exportHandler); + } + + + @Override + public ChecksumTableExportHandler getExportHandler() { + return (ChecksumTableExportHandler) super.getExportHandler(); + } + + + @Override + protected boolean canExport() { + return selectedColumn != null && super.canExport(); + } + + + @Override + protected void export(File file) throws IOException { + getExportHandler().export(file, selectedColumn); + } + + + @Override + protected String getDefaultFileName() { + return getExportHandler().getDefaultFileName(selectedColumn); + } + + + @Override + protected File getDefaultFolder() { + // use the column root as default folder in the file dialog + return selectedColumn; + } + + + @Override + public void actionPerformed(ActionEvent e) { + List options = new ArrayList(); + + // filter out verification file columns + for (File file : table.getModel().checksumColumns()) { + if (file.isDirectory()) + options.add(file); + } + + // can't export anything + if (options.isEmpty()) { + return; + } + + try { + if (options.size() == 1) { + // auto-select option if there is only one option + this.selectedColumn = options.get(0); + } else if (options.size() > 1) { + // user must select one option + SelectDialog selectDialog = new SelectDialog(SwingUtilities.getWindowAncestor(ChecksumPanel.this), options) { + + @Override + protected String convertValueToString(Object value) { + return FileUtilities.getFolderName((File) value); + } + }; + + selectDialog.getHeaderLabel().setText("Select checksum column:"); + selectDialog.setVisible(true); + + this.selectedColumn = selectDialog.getSelectedValue(); + } + + if (this.selectedColumn != null) { + // continue if a column was selected + super.actionPerformed(e); + } + } finally { + // reset selected column + this.selectedColumn = null; + } + } + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumRow.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumRow.java index c21d84c8..4c6e5503 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumRow.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumRow.java @@ -13,6 +13,8 @@ import java.util.HashSet; import java.util.Map; import java.util.Set; +import javax.swing.event.SwingPropertyChangeSupport; + import net.sourceforge.filebot.FileBotUtilities; @@ -53,38 +55,52 @@ class ChecksumRow { } + protected void setState(State newValue) { + State oldValue = this.state; + this.state = newValue; + + pcs.firePropertyChange("state", oldValue, newValue); + } + + public ChecksumCell getChecksum(File root) { return hashes.get(root); } - public void put(ChecksumCell cell) { - ChecksumCell old = hashes.put(cell.getRoot(), cell); - - // dispose of old map entry - if (old != null) { - old.dispose(); - } - - // update state immediately - updateState(); - - // keep state up-to-date - cell.addPropertyChangeListener(updateStateListener); + public Collection values() { + return Collections.unmodifiableCollection(hashes.values()); } - public void updateState() { + public ChecksumCell put(ChecksumCell cell) { + ChecksumCell old = hashes.put(cell.getRoot(), cell); + + // update state immediately, don't fire property change state = getState(hashes.values()); + + // keep state up-to-date + cell.addPropertyChangeListener(updateStateListener); + + return old; } public void dispose() { + // clear property change support + for (PropertyChangeListener listener : pcs.getPropertyChangeListeners()) { + pcs.removePropertyChangeListener(listener); + } + for (ChecksumCell cell : hashes.values()) { cell.dispose(); } - hashes.clear(); + name = null; + embeddedChecksum = null; + hashes = null; + state = null; + pcs = null; } @@ -111,7 +127,7 @@ class ChecksumRow { String checksum = cell.getChecksum(type); if (checksum != null) { - checksumSet.add(checksum); + checksumSet.add(checksum.toLowerCase()); } } @@ -153,8 +169,22 @@ class ChecksumRow { private final PropertyChangeListener updateStateListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { - updateState(); + if ("state".equals(evt.getPropertyName())) { + setState(getState(hashes.values())); + } } }; + private SwingPropertyChangeSupport pcs = new SwingPropertyChangeSupport(this, true); + + + public void addPropertyChangeListener(PropertyChangeListener listener) { + pcs.addPropertyChangeListener(listener); + } + + + public void removePropertyChangeListener(PropertyChangeListener listener) { + pcs.removePropertyChangeListener(listener); + } + } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTable.java similarity index 85% rename from source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java rename to source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTable.java index 958699b7..392df7df 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTable.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTable.java @@ -2,18 +2,17 @@ package net.sourceforge.filebot.ui.panel.sfv; +import net.sourceforge.filebot.FileBotUtilities; import net.sourceforge.tuned.ui.TunedUtilities.DragDropRowTableUI; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.TableColumn; import javax.swing.table.TableModel; -import net.sourceforge.filebot.FileBotUtilities; - -class SfvTable extends JTable { +class ChecksumTable extends JTable { - public SfvTable() { + public ChecksumTable() { setFillsViewportHeight(true); setAutoCreateRowSorter(true); setAutoCreateColumnsFromModel(true); @@ -23,12 +22,13 @@ class SfvTable extends JTable { setRowHeight(20); + setDragEnabled(true); setUI(new DragDropRowTableUI()); // highlight CRC32 patterns in filenames in green and with smaller font-size setDefaultRenderer(String.class, new HighlightPatternCellRenderer(FileBotUtilities.EMBEDDED_CHECKSUM_PATTERN, "#009900", "smaller")); - setDefaultRenderer(ChecksumRow.State.class, new StateIconTableCellRenderer()); - setDefaultRenderer(ChecksumCell.class, new ChecksumTableCellRenderer()); + setDefaultRenderer(ChecksumRow.State.class, new StateIconCellRenderer()); + setDefaultRenderer(ChecksumCell.class, new ChecksumCellRenderer()); } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableCellRenderer.java deleted file mode 100644 index 705892d4..00000000 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableCellRenderer.java +++ /dev/null @@ -1,115 +0,0 @@ - -package net.sourceforge.filebot.ui.panel.sfv; - - -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Rectangle; - -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JTable; -import javax.swing.border.EmptyBorder; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; - -import net.sourceforge.tuned.ExceptionUtilities; - - -class ChecksumTableCellRenderer extends DefaultTableCellRenderer { - - private final ProgressBarTableCellRenderer progressBarRenderer = new ProgressBarTableCellRenderer(); - - - @Override - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - super.getTableCellRendererComponent(table, null, isSelected, false, row, column); - - if (value instanceof ChecksumCell) { - ChecksumCell checksum = (ChecksumCell) value; - - switch (checksum.getState()) { - case READY: - setText(checksum.getChecksum(HashType.CRC32)); - break; - case PENDING: - setText("Pending ..."); - break; - case ERROR: - setText(ExceptionUtilities.getMessage(checksum.getError())); - break; - default: - return progressBarRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); - } - } - - return this; - } - - - private static class ProgressBarTableCellRenderer extends JPanel implements TableCellRenderer { - - private final JProgressBar progressBar = new JProgressBar(0, 100); - - - public ProgressBarTableCellRenderer() { - progressBar.setStringPainted(true); - - setLayout(new BorderLayout()); - add(progressBar, BorderLayout.CENTER); - - setBorder(new EmptyBorder(2, 2, 2, 2)); - } - - - public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { - - ChecksumComputationTask task = ((ChecksumCell) value).getTask(); - - if (task != null) { - progressBar.setValue(task.getProgress()); - } - - if (isSelected) { - this.setBackground(table.getSelectionBackground()); - } else { - this.setBackground(table.getBackground()); - } - - return this; - } - - - /** - * Overridden for performance reasons. - */ - @Override - public void repaint(long tm, int x, int y, int width, int height) { - } - - - /** - * Overridden for performance reasons. - */ - @Override - public void repaint(Rectangle r) { - } - - - /** - * Overridden for performance reasons. - */ - @Override - public void repaint() { - } - - - /** - * Overridden for performance reasons. - */ - @Override - public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { - } - - } -} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableExportHandler.java b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableExportHandler.java index 11827e47..e19e3749 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableExportHandler.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumTableExportHandler.java @@ -24,19 +24,30 @@ class ChecksumTableExportHandler extends TextFileExportHandler { @Override public boolean canExport() { - return model.getRowCount() > 0 && model.getChecksumColumns().size() > 0; + return model.getRowCount() > 0 && defaultColumn() != null; } @Override public void export(Formatter out) { - export(out, model.getChecksumColumns().get(0)); + export(out, defaultColumn()); } @Override public String getDefaultFileName() { - return getDefaultFileName(model.getChecksumColumns().get(0)); + return getDefaultFileName(defaultColumn()); + } + + + protected File defaultColumn() { + // select first column that is not a verification file column + for (File root : model.checksumColumns()) { + if (root.isDirectory()) + return root; + } + + return null; } @@ -52,27 +63,38 @@ class ChecksumTableExportHandler extends TextFileExportHandler { public void export(Formatter out, File column) { - out.format("; Generated by %s on %tF at % { +class ChecksumTableModel extends AbstractTableModel { private final IndexedMap rows = new IndexedMap() { @@ -34,7 +30,10 @@ class ChecksumTableModel extends AbstractTableModel implements Iterable columns = new ArrayList(4); + private final List checksumColumns = new ArrayList(4); + + public static final String HASH_TYPE_PROPERTY = "hashType"; + private HashType hashType = HashType.SFV; @Override @@ -64,19 +63,47 @@ class ChecksumTableModel extends AbstractTableModel implements Iterable checksumColumns() { + return Collections.unmodifiableList(checksumColumns); } @Override public int getColumnCount() { - return columns.size() + 2; + // add checksum column offset + return checksumColumns.size() + 2; } - public List getChecksumColumns() { - return Collections.unmodifiableList(columns); + protected int getRowIndex(ChecksumRow row) { + return rows.getIndexByKey(row.getName()); + } + + + protected int getRowIndex(ChecksumCell cell) { + return rows.getIndexByKey(cell.getName()); + } + + + public List rows() { + return Collections.unmodifiableList(rows); } @@ -86,6 +113,24 @@ class ChecksumTableModel extends AbstractTableModel implements Iterable iterator() { - return rows.iterator(); - } - - - public void addAll(List list) { - int firstRow = getRowCount(); + public void addAll(Collection values) { + List replacements = new ArrayList(); - for (ChecksumCell entry : list) { - ChecksumRow row = rows.getByKey(entry.getName()); + int rowCount = getRowCount(); + int columnCount = getColumnCount(); + + for (ChecksumCell cell : values) { + int rowIndex = getRowIndex(cell); - if (row == null) { - row = new ChecksumRow(entry.getName()); + ChecksumRow row; + + if (rowIndex >= 0) { + // get existing row + row = rows.get(rowIndex); + } else { + // add new row + row = new ChecksumRow(cell.getName()); + row.addPropertyChangeListener(stateListener); rows.add(row); } - row.put(entry); + // add cell to row + ChecksumCell old = row.put(cell); + + // dispose of old cell + if (old != null) { + old.dispose(); + replacements.add(cell); + } // listen to changes (progress, state) - entry.addPropertyChangeListener(progressListener); + cell.addPropertyChangeListener(progressListener); - if (!columns.contains(entry.getRoot())) { - columns.add(entry.getRoot()); - fireTableStructureChanged(); + if (!checksumColumns.contains(cell.getRoot())) { + checksumColumns.add(cell.getRoot()); } } - int lastRow = getRowCount() - 1; + // fire table events + if (columnCount != getColumnCount()) { + // number of columns has changed + fireTableStructureChanged(); + return; + } - if (lastRow >= firstRow) { - fireTableRowsInserted(firstRow, lastRow); + for (ChecksumCell replacement : replacements) { + int row = getRowIndex(replacement); + + // update this cell + fireTableCellUpdated(row, 0); + fireTableCellUpdated(row, getColumnIndex(replacement)); + } + + if (rowCount != getRowCount()) { + // some rows have been inserted + fireTableRowsInserted(rowCount, getRowCount() - 1); } } @@ -153,46 +235,40 @@ class ChecksumTableModel extends AbstractTableModel implements Iterable= 0) { + // update only column 0 (state) + fireTableCellUpdated(row, 0); + } + } + }; + private final PropertyChangeListener progressListener = new PropertyChangeListener() { - private final MutableTableModelEvent mutableUpdateEvent = new MutableTableModelEvent(ChecksumTableModel.this, UPDATE); - - public void propertyChange(PropertyChangeEvent evt) { - ChecksumCell entry = (ChecksumCell) evt.getSource(); + ChecksumCell cell = (ChecksumCell) evt.getSource(); - int index = rows.getIndexByKey(entry.getName()); + int row = getRowIndex(cell); + int column = getColumnIndex(cell); - if (index >= 0) { - rows.get(index).updateState(); - fireTableChanged(mutableUpdateEvent.setRow(index)); + if (row >= 0 && column >= 0) { + fireTableCellUpdated(row, column); } } }; - protected static class MutableTableModelEvent extends TableModelEvent { - - public MutableTableModelEvent(TableModel source, int type) { - super(source, 0, 0, ALL_COLUMNS, type); - } - - - public MutableTableModelEvent setRow(int row) { - this.firstRow = row; - this.lastRow = row; - - return this; - } - } - - protected static abstract class IndexedMap extends AbstractList implements Set { private final Map indexMap = new HashMap(64); @@ -208,16 +284,6 @@ class ChecksumTableModel extends AbstractTableModel implements Iterable { + + private final ChecksumTableModel model; + private final ChecksumComputationService computationService; + + + public ChecksumTableTransferablePolicy(ChecksumTableModel model, ChecksumComputationService checksumComputationService) { + this.model = model; + this.computationService = checksumComputationService; + } + + + @Override + protected boolean accept(List files) { + return true; + } + + + @Override + protected void clear() { + super.clear(); + + computationService.reset(); + model.clear(); + } + + + @Override + protected void prepare(List files) { + HashType type = getVerificationType(files); + + if (type != null) { + model.setHashType(type); + } + } + + + @Override + protected void process(List chunks) { + model.addAll(chunks); + } + + + @Override + protected void process(Exception e) { + Logger.getLogger("ui").log(Level.WARNING, ExceptionUtilities.getRootCauseMessage(e), e); + } + + + protected HashType getVerificationType(List files) { + for (HashType hash : HashType.values()) { + if (containsOnly(files, new ExtensionFileFilter(hash.getExtension()))) { + return hash; + } + } + + return null; + } + + + protected void loadVerificationFile(File file, HashType type) throws IOException { + // don't use new Scanner(File) because of BUG 6368019 (http://bugs.sun.com/view_bug.do?bug_id=6368019) + VerificationFileScanner scanner = type.newScanner(new Scanner(new FileInputStream(file), "UTF-8")); + + try { + // root for relative file paths in verification file + File root = file.getParentFile(); + + while (scanner.hasNext()) { + try { + Entry entry = scanner.next(); + + String name = normalizeRelativePath(entry.getKey()); + String hash = entry.getValue(); + + ChecksumCell correct = new ChecksumCell(name, file, Collections.singletonMap(type, hash)); + ChecksumCell current = createComputationCell(name, root, type); + + publish(correct, current); + + if (Thread.interrupted()) { + break; + } + } catch (IllegalSyntaxException e) { + // tell user about illegal lines in verification file + publish(e); + } + } + } finally { + scanner.close(); + } + } + + private final ThreadLocal executor = new ThreadLocal(); + + + @Override + protected void load(List files) throws IOException { + // initialize drop parameters + executor.set(computationService.newExecutor()); + + try { + HashType verificationType = getVerificationType(files); + + if (verificationType != null) { + for (File file : files) { + loadVerificationFile(file, verificationType); + } + } else if ((files.size() == 1) && files.get(0).isDirectory()) { + // one single folder + File file = files.get(0); + + for (File f : file.listFiles()) { + load(f, null, file); + } + } else { + // bunch of files + for (File f : files) { + load(f, null, f.getParentFile()); + } + } + } catch (InterruptedException e) { + // supposed to happen if background execution was aborted + } finally { + // shutdown executor after all tasks have been completed + executor.get().shutdown(); + + // remove drop parameters + executor.remove(); + } + } + + + protected void load(File file, File relativeFile, File root) throws InterruptedException { + if (Thread.interrupted()) + throw new InterruptedException(); + + // add next name to relative path + relativeFile = new File(relativeFile, file.getName()); + + if (file.isDirectory()) { + // load all files in the file tree + for (File child : file.listFiles()) { + load(child, relativeFile, root); + } + } else { + publish(createComputationCell(normalizeRelativePath(relativeFile), root, model.getHashType())); + } + } + + + protected ChecksumCell createComputationCell(String name, File root, HashType hash) { + ChecksumCell cell = new ChecksumCell(name, root, new ChecksumComputationTask(new File(root, name), hash)); + + // start computation task + executor.get().execute(cell.getTask()); + + return cell; + } + + + protected String normalizeRelativePath(File file) { + if (file.isAbsolute()) + throw new IllegalArgumentException("Path must be relative"); + + return file.getPath().replace('\\', '/'); + } + + + @Override + public String getFileFilterDescription() { + return "files, folders and sfv files"; + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/HashType.java b/source/net/sourceforge/filebot/ui/panel/sfv/HashType.java index 633dcdc9..be53cc3a 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/HashType.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/HashType.java @@ -2,33 +2,106 @@ package net.sourceforge.filebot.ui.panel.sfv; +import java.io.File; +import java.util.Formatter; +import java.util.Scanner; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.CRC32; enum HashType { - CRC32 { + SFV { @Override - public Hash newInstance() { + public Hash newHash() { return new ChecksumHash(new CRC32()); } + + + @Override + public VerificationFileScanner newScanner(Scanner scanner) { + // adapt default scanner to sfv line syntax + return new VerificationFileScanner(scanner) { + + /** + * Pattern used to parse the lines of a sfv file. + * + *

+				 * Sample:
+				 * folder/file.txt 970E4EF1
+				 * |  Group 1    | | Gr.2 |
+				 * 
+ */ + private final Pattern pattern = Pattern.compile("(.+)\\s+(\\p{XDigit}{8})"); + + + @Override + protected Entry parseLine(String line) { + Matcher matcher = pattern.matcher(line); + + if (!matcher.matches()) + throw new IllegalSyntaxException(getLineNumber(), line); + + return entry(new File(matcher.group(1)), matcher.group(2)); + } + }; + } + + + @Override + public VerificationFilePrinter newPrinter(Formatter out) { + return new VerificationFilePrinter(out, "CRC32") { + + @Override + public void print(String path, String hash) { + // e.g folder/file.txt 970E4EF1 + out.format(String.format("%s %s", path, hash)); + } + }; + } + }, + MD5 { @Override - public Hash newInstance() { + public Hash newHash() { return new MessageDigestHash("MD5"); } }, + SHA1 { @Override - public Hash newInstance() { + public Hash newHash() { return new MessageDigestHash("SHA-1"); } + + + @Override + public String toString() { + return "SHA-1"; + } }; - public abstract Hash newInstance(); + public abstract Hash newHash(); + + + public VerificationFileScanner newScanner(Scanner scanner) { + return new VerificationFileScanner(scanner); + } + + + public VerificationFilePrinter newPrinter(Formatter out) { + return new VerificationFilePrinter(out, this.name()); + } + + + public String getExtension() { + return name().toLowerCase(); + } } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/HighlightPatternCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/sfv/HighlightPatternCellRenderer.java index 6e445be3..12ceab3c 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/HighlightPatternCellRenderer.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/HighlightPatternCellRenderer.java @@ -39,7 +39,7 @@ class HighlightPatternCellRenderer extends DefaultTableCellRenderer { StringBuffer htmlText = new StringBuffer(""); while (matcher.find()) { - matcher.appendReplacement(htmlText, "$0"); + matcher.appendReplacement(htmlText, createReplacement(isSelected)); } matcher.appendTail(htmlText); @@ -50,4 +50,21 @@ class HighlightPatternCellRenderer extends DefaultTableCellRenderer { return this; } + + + protected String createReplacement(boolean isSelected) { + // build replacement string like + // e.g. $0 + StringBuilder replacement = new StringBuilder(60); + + replacement.append("$0").toString(); + } + } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java deleted file mode 100644 index f4208a19..00000000 --- a/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java +++ /dev/null @@ -1,182 +0,0 @@ - -package net.sourceforge.filebot.ui.panel.sfv; - - -import java.awt.event.ActionEvent; -import java.io.File; -import java.io.IOException; -import java.util.List; - -import javax.swing.AbstractAction; -import javax.swing.JButton; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; -import javax.swing.border.TitledBorder; - -import net.miginfocom.swing.MigLayout; -import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.filebot.ui.FileBotPanel; -import net.sourceforge.filebot.ui.FileTransferableMessageHandler; -import net.sourceforge.filebot.ui.SelectDialog; -import net.sourceforge.filebot.ui.transfer.DefaultTransferHandler; -import net.sourceforge.filebot.ui.transfer.LoadAction; -import net.sourceforge.filebot.ui.transfer.SaveAction; -import net.sourceforge.tuned.FileUtilities; -import net.sourceforge.tuned.MessageHandler; -import net.sourceforge.tuned.ui.TunedUtilities; - - -public class SfvPanel extends FileBotPanel { - - private final ChecksumComputationService computationService = new ChecksumComputationService(); - - private final SfvTable table = new SfvTable(); - - private final SfvTransferablePolicy transferablePolicy = new SfvTransferablePolicy(table.getModel(), computationService); - private final ChecksumTableExportHandler exportHandler = new ChecksumTableExportHandler(table.getModel()); - - private final MessageHandler messageHandler = new FileTransferableMessageHandler(this, transferablePolicy); - - - public SfvPanel() { - super("SFV", ResourceManager.getIcon("panel.sfv")); - - table.setTransferHandler(new DefaultTransferHandler(transferablePolicy, exportHandler)); - table.setDragEnabled(true); - - JPanel contentPane = new JPanel(new MigLayout("insets 0, nogrid, fill", null, "align bottom")); - contentPane.setBorder(new TitledBorder(getPanelName())); - - setLayout(new MigLayout("insets dialog, fill")); - add(contentPane, "grow"); - - contentPane.add(new JScrollPane(table), "grow, wrap 10px"); - - contentPane.add(new JButton(loadAction), "gap 15px, gap bottom 4px"); - contentPane.add(new JButton(saveAction), "gap rel, gap bottom 4px"); - contentPane.add(new JButton(clearAction), "gap rel, gap bottom 4px"); - - contentPane.add(new TotalProgressPanel(computationService), "gap left indent:push, gap bottom 2px, gap right 7px, hidemode 3"); - - // Shortcut DELETE - TunedUtilities.putActionForKeystroke(this, KeyStroke.getKeyStroke("pressed DELETE"), removeAction); - } - - - @Override - public MessageHandler getMessageHandler() { - return messageHandler; - } - - private final SaveAction saveAction = new ChecksumTableSaveAction(); - - private final LoadAction loadAction = new LoadAction(transferablePolicy); - - private final AbstractAction clearAction = new AbstractAction("Clear", ResourceManager.getIcon("action.clear")) { - - public void actionPerformed(ActionEvent e) { - transferablePolicy.reset(); - computationService.reset(); - - table.getModel().clear(); - } - }; - - private final AbstractAction removeAction = new AbstractAction("Remove") { - - public void actionPerformed(ActionEvent e) { - if (table.getSelectedRowCount() < 1) - return; - - int firstSelectedRow = table.getSelectedRow(); - - // remove selected rows - table.getModel().remove(table.getSelectedRows()); - - // update computation service task count - computationService.purge(); - - // auto select next row - firstSelectedRow = Math.min(firstSelectedRow, table.getRowCount() - 1); - - table.getSelectionModel().setSelectionInterval(firstSelectedRow, firstSelectedRow); - } - }; - - - protected class ChecksumTableSaveAction extends SaveAction { - - private File selectedColumn = null; - - - public ChecksumTableSaveAction() { - super(exportHandler); - } - - - @Override - public ChecksumTableExportHandler getExportHandler() { - return (ChecksumTableExportHandler) super.getExportHandler(); - } - - - @Override - protected boolean canExport() { - return selectedColumn != null && super.canExport(); - } - - - @Override - protected void export(File file) throws IOException { - getExportHandler().export(file, selectedColumn); - } - - - @Override - protected String getDefaultFileName() { - return getExportHandler().getDefaultFileName(selectedColumn); - } - - - @Override - protected File getDefaultFolder() { - // if the column is a folder use it as default folder in the file dialog - return selectedColumn.isDirectory() ? selectedColumn : null; - } - - - @Override - public void actionPerformed(ActionEvent e) { - List options = table.getModel().getChecksumColumns(); - - this.selectedColumn = null; - - if (options.size() == 1) { - // auto-select option if there is only one option - this.selectedColumn = options.get(0); - } else if (options.size() > 1) { - // user must select one option - SelectDialog selectDialog = new SelectDialog(SwingUtilities.getWindowAncestor(SfvPanel.this), options) { - - @Override - protected String convertValueToString(Object value) { - return FileUtilities.getFolderName((File) value); - } - }; - - selectDialog.getHeaderLabel().setText("Select checksum column:"); - selectDialog.setVisible(true); - - this.selectedColumn = selectDialog.getSelectedValue(); - } - - if (this.selectedColumn != null) { - // continue if a column was selected - super.actionPerformed(e); - } - } - } - -} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTransferablePolicy.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvTransferablePolicy.java deleted file mode 100644 index b87caab6..00000000 --- a/source/net/sourceforge/filebot/ui/panel/sfv/SfvTransferablePolicy.java +++ /dev/null @@ -1,168 +0,0 @@ - -package net.sourceforge.filebot.ui.panel.sfv; - - -import static net.sourceforge.filebot.FileBotUtilities.SFV_FILES; -import static net.sourceforge.tuned.FileUtilities.containsOnly; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.Scanner; -import java.util.concurrent.Executor; -import java.util.concurrent.ExecutorService; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import net.sourceforge.filebot.ui.transfer.BackgroundFileTransferablePolicy; -import net.sourceforge.tuned.ExceptionUtilities; - - -class SfvTransferablePolicy extends BackgroundFileTransferablePolicy { - - private final ChecksumTableModel model; - private final ChecksumComputationService checksumComputationService; - - - public SfvTransferablePolicy(ChecksumTableModel model, ChecksumComputationService checksumComputationService) { - this.model = model; - this.checksumComputationService = checksumComputationService; - } - - - @Override - protected boolean accept(List files) { - return true; - } - - - @Override - protected void clear() { - checksumComputationService.reset(); - model.clear(); - } - - - @Override - protected void process(List chunks) { - model.addAll(chunks); - } - - - @Override - protected void process(Exception e) { - Logger.getLogger("ui").log(Level.WARNING, ExceptionUtilities.getRootCauseMessage(e), e); - } - - - protected void loadSfvFile(File sfvFile, Executor executor) { - try { - // don't use new Scanner(File) because of BUG 6368019 (http://bugs.sun.com/view_bug.do?bug_id=6368019) - Scanner scanner = new Scanner(new FileInputStream(sfvFile), "utf-8"); - - try { - Pattern pattern = Pattern.compile("(.+)\\s+(\\p{XDigit}{8})"); - - // root for relative file paths in sfv file - File root = sfvFile.getParentFile(); - - while (scanner.hasNextLine()) { - String line = scanner.nextLine(); - - if (line.startsWith(";")) - continue; - - Matcher matcher = pattern.matcher(line); - - if (!matcher.matches()) - continue; - - String name = matcher.group(1); - String checksum = matcher.group(2); - - ChecksumCell correct = new ChecksumCell(name, sfvFile, Collections.singletonMap(HashType.CRC32, checksum)); - ChecksumCell current = createChecksumCell(name, root, new File(root, name), executor); - - publish(correct, current); - - if (Thread.interrupted()) { - break; - } - } - } finally { - scanner.close(); - } - } catch (IOException e) { - // should not happen - Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); - } - } - - - @Override - public String getFileFilterDescription() { - return "files, folders and sfv files"; - } - - - @Override - protected void load(List files) { - ExecutorService executor = checksumComputationService.newExecutor(); - - try { - if (containsOnly(files, SFV_FILES)) { - // one or more sfv files - for (File file : files) { - loadSfvFile(file, executor); - } - } else if ((files.size() == 1) && files.get(0).isDirectory()) { - // one single folder - File file = files.get(0); - - for (File f : file.listFiles()) { - load(f, file, "", executor); - } - } else { - // bunch of files - for (File f : files) { - load(f, f.getParentFile(), "", executor); - } - } - } catch (InterruptedException e) { - // supposed to happen if background execution was aborted - } finally { - executor.shutdown(); - } - } - - - protected void load(File file, File root, String prefix, Executor executor) throws InterruptedException { - if (Thread.interrupted()) - throw new InterruptedException(); - - if (file.isDirectory()) { - // load all files in the file tree - String newPrefix = prefix + file.getName() + "/"; - - for (File f : file.listFiles()) { - load(f, root, newPrefix, executor); - } - } else if (file.isFile()) { - publish(createChecksumCell(prefix + file.getName(), root, file, executor)); - } - } - - - protected ChecksumCell createChecksumCell(String name, File root, File file, Executor executor) { - ChecksumCell cell = new ChecksumCell(name, root, new ChecksumComputationTask(new File(root, name), HashType.CRC32)); - - // start computation task - executor.execute(cell.getTask()); - - return cell; - } -} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/StateIconTableCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/sfv/StateIconCellRenderer.java similarity index 91% rename from source/net/sourceforge/filebot/ui/panel/sfv/StateIconTableCellRenderer.java rename to source/net/sourceforge/filebot/ui/panel/sfv/StateIconCellRenderer.java index 3936dbab..f79ff645 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/StateIconTableCellRenderer.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/StateIconCellRenderer.java @@ -15,12 +15,12 @@ import net.sourceforge.filebot.ResourceManager; import net.sourceforge.filebot.ui.panel.sfv.ChecksumRow.State; -class StateIconTableCellRenderer extends DefaultTableCellRenderer { +class StateIconCellRenderer extends DefaultTableCellRenderer { private final Map icons = new EnumMap(State.class); - public StateIconTableCellRenderer() { + public StateIconCellRenderer() { icons.put(State.UNKNOWN, ResourceManager.getIcon("status.unknown")); icons.put(State.OK, ResourceManager.getIcon("status.ok")); icons.put(State.WARNING, ResourceManager.getIcon("status.warning")); diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SwingWorkerCellRenderer.java b/source/net/sourceforge/filebot/ui/panel/sfv/SwingWorkerCellRenderer.java new file mode 100644 index 00000000..c20adb35 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/SwingWorkerCellRenderer.java @@ -0,0 +1,74 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import java.awt.BorderLayout; +import java.awt.Component; +import java.awt.Rectangle; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.JTable; +import javax.swing.SwingWorker; +import javax.swing.border.EmptyBorder; +import javax.swing.table.TableCellRenderer; + + +class SwingWorkerCellRenderer extends JPanel implements TableCellRenderer { + + private final JProgressBar progressBar = new JProgressBar(0, 100); + + + public SwingWorkerCellRenderer() { + super(new BorderLayout()); + + // create margin for progress bar, + // because setting margin for progress bar directly does not work (border size is not respected in the paint method) + setBorder(new EmptyBorder(2, 2, 2, 2)); + + progressBar.setStringPainted(true); + + add(progressBar, BorderLayout.CENTER); + } + + + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + + progressBar.setValue(((SwingWorker) value).getProgress()); + + return this; + } + + + /** + * Overridden for performance reasons. + */ + @Override + public void repaint(long tm, int x, int y, int width, int height) { + } + + + /** + * Overridden for performance reasons. + */ + @Override + public void repaint(Rectangle r) { + } + + + /** + * Overridden for performance reasons. + */ + @Override + public void repaint() { + } + + + /** + * Overridden for performance reasons. + */ + @Override + public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/TotalProgressPanel.java b/source/net/sourceforge/filebot/ui/panel/sfv/TotalProgressPanel.java index 6e9de38e..35cba607 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/TotalProgressPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/TotalProgressPanel.java @@ -4,41 +4,36 @@ package net.sourceforge.filebot.ui.panel.sfv; import static net.sourceforge.filebot.ui.panel.sfv.ChecksumComputationService.TASK_COUNT_PROPERTY; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; import javax.swing.Timer; +import javax.swing.border.TitledBorder; import net.miginfocom.swing.MigLayout; -import net.sourceforge.tuned.ui.TunedUtilities; class TotalProgressPanel extends JComponent { - private int millisToSetVisible = 200; - private final JProgressBar progressBar = new JProgressBar(0, 0); - private final ChecksumComputationService computationService; + private final int millisToSetVisible = 200; public TotalProgressPanel(ChecksumComputationService computationService) { - this.computationService = computationService; + setLayout(new MigLayout("insets 1px")); - setLayout(new MigLayout()); + setBorder(new TitledBorder("Total Progress")); // invisible by default setVisible(false); progressBar.setStringPainted(true); - progressBar.setBorderPainted(false); - progressBar.setString(""); - - setBorder(BorderFactory.createTitledBorder("Total Progress")); add(progressBar, "growx"); @@ -47,45 +42,82 @@ class TotalProgressPanel extends JComponent { private final PropertyChangeListener progressListener = new PropertyChangeListener() { - private Timer setVisibleTimer; + private static final String SHOW = "show"; + private static final String HIDE = "hide"; + + private final DelayedToggle delayed = new DelayedToggle(); public void propertyChange(PropertyChangeEvent evt) { - final int completedTaskCount = computationService.getCompletedTaskCount(); - final int totalTaskCount = computationService.getTotalTaskCount(); + final int completedTaskCount = getComputationService(evt).getCompletedTaskCount(); + final int totalTaskCount = getComputationService(evt).getTotalTaskCount(); // invoke on EDT SwingUtilities.invokeLater(new Runnable() { @Override public void run() { - if (completedTaskCount < totalTaskCount) { - if (setVisibleTimer == null) { - setVisibleTimer = TunedUtilities.invokeLater(millisToSetVisible, new Runnable() { - - @Override - public void run() { - setVisible(computationService.getTaskCount() > computationService.getCompletedTaskCount()); - } - }); - } - } else { - if (setVisibleTimer != null) { - setVisibleTimer.stop(); - setVisibleTimer = null; - } - - // hide when not active - setVisible(false); + + if (completedTaskCount == totalTaskCount) { + // delayed hide on reset, immediate hide on finish + delayed.toggle(HIDE, totalTaskCount == 0 ? millisToSetVisible : 0, visibilityActionHandler); + } else if (totalTaskCount != 0) { + delayed.toggle(SHOW, millisToSetVisible, visibilityActionHandler); } - progressBar.setValue(completedTaskCount); - progressBar.setMaximum(totalTaskCount); - - progressBar.setString(String.format("%d / %d", completedTaskCount, totalTaskCount)); + if (totalTaskCount != 0) { + progressBar.setValue(completedTaskCount); + progressBar.setMaximum(totalTaskCount); + + progressBar.setString(String.format("%d / %d", completedTaskCount, totalTaskCount)); + } }; }); } + + + private ChecksumComputationService getComputationService(PropertyChangeEvent evt) { + return ((ChecksumComputationService) evt.getSource()); + } + + private final ActionListener visibilityActionHandler = new ActionListener() { + + public void actionPerformed(ActionEvent e) { + setVisible(e.getActionCommand() == SHOW); + } + }; + }; + + protected static class DelayedToggle { + + private Timer timer = null; + + + public void toggle(String action, int delay, final ActionListener actionHandler) { + if (timer != null) { + if (action.equals(timer.getActionCommand())) { + // action has not changed, don't stop existing timer + return; + } + + timer.stop(); + } + + timer = new Timer(delay, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + actionHandler.actionPerformed(e); + } + }); + + timer.setActionCommand(action); + timer.setRepeats(false); + timer.start(); + } + + } + } diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFilePrinter.java b/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFilePrinter.java new file mode 100644 index 00000000..4ede2283 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFilePrinter.java @@ -0,0 +1,42 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import java.io.Closeable; +import java.io.IOException; +import java.util.Formatter; + + +class VerificationFilePrinter implements Closeable { + + protected final Formatter out; + protected final String algorithm; + + + public VerificationFilePrinter(Formatter out, String algorithm) { + this.out = out; + this.algorithm = algorithm; + } + + + public void println(String path, String hash) { + // print entry + print(path, hash); + + // print line separator + out.format("%n"); + } + + + protected void print(String path, String hash) { + // e.g. 1a02a7c1e9ac91346d08829d5037b240f42ded07 ?SHA1*folder/file.txt + out.format("%s ?%s*%s", hash, algorithm.toUpperCase(), path); + } + + + @Override + public void close() throws IOException { + out.close(); + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScanner.java b/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScanner.java new file mode 100644 index 00000000..768b7582 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScanner.java @@ -0,0 +1,144 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Scanner; +import java.util.AbstractMap.SimpleEntry; +import java.util.Map.Entry; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + + +class VerificationFileScanner implements Iterator>, Closeable { + + private final Scanner scanner; + + private String cache; + + private int lineNumber = 0; + + + public VerificationFileScanner(File file) throws FileNotFoundException { + // don't use new Scanner(File) because of BUG 6368019 (http://bugs.sun.com/view_bug.do?bug_id=6368019) + this(new Scanner(new FileInputStream(file), "UTF-8")); + } + + + public VerificationFileScanner(Scanner scanner) { + this.scanner = scanner; + } + + + @Override + public boolean hasNext() { + if (cache == null) { + // cache next line + cache = nextLine(); + } + + return cache != null; + } + + + @Override + public Entry next() { + // cache next line + if (!hasNext()) { + throw new NoSuchElementException(); + } + + try { + return parseLine(cache); + } finally { + // invalidate cache + cache = null; + } + } + + + protected String nextLine() { + String line = null; + + // get next non-comment line + while (scanner.hasNext() && (line == null || isComment(line))) { + line = scanner.nextLine().trim(); + lineNumber++; + } + + return line; + } + + /** + * Pattern used to parse the lines of a md5 or sha1 file. + * + *
+	 * Sample MD5:
+	 * 50e85fe18e17e3616774637a82968f4c *folder/file.txt
+	 * |           Group 1               |   Group 2   |
+	 * 
+	 * Sample SHA-1:
+	 * 1a02a7c1e9ac91346d08829d5037b240f42ded07 ?SHA1*folder/file.txt
+	 * |               Group 1                |       |   Group 2   |
+	 * 
+ */ + private final Pattern pattern = Pattern.compile("(\\p{XDigit}{8,})\\s+(?:\\?\\w+)?\\*(.+)"); + + + protected Entry parseLine(String line) { + Matcher matcher = pattern.matcher(line); + + if (!matcher.matches()) + throw new IllegalSyntaxException(getLineNumber(), line); + + return entry(new File(matcher.group(2)), matcher.group(1)); + } + + + public int getLineNumber() { + return lineNumber; + } + + + protected boolean isComment(String line) { + return line.startsWith(";") || line.isEmpty(); + } + + + protected Entry entry(File file, String hash) { + return new SimpleEntry(file, hash); + } + + + @Override + public void close() throws IOException { + scanner.close(); + } + + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + + public static class IllegalSyntaxException extends RuntimeException { + + public IllegalSyntaxException(int lineNumber, String line) { + this(String.format("Illegal syntax in line %d: %s", lineNumber, line)); + } + + + public IllegalSyntaxException(String message) { + super(message); + } + + } + +} diff --git a/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java b/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java index 7da573d5..99e0379b 100644 --- a/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transfer/BackgroundFileTransferablePolicy.java @@ -3,44 +3,46 @@ package net.sourceforge.filebot.ui.transfer; import java.awt.datatransfer.Transferable; -import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.io.File; import java.util.ArrayList; import java.util.List; + import javax.swing.SwingUtilities; import javax.swing.SwingWorker; +import javax.swing.event.SwingPropertyChangeSupport; public abstract class BackgroundFileTransferablePolicy extends FileTransferablePolicy { public static final String LOADING_PROPERTY = "loading"; - private final ThreadLocal threadLocalWorker = new ThreadLocal() { - - @Override - protected BackgroundWorker initialValue() { - // fail if a non-background-worker thread is trying to access the thread-local worker object - throw new IllegalThreadStateException("Illegal access thread"); - } - }; + private final ThreadLocal threadLocalWorker = new ThreadLocal(); private final List workers = new ArrayList(2); @Override - public void handleTransferable(Transferable tr, TransferAction action) { + public void handleTransferable(Transferable tr, TransferAction action) throws Exception { List files = getFilesFromTransferable(tr); - if (action != TransferAction.ADD) + if (action != TransferAction.ADD) { clear(); + } + + prepare(files); // create and start worker new BackgroundWorker(files).execute(); } + protected void prepare(List files) { + + } + + @Override protected void clear() { // stop other workers on clear (before starting new worker) @@ -61,14 +63,39 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab } + public boolean isLoading() { + synchronized (workers) { + return !workers.isEmpty(); + } + } + + protected abstract void process(List chunks); - protected abstract void process(Exception e); + protected abstract void process(Exception exception); protected final void publish(V... chunks) { - threadLocalWorker.get().offer(chunks); + BackgroundWorker worker = threadLocalWorker.get(); + + if (worker == null) { + // fail if a non-background-worker thread is trying to access the thread-local worker object + throw new IllegalThreadStateException("Illegal access thread"); + } + + worker.offer(chunks); + } + + + protected final void publish(final Exception exception) { + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + process(exception); + } + }); } @@ -90,7 +117,7 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab @Override - protected Object doInBackground() { + protected Object doInBackground() throws Exception { // associate this worker with the current (background) thread threadLocalWorker.set(this); @@ -121,13 +148,6 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab @Override protected void done() { - // unregister worker - synchronized (workers) { - if (workers.remove(this) && workers.isEmpty()) { - swingPropertyChangeSupport.firePropertyChange(LOADING_PROPERTY, true, false); - } - } - if (!isCancelled()) { try { // check for exception @@ -136,27 +156,17 @@ public abstract class BackgroundFileTransferablePolicy extends FileTransferab BackgroundFileTransferablePolicy.this.process(e); } } + + // unregister worker + synchronized (workers) { + if (workers.remove(this) && workers.isEmpty()) { + swingPropertyChangeSupport.firePropertyChange(LOADING_PROPERTY, true, false); + } + } } } - protected final PropertyChangeSupport swingPropertyChangeSupport = new PropertyChangeSupport(this) { - - @Override - public void firePropertyChange(final PropertyChangeEvent evt) { - if (SwingUtilities.isEventDispatchThread()) { - super.firePropertyChange(evt); - } else { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - swingPropertyChangeSupport.firePropertyChange(evt); - } - }); - } - } - - }; + protected final PropertyChangeSupport swingPropertyChangeSupport = new SwingPropertyChangeSupport(this, true); public void addPropertyChangeListener(PropertyChangeListener listener) { diff --git a/source/net/sourceforge/filebot/ui/transfer/DefaultClipboardHandler.java b/source/net/sourceforge/filebot/ui/transfer/DefaultClipboardHandler.java index c38ddab9..fc6cd73e 100644 --- a/source/net/sourceforge/filebot/ui/transfer/DefaultClipboardHandler.java +++ b/source/net/sourceforge/filebot/ui/transfer/DefaultClipboardHandler.java @@ -4,9 +4,6 @@ package net.sourceforge.filebot.ui.transfer; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.StringSelection; -import java.io.PrintWriter; -import java.io.StringWriter; - import javax.swing.JComponent; import javax.swing.JList; import javax.swing.JTable; @@ -16,56 +13,58 @@ import javax.swing.tree.TreePath; public class DefaultClipboardHandler implements ClipboardHandler { + protected final String newLine = System.getProperty("line.separator"); + + @Override public void exportToClipboard(JComponent component, Clipboard clip, int action) throws IllegalStateException { - StringWriter buffer = new StringWriter(); + StringBuilder sb = new StringBuilder(); if (component instanceof JList) { - export(new PrintWriter(buffer), (JList) component); + export(sb, (JList) component); } else if (component instanceof JTree) { - export(new PrintWriter(buffer), (JTree) component); + export(sb, (JTree) component); } else if (component instanceof JTable) { - export(new PrintWriter(buffer), (JTable) component); + export(sb, (JTable) component); } - clip.setContents(new StringSelection(buffer.toString()), null); + clip.setContents(new StringSelection(sb.toString()), null); } - protected void export(PrintWriter out, JList list) { + protected void export(StringBuilder sb, JList list) { for (Object value : list.getSelectedValues()) { - out.println(valueToString(value)); + sb.append(value == null ? "" : value).append(newLine); } } - protected void export(PrintWriter out, JTree tree) { + protected void export(StringBuilder sb, JTree tree) { for (TreePath path : tree.getSelectionPaths()) { - out.println(valueToString(path.getLastPathComponent())); + Object value = path.getLastPathComponent(); + + sb.append(value == null ? "" : value).append(newLine); } } - protected void export(PrintWriter out, JTable table) { + protected void export(StringBuilder sb, JTable table) { for (int row : table.getSelectedRows()) { - for (int columnIndex = 0; columnIndex < table.getColumnCount(); columnIndex++) { - out.print(valueToString(table.getModel().getValueAt(row, columnIndex))); + int modelRow = table.getRowSorter().convertRowIndexToModel(row); + + for (int column = 0; column < table.getColumnCount(); column++) { + Object value = table.getModel().getValueAt(modelRow, column); - if (columnIndex < table.getColumnCount() - 1) - out.print("\t"); + if (value != null) { + sb.append(value); + } + + if (column < table.getColumnCount() - 1) { + sb.append("\t"); + } } - out.println(); + sb.append(newLine); } } - - - protected String valueToString(Object value) { - // return empty string for null values - if (value == null) - return ""; - - return value.toString(); - } - } diff --git a/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java b/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java index 1020fc2b..1b2eb9a0 100644 --- a/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transfer/FileTransferablePolicy.java @@ -4,7 +4,6 @@ package net.sourceforge.filebot.ui.transfer; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; -import java.awt.datatransfer.UnsupportedFlavorException; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -27,7 +26,7 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { @Override - public boolean accept(Transferable tr) { + public boolean accept(Transferable tr) throws Exception { List files = getFilesFromTransferable(tr); if (files.isEmpty()) @@ -38,48 +37,40 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { @SuppressWarnings("unchecked") - protected List getFilesFromTransferable(Transferable tr) { - try { - if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - // file list flavor - return (List) tr.getTransferData(DataFlavor.javaFileListFlavor); - } else if (tr.isDataFlavorSupported(FileTransferable.uriListFlavor)) { - // file URI list flavor - String transferData = (String) tr.getTransferData(FileTransferable.uriListFlavor); + protected List getFilesFromTransferable(Transferable tr) throws Exception { + if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + // file list flavor + return (List) tr.getTransferData(DataFlavor.javaFileListFlavor); + } else if (tr.isDataFlavorSupported(FileTransferable.uriListFlavor)) { + // file URI list flavor + String transferData = (String) tr.getTransferData(FileTransferable.uriListFlavor); + + Scanner scanner = new Scanner(transferData).useDelimiter(LINE_SEPARATOR); + + List files = new ArrayList(); + + while (scanner.hasNext()) { + String uri = scanner.next(); - Scanner scanner = new Scanner(transferData).useDelimiter(LINE_SEPARATOR); - - ArrayList files = new ArrayList(); - - while (scanner.hasNext()) { - String uri = scanner.next(); - - if (uri.startsWith("#")) { - // the line is a comment (as per RFC 2483) - continue; - } - - try { - File file = new File(new URI(uri)); - - if (!file.exists()) - throw new FileNotFoundException(file.toString()); - - files.add(file); - } catch (Exception e) { - // URISyntaxException, IllegalArgumentException, FileNotFoundException - Logger.getLogger("global").log(Level.WARNING, "Invalid file uri: " + uri); - } + if (uri.startsWith("#")) { + // the line is a comment (as per RFC 2483) + continue; } - return files; + try { + File file = new File(new URI(uri)); + + if (!file.exists()) + throw new FileNotFoundException(file.toString()); + + files.add(file); + } catch (Exception e) { + // URISyntaxException, IllegalArgumentException, FileNotFoundException + Logger.getLogger("global").log(Level.WARNING, "Invalid file uri: " + uri); + } } - } catch (UnsupportedFlavorException e) { - // should not happen - throw new RuntimeException(e); - } catch (IOException e) { - // should not happen - throw new RuntimeException(e); + + return files; } return Collections.emptyList(); @@ -87,7 +78,7 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { @Override - public void handleTransferable(Transferable tr, TransferAction action) { + public void handleTransferable(Transferable tr, TransferAction action) throws Exception { List files = getFilesFromTransferable(tr); if (action == TransferAction.PUT) { @@ -101,7 +92,7 @@ public abstract class FileTransferablePolicy extends TransferablePolicy { protected abstract boolean accept(List files); - protected abstract void load(List files); + protected abstract void load(List files) throws IOException; protected abstract void clear(); diff --git a/source/net/sourceforge/filebot/ui/transfer/LoadAction.java b/source/net/sourceforge/filebot/ui/transfer/LoadAction.java index c2a3a373..f4c5e85d 100644 --- a/source/net/sourceforge/filebot/ui/transfer/LoadAction.java +++ b/source/net/sourceforge/filebot/ui/transfer/LoadAction.java @@ -3,6 +3,8 @@ package net.sourceforge.filebot.ui.transfer; import java.awt.event.ActionEvent; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.JFileChooser; @@ -23,7 +25,7 @@ public class LoadAction extends AbstractAction { } - public void actionPerformed(ActionEvent e) { + public void actionPerformed(ActionEvent evt) { // get transferable policy from action properties TransferablePolicy transferablePolicy = (TransferablePolicy) getValue(TRANSFERABLE_POLICY); @@ -45,10 +47,17 @@ public class LoadAction extends AbstractAction { TransferAction action = TransferAction.PUT; // if CTRL was pressed when the button was clicked, assume ADD action (same as with dnd) - if ((e.getModifiers() & ActionEvent.CTRL_MASK) != 0) + if ((evt.getModifiers() & ActionEvent.CTRL_MASK) != 0) { action = TransferAction.ADD; + } - if (transferablePolicy.accept(transferable)) - transferablePolicy.handleTransferable(transferable, action); + try { + if (transferablePolicy.accept(transferable)) { + transferablePolicy.handleTransferable(transferable, action); + } + } catch (Exception e) { + Logger.getLogger("ui").log(Level.WARNING, e.getMessage(), e); + } } + } diff --git a/source/net/sourceforge/filebot/ui/transfer/TransferablePolicy.java b/source/net/sourceforge/filebot/ui/transfer/TransferablePolicy.java index 389a7865..5429b4c7 100644 --- a/source/net/sourceforge/filebot/ui/transfer/TransferablePolicy.java +++ b/source/net/sourceforge/filebot/ui/transfer/TransferablePolicy.java @@ -13,14 +13,13 @@ import javax.swing.TransferHandler.TransferSupport; public abstract class TransferablePolicy { - public abstract boolean accept(Transferable tr); + public abstract boolean accept(Transferable tr) throws Exception; - public abstract void handleTransferable(Transferable tr, TransferAction action); + public abstract void handleTransferable(Transferable tr, TransferAction action) throws Exception; public boolean canImport(TransferSupport support) { - if (support.isDrop()) support.setShowDropLocation(false); @@ -32,6 +31,8 @@ public abstract class TransferablePolicy { // just assume that the transferable will be accepted, accept will be called in importData again anyway return true; + } catch (Exception e) { + return false; } } diff --git a/source/net/sourceforge/filebot/ui/transfer/TransferablePolicyFileFilter.java b/source/net/sourceforge/filebot/ui/transfer/TransferablePolicyFileFilter.java index f0334026..7ae16621 100644 --- a/source/net/sourceforge/filebot/ui/transfer/TransferablePolicyFileFilter.java +++ b/source/net/sourceforge/filebot/ui/transfer/TransferablePolicyFileFilter.java @@ -7,7 +7,6 @@ import java.io.File; import javax.swing.filechooser.FileFilter; - public class TransferablePolicyFileFilter extends FileFilter { private final TransferablePolicy transferablePolicy; @@ -23,7 +22,11 @@ public class TransferablePolicyFileFilter extends FileFilter { if (f.isDirectory()) return true; - return transferablePolicy.accept(new FileTransferable(f)); + try { + return transferablePolicy.accept(new FileTransferable(f)); + } catch (Exception e) { + return false; + } } diff --git a/source/net/sourceforge/tuned/DefaultThreadFactory.java b/source/net/sourceforge/tuned/DefaultThreadFactory.java index a3e9c583..6e29468c 100644 --- a/source/net/sourceforge/tuned/DefaultThreadFactory.java +++ b/source/net/sourceforge/tuned/DefaultThreadFactory.java @@ -36,8 +36,11 @@ public class DefaultThreadFactory implements ThreadFactory { public Thread newThread(Runnable r) { Thread thread = new Thread(group, r, String.format("%s-thread-%d", group.getName(), threadNumber.incrementAndGet())); - thread.setDaemon(daemon); - thread.setPriority(priority); + if (daemon != thread.isDaemon()) + thread.setDaemon(daemon); + + if (priority != thread.getPriority()) + thread.setPriority(priority); return thread; } diff --git a/source/net/sourceforge/tuned/ExceptionUtilities.java b/source/net/sourceforge/tuned/ExceptionUtilities.java index 21a88ef2..f5afa28e 100644 --- a/source/net/sourceforge/tuned/ExceptionUtilities.java +++ b/source/net/sourceforge/tuned/ExceptionUtilities.java @@ -22,7 +22,7 @@ public final class ExceptionUtilities { String message = t.getMessage(); if (message == null || message.isEmpty()) { - return t.toString(); + message = t.toString().replaceAll(t.getClass().getName(), t.getClass().getSimpleName()); } return message; diff --git a/source/net/sourceforge/tuned/MessageBus.java b/source/net/sourceforge/tuned/MessageBus.java index ac28d3af..769c2472 100644 --- a/source/net/sourceforge/tuned/MessageBus.java +++ b/source/net/sourceforge/tuned/MessageBus.java @@ -6,6 +6,8 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.swing.SwingUtilities; @@ -73,7 +75,11 @@ public class MessageBus { private void publishDirect(String topic, Object... messages) { for (MessageHandler handler : getHandlers(topic.toLowerCase())) { - handler.handle(topic.toLowerCase(), messages); + try { + handler.handle(topic.toLowerCase(), messages); + } catch (Exception e) { + Logger.getLogger("global").log(Level.SEVERE, e.getMessage(), e); + } } } diff --git a/source/net/sourceforge/tuned/MessageHandler.java b/source/net/sourceforge/tuned/MessageHandler.java index 94ebfb25..5e7c6e7d 100644 --- a/source/net/sourceforge/tuned/MessageHandler.java +++ b/source/net/sourceforge/tuned/MessageHandler.java @@ -4,6 +4,6 @@ package net.sourceforge.tuned; public interface MessageHandler { - public void handle(String topic, Object... messages); + public void handle(String topic, Object... messages) throws Exception; } diff --git a/source/net/sourceforge/tuned/ui/ActionPopup.java b/source/net/sourceforge/tuned/ui/ActionPopup.java index 57e94401..3e1f6d71 100644 --- a/source/net/sourceforge/tuned/ui/ActionPopup.java +++ b/source/net/sourceforge/tuned/ui/ActionPopup.java @@ -67,6 +67,11 @@ public class ActionPopup extends JPopupMenu { } + public void clear() { + actionPanel.removeAll(); + } + + @Override public void setLabel(String label) { headerLabel.setText(label); diff --git a/source/net/sourceforge/tuned/ui/TunedUtilities.java b/source/net/sourceforge/tuned/ui/TunedUtilities.java index bf872be1..f85b0846 100644 --- a/source/net/sourceforge/tuned/ui/TunedUtilities.java +++ b/source/net/sourceforge/tuned/ui/TunedUtilities.java @@ -93,7 +93,6 @@ public final class TunedUtilities { public void actionPerformed(ActionEvent e) { runnable.run(); } - }); timer.setRepeats(false); diff --git a/test/net/sourceforge/filebot/FileBotTestSuite.java b/test/net/sourceforge/filebot/FileBotTestSuite.java index a1f612ed..a8130fdf 100644 --- a/test/net/sourceforge/filebot/FileBotTestSuite.java +++ b/test/net/sourceforge/filebot/FileBotTestSuite.java @@ -11,7 +11,7 @@ import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) -@SuiteClasses( { SimilarityTestSuite.class, WebTestSuite.class, ArgumentBeanTest.class }) +@SuiteClasses( { SimilarityTestSuite.class, WebTestSuite.class, MiscSuite.class }) public class FileBotTestSuite { } diff --git a/test/net/sourceforge/filebot/MiscSuite.java b/test/net/sourceforge/filebot/MiscSuite.java new file mode 100644 index 00000000..13071d23 --- /dev/null +++ b/test/net/sourceforge/filebot/MiscSuite.java @@ -0,0 +1,15 @@ + +package net.sourceforge.filebot; + + +import net.sourceforge.filebot.ui.panel.sfv.VerificationFileScannerTest; +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + + +@RunWith(Suite.class) +@SuiteClasses( { ArgumentBeanTest.class, VerificationFileScannerTest.class }) +public class MiscSuite { + +} diff --git a/test/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScannerTest.java b/test/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScannerTest.java new file mode 100644 index 00000000..010a9843 --- /dev/null +++ b/test/net/sourceforge/filebot/ui/panel/sfv/VerificationFileScannerTest.java @@ -0,0 +1,50 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import static org.junit.Assert.*; + +import java.io.File; +import java.util.Scanner; +import java.util.Map.Entry; + +import org.junit.Test; + + +public class VerificationFileScannerTest { + + @Test + public void nextLine() { + // trim lines, skip empty lines + String text = String.format("%s %n %n%n%n %s%n%s", "line 1", "line 2", "line 3"); + + VerificationFileScanner lines = new VerificationFileScanner(new Scanner(text)); + + assertEquals("line 1", lines.nextLine()); + assertEquals("line 2", lines.nextLine()); + assertEquals("line 3", lines.nextLine()); + + assertFalse(lines.hasNext()); + } + + + @Test + public void parseLine() { + VerificationFileScanner reader = new VerificationFileScanner(new Scanner("null")); + + // md5 + Entry md5 = reader.parseLine("50e85fe18e17e3616774637a82968f4c *folder/file.txt"); + + assertEquals("file.txt", md5.getKey().getName()); + assertEquals("folder", md5.getKey().getParent()); + assertEquals("50e85fe18e17e3616774637a82968f4c", md5.getValue()); + + // sha1 + Entry sha1 = reader.parseLine("1a02a7c1e9ac91346d08829d5037b240f42ded07 ?SHA1*folder/file.txt"); + + assertEquals("file.txt", sha1.getKey().getName()); + assertEquals("folder", sha1.getKey().getParent()); + assertEquals("1a02a7c1e9ac91346d08829d5037b240f42ded07", sha1.getValue()); + } + +}