Refactor Extension Override/Preserve default String/FileInfo formatters
This commit is contained in:
parent
d1a5c01037
commit
73b2c9e5e7
|
@ -57,7 +57,7 @@ class ExpressionFormatter implements MatchFormatter {
|
|||
}
|
||||
|
||||
@Override
|
||||
public synchronized String format(Match<?, ?> match, Map<?, ?> context) throws ScriptException {
|
||||
public synchronized String format(Match<?, ?> match, boolean extension, Map<?, ?> context) throws ScriptException {
|
||||
// lazy initialize script engine
|
||||
if (format == null) {
|
||||
format = new ExpressionFormat(expression);
|
||||
|
|
|
@ -1,53 +1,42 @@
|
|||
|
||||
package net.filebot.ui.rename;
|
||||
|
||||
import static net.filebot.util.FileUtilities.*;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Map;
|
||||
|
||||
import net.filebot.similarity.Match;
|
||||
import net.filebot.util.FileUtilities;
|
||||
import net.filebot.vfs.FileInfo;
|
||||
|
||||
|
||||
class FileNameFormatter implements MatchFormatter {
|
||||
|
||||
private boolean preserveExtension;
|
||||
|
||||
|
||||
public FileNameFormatter(boolean preserveExtension) {
|
||||
this.preserveExtension = preserveExtension;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean canFormat(Match<?, ?> match) {
|
||||
return match.getValue() instanceof File || match.getValue() instanceof FileInfo || match.getValue() instanceof String;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String preview(Match<?, ?> match) {
|
||||
return format(match, null);
|
||||
return format(match, true, null);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String format(Match<?, ?> match, Map<?, ?> context) {
|
||||
public String format(Match<?, ?> match, boolean extension, Map<?, ?> context) {
|
||||
Object value = match.getValue();
|
||||
|
||||
if (value instanceof File) {
|
||||
File file = (File) value;
|
||||
return preserveExtension ? FileUtilities.getName(file) : file.getName();
|
||||
return extension ? file.getName() : getName(file);
|
||||
}
|
||||
|
||||
if (value instanceof FileInfo) {
|
||||
FileInfo file = (FileInfo) value;
|
||||
return preserveExtension ? file.getName() : file.getPath();
|
||||
return extension ? file.getPath() : file.getName();
|
||||
}
|
||||
|
||||
if (value instanceof String) {
|
||||
return preserveExtension ? FileUtilities.getNameWithoutExtension(value.toString()) : value.toString();
|
||||
return extension ? value.toString() : getNameWithoutExtension(new File(value.toString()).getName());
|
||||
}
|
||||
|
||||
// cannot format value
|
||||
|
|
|
@ -1,20 +1,16 @@
|
|||
|
||||
package net.filebot.ui.rename;
|
||||
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import net.filebot.similarity.Match;
|
||||
|
||||
|
||||
public interface MatchFormatter {
|
||||
|
||||
public boolean canFormat(Match<?, ?> match);
|
||||
|
||||
|
||||
public String preview(Match<?, ?> match);
|
||||
|
||||
|
||||
public String format(Match<?, ?> match, Map<?, ?> context) throws Exception;
|
||||
public String format(Match<?, ?> match, boolean extension, Map<?, ?> context) throws Exception;
|
||||
|
||||
}
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
|
||||
package net.filebot.ui.rename;
|
||||
|
||||
|
||||
import static net.filebot.util.FileUtilities.*;
|
||||
|
||||
import java.util.Formatter;
|
||||
import java.util.Map;
|
||||
|
||||
import net.filebot.similarity.Match;
|
||||
import net.filebot.web.Movie;
|
||||
import net.filebot.web.MoviePart;
|
||||
|
||||
|
||||
class MovieFormatter implements MatchFormatter {
|
||||
|
||||
@Override
|
||||
public boolean canFormat(Match<?, ?> match) {
|
||||
return match.getValue() instanceof MoviePart;
|
||||
return match.getValue() instanceof Movie;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String preview(Match<?, ?> match) {
|
||||
return format(match, null);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String format(Match<?, ?> match, Map<?, ?> context) {
|
||||
MoviePart video = (MoviePart) match.getValue();
|
||||
Formatter name = new Formatter(new StringBuilder());
|
||||
Movie movie = (Movie) match.getValue();
|
||||
StringBuilder name = new StringBuilder();
|
||||
|
||||
// format as single-file or multi-part movie
|
||||
name.format("%s (%d)", video.getName(), video.getYear());
|
||||
name.append(movie.getName()).append(" (").append(movie.getYear()).append(")");
|
||||
|
||||
if (video.getPartCount() > 1) {
|
||||
name.format(".CD%d", video.getPartIndex());
|
||||
if (movie instanceof MoviePart) {
|
||||
MoviePart part = (MoviePart) movie;
|
||||
if (part.getPartCount() > 1) {
|
||||
name.append(".CD").append(part.getPartIndex());
|
||||
}
|
||||
}
|
||||
|
||||
// remove path separators if the name contains any / or \
|
||||
return replacePathSeparators(name.out().toString());
|
||||
return replacePathSeparators(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String format(Match<?, ?> match, boolean extension, Map<?, ?> context) {
|
||||
return preview(match);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,10 +2,12 @@ package net.filebot.ui.rename;
|
|||
|
||||
import static java.awt.datatransfer.DataFlavor.*;
|
||||
import static java.util.Arrays.*;
|
||||
import static java.util.stream.Collectors.*;
|
||||
import static net.filebot.MediaTypes.*;
|
||||
import static net.filebot.hash.VerificationUtilities.*;
|
||||
import static net.filebot.ui.transfer.FileTransferable.*;
|
||||
import static net.filebot.util.FileUtilities.*;
|
||||
import static net.filebot.util.RegularExpressions.*;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
|
@ -64,21 +66,12 @@ class NamesListTransferablePolicy extends FileTransferablePolicy {
|
|||
load(getFilesFromTransferable(tr), action);
|
||||
} else if (tr.isDataFlavorSupported(stringFlavor)) {
|
||||
// string transferable
|
||||
load((String) tr.getTransferData(stringFlavor));
|
||||
load(tr.getTransferData(stringFlavor).toString());
|
||||
}
|
||||
}
|
||||
|
||||
protected void load(String string) {
|
||||
List<String> values = new ArrayList<String>();
|
||||
Scanner scanner = new Scanner(string);
|
||||
|
||||
while (scanner.hasNextLine()) {
|
||||
String line = scanner.nextLine().trim();
|
||||
if (line.length() > 0) {
|
||||
values.add(normalizePathSeparators(line));
|
||||
}
|
||||
}
|
||||
|
||||
List<String> values = NEWLINE.splitAsStream(string).map(String::trim).filter(s -> s.length() > 0).map(s -> normalizePathSeparators(s)).collect(toList());
|
||||
model.addAll(values);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,13 +45,12 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
|
||||
@Override
|
||||
public String preview(Match<?, ?> match) {
|
||||
return format(match, null);
|
||||
return replacePathSeparators(String.valueOf(match.getValue())).trim(); // clean up path separators like / or \
|
||||
}
|
||||
|
||||
@Override
|
||||
public String format(Match<?, ?> match, Map<?, ?> context) {
|
||||
// clean up path separators like / or \
|
||||
return replacePathSeparators(String.valueOf(match.getValue())).trim();
|
||||
public String format(Match<?, ?> match, boolean extension, Map<?, ?> context) {
|
||||
return preview(match);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -71,6 +70,9 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
|
||||
public void setPreserveExtension(boolean preserveExtension) {
|
||||
this.preserveExtension = preserveExtension;
|
||||
|
||||
// update formatted names
|
||||
names.refresh();
|
||||
}
|
||||
|
||||
public Map<File, File> getRenameMap() {
|
||||
|
@ -213,7 +215,7 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
Match<Object, File> match = getMatch(index);
|
||||
|
||||
// create new future
|
||||
final FormattedFuture future = new FormattedFuture(match, getFormatter(match), getMatchContext(match));
|
||||
FormattedFuture future = new FormattedFuture(match, !preserveExtension, getFormatter(match), getMatchContext(match));
|
||||
|
||||
// update data
|
||||
if (type == ListEvent.INSERT) {
|
||||
|
@ -261,7 +263,7 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
for (int i = 0; i < size(); i++) {
|
||||
FormattedFuture obsolete = futures.get(i);
|
||||
Match<Object, File> match = obsolete.getMatch();
|
||||
FormattedFuture future = new FormattedFuture(match, getFormatter(match), getMatchContext(match));
|
||||
FormattedFuture future = new FormattedFuture(match, !preserveExtension, getFormatter(match), getMatchContext(match));
|
||||
|
||||
// replace and cancel old future
|
||||
cancel(futures.set(i, future));
|
||||
|
@ -308,12 +310,14 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
public static class FormattedFuture extends SwingWorker<String, Void> {
|
||||
|
||||
private final Match<Object, File> match;
|
||||
private final boolean extension;
|
||||
private final Map<File, Object> context;
|
||||
|
||||
private final MatchFormatter formatter;
|
||||
|
||||
private FormattedFuture(Match<Object, File> match, MatchFormatter formatter, Map<File, Object> context) {
|
||||
private FormattedFuture(Match<Object, File> match, boolean extension, MatchFormatter formatter, Map<File, Object> context) {
|
||||
this.match = match;
|
||||
this.extension = extension;
|
||||
this.formatter = formatter;
|
||||
this.context = context;
|
||||
}
|
||||
|
@ -332,7 +336,7 @@ public class RenameModel extends MatchModel<Object, File> {
|
|||
|
||||
@Override
|
||||
protected String doInBackground() throws Exception {
|
||||
return formatter.format(match, context).trim();
|
||||
return formatter.format(match, extension, context).trim();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -154,10 +154,10 @@ public class RenamePanel extends JComponent {
|
|||
renameModel.useFormatter(File.class, new ExpressionFormatter(persistentFileFormat.getValue(), new FileNameFormat(), File.class));
|
||||
} catch (Exception e) {
|
||||
// make sure to put File formatter at position 3
|
||||
renameModel.useFormatter(File.class, new FileNameFormatter(renameModel.preserveExtension()));
|
||||
renameModel.useFormatter(File.class, new FileNameFormatter());
|
||||
} finally {
|
||||
// use default filename formatter
|
||||
renameModel.useFormatter(FileInfo.class, new FileNameFormatter(renameModel.preserveExtension()));
|
||||
renameModel.useFormatter(FileInfo.class, new FileNameFormatter());
|
||||
}
|
||||
|
||||
RenameListCellRenderer cellrenderer = new RenameListCellRenderer(renameModel, ApplicationFolder.UserHome.getCanonicalFile());
|
||||
|
@ -560,14 +560,14 @@ public class RenamePanel extends JComponent {
|
|||
} else if (binding.getInfoObject() instanceof File) {
|
||||
return Mode.File;
|
||||
} else {
|
||||
throw new IllegalArgumentException("Cannot format class: " + binding.getClass()); // ignore objects that cannot be formatted
|
||||
throw new IllegalArgumentException("Cannot format class: " + binding.getInfoObjectType()); // ignore objects that cannot be formatted
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
return Mode.valueOf(persistentLastFormatState.getValue()); // restore previous mode
|
||||
} catch (Exception e) {
|
||||
debug.log(Level.WARNING, e.getMessage(), e);
|
||||
debug.log(Level.WARNING, e, e::getMessage);
|
||||
}
|
||||
|
||||
return Mode.Episode; // default to Episode mode
|
||||
|
@ -788,9 +788,6 @@ public class RenamePanel extends JComponent {
|
|||
public void actionPerformed(ActionEvent evt) {
|
||||
renameModel.setPreserveExtension(!activate);
|
||||
|
||||
// use different file name formatter
|
||||
renameModel.useFormatter(FileInfo.class, new FileNameFormatter(renameModel.preserveExtension()));
|
||||
|
||||
// display changed state
|
||||
filesList.repaint();
|
||||
}
|
||||
|
|
|
@ -321,7 +321,7 @@ public final class SwingUI {
|
|||
window.ifPresent(w -> w.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)));
|
||||
runnable.run();
|
||||
} catch (Exception e) {
|
||||
debug.log(Level.SEVERE, e, e::toString);
|
||||
debug.log(Level.SEVERE, e, e::getMessage);
|
||||
} finally {
|
||||
window.ifPresent(w -> w.setCursor(Cursor.getDefaultCursor()));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue