* improved dnd behaviour
This commit is contained in:
parent
05eecdedd5
commit
824c29fd36
|
@ -5,7 +5,8 @@ package net.sourceforge.filebot;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
import java.util.Iterator;
|
import java.io.File;
|
||||||
|
import java.util.List;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import javax.swing.Action;
|
import javax.swing.Action;
|
||||||
|
@ -20,13 +21,6 @@ public class FileBotUtil {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void registerActionForKeystroke(JComponent component, KeyStroke keystroke, Action action) {
|
|
||||||
Integer key = action.hashCode();
|
|
||||||
component.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(keystroke, key);
|
|
||||||
component.getActionMap().put(key, action);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* invalid characters: \, /, :, *, ?, ", <, > and |
|
* invalid characters: \, /, :, *, ?, ", <, > and |
|
||||||
*/
|
*/
|
||||||
|
@ -60,19 +54,63 @@ public class FileBotUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String join(Iterable<?> list, String delim) {
|
public static boolean containsOnlyFolders(List<File> files) {
|
||||||
StringBuilder sb = new StringBuilder();
|
for (File file : files) {
|
||||||
|
if (!file.isDirectory())
|
||||||
Iterator<?> it = list.iterator();
|
return false;
|
||||||
|
|
||||||
while (it.hasNext()) {
|
|
||||||
sb.append(it.next().toString());
|
|
||||||
|
|
||||||
if (it.hasNext())
|
|
||||||
sb.append(delim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sb.toString();
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean containsOnlyTorrentFiles(List<File> files) {
|
||||||
|
for (File file : files) {
|
||||||
|
if (!file.isFile() || !FileFormat.getExtension(file).equalsIgnoreCase("torrent"))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean containsOnlySfvFiles(List<File> files) {
|
||||||
|
for (File file : files) {
|
||||||
|
if (!file.isFile() || !FileFormat.getExtension(file).equalsIgnoreCase("sfv"))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean containsOnlyListFiles(List<File> files) {
|
||||||
|
for (File file : files) {
|
||||||
|
if (!isListFile(file))
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static boolean isListFile(File file) {
|
||||||
|
if (!file.isFile())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
String extension = FileFormat.getExtension(file).toLowerCase();
|
||||||
|
|
||||||
|
if (extension.equals("txt") || extension.equals("list") || extension.isEmpty())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void registerActionForKeystroke(JComponent component, KeyStroke keystroke, Action action) {
|
||||||
|
Integer key = action.hashCode();
|
||||||
|
component.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(keystroke, key);
|
||||||
|
component.getActionMap().put(key, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -31,10 +31,13 @@ public class FileFormat {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String formatName(File f) {
|
public static String formatName(File file) {
|
||||||
String name = f.getName();
|
if (file == null)
|
||||||
|
return "";
|
||||||
|
|
||||||
if (f.isDirectory())
|
String name = file.getName();
|
||||||
|
|
||||||
|
if (file.isDirectory())
|
||||||
return name;
|
return name;
|
||||||
|
|
||||||
return getNameWithoutExtension(name);
|
return getNameWithoutExtension(name);
|
||||||
|
@ -49,13 +52,16 @@ public class FileFormat {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getExtension(File f) {
|
public static String getExtension(File file) {
|
||||||
return getExtension(f, false);
|
return getExtension(file, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String getExtension(File f, boolean includeDot) {
|
public static String getExtension(File file, boolean includeDot) {
|
||||||
String name = f.getName();
|
if (!file.isFile())
|
||||||
|
return null;
|
||||||
|
|
||||||
|
String name = file.getName();
|
||||||
int dotIndex = name.lastIndexOf(".");
|
int dotIndex = name.lastIndexOf(".");
|
||||||
|
|
||||||
// .config -> no extension
|
// .config -> no extension
|
||||||
|
@ -90,6 +96,9 @@ public class FileFormat {
|
||||||
|
|
||||||
|
|
||||||
public static String getName(File file) {
|
public static String getName(File file) {
|
||||||
|
if (file == null)
|
||||||
|
return "";
|
||||||
|
|
||||||
String name = file.getName();
|
String name = file.getName();
|
||||||
|
|
||||||
if (!name.isEmpty())
|
if (!name.isEmpty())
|
||||||
|
|
|
@ -5,7 +5,6 @@ package net.sourceforge.filebot.ui;
|
||||||
import java.awt.BorderLayout;
|
import java.awt.BorderLayout;
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
@ -134,7 +133,7 @@ public class FileBotList extends JPanel implements Saveable, TransferablePolicyS
|
||||||
}
|
}
|
||||||
|
|
||||||
out.close();
|
out.close();
|
||||||
} catch (FileNotFoundException e) {
|
} catch (Exception e) {
|
||||||
// should not happen
|
// should not happen
|
||||||
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,12 @@ package net.sourceforge.filebot.ui.panel.list;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import net.sourceforge.filebot.FileBotUtil;
|
||||||
import net.sourceforge.filebot.FileFormat;
|
import net.sourceforge.filebot.FileFormat;
|
||||||
import net.sourceforge.filebot.torrent.Torrent;
|
import net.sourceforge.filebot.torrent.Torrent;
|
||||||
import net.sourceforge.filebot.ui.FileBotList;
|
import net.sourceforge.filebot.ui.FileBotList;
|
||||||
|
@ -25,7 +28,7 @@ class FileListTransferablePolicy extends FileTransferablePolicy {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean accept(File file) {
|
protected boolean accept(File file) {
|
||||||
return file.isDirectory() || FileFormat.getExtension(file).equalsIgnoreCase("torrent");
|
return file.isFile() || file.isDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,34 +39,67 @@ class FileListTransferablePolicy extends FileTransferablePolicy {
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void load(File file) {
|
protected void load(List<File> files) {
|
||||||
if (file.isDirectory()) {
|
if (files.size() > 1) {
|
||||||
list.setTitle(file.getName());
|
list.setTitle(FileFormat.getName(files.get(0).getParentFile()));
|
||||||
|
|
||||||
for (File f : file.listFiles()) {
|
|
||||||
list.getModel().add(FileFormat.formatName(f));
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (FileFormat.getExtension(file).equalsIgnoreCase("torrent")) {
|
|
||||||
try {
|
|
||||||
Torrent torrent = new Torrent(file);
|
|
||||||
list.setTitle(FileFormat.getNameWithoutExtension(torrent.getName()));
|
|
||||||
|
|
||||||
|
if (FileBotUtil.containsOnlyFolders(files)) {
|
||||||
|
loadFolderList(files);
|
||||||
|
} else if (FileBotUtil.containsOnlyTorrentFiles(files)) {
|
||||||
|
loadTorrentList(files);
|
||||||
|
} else {
|
||||||
|
super.load(files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void loadFolderList(List<File> folders) {
|
||||||
|
if (folders.size() == 1) {
|
||||||
|
list.setTitle(FileFormat.getName(folders.get(0)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (File folder : folders) {
|
||||||
|
for (File file : folder.listFiles()) {
|
||||||
|
list.getModel().add(FileFormat.formatName(file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void loadTorrentList(List<File> torrentFiles) {
|
||||||
|
try {
|
||||||
|
List<Torrent> torrents = new ArrayList<Torrent>(torrentFiles.size());
|
||||||
|
|
||||||
|
for (File file : torrentFiles) {
|
||||||
|
torrents.add(new Torrent(file));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (torrentFiles.size() == 1) {
|
||||||
|
list.setTitle(FileFormat.getNameWithoutExtension(torrents.get(0).getName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Torrent torrent : torrents) {
|
||||||
for (Torrent.Entry entry : torrent.getFiles()) {
|
for (Torrent.Entry entry : torrent.getFiles()) {
|
||||||
list.getModel().add(FileFormat.getNameWithoutExtension(entry.getName()));
|
list.getModel().add(FileFormat.getNameWithoutExtension(entry.getName()));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// should not happen
|
// should not happen
|
||||||
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void load(File file) {
|
||||||
|
list.getModel().add(FileFormat.formatName(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getDescription() {
|
public String getDescription() {
|
||||||
return "folders and torrents";
|
return "files, folders and torrents";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,9 @@ package net.sourceforge.filebot.ui.panel.rename;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.sourceforge.filebot.FileBotUtil;
|
||||||
import net.sourceforge.filebot.ui.panel.rename.entry.FileEntry;
|
import net.sourceforge.filebot.ui.panel.rename.entry.FileEntry;
|
||||||
import net.sourceforge.filebot.ui.transferablepolicies.FileTransferablePolicy;
|
import net.sourceforge.filebot.ui.transferablepolicies.FileTransferablePolicy;
|
||||||
import net.sourceforge.tuned.ui.SimpleListModel;
|
import net.sourceforge.tuned.ui.SimpleListModel;
|
||||||
|
@ -12,37 +14,41 @@ import net.sourceforge.tuned.ui.SimpleListModel;
|
||||||
|
|
||||||
class FilesListTransferablePolicy extends FileTransferablePolicy {
|
class FilesListTransferablePolicy extends FileTransferablePolicy {
|
||||||
|
|
||||||
private SimpleListModel listModel;
|
private final SimpleListModel model;
|
||||||
|
|
||||||
|
|
||||||
public FilesListTransferablePolicy(SimpleListModel listModel) {
|
public FilesListTransferablePolicy(SimpleListModel listModel) {
|
||||||
this.listModel = listModel;
|
this.model = listModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean accept(File file) {
|
protected boolean accept(File file) {
|
||||||
return file.isDirectory() || file.isFile();
|
return file.isFile() || file.isDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void clear() {
|
protected void clear() {
|
||||||
listModel.clear();
|
model.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void load(List<File> files) {
|
||||||
|
if (FileBotUtil.containsOnlyFolders(files)) {
|
||||||
|
for (File folder : files) {
|
||||||
|
super.load(Arrays.asList(folder.listFiles()));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
super.load(files);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void load(File file) {
|
protected void load(File file) {
|
||||||
if (file.isDirectory()) {
|
model.add(new FileEntry(file));
|
||||||
File subfiles[] = file.listFiles();
|
|
||||||
Arrays.sort(subfiles);
|
|
||||||
|
|
||||||
for (File f : subfiles)
|
|
||||||
listModel.add(new FileEntry(f));
|
|
||||||
} else {
|
|
||||||
listModel.add(new FileEntry(file));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ package net.sourceforge.filebot.ui.panel.rename;
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -14,19 +15,17 @@ import java.util.logging.Logger;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import net.sourceforge.filebot.FileBotUtil;
|
import net.sourceforge.filebot.FileBotUtil;
|
||||||
import net.sourceforge.filebot.FileFormat;
|
|
||||||
import net.sourceforge.filebot.torrent.Torrent;
|
import net.sourceforge.filebot.torrent.Torrent;
|
||||||
import net.sourceforge.filebot.ui.panel.rename.entry.ListEntry;
|
import net.sourceforge.filebot.ui.panel.rename.entry.ListEntry;
|
||||||
import net.sourceforge.filebot.ui.panel.rename.entry.StringEntry;
|
import net.sourceforge.filebot.ui.panel.rename.entry.StringEntry;
|
||||||
import net.sourceforge.filebot.ui.panel.rename.entry.TorrentEntry;
|
import net.sourceforge.filebot.ui.panel.rename.entry.TorrentEntry;
|
||||||
import net.sourceforge.filebot.ui.transferablepolicies.FileTransferablePolicy;
|
|
||||||
import net.sourceforge.filebot.ui.transferablepolicies.MultiTransferablePolicy;
|
import net.sourceforge.filebot.ui.transferablepolicies.MultiTransferablePolicy;
|
||||||
import net.sourceforge.filebot.ui.transferablepolicies.TextTransferablePolicy;
|
import net.sourceforge.filebot.ui.transferablepolicies.TextTransferablePolicy;
|
||||||
|
|
||||||
|
|
||||||
class NamesListTransferablePolicy extends MultiTransferablePolicy {
|
class NamesListTransferablePolicy extends MultiTransferablePolicy {
|
||||||
|
|
||||||
private NamesRenameList list;
|
private final NamesRenameList list;
|
||||||
|
|
||||||
|
|
||||||
public NamesListTransferablePolicy(NamesRenameList list) {
|
public NamesListTransferablePolicy(NamesRenameList list) {
|
||||||
|
@ -63,45 +62,71 @@ class NamesListTransferablePolicy extends MultiTransferablePolicy {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class FilePolicy extends FileTransferablePolicy {
|
private class FilePolicy extends FilesListTransferablePolicy {
|
||||||
|
|
||||||
private long MAX_FILESIZE = 10 * FileFormat.MEGA;
|
public FilePolicy() {
|
||||||
|
super(list.getModel());
|
||||||
|
|
||||||
@Override
|
|
||||||
protected boolean accept(File file) {
|
|
||||||
return file.isFile() && (file.length() < MAX_FILESIZE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void load(File file) {
|
protected boolean accept(File file) {
|
||||||
|
return file.isFile() || file.isDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void load(List<File> files) {
|
||||||
|
|
||||||
|
if (FileBotUtil.containsOnlyListFiles(files)) {
|
||||||
|
loadListFiles(files);
|
||||||
|
} else if (FileBotUtil.containsOnlyTorrentFiles(files)) {
|
||||||
|
loadTorrentFiles(files);
|
||||||
|
} else {
|
||||||
|
super.load(files);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void loadListFiles(List<File> files) {
|
||||||
try {
|
try {
|
||||||
List<ListEntry<?>> entries = new ArrayList<ListEntry<?>>();
|
List<ListEntry<?>> entries = new ArrayList<ListEntry<?>>();
|
||||||
|
|
||||||
if (FileFormat.getExtension(file).equalsIgnoreCase("torrent")) {
|
for (File file : files) {
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
|
||||||
|
|
||||||
|
String line = null;
|
||||||
|
|
||||||
|
while ((line = in.readLine()) != null) {
|
||||||
|
if (line.trim().length() > 0) {
|
||||||
|
entries.add(new StringEntry(line));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
submit(entries);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void loadTorrentFiles(List<File> files) {
|
||||||
|
try {
|
||||||
|
List<ListEntry<?>> entries = new ArrayList<ListEntry<?>>();
|
||||||
|
|
||||||
|
for (File file : files) {
|
||||||
Torrent torrent = new Torrent(file);
|
Torrent torrent = new Torrent(file);
|
||||||
|
|
||||||
for (Torrent.Entry entry : torrent.getFiles()) {
|
for (Torrent.Entry entry : torrent.getFiles()) {
|
||||||
entries.add(new TorrentEntry(entry));
|
entries.add(new TorrentEntry(entry));
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
|
|
||||||
|
|
||||||
String line = null;
|
|
||||||
|
|
||||||
while ((line = in.readLine()) != null)
|
|
||||||
if (line.trim().length() > 0)
|
|
||||||
entries.add(new StringEntry(line));
|
|
||||||
|
|
||||||
in.close();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!entries.isEmpty()) {
|
|
||||||
submit(entries);
|
submit(entries);
|
||||||
}
|
} catch (IOException e) {
|
||||||
} catch (Exception e) {
|
|
||||||
// should not happen
|
|
||||||
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ package net.sourceforge.filebot.ui.panel.rename;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
|
|
||||||
|
import javax.swing.JLabel;
|
||||||
import javax.swing.JList;
|
import javax.swing.JList;
|
||||||
import javax.swing.ListModel;
|
import javax.swing.ListModel;
|
||||||
|
|
||||||
|
@ -13,8 +14,10 @@ import net.sourceforge.tuned.ui.FancyListCellRenderer;
|
||||||
|
|
||||||
class RenameListCellRenderer extends FancyListCellRenderer {
|
class RenameListCellRenderer extends FancyListCellRenderer {
|
||||||
|
|
||||||
private ListModel names;
|
private final ListModel names;
|
||||||
private ListModel files;
|
private final ListModel files;
|
||||||
|
|
||||||
|
private final JLabel extension = new JLabel(".png");
|
||||||
|
|
||||||
|
|
||||||
public RenameListCellRenderer(ListModel names, ListModel files) {
|
public RenameListCellRenderer(ListModel names, ListModel files) {
|
||||||
|
@ -22,6 +25,8 @@ class RenameListCellRenderer extends FancyListCellRenderer {
|
||||||
this.files = files;
|
this.files = files;
|
||||||
|
|
||||||
setHighlightingEnabled(false);
|
setHighlightingEnabled(false);
|
||||||
|
|
||||||
|
this.add(extension);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color noMatchGradientBeginColor = Color.decode("#B7B7B7");
|
private Color noMatchGradientBeginColor = Color.decode("#B7B7B7");
|
||||||
|
|
|
@ -5,7 +5,6 @@ package net.sourceforge.filebot.ui.panel.sfv;
|
||||||
import java.beans.PropertyChangeEvent;
|
import java.beans.PropertyChangeEvent;
|
||||||
import java.beans.PropertyChangeListener;
|
import java.beans.PropertyChangeListener;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.PrintStream;
|
import java.io.PrintStream;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
@ -166,7 +165,7 @@ class SfvTable extends JTable implements TransferablePolicySupport, Saveable {
|
||||||
}
|
}
|
||||||
|
|
||||||
out.close();
|
out.close();
|
||||||
} catch (FileNotFoundException e) {
|
} catch (Exception e) {
|
||||||
// should not happen
|
// should not happen
|
||||||
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
Logger.getLogger(Logger.GLOBAL_LOGGER_NAME).log(Level.SEVERE, e.toString(), e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,7 @@ import java.util.logging.Logger;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import net.sourceforge.filebot.FileFormat;
|
import net.sourceforge.filebot.FileBotUtil;
|
||||||
import net.sourceforge.filebot.ui.transferablepolicies.BackgroundFileTransferablePolicy;
|
import net.sourceforge.filebot.ui.transferablepolicies.BackgroundFileTransferablePolicy;
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,22 +89,12 @@ class SfvTransferablePolicy extends BackgroundFileTransferablePolicy<SfvTableMod
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private boolean isSfvFileList(List<File> files) {
|
|
||||||
for (File file : files) {
|
|
||||||
if (!FileFormat.getExtension(file).equalsIgnoreCase("sfv"))
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void load(List<File> files) {
|
protected void load(List<File> files) {
|
||||||
synchronized (ChecksumComputationExecutor.getInstance()) {
|
synchronized (ChecksumComputationExecutor.getInstance()) {
|
||||||
ChecksumComputationExecutor.getInstance().pause();
|
ChecksumComputationExecutor.getInstance().pause();
|
||||||
|
|
||||||
if (isSfvFileList(files)) {
|
if (FileBotUtil.containsOnlySfvFiles(files)) {
|
||||||
// one or more sfv files
|
// one or more sfv files
|
||||||
for (File file : files) {
|
for (File file : files) {
|
||||||
loadSfvFile(file);
|
loadSfvFile(file);
|
||||||
|
|
|
@ -5,10 +5,9 @@ package net.sourceforge.filebot.ui.transferablepolicies;
|
||||||
import java.awt.datatransfer.Transferable;
|
import java.awt.datatransfer.Transferable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import net.sourceforge.filebot.FileBotUtil;
|
|
||||||
|
|
||||||
|
|
||||||
public class MultiTransferablePolicy implements TransferablePolicy {
|
public class MultiTransferablePolicy implements TransferablePolicy {
|
||||||
|
|
||||||
|
@ -84,7 +83,17 @@ public class MultiTransferablePolicy implements TransferablePolicy {
|
||||||
descriptions.add(desc);
|
descriptions.add(desc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return FileBotUtil.join(descriptions, ", ");
|
StringBuilder sb = new StringBuilder();
|
||||||
|
Iterator<String> iterator = descriptions.iterator();
|
||||||
|
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
sb.append(iterator.next().toString());
|
||||||
|
|
||||||
|
if (iterator.hasNext())
|
||||||
|
sb.append(", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -101,8 +101,19 @@ public class SimpleListModel extends AbstractListModel {
|
||||||
|
|
||||||
|
|
||||||
public void remove(Object object) {
|
public void remove(Object object) {
|
||||||
|
synchronized (list) {
|
||||||
remove(indexOf(object));
|
remove(indexOf(object));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void sort() {
|
||||||
|
synchronized (list) {
|
||||||
|
Collections.sort(list, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
fireContentsChanged(this, 0, list.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public List<? extends Object> getCopy() {
|
public List<? extends Object> getCopy() {
|
||||||
|
@ -115,8 +126,10 @@ public class SimpleListModel extends AbstractListModel {
|
||||||
public void set(Collection<? extends Object> c) {
|
public void set(Collection<? extends Object> c) {
|
||||||
int end = Math.max(list.size(), c.size()) - 1;
|
int end = Math.max(list.size(), c.size()) - 1;
|
||||||
|
|
||||||
|
synchronized (list) {
|
||||||
list.clear();
|
list.clear();
|
||||||
list.addAll(c);
|
list.addAll(c);
|
||||||
|
}
|
||||||
|
|
||||||
if (end >= 0) {
|
if (end >= 0) {
|
||||||
fireContentsChanged(this, 0, end);
|
fireContentsChanged(this, 0, end);
|
||||||
|
|
Loading…
Reference in New Issue