mirror of
https://github.com/mitb-archive/filebot
synced 2024-12-25 17:28:51 -05:00
Use EventBus singleton that runs tasks on the EDT
This commit is contained in:
parent
f724e0d949
commit
4bd0ed265d
@ -44,8 +44,6 @@ import javax.swing.UIManager;
|
|||||||
import org.kohsuke.args4j.CmdLineException;
|
import org.kohsuke.args4j.CmdLineException;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
|
||||||
import com.google.common.eventbus.EventBus;
|
|
||||||
|
|
||||||
import net.filebot.Settings.ApplicationFolder;
|
import net.filebot.Settings.ApplicationFolder;
|
||||||
import net.filebot.cli.ArgumentBean;
|
import net.filebot.cli.ArgumentBean;
|
||||||
import net.filebot.cli.ArgumentProcessor;
|
import net.filebot.cli.ArgumentProcessor;
|
||||||
@ -59,6 +57,7 @@ import net.filebot.ui.PanelBuilder;
|
|||||||
import net.filebot.ui.SinglePanelFrame;
|
import net.filebot.ui.SinglePanelFrame;
|
||||||
import net.filebot.ui.transfer.FileTransferable;
|
import net.filebot.ui.transfer.FileTransferable;
|
||||||
import net.filebot.util.PreferencesMap.PreferencesEntry;
|
import net.filebot.util.PreferencesMap.PreferencesEntry;
|
||||||
|
import net.filebot.util.ui.SwingEventBus;
|
||||||
import net.filebot.util.TeePrintStream;
|
import net.filebot.util.TeePrintStream;
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
@ -126,7 +125,15 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GUI mode => start user interface
|
// GUI mode => start user interface
|
||||||
SwingUtilities.invokeAndWait(() -> startUserInterface(args));
|
SwingUtilities.invokeAndWait(() -> {
|
||||||
|
startUserInterface(args);
|
||||||
|
});
|
||||||
|
|
||||||
|
// publish file arguments
|
||||||
|
List<File> files = args.getFiles(false);
|
||||||
|
if (files.size() > 0) {
|
||||||
|
SwingEventBus.getInstance().post(new FileTransferable(files));
|
||||||
|
}
|
||||||
|
|
||||||
// preload media.types (when loaded during DnD it will freeze the UI for a few hundred milliseconds)
|
// preload media.types (when loaded during DnD it will freeze the UI for a few hundred milliseconds)
|
||||||
MediaTypes.getDefault();
|
MediaTypes.getDefault();
|
||||||
@ -173,16 +180,15 @@ public class Main {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// default frame
|
// default frame
|
||||||
EventBus eventBus = new EventBus();
|
JFrame frame = new MainFrame(PanelBuilder.defaultSequence());
|
||||||
JFrame frame = new MainFrame(PanelBuilder.defaultSequence(), eventBus);
|
|
||||||
|
|
||||||
// single panel frame
|
// single panel frame
|
||||||
if (args.mode != null) {
|
if (args.mode != null) {
|
||||||
PanelBuilder[] selection = stream(PanelBuilder.defaultSequence()).filter(p -> p.getName().matches(args.mode)).toArray(PanelBuilder[]::new);
|
PanelBuilder[] selection = stream(PanelBuilder.defaultSequence()).filter(p -> p.getName().matches(args.mode)).toArray(PanelBuilder[]::new);
|
||||||
if (selection.length == 1) {
|
if (selection.length == 1) {
|
||||||
frame = new SinglePanelFrame(selection[0], eventBus);
|
frame = new SinglePanelFrame(selection[0]);
|
||||||
} else if (selection.length > 1) {
|
} else if (selection.length > 1) {
|
||||||
frame = new MainFrame(selection, eventBus);
|
frame = new MainFrame(selection);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Illegal mode: " + args.mode);
|
throw new IllegalArgumentException("Illegal mode: " + args.mode);
|
||||||
}
|
}
|
||||||
@ -226,7 +232,7 @@ public class Main {
|
|||||||
MacAppUtilities.initializeApplication();
|
MacAppUtilities.initializeApplication();
|
||||||
MacAppUtilities.setWindowCanFullScreen(frame);
|
MacAppUtilities.setWindowCanFullScreen(frame);
|
||||||
MacAppUtilities.setDefaultMenuBar(FileBotMenuBar.createHelp());
|
MacAppUtilities.setDefaultMenuBar(FileBotMenuBar.createHelp());
|
||||||
MacAppUtilities.setOpenFileHandler(openFiles -> eventBus.post(new FileTransferable(openFiles)));
|
MacAppUtilities.setOpenFileHandler(openFiles -> SwingEventBus.getInstance().post(new FileTransferable(openFiles)));
|
||||||
} else if (isUbuntuApp()) {
|
} else if (isUbuntuApp()) {
|
||||||
// Ubuntu specific configuration
|
// Ubuntu specific configuration
|
||||||
String options = System.getenv("JAVA_TOOL_OPTIONS");
|
String options = System.getenv("JAVA_TOOL_OPTIONS");
|
||||||
@ -240,12 +246,6 @@ public class Main {
|
|||||||
frame.setIconImages(ResourceManager.getApplicationIcons());
|
frame.setIconImages(ResourceManager.getApplicationIcons());
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle file arguments
|
|
||||||
List<File> files = args.getFiles(false);
|
|
||||||
if (files.size() > 0) {
|
|
||||||
eventBus.post(new FileTransferable(files));
|
|
||||||
}
|
|
||||||
|
|
||||||
// start application
|
// start application
|
||||||
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
|
@ -15,7 +15,6 @@ import java.util.function.Consumer;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
import javax.swing.JMenuBar;
|
import javax.swing.JMenuBar;
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
import javax.swing.UIManager;
|
import javax.swing.UIManager;
|
||||||
|
|
||||||
import com.apple.eawt.Application;
|
import com.apple.eawt.Application;
|
||||||
@ -142,7 +141,7 @@ public class MacAppUtilities {
|
|||||||
Application.getApplication().setOpenFileHandler(evt -> {
|
Application.getApplication().setOpenFileHandler(evt -> {
|
||||||
List<File> files = evt.getFiles();
|
List<File> files = evt.getFiles();
|
||||||
if (files.size() > 0) {
|
if (files.size() > 0) {
|
||||||
SwingUtilities.invokeLater(() -> handler.accept(files));
|
handler.accept(files);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
|
@ -36,8 +36,6 @@ import javax.swing.border.LineBorder;
|
|||||||
import javax.swing.event.ListSelectionEvent;
|
import javax.swing.event.ListSelectionEvent;
|
||||||
import javax.swing.event.ListSelectionListener;
|
import javax.swing.event.ListSelectionListener;
|
||||||
|
|
||||||
import com.google.common.eventbus.EventBus;
|
|
||||||
|
|
||||||
import net.filebot.CacheManager;
|
import net.filebot.CacheManager;
|
||||||
import net.filebot.Settings;
|
import net.filebot.Settings;
|
||||||
import net.filebot.cli.GroovyPad;
|
import net.filebot.cli.GroovyPad;
|
||||||
@ -45,22 +43,19 @@ import net.filebot.mac.MacAppUtilities;
|
|||||||
import net.filebot.util.PreferencesMap.PreferencesEntry;
|
import net.filebot.util.PreferencesMap.PreferencesEntry;
|
||||||
import net.filebot.util.ui.DefaultFancyListCellRenderer;
|
import net.filebot.util.ui.DefaultFancyListCellRenderer;
|
||||||
import net.filebot.util.ui.ShadowBorder;
|
import net.filebot.util.ui.ShadowBorder;
|
||||||
|
import net.filebot.util.ui.SwingEventBus;
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
public class MainFrame extends JFrame {
|
public class MainFrame extends JFrame {
|
||||||
|
|
||||||
private static final PreferencesEntry<String> persistentSelectedPanel = Settings.forPackage(MainFrame.class).entry("panel.selected").defaultValue("0");
|
private static final PreferencesEntry<String> persistentSelectedPanel = Settings.forPackage(MainFrame.class).entry("panel.selected").defaultValue("0");
|
||||||
|
|
||||||
private EventBus eventBus;
|
|
||||||
|
|
||||||
private JList selectionList;
|
private JList selectionList;
|
||||||
private HeaderPanel headerPanel;
|
private HeaderPanel headerPanel;
|
||||||
|
|
||||||
public MainFrame(PanelBuilder[] panels, EventBus eventBus) {
|
public MainFrame(PanelBuilder[] panels) {
|
||||||
super(isInstalled() ? getApplicationName() : String.format("%s %s", getApplicationName(), getApplicationVersion()));
|
super(isInstalled() ? getApplicationName() : String.format("%s %s", getApplicationName(), getApplicationVersion()));
|
||||||
|
|
||||||
this.eventBus = eventBus;
|
|
||||||
|
|
||||||
selectionList = new PanelSelectionList(panels);
|
selectionList = new PanelSelectionList(panels);
|
||||||
headerPanel = new HeaderPanel();
|
headerPanel = new HeaderPanel();
|
||||||
|
|
||||||
@ -156,7 +151,7 @@ public class MainFrame extends JFrame {
|
|||||||
selectedPanel = panel;
|
selectedPanel = panel;
|
||||||
} else if (panel.isVisible()) {
|
} else if (panel.isVisible()) {
|
||||||
panel.setVisible(false);
|
panel.setVisible(false);
|
||||||
eventBus.unregister(panel);
|
SwingEventBus.getInstance().unregister(panel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -172,7 +167,7 @@ public class MainFrame extends JFrame {
|
|||||||
if (!selectedPanel.isVisible()) {
|
if (!selectedPanel.isVisible()) {
|
||||||
headerPanel.setTitle(selectedBuilder.getName());
|
headerPanel.setTitle(selectedBuilder.getName());
|
||||||
selectedPanel.setVisible(true);
|
selectedPanel.setVisible(true);
|
||||||
eventBus.register(selectedPanel);
|
SwingEventBus.getInstance().register(selectedPanel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,13 +8,12 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import javax.swing.border.EmptyBorder;
|
import javax.swing.border.EmptyBorder;
|
||||||
|
|
||||||
import com.google.common.eventbus.EventBus;
|
import net.filebot.util.ui.SwingEventBus;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
public class SinglePanelFrame extends JFrame {
|
public class SinglePanelFrame extends JFrame {
|
||||||
|
|
||||||
public SinglePanelFrame(PanelBuilder builder, EventBus eventBus) {
|
public SinglePanelFrame(PanelBuilder builder) {
|
||||||
super(String.format("%s %s %s", getApplicationName(), builder.getName(), getApplicationVersion()));
|
super(String.format("%s %s %s", getApplicationName(), builder.getName(), getApplicationVersion()));
|
||||||
JComponent panel = builder.create();
|
JComponent panel = builder.create();
|
||||||
|
|
||||||
@ -32,7 +31,7 @@ public class SinglePanelFrame extends JFrame {
|
|||||||
setSize(850, 600);
|
setSize(850, 600);
|
||||||
setMinimumSize(new Dimension(800, 400));
|
setMinimumSize(new Dimension(800, 400));
|
||||||
|
|
||||||
eventBus.register(panel);
|
SwingEventBus.getInstance().register(panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,6 @@
|
|||||||
package net.filebot.ui.analyze;
|
package net.filebot.ui.analyze;
|
||||||
|
|
||||||
import static net.filebot.Logging.*;
|
|
||||||
|
|
||||||
import java.awt.datatransfer.Transferable;
|
import java.awt.datatransfer.Transferable;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
import javax.swing.JTabbedPane;
|
import javax.swing.JTabbedPane;
|
||||||
@ -38,15 +35,11 @@ public class AnalyzePanel extends JComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void handle(Transferable transferable) {
|
public void handle(Transferable transferable) throws Exception {
|
||||||
TransferablePolicy handler = fileTreePanel.getTransferablePolicy();
|
TransferablePolicy handler = fileTreePanel.getTransferablePolicy();
|
||||||
|
|
||||||
try {
|
if (handler != null && handler.accept(transferable)) {
|
||||||
if (handler != null && handler.accept(transferable)) {
|
handler.handleTransferable(transferable, TransferAction.PUT);
|
||||||
handler.handleTransferable(transferable, TransferAction.PUT);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,6 @@ package net.filebot.ui.list;
|
|||||||
import static java.awt.Font.*;
|
import static java.awt.Font.*;
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
import static net.filebot.Logging.*;
|
import static net.filebot.Logging.*;
|
||||||
import static net.filebot.Logging.log;
|
|
||||||
import static net.filebot.media.MediaDetection.*;
|
import static net.filebot.media.MediaDetection.*;
|
||||||
import static net.filebot.util.ui.SwingUI.*;
|
import static net.filebot.util.ui.SwingUI.*;
|
||||||
|
|
||||||
@ -141,15 +140,11 @@ public class ListPanel extends JComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void handle(Transferable transferable) {
|
public void handle(Transferable transferable) throws Exception {
|
||||||
TransferablePolicy handler = list.getTransferablePolicy();
|
TransferablePolicy handler = list.getTransferablePolicy();
|
||||||
|
|
||||||
try {
|
if (handler != null && handler.accept(transferable)) {
|
||||||
if (handler != null && handler.accept(transferable)) {
|
handler.handleTransferable(transferable, TransferAction.PUT);
|
||||||
handler.handleTransferable(transferable, TransferAction.PUT);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -646,15 +646,11 @@ public class RenamePanel extends JComponent {
|
|||||||
};
|
};
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void handle(Transferable transferable) {
|
public void handle(Transferable transferable) throws Exception {
|
||||||
TransferablePolicy handler = filesList.getTransferablePolicy();
|
TransferablePolicy handler = filesList.getTransferablePolicy();
|
||||||
|
|
||||||
try {
|
if (handler != null && handler.accept(transferable)) {
|
||||||
if (handler != null && handler.accept(transferable)) {
|
handler.handleTransferable(transferable, TransferAction.PUT);
|
||||||
handler.handleTransferable(transferable, TransferAction.PUT);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package net.filebot.ui.sfv;
|
package net.filebot.ui.sfv;
|
||||||
|
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
import static net.filebot.Logging.*;
|
|
||||||
import static net.filebot.ui.sfv.ChecksumTableModel.*;
|
import static net.filebot.ui.sfv.ChecksumTableModel.*;
|
||||||
import static net.filebot.ui.transfer.BackgroundFileTransferablePolicy.*;
|
import static net.filebot.ui.transfer.BackgroundFileTransferablePolicy.*;
|
||||||
import static net.filebot.util.FileUtilities.*;
|
import static net.filebot.util.FileUtilities.*;
|
||||||
@ -19,7 +18,6 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.logging.Level;
|
|
||||||
|
|
||||||
import javax.swing.AbstractAction;
|
import javax.swing.AbstractAction;
|
||||||
import javax.swing.ButtonGroup;
|
import javax.swing.ButtonGroup;
|
||||||
@ -134,15 +132,11 @@ public class SfvPanel extends JComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void handle(Transferable transferable) {
|
public void handle(Transferable transferable) throws Exception {
|
||||||
TransferablePolicy handler = getTransferablePolicy();
|
TransferablePolicy handler = getTransferablePolicy();
|
||||||
|
|
||||||
try {
|
if (handler != null && handler.accept(transferable)) {
|
||||||
if (handler != null && handler.accept(transferable)) {
|
handler.handleTransferable(transferable, TransferAction.PUT);
|
||||||
handler.handleTransferable(transferable, TransferAction.PUT);
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,16 +81,12 @@ public class SubtitlePanel extends AbstractSearchPanel<SubtitleProvider, Subtitl
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Subscribe
|
@Subscribe
|
||||||
public void handle(Transferable transferable) {
|
public void handle(Transferable transferable) throws Exception {
|
||||||
try {
|
SubtitleDropTarget target = downloadDropTarget;
|
||||||
SubtitleDropTarget target = downloadDropTarget;
|
List<File> files = FileTransferable.getFilesFromTransferable(transferable);
|
||||||
List<File> files = FileTransferable.getFilesFromTransferable(transferable);
|
|
||||||
|
|
||||||
if (files != null && files.size() > 0 && target.getDropAction(files) != DropAction.Cancel) {
|
if (files != null && files.size() > 0 && target.getDropAction(files) != DropAction.Cancel) {
|
||||||
target.handleDrop(files);
|
target.handleDrop(files);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
debug.log(Level.WARNING, "Failed to handle transferable: " + transferable, e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
31
source/net/filebot/util/ui/SwingEventBus.java
Normal file
31
source/net/filebot/util/ui/SwingEventBus.java
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package net.filebot.util.ui;
|
||||||
|
|
||||||
|
import static net.filebot.Logging.*;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
|
import com.google.common.eventbus.AsyncEventBus;
|
||||||
|
import com.google.common.eventbus.SubscriberExceptionContext;
|
||||||
|
|
||||||
|
public class SwingEventBus extends AsyncEventBus {
|
||||||
|
|
||||||
|
private static SwingEventBus instance;
|
||||||
|
|
||||||
|
public static synchronized SwingEventBus getInstance() {
|
||||||
|
if (instance == null) {
|
||||||
|
instance = new SwingEventBus();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public SwingEventBus() {
|
||||||
|
super(SwingUtilities::invokeLater, SwingEventBus::handleException);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void handleException(Throwable throwable, SubscriberExceptionContext context) {
|
||||||
|
debug.log(Level.WARNING, "Failed to handle event: " + context.getEvent(), throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user