diff --git a/source/net/filebot/Main.java b/source/net/filebot/Main.java index e4b21f1b..0dbc63f8 100644 --- a/source/net/filebot/Main.java +++ b/source/net/filebot/Main.java @@ -28,6 +28,7 @@ import java.security.PermissionCollection; import java.security.Permissions; import java.security.Policy; import java.security.ProtectionDomain; +import java.util.List; import java.util.Map; import java.util.logging.Handler; import java.util.logging.Level; @@ -43,6 +44,8 @@ import javax.swing.UIManager; import org.kohsuke.args4j.CmdLineException; import org.w3c.dom.Document; +import com.google.common.eventbus.EventBus; + import net.filebot.Settings.ApplicationFolder; import net.filebot.cli.ArgumentBean; import net.filebot.cli.ArgumentProcessor; @@ -170,20 +173,27 @@ public class Main { } // default frame - JFrame frame = new MainFrame(MainFrame.createPanelBuilders()); + EventBus eventBus = new EventBus(); + JFrame frame = new MainFrame(PanelBuilder.defaultSequence(), eventBus); // single panel frame if (args.mode != null) { PanelBuilder[] selection = stream(MainFrame.createPanelBuilders()).filter(p -> p.getName().matches(args.mode)).toArray(PanelBuilder[]::new); if (selection.length == 1) { - frame = new SinglePanelFrame(selection[0]).publish(new FileTransferable(args.getFiles(false))); + frame = new SinglePanelFrame(selection[0], eventBus); } else if (selection.length > 1) { - frame = new MainFrame(selection); + frame = new MainFrame(selection, eventBus); } else { throw new IllegalArgumentException("Illegal mode: " + args.mode); } } + // handle file arguments + List files = args.getFiles(false); + if (files.size() > 0) { + eventBus.post(new FileTransferable(files)); + } + try { // restore previous size and location restoreWindowBounds(frame, Settings.forPackage(MainFrame.class)); diff --git a/source/net/filebot/ui/MainFrame.java b/source/net/filebot/ui/MainFrame.java index 56cea1f2..918e93cd 100644 --- a/source/net/filebot/ui/MainFrame.java +++ b/source/net/filebot/ui/MainFrame.java @@ -37,6 +37,8 @@ import javax.swing.border.LineBorder; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import com.google.common.eventbus.EventBus; + import net.filebot.CacheManager; import net.filebot.Settings; import net.filebot.cli.GroovyPad; @@ -55,22 +57,26 @@ import net.miginfocom.swing.MigLayout; public class MainFrame extends JFrame { + private static final PreferencesEntry persistentSelectedPanel = Settings.forPackage(MainFrame.class).entry("panel.selected").defaultValue("0"); + + private EventBus eventBus; + private JList selectionList; private HeaderPanel headerPanel; - private static final PreferencesEntry persistentSelectedPanel = Settings.forPackage(MainFrame.class).entry("panel.selected").defaultValue("0"); - - public MainFrame(PanelBuilder[] panels) { + public MainFrame(PanelBuilder[] panels, EventBus eventBus) { super(isInstalled() ? getApplicationName() : String.format("%s %s", getApplicationName(), getApplicationVersion())); + this.eventBus = eventBus; + selectionList = new PanelSelectionList(panels); headerPanel = new HeaderPanel(); + // restore selected panel try { - // restore selected panel selectionList.setSelectedIndex(Integer.parseInt(persistentSelectedPanel.getValue())); - } catch (NumberFormatException e) { - // ignore + } catch (Exception e) { + debug.warning(e.getMessage()); } JScrollPane selectionListScrollPane = new JScrollPane(selectionList, VERTICAL_SCROLLBAR_NEVER, HORIZONTAL_SCROLLBAR_NEVER); @@ -164,35 +170,34 @@ public class MainFrame extends JFrame { } protected void showPanel(PanelBuilder selectedBuilder) { - final JComponent contentPane = (JComponent) getContentPane(); - - JComponent panel = null; + JComponent contentPane = (JComponent) getContentPane(); + JComponent selectedPanel = null; for (int i = 0; i < contentPane.getComponentCount(); i++) { - JComponent c = (JComponent) contentPane.getComponent(i); - PanelBuilder builder = (PanelBuilder) c.getClientProperty("panelBuilder"); - + JComponent panel = (JComponent) contentPane.getComponent(i); + PanelBuilder builder = (PanelBuilder) panel.getClientProperty(PanelBuilder.class.getName()); if (builder != null) { if (builder.equals(selectedBuilder)) { - panel = c; + selectedPanel = panel; } else { - c.setVisible(false); + panel.setVisible(false); + eventBus.unregister(panel); } } } - if (panel == null) { - panel = selectedBuilder.create(); - panel.setVisible(false); // invisible by default - panel.putClientProperty("panelBuilder", selectedBuilder); - - contentPane.add(panel); + if (selectedPanel == null) { + selectedPanel = selectedBuilder.create(); + selectedPanel.setVisible(false); // invisible by default + selectedPanel.putClientProperty(PanelBuilder.class.getName(), selectedBuilder); + contentPane.add(selectedPanel); } // make visible, ignore action is visible already - if (!panel.isVisible()) { + if (!selectedPanel.isVisible()) { headerPanel.setTitle(selectedBuilder.getName()); - panel.setVisible(true); + selectedPanel.setVisible(true); + eventBus.register(selectedPanel); } } diff --git a/source/net/filebot/ui/PanelBuilder.java b/source/net/filebot/ui/PanelBuilder.java index 2095471e..dc33bc0e 100644 --- a/source/net/filebot/ui/PanelBuilder.java +++ b/source/net/filebot/ui/PanelBuilder.java @@ -1,19 +1,26 @@ package net.filebot.ui; - import javax.swing.Icon; import javax.swing.JComponent; +import net.filebot.ui.analyze.AnalyzePanelBuilder; +import net.filebot.ui.episodelist.EpisodeListPanelBuilder; +import net.filebot.ui.list.ListPanelBuilder; +import net.filebot.ui.rename.RenamePanelBuilder; +import net.filebot.ui.sfv.SfvPanelBuilder; +import net.filebot.ui.subtitle.SubtitlePanelBuilder; public interface PanelBuilder { public String getName(); - public Icon getIcon(); - public JComponent create(); + public static PanelBuilder[] defaultSequence() { + return new PanelBuilder[] { new RenamePanelBuilder(), new EpisodeListPanelBuilder(), new SubtitlePanelBuilder(), new SfvPanelBuilder(), new AnalyzePanelBuilder(), new ListPanelBuilder() }; + } + } diff --git a/source/net/filebot/ui/SinglePanelFrame.java b/source/net/filebot/ui/SinglePanelFrame.java index 6be3416c..3f893679 100644 --- a/source/net/filebot/ui/SinglePanelFrame.java +++ b/source/net/filebot/ui/SinglePanelFrame.java @@ -3,24 +3,20 @@ package net.filebot.ui; import static net.filebot.Settings.*; import java.awt.Dimension; -import java.awt.datatransfer.Transferable; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.border.EmptyBorder; -import net.filebot.ui.transfer.TransferablePolicy; -import net.filebot.ui.transfer.TransferablePolicy.TransferAction; -import net.filebot.util.ExceptionUtilities; +import com.google.common.eventbus.EventBus; + import net.miginfocom.swing.MigLayout; public class SinglePanelFrame extends JFrame { - private final JComponent panel; - - public SinglePanelFrame(PanelBuilder builder) { + public SinglePanelFrame(PanelBuilder builder, EventBus eventBus) { super(String.format("%s %s %s", getApplicationName(), builder.getName(), getApplicationVersion())); - panel = builder.create(); + JComponent panel = builder.create(); JComponent c = (JComponent) getContentPane(); c.setLayout(new MigLayout("insets 0, nogrid, fill", "fill", "fill")); @@ -35,20 +31,8 @@ public class SinglePanelFrame extends JFrame { setSize(850, 600); setMinimumSize(new Dimension(800, 400)); - } - public SinglePanelFrame publish(Transferable transferable) { - TransferablePolicy policy = (TransferablePolicy) panel.getClientProperty("transferablePolicy"); - - try { - if (policy != null && policy.accept(transferable)) { - policy.handleTransferable(transferable, TransferAction.ADD); - } - } catch (Exception e) { - throw ExceptionUtilities.asRuntimeException(e); - } - - return this; + eventBus.register(panel); } } diff --git a/source/net/filebot/ui/analyze/AnalyzePanel.java b/source/net/filebot/ui/analyze/AnalyzePanel.java index 06f73b40..e18dafd6 100644 --- a/source/net/filebot/ui/analyze/AnalyzePanel.java +++ b/source/net/filebot/ui/analyze/AnalyzePanel.java @@ -1,8 +1,17 @@ package net.filebot.ui.analyze; +import static net.filebot.Logging.*; + +import java.awt.datatransfer.Transferable; +import java.util.logging.Level; + import javax.swing.JComponent; import javax.swing.JTabbedPane; +import com.google.common.eventbus.Subscribe; + +import net.filebot.ui.transfer.TransferablePolicy; +import net.filebot.ui.transfer.TransferablePolicy.TransferAction; import net.miginfocom.swing.MigLayout; public class AnalyzePanel extends JComponent { @@ -15,8 +24,6 @@ public class AnalyzePanel extends JComponent { add(fileTreePanel, "grow 1, w 300:pref:500"); add(toolsPanel, "grow 2"); - putClientProperty("transferablePolicy", fileTreePanel.getTransferablePolicy()); - fileTreePanel.addPropertyChangeListener("filetree", evt -> { // stopped loading, refresh tools for (int i = 0; i < toolsPanel.getTabCount(); i++) { @@ -30,4 +37,17 @@ public class AnalyzePanel extends JComponent { toolsPanel.addTab(tool.getName(), tool); } + @Subscribe + public void handle(Transferable transferable) { + TransferablePolicy handler = fileTreePanel.getTransferablePolicy(); + + try { + if (handler != null && handler.accept(transferable)) { + handler.handleTransferable(transferable, TransferAction.ADD); + } + } catch (Exception e) { + debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e); + } + } + } diff --git a/source/net/filebot/ui/rename/RenamePanel.java b/source/net/filebot/ui/rename/RenamePanel.java index e7617849..c84c9a7e 100644 --- a/source/net/filebot/ui/rename/RenamePanel.java +++ b/source/net/filebot/ui/rename/RenamePanel.java @@ -14,8 +14,8 @@ import java.awt.Component; import java.awt.Cursor; import java.awt.Insets; import java.awt.Window; +import java.awt.datatransfer.Transferable; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; @@ -47,6 +47,13 @@ import javax.swing.SwingWorker; import javax.swing.border.CompoundBorder; import javax.swing.border.TitledBorder; +import com.cedarsoftware.util.io.JsonReader; +import com.cedarsoftware.util.io.JsonWriter; +import com.google.common.eventbus.Subscribe; + +import ca.odell.glazedlists.EventList; +import ca.odell.glazedlists.ListSelection; +import ca.odell.glazedlists.swing.DefaultEventSelectionModel; import net.filebot.History; import net.filebot.HistorySpooler; import net.filebot.Language; @@ -62,6 +69,8 @@ import net.filebot.similarity.Match; import net.filebot.ui.rename.FormatDialog.Mode; import net.filebot.ui.rename.RenameModel.FormattedFuture; import net.filebot.ui.transfer.BackgroundFileTransferablePolicy; +import net.filebot.ui.transfer.TransferablePolicy; +import net.filebot.ui.transfer.TransferablePolicy.TransferAction; import net.filebot.util.PreferencesMap.PreferencesEntry; import net.filebot.util.ui.ActionPopup; import net.filebot.util.ui.LoadingOverlayPane; @@ -77,12 +86,6 @@ import net.filebot.web.MovieIdentificationService; import net.filebot.web.MusicIdentificationService; import net.filebot.web.SortOrder; import net.miginfocom.swing.MigLayout; -import ca.odell.glazedlists.EventList; -import ca.odell.glazedlists.ListSelection; -import ca.odell.glazedlists.swing.DefaultEventSelectionModel; - -import com.cedarsoftware.util.io.JsonReader; -import com.cedarsoftware.util.io.JsonWriter; public class RenamePanel extends JComponent { @@ -168,41 +171,37 @@ public class RenamePanel extends JComponent { new ScrollPaneSynchronizer(namesList, filesList); // delete items from both lists - Action removeAction = new AbstractAction("Exclude Selected Items", ResourceManager.getIcon("dialog.cancel")) { + Action removeAction = newAction("Exclude Selected Items", ResourceManager.getIcon("dialog.cancel"), evt -> { + RenameList list = null; + boolean deleteCell; - @Override - public void actionPerformed(ActionEvent e) { - RenameList list = null; - boolean deleteCell; + if (evt.getSource() instanceof JButton) { + list = filesList; + deleteCell = isShiftOrAltDown(evt); + } else { + list = ((RenameList) evt.getSource()); + deleteCell = isShiftOrAltDown(evt); + } - if (e.getSource() instanceof JButton) { - list = filesList; - deleteCell = isShiftOrAltDown(e); + int index = list.getListComponent().getSelectedIndex(); + if (index >= 0) { + if (deleteCell) { + EventList eventList = list.getModel(); + if (index < eventList.size()) { + list.getModel().remove(index); + } } else { - list = ((RenameList) e.getSource()); - deleteCell = isShiftOrAltDown(e); + renameModel.matches().remove(index); + } + int maxIndex = list.getModel().size() - 1; + if (index > maxIndex) { + index = maxIndex; } - - int index = list.getListComponent().getSelectedIndex(); if (index >= 0) { - if (deleteCell) { - EventList eventList = list.getModel(); - if (index < eventList.size()) { - list.getModel().remove(index); - } - } else { - renameModel.matches().remove(index); - } - int maxIndex = list.getModel().size() - 1; - if (index > maxIndex) { - index = maxIndex; - } - if (index >= 0) { - list.getListComponent().setSelectedIndex(index); - } + list.getListComponent().setSelectedIndex(index); } } - }; + }); namesList.setRemoveAction(removeAction); filesList.setRemoveAction(removeAction); @@ -219,7 +218,7 @@ public class RenamePanel extends JComponent { // create fetch popup ActionPopup fetchPopup = createFetchPopup(); - final Action fetchPopupAction = new ShowPopupAction("Fetch Data", ResourceManager.getIcon("action.fetch")); + Action fetchPopupAction = new ShowPopupAction("Fetch Data", ResourceManager.getIcon("action.fetch")); JButton fetchButton = new JButton(fetchPopupAction); filesList.getListComponent().setComponentPopupMenu(fetchPopup); namesList.getListComponent().setComponentPopupMenu(fetchPopup); @@ -248,14 +247,10 @@ public class RenamePanel extends JComponent { JButton macrosButton = createImageButton(macrosAction); filesList.getButtonPanel().add(macrosButton, "gap 0"); - matchButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - // show popup on actionPerformed only when names list is empty - if (renameModel.names().isEmpty()) { - fetchPopupAction.actionPerformed(e); - } + // show popup on actionPerformed only when names list is empty + matchButton.addActionListener(evt -> { + if (renameModel.names().isEmpty()) { + fetchPopupAction.actionPerformed(evt); } }); @@ -309,16 +304,11 @@ public class RenamePanel extends JComponent { add(new LoadingOverlayPane(filesList, filesList, "37px", "30px"), "grow, sizegroupx list"); BackgroundFileTransferablePolicy transferablePolicy = (BackgroundFileTransferablePolicy) filesList.getTransferablePolicy(); - transferablePolicy.addPropertyChangeListener(new PropertyChangeListener() { - - @Override - public void propertyChange(PropertyChangeEvent evt) { - if (BackgroundFileTransferablePolicy.LOADING_PROPERTY.equals(evt.getPropertyName())) { - filesList.firePropertyChange(LoadingOverlayPane.LOADING_PROPERTY, (boolean) evt.getOldValue(), (boolean) evt.getNewValue()); - } + transferablePolicy.addPropertyChangeListener(evt -> { + if (BackgroundFileTransferablePolicy.LOADING_PROPERTY.equals(evt.getPropertyName())) { + filesList.firePropertyChange(LoadingOverlayPane.LOADING_PROPERTY, (boolean) evt.getOldValue(), (boolean) evt.getNewValue()); } }); - this.putClientProperty("transferablePolicy", transferablePolicy); // make buttons larger matchButton.setMargin(new Insets(3, 14, 2, 14)); @@ -655,6 +645,19 @@ public class RenamePanel extends JComponent { } }; + @Subscribe + public void handle(Transferable transferable) { + TransferablePolicy handler = filesList.getTransferablePolicy(); + + try { + if (handler != null && handler.accept(transferable)) { + handler.handleTransferable(transferable, TransferAction.ADD); + } + } catch (Exception e) { + debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e); + } + } + protected static class ShowPopupAction extends AbstractAction { public ShowPopupAction(String name, Icon icon) { diff --git a/source/net/filebot/ui/sfv/SfvPanel.java b/source/net/filebot/ui/sfv/SfvPanel.java index f513cc3d..9b597d0c 100644 --- a/source/net/filebot/ui/sfv/SfvPanel.java +++ b/source/net/filebot/ui/sfv/SfvPanel.java @@ -4,6 +4,7 @@ import static java.lang.Math.*; import static net.filebot.ui.sfv.ChecksumTableModel.*; import static net.filebot.ui.transfer.BackgroundFileTransferablePolicy.*; import static net.filebot.util.FileUtilities.*; +import static net.filebot.util.ui.SwingUI.*; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; @@ -36,7 +37,6 @@ import net.filebot.ui.transfer.LoadAction; import net.filebot.ui.transfer.SaveAction; import net.filebot.ui.transfer.TransferablePolicy; import net.filebot.util.FileUtilities; -import net.filebot.util.ui.SwingUI; import net.miginfocom.swing.MigLayout; public class SfvPanel extends JComponent { @@ -86,10 +86,8 @@ public class SfvPanel extends JComponent { } }); - putClientProperty("transferablePolicy", transferablePolicy); - // Shortcut DELETE - SwingUI.installAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), removeAction); + installAction(this, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), removeAction); } public TransferablePolicy getTransferablePolicy() {