Fix ListPanel "Copy selected item" behaviour
This commit is contained in:
parent
47ab6f6b96
commit
912ddbc2d8
|
@ -26,7 +26,7 @@ public class FileBotList<E> extends JComponent {
|
|||
|
||||
protected EventList<E> model = new BasicEventList<E>();
|
||||
|
||||
protected JList list = new JList(new DefaultEventListModel<E>(model));
|
||||
protected JList<E> list = new JList<E>(new DefaultEventListModel<E>(model));
|
||||
|
||||
protected JScrollPane listScrollPane = new JScrollPane(list);
|
||||
|
||||
|
@ -58,7 +58,7 @@ public class FileBotList<E> extends JComponent {
|
|||
list.setModel(new DefaultEventListModel(model));
|
||||
}
|
||||
|
||||
public JList getListComponent() {
|
||||
public JList<E> getListComponent() {
|
||||
return list;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,16 +2,29 @@
|
|||
package net.filebot.ui;
|
||||
|
||||
import java.awt.Cursor;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
|
||||
import net.filebot.ui.transfer.ClipboardHandler;
|
||||
import net.filebot.ui.transfer.TextFileExportHandler;
|
||||
|
||||
public class FileBotListExportHandler<T> extends TextFileExportHandler {
|
||||
public class FileBotListExportHandler<T> extends TextFileExportHandler implements ClipboardHandler {
|
||||
|
||||
protected final FileBotList<T> list;
|
||||
protected final BiConsumer<T, PrintWriter> exportItem;
|
||||
|
||||
public FileBotListExportHandler(FileBotList<T> list) {
|
||||
this(list, (item, out) -> out.println(item));
|
||||
}
|
||||
|
||||
public FileBotListExportHandler(FileBotList<T> list, BiConsumer<T, PrintWriter> exportItem) {
|
||||
this.list = list;
|
||||
this.exportItem = exportItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -24,20 +37,31 @@ public class FileBotListExportHandler<T> extends TextFileExportHandler {
|
|||
try {
|
||||
list.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
for (T item : list.getModel()) {
|
||||
export(item, out);
|
||||
exportItem.accept(item, out);
|
||||
}
|
||||
} finally {
|
||||
list.setCursor(Cursor.getDefaultCursor());
|
||||
}
|
||||
}
|
||||
|
||||
public void export(T item, PrintWriter out) {
|
||||
out.println(item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDefaultFileName() {
|
||||
return list.getTitle() + ".txt";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exportToClipboard(JComponent c, Clipboard clip, int action) throws IllegalStateException {
|
||||
StringWriter buffer = new StringWriter();
|
||||
try (PrintWriter out = new PrintWriter(buffer)) {
|
||||
list.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
|
||||
for (T item : list.getListComponent().getSelectedValuesList()) {
|
||||
exportItem.accept(item, out);
|
||||
}
|
||||
} finally {
|
||||
list.setCursor(Cursor.getDefaultCursor());
|
||||
}
|
||||
|
||||
clip.setContents(new StringSelection(buffer.toString()), null);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
package net.filebot.ui.episodelist;
|
||||
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.util.List;
|
||||
|
||||
import javax.swing.JComponent;
|
||||
|
||||
import net.filebot.ui.FileBotList;
|
||||
import net.filebot.ui.FileBotListExportHandler;
|
||||
import net.filebot.ui.transfer.ArrayTransferable;
|
||||
import net.filebot.ui.transfer.ClipboardHandler;
|
||||
import net.filebot.ui.transfer.CompositeTranserable;
|
||||
import net.filebot.util.StringUtilities;
|
||||
import net.filebot.web.Episode;
|
||||
|
||||
class EpisodeListExportHandler extends FileBotListExportHandler<Episode> implements ClipboardHandler {
|
||||
|
||||
public EpisodeListExportHandler(FileBotList<Episode> list) {
|
||||
super(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transferable createTransferable(JComponent c) {
|
||||
Transferable episodeArray = export(list, true);
|
||||
Transferable textFile = super.createTransferable(c);
|
||||
|
||||
return new CompositeTranserable(episodeArray, textFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exportToClipboard(JComponent c, Clipboard clipboard, int action) throws IllegalStateException {
|
||||
ArrayTransferable<Episode> episodeData = export(list, false);
|
||||
StringSelection stringSelection = new StringSelection(StringUtilities.join(episodeData.getArray(), System.lineSeparator()));
|
||||
|
||||
clipboard.setContents(new CompositeTranserable(episodeData, stringSelection), null);
|
||||
}
|
||||
|
||||
public ArrayTransferable<Episode> export(FileBotList<?> list, boolean forceAll) {
|
||||
Episode[] selection = ((List<?>) list.getListComponent().getSelectedValuesList()).stream().map(Episode.class::cast).toArray(Episode[]::new);
|
||||
|
||||
if (forceAll || selection.length == 0) {
|
||||
selection = list.getModel().stream().map(Episode.class::cast).toArray(Episode[]::new);
|
||||
}
|
||||
|
||||
return new ArrayTransferable<Episode>(selection);
|
||||
}
|
||||
|
||||
}
|
|
@ -6,9 +6,6 @@ import static net.filebot.web.EpisodeUtilities.*;
|
|||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Toolkit;
|
||||
import java.awt.datatransfer.Clipboard;
|
||||
import java.awt.datatransfer.StringSelection;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.KeyEvent;
|
||||
import java.beans.PropertyChangeEvent;
|
||||
|
@ -22,7 +19,6 @@ import java.util.Locale;
|
|||
import javax.swing.AbstractAction;
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JMenu;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JSpinner;
|
||||
|
@ -37,15 +33,10 @@ import net.filebot.media.MediaDetection;
|
|||
import net.filebot.similarity.Normalization;
|
||||
import net.filebot.ui.AbstractSearchPanel;
|
||||
import net.filebot.ui.FileBotList;
|
||||
import net.filebot.ui.FileBotListExportHandler;
|
||||
import net.filebot.ui.LanguageComboBox;
|
||||
import net.filebot.ui.PanelBuilder;
|
||||
import net.filebot.ui.SelectDialog;
|
||||
import net.filebot.ui.transfer.ArrayTransferable;
|
||||
import net.filebot.ui.transfer.ClipboardHandler;
|
||||
import net.filebot.ui.transfer.CompositeTranserable;
|
||||
import net.filebot.ui.transfer.SaveAction;
|
||||
import net.filebot.util.StringUtilities;
|
||||
import net.filebot.util.ui.LabelProvider;
|
||||
import net.filebot.util.ui.SelectButton;
|
||||
import net.filebot.util.ui.SimpleLabelProvider;
|
||||
|
@ -279,37 +270,4 @@ public class EpisodeListPanel extends AbstractSearchPanel<EpisodeListProvider, E
|
|||
|
||||
}
|
||||
|
||||
protected static class EpisodeListExportHandler extends FileBotListExportHandler<Episode> implements ClipboardHandler {
|
||||
|
||||
public EpisodeListExportHandler(FileBotList<Episode> list) {
|
||||
super(list);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Transferable createTransferable(JComponent c) {
|
||||
Transferable episodeArray = export(list, true);
|
||||
Transferable textFile = super.createTransferable(c);
|
||||
|
||||
return new CompositeTranserable(episodeArray, textFile);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void exportToClipboard(JComponent c, Clipboard clipboard, int action) throws IllegalStateException {
|
||||
ArrayTransferable<Episode> episodeData = export(list, false);
|
||||
Transferable stringSelection = new StringSelection(StringUtilities.join(episodeData.getArray(), System.lineSeparator()));
|
||||
|
||||
clipboard.setContents(new CompositeTranserable(episodeData, stringSelection), null);
|
||||
}
|
||||
|
||||
public ArrayTransferable<Episode> export(FileBotList<?> list, boolean forceAll) {
|
||||
Episode[] selection = ((List<?>) list.getListComponent().getSelectedValuesList()).stream().map(Episode.class::cast).toArray(Episode[]::new);
|
||||
|
||||
if (forceAll || selection.length == 0) {
|
||||
selection = list.getModel().stream().map(Episode.class::cast).toArray(Episode[]::new);
|
||||
}
|
||||
|
||||
return new ArrayTransferable<Episode>(selection);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ import java.awt.BorderLayout;
|
|||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.datatransfer.Transferable;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
import java.util.ListIterator;
|
||||
import java.util.stream.IntStream;
|
||||
|
@ -71,13 +70,10 @@ public class ListPanel extends JComponent {
|
|||
list.getRemoveAction().setEnabled(true);
|
||||
|
||||
list.setTransferablePolicy(new FileListTransferablePolicy(list::setTitle, editor::setText, this::createItemSequence));
|
||||
list.setExportHandler(new FileBotListExportHandler<ListItem>(list) {
|
||||
|
||||
@Override
|
||||
public void export(ListItem item, PrintWriter out) {
|
||||
out.println(item.getFormattedValue());
|
||||
}
|
||||
});
|
||||
FileBotListExportHandler<ListItem> exportHandler = new FileBotListExportHandler<ListItem>(list, (item, out) -> out.println(item.getFormattedValue()));
|
||||
list.setExportHandler(exportHandler);
|
||||
list.getTransferHandler().setClipboardHandler(exportHandler);
|
||||
|
||||
list.getListComponent().setCellRenderer(new DefaultFancyListCellRenderer() {
|
||||
|
||||
|
|
|
@ -34,10 +34,10 @@ public abstract class TextFileExportHandler implements TransferableExportHandler
|
|||
|
||||
@Override
|
||||
public Transferable createTransferable(JComponent c) {
|
||||
// get transfer data
|
||||
StringWriter buffer = new StringWriter();
|
||||
export(new PrintWriter(buffer));
|
||||
|
||||
try (PrintWriter out = new PrintWriter(buffer)) {
|
||||
export(out);
|
||||
}
|
||||
return new TextFileTransferable(getDefaultFileName(), buffer.toString());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package net.filebot.ui.transfer;
|
||||
|
||||
import static java.nio.charset.StandardCharsets.*;
|
||||
import static java.util.Collections.*;
|
||||
|
||||
import java.awt.datatransfer.DataFlavor;
|
||||
import java.awt.datatransfer.UnsupportedFlavorException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.AbstractMap;
|
||||
import java.util.Collections;
|
||||
import java.util.Set;
|
||||
|
||||
public class TextFileTransferable extends ByteBufferTransferable {
|
||||
|
@ -18,17 +18,13 @@ public class TextFileTransferable extends ByteBufferTransferable {
|
|||
this(name, text, UTF_8);
|
||||
}
|
||||
|
||||
public TextFileTransferable(final String name, final String text, final Charset charset) {
|
||||
public TextFileTransferable(String name, String text, Charset charset) {
|
||||
// lazy data map for file transfer
|
||||
super(new AbstractMap<String, ByteBuffer>() {
|
||||
|
||||
@Override
|
||||
public Set<Entry<String, ByteBuffer>> entrySet() {
|
||||
// encode text
|
||||
Entry<String, ByteBuffer> entry = new SimpleEntry<String, ByteBuffer>(name, charset.encode(text));
|
||||
|
||||
// return memory file entry
|
||||
return Collections.singleton(entry);
|
||||
return singletonMap(name, charset.encode(text)).entrySet();
|
||||
}
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue