From 9f9aa9ed8271a712488a629a310e553ec69be154 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Thu, 10 Mar 2016 16:23:45 +0000 Subject: [PATCH] Support REVERT for all rename actions --- .classpath | 2 +- source/net/filebot/StandardRenameAction.java | 39 ++++++++++++- .../net/filebot/ui/rename/HistoryDialog.java | 56 ++++++++----------- 3 files changed, 61 insertions(+), 36 deletions(-) diff --git a/.classpath b/.classpath index 31d9eb0a..66046fbe 100644 --- a/.classpath +++ b/.classpath @@ -17,7 +17,7 @@ - + diff --git a/source/net/filebot/StandardRenameAction.java b/source/net/filebot/StandardRenameAction.java index 06f1fcc5..6a6416a7 100644 --- a/source/net/filebot/StandardRenameAction.java +++ b/source/net/filebot/StandardRenameAction.java @@ -3,6 +3,8 @@ package net.filebot; import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.nio.file.LinkOption; +import java.nio.file.attribute.BasicFileAttributes; import net.filebot.util.FileUtilities; @@ -128,8 +130,43 @@ public enum StandardRenameAction implements RenameAction { if (it.name().equalsIgnoreCase(action)) return it; } - throw new IllegalArgumentException("Illegal rename action: " + action); } + public static File revert(File current, File original) throws IOException { + // reverse move + if (current.exists() && !original.exists()) { + return FileUtilities.moveRename(current, original); + } + + BasicFileAttributes currentAttr = Files.readAttributes(current.toPath(), BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); + BasicFileAttributes originalAttr = Files.readAttributes(original.toPath(), BasicFileAttributes.class, LinkOption.NOFOLLOW_LINKS); + + // reverse symlink + if (currentAttr.isSymbolicLink() && !originalAttr.isSymbolicLink()) { + Files.delete(current.toPath()); + return original; + } + + // reverse keeplink + if (!currentAttr.isSymbolicLink() && originalAttr.isSymbolicLink()) { + Files.delete(original.toPath()); + return FileUtilities.moveRename(current, original); + } + + // reverse copy / hardlink + if (currentAttr.isRegularFile() && originalAttr.isRegularFile()) { + Files.delete(current.toPath()); + return original; + } + + // reverse folder copy + if (currentAttr.isDirectory() && originalAttr.isDirectory()) { + FileUtilities.delete(original); + return FileUtilities.moveRename(current, original); + } + + throw new IllegalArgumentException(String.format("Cannot revert files: %s => %s", current, original)); + } + } diff --git a/source/net/filebot/ui/rename/HistoryDialog.java b/source/net/filebot/ui/rename/HistoryDialog.java index d10ce2b3..7f7ad35f 100644 --- a/source/net/filebot/ui/rename/HistoryDialog.java +++ b/source/net/filebot/ui/rename/HistoryDialog.java @@ -8,7 +8,6 @@ import static javax.swing.JOptionPane.*; import static net.filebot.Logging.*; import static net.filebot.Settings.*; import static net.filebot.UserFiles.*; -import static net.filebot.util.FileUtilities.*; import static net.filebot.util.ui.SwingUI.*; import java.awt.Color; @@ -72,7 +71,7 @@ import net.filebot.History; import net.filebot.History.Element; import net.filebot.History.Sequence; import net.filebot.ResourceManager; -import net.filebot.Settings; +import net.filebot.StandardRenameAction; import net.filebot.mac.MacAppUtilities; import net.filebot.media.MetaAttributes; import net.filebot.ui.transfer.FileExportHandler; @@ -445,25 +444,15 @@ class HistoryDialog extends JDialog { } private enum Option { - Rename { + Revert, ChangeDirectory, Cancel; - @Override - public String toString() { - return "Rename"; - } - }, - ChangeDirectory { - - @Override - public String toString() { + @Override + public String toString() { + switch (this) { + case ChangeDirectory: return "Change Directory"; - } - }, - Cancel { - - @Override - public String toString() { - return "Cancel"; + default: + return name(); } } } @@ -488,9 +477,9 @@ class HistoryDialog extends JDialog { Set