From ec501bc2edf8a8a5ca0b9dda62451caca85ebc4e Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sun, 20 Mar 2016 09:28:09 +0000 Subject: [PATCH] Support sending selected episode data from Episodes panel to Rename panel via context menu (not just clipboard copy & paste) --- source/net/filebot/ui/MainFrame.java | 11 +++++++- .../ui/analyze/AnalyzePanelBuilder.java | 5 ++++ .../ui/episodelist/EpisodeListPanel.java | 25 ++++++++++++++----- .../episodelist/EpisodeListPanelBuilder.java | 7 +++--- .../net/filebot/ui/list/ListPanelBuilder.java | 7 +++--- .../rename/NamesListTransferablePolicy.java | 2 +- source/net/filebot/ui/rename/RenamePanel.java | 10 +++++--- .../filebot/ui/rename/RenamePanelBuilder.java | 7 +++--- .../net/filebot/ui/sfv/SfvPanelBuilder.java | 7 +++--- .../ui/subtitle/SubtitlePanelBuilder.java | 7 +++--- .../ui/transfer/ArrayTransferable.java | 6 ++++- source/net/filebot/util/ui/SwingEventBus.java | 15 +++++++++++ 12 files changed, 81 insertions(+), 28 deletions(-) diff --git a/source/net/filebot/ui/MainFrame.java b/source/net/filebot/ui/MainFrame.java index 50e32883..2a6bc561 100644 --- a/source/net/filebot/ui/MainFrame.java +++ b/source/net/filebot/ui/MainFrame.java @@ -36,6 +36,8 @@ import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import com.google.common.eventbus.Subscribe; + import net.filebot.CacheManager; import net.filebot.Settings; import net.filebot.cli.GroovyPad; @@ -137,9 +139,16 @@ public class MainFrame extends JFrame { installAction(this.getRootPane(), getKeyStroke(VK_F1, 0), newAction("Help", evt -> { GettingStartedStage.start(); })); + + SwingEventBus.getInstance().register(this); } - protected void showPanel(PanelBuilder selectedBuilder) { + @Subscribe + public void selectPanel(PanelBuilder panel) { + selectionList.setSelectedValue(panel, false); + } + + private void showPanel(PanelBuilder selectedBuilder) { JComponent contentPane = (JComponent) getContentPane(); JComponent selectedPanel = null; diff --git a/source/net/filebot/ui/analyze/AnalyzePanelBuilder.java b/source/net/filebot/ui/analyze/AnalyzePanelBuilder.java index da8c2707..9f333180 100644 --- a/source/net/filebot/ui/analyze/AnalyzePanelBuilder.java +++ b/source/net/filebot/ui/analyze/AnalyzePanelBuilder.java @@ -19,6 +19,11 @@ public class AnalyzePanelBuilder implements PanelBuilder { return ResourceManager.getIcon("panel.analyze"); } + @Override + public boolean equals(Object obj) { + return obj instanceof AnalyzePanelBuilder; + } + @Override public JComponent create() { AnalyzePanel panel = new AnalyzePanel(); diff --git a/source/net/filebot/ui/episodelist/EpisodeListPanel.java b/source/net/filebot/ui/episodelist/EpisodeListPanel.java index 8d093ea0..1942be8b 100644 --- a/source/net/filebot/ui/episodelist/EpisodeListPanel.java +++ b/source/net/filebot/ui/episodelist/EpisodeListPanel.java @@ -39,6 +39,7 @@ import net.filebot.ui.FileBotList; import net.filebot.ui.FileBotListExportHandler; import net.filebot.ui.LanguageComboBox; import net.filebot.ui.SelectDialog; +import net.filebot.ui.rename.RenamePanelBuilder; import net.filebot.ui.transfer.ArrayTransferable; import net.filebot.ui.transfer.ClipboardHandler; import net.filebot.ui.transfer.CompositeTranserable; @@ -47,6 +48,7 @@ import net.filebot.util.StringUtilities; import net.filebot.util.ui.LabelProvider; import net.filebot.util.ui.SelectButton; import net.filebot.util.ui.SimpleLabelProvider; +import net.filebot.util.ui.SwingEventBus; import net.filebot.web.Episode; import net.filebot.web.EpisodeListProvider; import net.filebot.web.SearchResult; @@ -251,6 +253,13 @@ public class EpisodeListPanel extends AbstractSearchPanel { + // switch to Rename panel + SwingEventBus.getInstance().post(new RenamePanelBuilder()); + + // load episode data + invokeLater(200, () -> SwingEventBus.getInstance().post(EpisodeListExportHandler.export(this, false))); + })); popup.add(newAction("Copy", ResourceManager.getIcon("rename.action.copy"), evt -> { getTransferHandler().getClipboardHandler().exportToClipboard(this, Toolkit.getDefaultToolkit().getSystemClipboard(), TransferHandler.COPY); })); @@ -268,7 +277,7 @@ public class EpisodeListPanel extends AbstractSearchPanel(list.getModel().toArray(new Episode[0])); + Transferable episodeArray = export(list, true); Transferable textFile = super.createTransferable(c); return new CompositeTranserable(episodeArray, textFile); @@ -276,16 +285,20 @@ public class EpisodeListPanel extends AbstractSearchPanel episodeData = export(list, false); + Transferable stringSelection = new StringSelection(StringUtilities.join(episodeData.getArray(), System.lineSeparator())); + + clipboard.setContents(new CompositeTranserable(episodeData, stringSelection), null); + } + + public static ArrayTransferable export(FileBotList list, boolean forceAll) { Episode[] selection = ((List) list.getListComponent().getSelectedValuesList()).stream().map(Episode.class::cast).toArray(Episode[]::new); - if (selection.length == 0) { + if (forceAll || selection.length == 0) { selection = list.getModel().stream().map(Episode.class::cast).toArray(Episode[]::new); } - Transferable episodeArray = new ArrayTransferable(selection); - Transferable stringSelection = new StringSelection(StringUtilities.join(selection, "\n")); - - clipboard.setContents(new CompositeTranserable(episodeArray, stringSelection), null); + return new ArrayTransferable(selection); } } diff --git a/source/net/filebot/ui/episodelist/EpisodeListPanelBuilder.java b/source/net/filebot/ui/episodelist/EpisodeListPanelBuilder.java index 90249b20..38687863 100644 --- a/source/net/filebot/ui/episodelist/EpisodeListPanelBuilder.java +++ b/source/net/filebot/ui/episodelist/EpisodeListPanelBuilder.java @@ -1,14 +1,12 @@ package net.filebot.ui.episodelist; - import javax.swing.Icon; import javax.swing.JComponent; import net.filebot.ResourceManager; import net.filebot.ui.PanelBuilder; - public class EpisodeListPanelBuilder implements PanelBuilder { @Override @@ -16,12 +14,15 @@ public class EpisodeListPanelBuilder implements PanelBuilder { return "Episodes"; } - @Override public Icon getIcon() { return ResourceManager.getIcon("panel.episodelist"); } + @Override + public boolean equals(Object obj) { + return obj instanceof EpisodeListPanelBuilder; + } @Override public JComponent create() { diff --git a/source/net/filebot/ui/list/ListPanelBuilder.java b/source/net/filebot/ui/list/ListPanelBuilder.java index a0c449ed..38ca23ab 100644 --- a/source/net/filebot/ui/list/ListPanelBuilder.java +++ b/source/net/filebot/ui/list/ListPanelBuilder.java @@ -1,14 +1,12 @@ package net.filebot.ui.list; - import javax.swing.Icon; import javax.swing.JComponent; import net.filebot.ResourceManager; import net.filebot.ui.PanelBuilder; - public class ListPanelBuilder implements PanelBuilder { @Override @@ -16,12 +14,15 @@ public class ListPanelBuilder implements PanelBuilder { return "List"; } - @Override public Icon getIcon() { return ResourceManager.getIcon("panel.list"); } + @Override + public boolean equals(Object obj) { + return obj instanceof ListPanelBuilder; + } @Override public JComponent create() { diff --git a/source/net/filebot/ui/rename/NamesListTransferablePolicy.java b/source/net/filebot/ui/rename/NamesListTransferablePolicy.java index a26d3efc..a30c49e7 100644 --- a/source/net/filebot/ui/rename/NamesListTransferablePolicy.java +++ b/source/net/filebot/ui/rename/NamesListTransferablePolicy.java @@ -43,7 +43,7 @@ class NamesListTransferablePolicy extends FileTransferablePolicy { @Override public boolean accept(Transferable tr) throws Exception { - return tr.isDataFlavorSupported(stringFlavor) || hasFileListFlavor(tr); + return hasFileListFlavor(tr) || tr.isDataFlavorSupported(stringFlavor) || tr.isDataFlavorSupported(episodeArrayFlavor); } @Override diff --git a/source/net/filebot/ui/rename/RenamePanel.java b/source/net/filebot/ui/rename/RenamePanel.java index ba0e04e8..dd1915b5 100644 --- a/source/net/filebot/ui/rename/RenamePanel.java +++ b/source/net/filebot/ui/rename/RenamePanel.java @@ -647,10 +647,12 @@ public class RenamePanel extends JComponent { @Subscribe public void handle(Transferable transferable) throws Exception { - TransferablePolicy handler = filesList.getTransferablePolicy(); - - if (handler != null && handler.accept(transferable)) { - handler.handleTransferable(transferable, TransferAction.PUT); + for (TransferablePolicy handler : new TransferablePolicy[] { filesList.getTransferablePolicy(), namesList.getTransferablePolicy() }) { + System.out.println(handler.accept(transferable)); + if (handler != null && handler.accept(transferable)) { + handler.handleTransferable(transferable, TransferAction.PUT); + return; + } } } diff --git a/source/net/filebot/ui/rename/RenamePanelBuilder.java b/source/net/filebot/ui/rename/RenamePanelBuilder.java index 704fc7d7..46de673b 100644 --- a/source/net/filebot/ui/rename/RenamePanelBuilder.java +++ b/source/net/filebot/ui/rename/RenamePanelBuilder.java @@ -1,14 +1,12 @@ package net.filebot.ui.rename; - import javax.swing.Icon; import javax.swing.JComponent; import net.filebot.ResourceManager; import net.filebot.ui.PanelBuilder; - public class RenamePanelBuilder implements PanelBuilder { @Override @@ -16,12 +14,15 @@ public class RenamePanelBuilder implements PanelBuilder { return "Rename"; } - @Override public Icon getIcon() { return ResourceManager.getIcon("panel.rename"); } + @Override + public boolean equals(Object obj) { + return obj instanceof RenamePanelBuilder; + } @Override public JComponent create() { diff --git a/source/net/filebot/ui/sfv/SfvPanelBuilder.java b/source/net/filebot/ui/sfv/SfvPanelBuilder.java index 712e9412..67898043 100644 --- a/source/net/filebot/ui/sfv/SfvPanelBuilder.java +++ b/source/net/filebot/ui/sfv/SfvPanelBuilder.java @@ -1,14 +1,12 @@ package net.filebot.ui.sfv; - import javax.swing.Icon; import javax.swing.JComponent; import net.filebot.ResourceManager; import net.filebot.ui.PanelBuilder; - public class SfvPanelBuilder implements PanelBuilder { @Override @@ -16,12 +14,15 @@ public class SfvPanelBuilder implements PanelBuilder { return "SFV"; } - @Override public Icon getIcon() { return ResourceManager.getIcon("panel.sfv"); } + @Override + public boolean equals(Object obj) { + return obj instanceof SfvPanelBuilder; + } @Override public JComponent create() { diff --git a/source/net/filebot/ui/subtitle/SubtitlePanelBuilder.java b/source/net/filebot/ui/subtitle/SubtitlePanelBuilder.java index 262ffa71..aa9eeb36 100644 --- a/source/net/filebot/ui/subtitle/SubtitlePanelBuilder.java +++ b/source/net/filebot/ui/subtitle/SubtitlePanelBuilder.java @@ -1,14 +1,12 @@ package net.filebot.ui.subtitle; - import javax.swing.Icon; import javax.swing.JComponent; import net.filebot.ResourceManager; import net.filebot.ui.PanelBuilder; - public class SubtitlePanelBuilder implements PanelBuilder { @Override @@ -16,12 +14,15 @@ public class SubtitlePanelBuilder implements PanelBuilder { return "Subtitles"; } - @Override public Icon getIcon() { return ResourceManager.getIcon("panel.subtitle"); } + @Override + public boolean equals(Object obj) { + return obj instanceof SubtitlePanelBuilder; + } @Override public JComponent create() { diff --git a/source/net/filebot/ui/transfer/ArrayTransferable.java b/source/net/filebot/ui/transfer/ArrayTransferable.java index 535b6a47..32047475 100644 --- a/source/net/filebot/ui/transfer/ArrayTransferable.java +++ b/source/net/filebot/ui/transfer/ArrayTransferable.java @@ -18,10 +18,14 @@ public class ArrayTransferable implements Transferable { this.array = array; } + public T[] getArray() { + return array.clone(); + } + @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { - return array; + return getArray(); } return null; diff --git a/source/net/filebot/util/ui/SwingEventBus.java b/source/net/filebot/util/ui/SwingEventBus.java index 643ca62d..816891bb 100644 --- a/source/net/filebot/util/ui/SwingEventBus.java +++ b/source/net/filebot/util/ui/SwingEventBus.java @@ -24,6 +24,21 @@ public class SwingEventBus extends AsyncEventBus { super(SwingUtilities::invokeLater, SwingEventBus::handleException); } + @Override + public void register(Object object) { + SwingUtilities.invokeLater(() -> super.register(object)); + } + + @Override + public void unregister(Object object) { + SwingUtilities.invokeLater(() -> super.unregister(object)); + } + + @Override + public void post(Object object) { + SwingUtilities.invokeLater(() -> super.post(object)); + } + protected static void handleException(Throwable throwable, SubscriberExceptionContext context) { debug.log(Level.WARNING, "Failed to handle event: " + context.getEvent(), throwable); }