From 9ed970de058e90160991e2fb74903ae179f74273 Mon Sep 17 00:00:00 2001 From: Reinhard Pointner Date: Sat, 14 Mar 2009 00:30:24 +0000 Subject: [PATCH] * refactoring ... * changed cmd line args (single panel frame) * simplified multi panel frame * changed window icon * create panels via PanelBuilder --- build.xml | 3 +- .../net/sourceforge/filebot/ArgumentBean.java | 78 +++--- source/net/sourceforge/filebot/Main.java | 30 ++- .../filebot/resources/window.icon.big.png | Bin 1985 -> 2318 bytes .../filebot/resources/window.icon.small.png | Bin 768 -> 854 bytes .../filebot/ui/AbstractSearchPanel.java | 5 +- .../filebot/ui/EpisodeFormatDialog.java | 1 - .../sourceforge/filebot/ui/FileBotPanel.java | 43 ---- .../filebot/ui/FileBotPanelSelectionList.java | 128 ---------- .../sourceforge/filebot/ui/FileBotWindow.java | 178 ------------- .../ui/FileTransferableMessageHandler.java | 72 ------ .../sourceforge/filebot/ui/HeaderPanel.java | 8 +- .../net/sourceforge/filebot/ui/MainFrame.java | 234 ++++++++++++++++++ .../sourceforge/filebot/ui/PanelBuilder.java | 19 ++ .../filebot/ui/SinglePanelFrame.java | 57 +++++ .../ui/panel/analyze/AnalyzePanel.java | 19 +- .../ui/panel/analyze/AnalyzePanelBuilder.java | 31 +++ .../panel/episodelist/EpisodeListPanel.java | 4 +- .../episodelist/EpisodeListPanelBuilder.java | 31 +++ .../filebot/ui/panel/list/ListPanel.java | 16 +- .../ui/panel/list/ListPanelBuilder.java | 31 +++ .../filebot/ui/panel/rename/RenamePanel.java | 4 +- .../ui/panel/rename/RenamePanelBuilder.java | 31 +++ .../sfv/{ChecksumPanel.java => SfvPanel.java} | 23 +- .../filebot/ui/panel/sfv/SfvPanelBuilder.java | 31 +++ .../ui/panel/subtitle/SubtitlePanel.java | 3 - .../panel/subtitle/SubtitlePanelBuilder.java | 31 +++ source/net/sourceforge/tuned/MessageBus.java | 86 ------- .../net/sourceforge/tuned/MessageHandler.java | 9 - .../sourceforge/filebot/ArgumentBeanTest.java | 35 +-- 30 files changed, 582 insertions(+), 659 deletions(-) delete mode 100644 source/net/sourceforge/filebot/ui/FileBotPanel.java delete mode 100644 source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java delete mode 100644 source/net/sourceforge/filebot/ui/FileBotWindow.java delete mode 100644 source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java create mode 100644 source/net/sourceforge/filebot/ui/MainFrame.java create mode 100644 source/net/sourceforge/filebot/ui/PanelBuilder.java create mode 100644 source/net/sourceforge/filebot/ui/SinglePanelFrame.java create mode 100644 source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanelBuilder.java create mode 100644 source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanelBuilder.java create mode 100644 source/net/sourceforge/filebot/ui/panel/list/ListPanelBuilder.java create mode 100644 source/net/sourceforge/filebot/ui/panel/rename/RenamePanelBuilder.java rename source/net/sourceforge/filebot/ui/panel/sfv/{ChecksumPanel.java => SfvPanel.java} (93%) create mode 100644 source/net/sourceforge/filebot/ui/panel/sfv/SfvPanelBuilder.java create mode 100644 source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanelBuilder.java delete mode 100644 source/net/sourceforge/tuned/MessageBus.java delete mode 100644 source/net/sourceforge/tuned/MessageHandler.java diff --git a/build.xml b/build.xml index 7a6e8ed1..29222657 100644 --- a/build.xml +++ b/build.xml @@ -106,8 +106,7 @@ - - + diff --git a/source/net/sourceforge/filebot/ArgumentBean.java b/source/net/sourceforge/filebot/ArgumentBean.java index 0cb6ad74..1a9a1ee9 100644 --- a/source/net/sourceforge/filebot/ArgumentBean.java +++ b/source/net/sourceforge/filebot/ArgumentBean.java @@ -2,18 +2,16 @@ package net.sourceforge.filebot; -import static java.lang.annotation.ElementType.FIELD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - import java.io.File; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.lang.reflect.Field; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import net.sourceforge.tuned.MessageBus; +import net.sourceforge.filebot.ui.transfer.FileTransferable; +import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; @@ -25,71 +23,59 @@ public class ArgumentBean { @Option(name = "-clear", usage = "Clear history and settings") private boolean clear = false; - @Message(topic = "list") - @Option(name = "--list", usage = "Open file in 'List' panel", metaVar = "") - private File listPanelFile; - - @Message(topic = "analyze") @Option(name = "--analyze", usage = "Open file in 'Analyze' panel", metaVar = "") - private File analyzePanelFile; + private boolean analyze; - @Message(topic = "sfv") @Option(name = "--sfv", usage = "Open file in 'SFV' panel", metaVar = "") - private File sfvPanelFile; + private boolean sfv; + + @Argument + private List arguments; - public boolean isHelp() { + public boolean help() { return help; } - public boolean isClear() { + public boolean clear() { return clear; } - public File getListPanelFile() { - return listPanelFile; + public boolean sfv() { + return sfv; } - public File getAnalyzePanelFile() { - return analyzePanelFile; + public boolean analyze() { + return analyze; } - public File getSfvPanelFile() { - return sfvPanelFile; + public List arguments() { + return arguments; } - public void publishMessages() { - for (Field field : getClass().getDeclaredFields()) { - - Message message = field.getAnnotation(Message.class); - - if (message == null) - continue; - - try { - Object value = field.get(this); - - if (value != null) { - MessageBus.getDefault().publish(message.topic(), value); + public FileTransferable transferable() { + List files = new ArrayList(arguments.size()); + + for (File argument : arguments) { + if (argument.exists()) { + try { + // path may be relative, use absolute path + files.add(argument.getCanonicalFile()); + } catch (IOException e) { + Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); } - } catch (Exception e) { - // should not happen - Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); + } else { + // file doesn't exist + Logger.getLogger("global").log(Level.WARNING, String.format("Invalid File: %s", argument)); } } - } - - - @Retention(RUNTIME) - @Target(FIELD) - private @interface Message { - String topic(); + return new FileTransferable(files); } } diff --git a/source/net/sourceforge/filebot/Main.java b/source/net/sourceforge/filebot/Main.java index 6854f9a2..d334a8c9 100644 --- a/source/net/sourceforge/filebot/Main.java +++ b/source/net/sourceforge/filebot/Main.java @@ -2,16 +2,21 @@ package net.sourceforge.filebot; +import static javax.swing.JFrame.*; + import java.util.logging.ConsoleHandler; import java.util.logging.Level; import java.util.logging.Logger; +import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.UIManager; -import net.sourceforge.filebot.ui.FileBotWindow; +import net.sourceforge.filebot.ui.MainFrame; import net.sourceforge.filebot.ui.NotificationLoggingHandler; - +import net.sourceforge.filebot.ui.SinglePanelFrame; +import net.sourceforge.filebot.ui.panel.analyze.AnalyzePanelBuilder; +import net.sourceforge.filebot.ui.panel.sfv.SfvPanelBuilder; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.args4j.CmdLineParser; @@ -25,14 +30,14 @@ public class Main { final ArgumentBean argumentBean = initializeArgumentBean(args); - if (argumentBean.isHelp()) { + if (argumentBean.help()) { printUsage(argumentBean); // just print help message and exit afterwards System.exit(0); } - if (argumentBean.isClear()) { + if (argumentBean.clear()) { // clear preferences Settings.userRoot().clear(); } @@ -56,13 +61,22 @@ public class Main { @Override public void run() { - FileBotWindow window = new FileBotWindow(); + JFrame frame; - // publish messages from arguments to the newly created components - argumentBean.publishMessages(); + if (argumentBean.analyze()) { + frame = new SinglePanelFrame(new AnalyzePanelBuilder()).publish(argumentBean.transferable()); + } else if (argumentBean.sfv()) { + frame = new SinglePanelFrame(new SfvPanelBuilder()).publish(argumentBean.transferable()); + } else { + // default + frame = new MainFrame(); + } + + frame.setLocationByPlatform(true); + frame.setDefaultCloseOperation(EXIT_ON_CLOSE); // start - window.setVisible(true); + frame.setVisible(true); } }); } diff --git a/source/net/sourceforge/filebot/resources/window.icon.big.png b/source/net/sourceforge/filebot/resources/window.icon.big.png index c5ba956de8953e3aeae3bdc0455c99dc1afd2351..b2c094ca0d7438c80ae6b71125696d24d14b4eee 100644 GIT binary patch delta 2263 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 delta 1929 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 delta 667 zcmV;M0%ZNx27m^TNs((Se|JelK~y-6rISx+R96&-zkA=EHxnnugbBWM(k?U@40Pe5 zprW{tL=c)}r<*|crMR=}ZnARiqL3I{OQ8!%N`tx)A!HK>1Bx*uBC#EGn!JD^Z)P&{ z{+#1NqID6W_`$b4hjV_MV^o#T!G2aX-~fKPbNgB;eRIjgO#u+sf8j~*z{~OR@gIOs zj%dzZxcK$l-QORS!b-nJ+b9N8EWywv-Pm~X*H#!V#Yy6c2$HF7wf1)Z`1AhEuRq`1 z0dU=iJ9?~VI?d2!%tyV&3=9m81;Np=y=D^;AYo9D_>N9n!kQw<=Yzz_gudJB;i_xzWQ@az7t~|cn*xA z%ce9;M%r}@8?MuthUBw7QjHGfQceK4x>uyNRi$KWWLm`d1+aOHb+j@=^5sQ}g)VZ( zzCqg&jaD5rWAIe_`&KNWTxF`Yqxa}Hz7d*f!kF*P-{?p7W?+Ie;Q-_1gn z>rbLgOfJDVf5rGI_Q<;JEtm5P%gf|_pW)$Qk|aSyz{`C&CSU+K3!M3{v$M0eR8_0h zs!mKy==}V=s;Y{JRw|VzKmk=f(8a~Y+ajX-Y;JC96h&IA)pT-la#U5{{lY extends FileBotPanel { +public abstract class AbstractSearchPanel extends JComponent { protected final JPanel tabbedPaneGroup = new JPanel(new MigLayout("nogrid, fill, insets 0", "align center", "[fill]8px[pref!]4px")); @@ -49,8 +49,7 @@ public abstract class AbstractSearchPanel extends FileBotPanel { protected final EventList searchHistory = createSearchHistory(); - public AbstractSearchPanel(String title, Icon icon) { - super(title, icon); + public AbstractSearchPanel() { historyPanel.setColumnHeader(2, "Duration"); diff --git a/source/net/sourceforge/filebot/ui/EpisodeFormatDialog.java b/source/net/sourceforge/filebot/ui/EpisodeFormatDialog.java index d2a8e24b..26a2c500 100644 --- a/source/net/sourceforge/filebot/ui/EpisodeFormatDialog.java +++ b/source/net/sourceforge/filebot/ui/EpisodeFormatDialog.java @@ -91,7 +91,6 @@ public class EpisodeFormatDialog extends JDialog { JLabel title = new JLabel(this.getTitle()); title.setFont(title.getFont().deriveFont(BOLD)); - // status.setVisible(false); JPanel header = new JPanel(new MigLayout("insets dialog, nogrid, fillx")); header.setBackground(Color.white); diff --git a/source/net/sourceforge/filebot/ui/FileBotPanel.java b/source/net/sourceforge/filebot/ui/FileBotPanel.java deleted file mode 100644 index 8be2f096..00000000 --- a/source/net/sourceforge/filebot/ui/FileBotPanel.java +++ /dev/null @@ -1,43 +0,0 @@ - -package net.sourceforge.filebot.ui; - - -import javax.swing.Icon; -import javax.swing.JComponent; - -import net.sourceforge.tuned.MessageHandler; - - -public class FileBotPanel extends JComponent { - - private final String name; - private final Icon icon; - - - public FileBotPanel(String title, Icon icon) { - this.name = title; - this.icon = icon; - } - - - public Icon getIcon() { - return icon; - } - - - public String getPanelName() { - return name; - } - - - public MessageHandler getMessageHandler() { - return null; - } - - - @Override - public String toString() { - return getPanelName(); - } - -} diff --git a/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java b/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java deleted file mode 100644 index 6ecd462b..00000000 --- a/source/net/sourceforge/filebot/ui/FileBotPanelSelectionList.java +++ /dev/null @@ -1,128 +0,0 @@ - -package net.sourceforge.filebot.ui; - - -import java.awt.Color; -import java.awt.FlowLayout; -import java.awt.dnd.DropTarget; -import java.awt.dnd.DropTargetAdapter; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; - -import javax.swing.JList; -import javax.swing.ListSelectionModel; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.Timer; -import javax.swing.border.EmptyBorder; - -import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer; -import net.sourceforge.tuned.ui.TunedUtilities; -import ca.odell.glazedlists.BasicEventList; -import ca.odell.glazedlists.EventList; -import ca.odell.glazedlists.swing.EventListModel; - - -class FileBotPanelSelectionList extends JList { - - private static final int SELECTDELAY_ON_DRAG_OVER = 300; - - private final EventList panelModel = new BasicEventList(); - - - public FileBotPanelSelectionList() { - - setModel(new EventListModel(panelModel)); - - setCellRenderer(new PanelCellRenderer()); - setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - - setBorder(new EmptyBorder(4, 5, 4, 5)); - - // initialize "drag over" panel selection - new DropTarget(this, new DragDropListener()); - } - - - public EventList getPanelModel() { - return panelModel; - } - - - private static class PanelCellRenderer extends DefaultFancyListCellRenderer { - - public PanelCellRenderer() { - super(10, 0, new Color(0x163264)); - - // center labels in list - setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); - - setHighlightingEnabled(false); - - setVerticalTextPosition(SwingConstants.BOTTOM); - setHorizontalTextPosition(SwingConstants.CENTER); - } - - - @Override - public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { - super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus); - - FileBotPanel panel = (FileBotPanel) value; - setText(panel.getPanelName()); - setIcon(panel.getIcon()); - } - - } - - - private class DragDropListener extends DropTargetAdapter { - - private boolean selectEnabled = false; - - private Timer dragEnterTimer; - - - @Override - public void dragOver(DropTargetDragEvent dtde) { - if (selectEnabled) { - int index = locationToIndex(dtde.getLocation()); - setSelectedIndex(index); - } - } - - - @Override - public void dragEnter(DropTargetDragEvent dtde) { - dragEnterTimer = TunedUtilities.invokeLater(SELECTDELAY_ON_DRAG_OVER, new Runnable() { - - @Override - public void run() { - selectEnabled = true; - - // bring window to front when on dnd - SwingUtilities.getWindowAncestor(FileBotPanelSelectionList.this).toFront(); - } - }); - } - - - @Override - public void dragExit(DropTargetEvent dte) { - selectEnabled = false; - - if (dragEnterTimer != null) { - dragEnterTimer.stop(); - } - } - - - @Override - public void drop(DropTargetDropEvent dtde) { - - } - - } - -} diff --git a/source/net/sourceforge/filebot/ui/FileBotWindow.java b/source/net/sourceforge/filebot/ui/FileBotWindow.java deleted file mode 100644 index 44c1d213..00000000 --- a/source/net/sourceforge/filebot/ui/FileBotWindow.java +++ /dev/null @@ -1,178 +0,0 @@ - -package net.sourceforge.filebot.ui; - - -import static net.sourceforge.filebot.Settings.getApplicationName; - -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Image; -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.OverlayLayout; -import javax.swing.ScrollPaneConstants; -import javax.swing.border.EmptyBorder; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; - -import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.filebot.Settings; -import net.sourceforge.filebot.ui.panel.analyze.AnalyzePanel; -import net.sourceforge.filebot.ui.panel.episodelist.EpisodeListPanel; -import net.sourceforge.filebot.ui.panel.list.ListPanel; -import net.sourceforge.filebot.ui.panel.rename.RenamePanel; -import net.sourceforge.filebot.ui.panel.sfv.ChecksumPanel; -import net.sourceforge.filebot.ui.panel.subtitle.SubtitlePanel; -import net.sourceforge.tuned.MessageBus; -import net.sourceforge.tuned.MessageHandler; -import net.sourceforge.tuned.ui.ShadowBorder; - - -public class FileBotWindow extends JFrame implements ListSelectionListener { - - private JPanel pagePanel = new JPanel(new CardLayout()); - - private FileBotPanelSelectionList panelSelectionList = new FileBotPanelSelectionList(); - - private HeaderPanel headerPanel = new HeaderPanel(); - - - public FileBotWindow() { - super(getApplicationName()); - - setLocationByPlatform(true); - setDefaultCloseOperation(EXIT_ON_CLOSE); - - // set taskbar / taskswitch icons - ArrayList icons = new ArrayList(2); - icons.add(ResourceManager.getImage("window.icon.small")); - icons.add(ResourceManager.getImage("window.icon.big")); - setIconImages(icons); - - panelSelectionList.getPanelModel().addAll(createPanels()); - panelSelectionList.addListSelectionListener(this); - - JComponent contentPane = createContentPane(); - - setContentPane(contentPane); - - setSize(760, 615); - - //TODO restore the panel selection from last time, - // switch to EpisodeListPanel by default (e.g. first start) - // int selectedPanel = asStringList(panelSelectionList.getPanelModel()).indexOf(Settings.userRoot().get("selectedPanel")); - // panelSelectionList.setSelectedIndex(selectedPanel); - - // connect message handlers to message bus - MessageBus.getDefault().addMessageHandler("panel", panelSelectMessageHandler); - - for (FileBotPanel panel : panelSelectionList.getPanelModel()) { - MessageBus.getDefault().addMessageHandler(panel.getPanelName(), panel.getMessageHandler()); - } - } - - - private List createPanels() { - List panels = new ArrayList(6); - - panels.add(new ListPanel()); - panels.add(new RenamePanel()); - panels.add(new AnalyzePanel()); - panels.add(new EpisodeListPanel()); - panels.add(new SubtitlePanel()); - panels.add(new ChecksumPanel()); - - return panels; - } - - - public void valueChanged(ListSelectionEvent e) { - FileBotPanel currentPanel = (FileBotPanel) panelSelectionList.getSelectedValue(); - - headerPanel.setTitle(currentPanel.getPanelName()); - CardLayout cardLayout = (CardLayout) pagePanel.getLayout(); - cardLayout.show(pagePanel, currentPanel.getPanelName()); - - JComponent c = (JComponent) getContentPane(); - - c.revalidate(); - c.repaint(); - - Settings.userRoot().put("selectedPanel", panelSelectionList.getSelectedValue().toString()); - } - - - private JComponent createSelectionListLayer() { - JPanel selectionListLayer = new JPanel(new BorderLayout()); - selectionListLayer.setOpaque(false); - - JPanel shadowBorderPanel = new JPanel(new BorderLayout()); - shadowBorderPanel.setOpaque(false); - - JScrollPane selectListScrollPane = new JScrollPane(panelSelectionList); - selectListScrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); - selectListScrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER); - shadowBorderPanel.add(selectListScrollPane, BorderLayout.CENTER); - shadowBorderPanel.setBorder(new ShadowBorder()); - - selectionListLayer.setBorder(new EmptyBorder(10, 6, 12, 0)); - selectionListLayer.add(shadowBorderPanel, BorderLayout.WEST); - - selectionListLayer.setAlignmentX(0.0f); - selectionListLayer.setAlignmentY(0.0f); - selectionListLayer.setMaximumSize(selectionListLayer.getPreferredSize()); - - return selectionListLayer; - } - - - private JComponent createPageLayer() { - JPanel pageLayer = new JPanel(new BorderLayout()); - pagePanel.setBorder(new EmptyBorder(0, 95, 0, 0)); - - pageLayer.add(headerPanel, BorderLayout.NORTH); - pageLayer.add(pagePanel, BorderLayout.CENTER); - - for (FileBotPanel panel : panelSelectionList.getPanelModel()) { - pagePanel.add(panel, panel.getPanelName()); - } - - pageLayer.setAlignmentX(0.0f); - pageLayer.setAlignmentY(0.0f); - - return pageLayer; - } - - - private JComponent createContentPane() { - JPanel contentPane = new JPanel(null); - contentPane.setLayout(new OverlayLayout(contentPane)); - - contentPane.add(createSelectionListLayer()); - contentPane.add(createPageLayer()); - - return contentPane; - } - - private final MessageHandler panelSelectMessageHandler = new MessageHandler() { - - @Override - public void handle(String topic, Object... messages) { - if (messages.length >= 1) { - // get last element in array - Object panel = messages[messages.length - 1]; - - // switch to this panel - if (panel instanceof FileBotPanel) - panelSelectionList.setSelectedValue(panel, true); - } - } - - }; - -} diff --git a/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java b/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java deleted file mode 100644 index 8f66a3ae..00000000 --- a/source/net/sourceforge/filebot/ui/FileTransferableMessageHandler.java +++ /dev/null @@ -1,72 +0,0 @@ - -package net.sourceforge.filebot.ui; - - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import net.sourceforge.filebot.ui.transfer.FileTransferable; -import net.sourceforge.filebot.ui.transfer.TransferablePolicy; -import net.sourceforge.filebot.ui.transfer.TransferablePolicy.TransferAction; -import net.sourceforge.tuned.MessageBus; -import net.sourceforge.tuned.MessageHandler; - - -public class FileTransferableMessageHandler implements MessageHandler { - - private final FileBotPanel panel; - private final TransferablePolicy transferablePolicy; - - - public FileTransferableMessageHandler(FileBotPanel panel, TransferablePolicy transferablePolicy) { - this.panel = panel; - this.transferablePolicy = transferablePolicy; - } - - - @Override - public void handle(String topic, Object... messages) throws Exception { - // switch to panel - MessageBus.getDefault().publish("panel", panel); - - List files = new ArrayList(messages.length); - - for (Object message : messages) { - File file = fromMessage(message); - - if (file == null) - continue; - - if (file.exists()) { - try { - // path may be relative, use absolute path - files.add(file.getCanonicalFile()); - } catch (IOException e) { - Logger.getLogger("global").log(Level.SEVERE, e.toString(), e); - } - } else { - // file doesn't exist - Logger.getLogger("global").log(Level.WARNING, "Invalid File: " + file); - } - } - - transferablePolicy.handleTransferable(new FileTransferable(files), TransferAction.PUT); - } - - - private File fromMessage(Object message) { - - if (message instanceof File) - return (File) message; - - if (message instanceof String) - return new File((String) message); - - return null; - } - -} diff --git a/source/net/sourceforge/filebot/ui/HeaderPanel.java b/source/net/sourceforge/filebot/ui/HeaderPanel.java index 72bab09a..3b2b1392 100644 --- a/source/net/sourceforge/filebot/ui/HeaderPanel.java +++ b/source/net/sourceforge/filebot/ui/HeaderPanel.java @@ -42,9 +42,6 @@ class HeaderPanel extends JComponent { titleLabel.setForeground(new Color(0x101010)); titleLabel.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 24)); - int margin = 9; - titleLabel.setBorder(new EmptyBorder(margin - 1, 90, margin + 1, 0)); - JLabel decorationLabel = new JLabel(ResourceManager.getIcon("decoration.header")); decorationLabel.setHorizontalAlignment(SwingConstants.CENTER); decorationLabel.setVerticalAlignment(SwingConstants.CENTER); @@ -64,6 +61,11 @@ class HeaderPanel extends JComponent { } + public JLabel getTitleLabel() { + return titleLabel; + } + + @Override protected void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D) g; diff --git a/source/net/sourceforge/filebot/ui/MainFrame.java b/source/net/sourceforge/filebot/ui/MainFrame.java new file mode 100644 index 00000000..7290151a --- /dev/null +++ b/source/net/sourceforge/filebot/ui/MainFrame.java @@ -0,0 +1,234 @@ + +package net.sourceforge.filebot.ui; + + +import static javax.swing.ScrollPaneConstants.*; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.dnd.DropTarget; +import java.awt.dnd.DropTargetAdapter; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JList; +import javax.swing.JScrollPane; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + +import net.miginfocom.swing.MigLayout; +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.Settings; +import net.sourceforge.filebot.ui.panel.analyze.AnalyzePanelBuilder; +import net.sourceforge.filebot.ui.panel.episodelist.EpisodeListPanelBuilder; +import net.sourceforge.filebot.ui.panel.list.ListPanelBuilder; +import net.sourceforge.filebot.ui.panel.rename.RenamePanelBuilder; +import net.sourceforge.filebot.ui.panel.sfv.SfvPanelBuilder; +import net.sourceforge.tuned.PreferencesMap.PreferencesEntry; +import net.sourceforge.tuned.ui.ArrayListModel; +import net.sourceforge.tuned.ui.DefaultFancyListCellRenderer; +import net.sourceforge.tuned.ui.ShadowBorder; +import net.sourceforge.tuned.ui.TunedUtilities; + + +public class MainFrame extends JFrame { + + private JList selectionList = new PanelSelectionList(); + + private HeaderPanel headerPanel = new HeaderPanel(); + + private final PreferencesEntry persistentSelectedPanel = Settings.userRoot().entry("selectedPanel"); + + + public MainFrame() { + super(Settings.getApplicationName()); + + // set taskbar / taskswitch icons + setIconImages(Arrays.asList(ResourceManager.getImage("window.icon.small"), ResourceManager.getImage("window.icon.big"))); + + selectionList.setModel(new ArrayListModel(createPanelBuilders())); + + JScrollPane selectionListScrollPane = new JScrollPane(selectionList, VERTICAL_SCROLLBAR_NEVER, HORIZONTAL_SCROLLBAR_NEVER); + selectionListScrollPane.setBorder(new CompoundBorder(new ShadowBorder(), selectionListScrollPane.getBorder())); + selectionListScrollPane.setOpaque(false); + + headerPanel.getTitleLabel().setBorder(new EmptyBorder(8, 90, 10, 0)); + + JComponent c = (JComponent) getContentPane(); + c.setLayout(new MigLayout("insets 0, fill", "95px[fill]", "fill")); + + c.add(selectionListScrollPane, "pos visual.x+6 visual.y+10 n visual.y2-12"); + c.add(headerPanel, "growx, dock north"); + + setSize(760, 615); + + selectionList.addListSelectionListener(new ListSelectionListener() { + + @Override + public void valueChanged(ListSelectionEvent e) { + showPanel((PanelBuilder) selectionList.getSelectedValue()); + persistentSelectedPanel.setValue(Integer.toString(selectionList.getSelectedIndex())); + } + }); + + try { + // restore selected panel + selectionList.setSelectedIndex(Integer.parseInt(persistentSelectedPanel.getValue())); + } catch (Exception e) { + // default panel + selectionList.setSelectedIndex(1); + } + } + + + protected List createPanelBuilders() { + List builders = new ArrayList(); + + builders.add(new ListPanelBuilder()); + builders.add(new RenamePanelBuilder()); + builders.add(new AnalyzePanelBuilder()); + builders.add(new EpisodeListPanelBuilder()); + builders.add(new SfvPanelBuilder()); + + return builders; + } + + + protected void showPanel(final PanelBuilder selectedBuilder) { + headerPanel.setTitle(selectedBuilder.getName()); + + JComponent panel = null; + + for (int i = 0; i < getContentPane().getComponentCount(); i++) { + JComponent c = (JComponent) getContentPane().getComponent(i); + PanelBuilder builder = (PanelBuilder) c.getClientProperty("panelBuilder"); + + if (builder != null) { + c.setVisible(false); + + if (builder.equals(selectedBuilder)) { + panel = c; + } + } + } + + JComponent contentPane = (JComponent) getContentPane(); + + if (panel == null) { + panel = selectedBuilder.create(); + panel.putClientProperty("panelBuilder", selectedBuilder); + + contentPane.add(panel, "hidemode 3"); + } + + panel.setVisible(true); + + // update layout now + contentPane.validate(); + } + + + private static class PanelSelectionList extends JList { + + private static final int SELECTDELAY_ON_DRAG_OVER = 300; + + + public PanelSelectionList() { + setCellRenderer(new PanelCellRenderer()); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + setBorder(new EmptyBorder(4, 5, 4, 5)); + + // initialize "drag over" panel selection + new DropTarget(this, new DragDropListener()); + } + + + private class DragDropListener extends DropTargetAdapter { + + private boolean selectEnabled = false; + + private Timer dragEnterTimer; + + + @Override + public void dragOver(DropTargetDragEvent dtde) { + if (selectEnabled) { + int index = locationToIndex(dtde.getLocation()); + setSelectedIndex(index); + } + } + + + @Override + public void dragEnter(final DropTargetDragEvent dtde) { + dragEnterTimer = TunedUtilities.invokeLater(SELECTDELAY_ON_DRAG_OVER, new Runnable() { + + @Override + public void run() { + selectEnabled = true; + + // bring window to front when on dnd + SwingUtilities.getWindowAncestor((JComponent) dtde.getSource()).toFront(); + } + }); + } + + + @Override + public void dragExit(DropTargetEvent dte) { + selectEnabled = false; + + if (dragEnterTimer != null) { + dragEnterTimer.stop(); + } + } + + + @Override + public void drop(DropTargetDropEvent dtde) { + + } + + } + + } + + + private static class PanelCellRenderer extends DefaultFancyListCellRenderer { + + public PanelCellRenderer() { + super(10, 0, new Color(0x163264)); + + // center labels in list + setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + + setHighlightingEnabled(false); + + setVerticalTextPosition(SwingConstants.BOTTOM); + setHorizontalTextPosition(SwingConstants.CENTER); + } + + + @Override + public void configureListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.configureListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + PanelBuilder panel = (PanelBuilder) value; + setText(panel.getName()); + setIcon(panel.getIcon()); + } + + } + +} diff --git a/source/net/sourceforge/filebot/ui/PanelBuilder.java b/source/net/sourceforge/filebot/ui/PanelBuilder.java new file mode 100644 index 00000000..ec2774e2 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/PanelBuilder.java @@ -0,0 +1,19 @@ + +package net.sourceforge.filebot.ui; + + +import javax.swing.Icon; +import javax.swing.JComponent; + + +public interface PanelBuilder { + + public String getName(); + + + public Icon getIcon(); + + + public JComponent create(); + +} diff --git a/source/net/sourceforge/filebot/ui/SinglePanelFrame.java b/source/net/sourceforge/filebot/ui/SinglePanelFrame.java new file mode 100644 index 00000000..b496f73c --- /dev/null +++ b/source/net/sourceforge/filebot/ui/SinglePanelFrame.java @@ -0,0 +1,57 @@ + +package net.sourceforge.filebot.ui; + + +import java.awt.datatransfer.Transferable; +import java.util.Arrays; + +import javax.swing.JComponent; +import javax.swing.JFrame; +import net.miginfocom.swing.MigLayout; +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.transfer.TransferablePolicy; +import net.sourceforge.filebot.ui.transfer.TransferablePolicy.TransferAction; +import net.sourceforge.tuned.ExceptionUtilities; + + +public class SinglePanelFrame extends JFrame { + + private final JComponent panel; + + + public SinglePanelFrame(PanelBuilder builder) { + super(builder.getName()); + + panel = builder.create(); + + // set taskbar / taskswitch icons + setIconImages(Arrays.asList(ResourceManager.getImage("window.icon.small"), ResourceManager.getImage("window.icon.big"))); + + JComponent c = (JComponent) getContentPane(); + c.setLayout(new MigLayout("insets 0, nogrid, fill", "fill", "fill")); + + HeaderPanel headerPanel = new HeaderPanel(); + headerPanel.setTitle(builder.getName()); + + c.add(headerPanel, "growx, dock north"); + c.add(panel); + + setSize(760, 615); + } + + + 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; + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanel.java b/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanel.java index f9468afd..e2597557 100644 --- a/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanel.java +++ b/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanel.java @@ -6,25 +6,18 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; +import javax.swing.JComponent; import javax.swing.JTabbedPane; import net.miginfocom.swing.MigLayout; -import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.filebot.ui.FileBotPanel; -import net.sourceforge.filebot.ui.FileTransferableMessageHandler; -import net.sourceforge.tuned.MessageHandler; -public class AnalyzePanel extends FileBotPanel { +public class AnalyzePanel extends JComponent { private final FileTreePanel fileTreePanel = new FileTreePanel(); private final JTabbedPane toolsPanel = new JTabbedPane(); - private final MessageHandler messageHandler = new FileTransferableMessageHandler(this, fileTreePanel.getTransferablePolicy()); - public AnalyzePanel() { - super("Analyze", ResourceManager.getIcon("panel.analyze")); - toolsPanel.setBorder(BorderFactory.createTitledBorder("Tools")); setLayout(new MigLayout("insets dialog, gapx 50, fill")); @@ -35,6 +28,8 @@ public class AnalyzePanel extends FileBotPanel { addTool(new TypeTool()); addTool(new SplitTool()); + putClientProperty("transferablePolicy", fileTreePanel.getTransferablePolicy()); + fileTreePanel.addPropertyChangeListener("filetree", filetreeListener); } @@ -43,12 +38,6 @@ public class AnalyzePanel extends FileBotPanel { toolsPanel.addTab(tool.getName(), tool); } - - @Override - public MessageHandler getMessageHandler() { - return messageHandler; - } - private final PropertyChangeListener filetreeListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent evt) { diff --git a/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanelBuilder.java b/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanelBuilder.java new file mode 100644 index 00000000..eaa6a881 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/analyze/AnalyzePanelBuilder.java @@ -0,0 +1,31 @@ + +package net.sourceforge.filebot.ui.panel.analyze; + + +import javax.swing.Icon; +import javax.swing.JComponent; + +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.PanelBuilder; + + +public class AnalyzePanelBuilder implements PanelBuilder { + + @Override + public String getName() { + return "Analyze"; + } + + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("panel.analyze"); + } + + + @Override + public JComponent create() { + return new AnalyzePanel(); + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java index c4790b6c..aeea142f 100644 --- a/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/episodelist/EpisodeListPanel.java @@ -3,6 +3,7 @@ package net.sourceforge.filebot.ui.panel.episodelist; import static net.sourceforge.filebot.ui.panel.episodelist.SeasonSpinnerModel.ALL_SEASONS; + import java.awt.event.ActionEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -19,7 +20,6 @@ import javax.swing.JButton; import javax.swing.JSpinner; import javax.swing.KeyStroke; -import net.sourceforge.filebot.ResourceManager; import net.sourceforge.filebot.Settings; import net.sourceforge.filebot.ui.AbstractSearchPanel; import net.sourceforge.filebot.ui.FileBotList; @@ -49,8 +49,6 @@ public class EpisodeListPanel extends AbstractSearchPanel model = RenameModel.create(); @@ -74,7 +73,6 @@ public class RenamePanel extends FileBotPanel { public RenamePanel() { - super("Rename", ResourceManager.getIcon("panel.rename")); namesList.setTitle("Proposed"); namesList.setTransferablePolicy(new NamesListTransferablePolicy(model.names())); diff --git a/source/net/sourceforge/filebot/ui/panel/rename/RenamePanelBuilder.java b/source/net/sourceforge/filebot/ui/panel/rename/RenamePanelBuilder.java new file mode 100644 index 00000000..6ed7f2b1 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/rename/RenamePanelBuilder.java @@ -0,0 +1,31 @@ + +package net.sourceforge.filebot.ui.panel.rename; + + +import javax.swing.Icon; +import javax.swing.JComponent; + +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.PanelBuilder; + + +public class RenamePanelBuilder implements PanelBuilder { + + @Override + public String getName() { + return "Rename"; + } + + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("panel.rename"); + } + + + @Override + public JComponent create() { + return new RenamePanel(); + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java similarity index 93% rename from source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java rename to source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java index d95d6913..0b478b1d 100644 --- a/source/net/sourceforge/filebot/ui/panel/sfv/ChecksumPanel.java +++ b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanel.java @@ -20,6 +20,7 @@ import java.util.concurrent.ExecutorService; import javax.swing.AbstractAction; import javax.swing.ButtonGroup; import javax.swing.JButton; +import javax.swing.JComponent; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JToggleButton; @@ -29,18 +30,15 @@ import javax.swing.border.TitledBorder; import net.miginfocom.swing.MigLayout; import net.sourceforge.filebot.ResourceManager; -import net.sourceforge.filebot.ui.FileBotPanel; -import net.sourceforge.filebot.ui.FileTransferableMessageHandler; import net.sourceforge.filebot.ui.SelectDialog; import net.sourceforge.filebot.ui.transfer.DefaultTransferHandler; import net.sourceforge.filebot.ui.transfer.LoadAction; import net.sourceforge.filebot.ui.transfer.SaveAction; import net.sourceforge.tuned.FileUtilities; -import net.sourceforge.tuned.MessageHandler; import net.sourceforge.tuned.ui.TunedUtilities; -public class ChecksumPanel extends FileBotPanel { +public class SfvPanel extends JComponent { private final ChecksumComputationService computationService = new ChecksumComputationService(); @@ -49,16 +47,13 @@ public class ChecksumPanel extends FileBotPanel { private final ChecksumTableTransferablePolicy transferablePolicy = new ChecksumTableTransferablePolicy(table.getModel(), computationService); private final ChecksumTableExportHandler exportHandler = new ChecksumTableExportHandler(table.getModel()); - private final MessageHandler messageHandler = new FileTransferableMessageHandler(this, transferablePolicy); - - public ChecksumPanel() { - super("SFV", ResourceManager.getIcon("panel.sfv")); + public SfvPanel() { table.setTransferHandler(new DefaultTransferHandler(transferablePolicy, exportHandler)); JPanel contentPane = new JPanel(new MigLayout("insets 0, nogrid, fill", "", "[fill]10px[bottom, pref!]4px")); - contentPane.setBorder(new TitledBorder(getPanelName())); + contentPane.setBorder(new TitledBorder("SFV")); setLayout(new MigLayout("insets dialog, fill")); add(contentPane, "grow"); @@ -92,6 +87,8 @@ public class ChecksumPanel extends FileBotPanel { } }); + putClientProperty("transferablePolicy", transferablePolicy); + // Shortcut DELETE TunedUtilities.putActionForKeystroke(this, KeyStroke.getKeyStroke("pressed DELETE"), removeAction); } @@ -130,12 +127,6 @@ public class ChecksumPanel extends FileBotPanel { } } - - @Override - public MessageHandler getMessageHandler() { - return messageHandler; - } - private final SaveAction saveAction = new ChecksumTableSaveAction(); private final LoadAction loadAction = new LoadAction(transferablePolicy); @@ -281,7 +272,7 @@ public class ChecksumPanel extends FileBotPanel { this.selectedColumn = options.get(0); } else if (options.size() > 1) { // user must select one option - SelectDialog selectDialog = new SelectDialog(SwingUtilities.getWindowAncestor(ChecksumPanel.this), options) { + SelectDialog selectDialog = new SelectDialog(SwingUtilities.getWindowAncestor(SfvPanel.this), options) { @Override protected String convertValueToString(Object value) { diff --git a/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanelBuilder.java b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanelBuilder.java new file mode 100644 index 00000000..5e0f25b2 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/sfv/SfvPanelBuilder.java @@ -0,0 +1,31 @@ + +package net.sourceforge.filebot.ui.panel.sfv; + + +import javax.swing.Icon; +import javax.swing.JComponent; + +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.PanelBuilder; + + +public class SfvPanelBuilder implements PanelBuilder { + + @Override + public String getName() { + return "SFV"; + } + + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("panel.sfv"); + } + + + @Override + public JComponent create() { + return new SfvPanel(); + } + +} diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java index a8cdd718..ee186b92 100644 --- a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanel.java @@ -15,7 +15,6 @@ import javax.swing.Icon; import ca.odell.glazedlists.BasicEventList; import ca.odell.glazedlists.EventList; -import net.sourceforge.filebot.ResourceManager; import net.sourceforge.filebot.Settings; import net.sourceforge.filebot.ui.AbstractSearchPanel; import net.sourceforge.filebot.ui.SelectDialog; @@ -33,8 +32,6 @@ import net.sourceforge.tuned.ui.SimpleLabelProvider; public class SubtitlePanel extends AbstractSearchPanel { public SubtitlePanel() { - super("Subtitles", ResourceManager.getIcon("panel.subtitle")); - historyPanel.setColumnHeader(0, "Show / Movie"); historyPanel.setColumnHeader(1, "Number of Subtitles"); } diff --git a/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanelBuilder.java b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanelBuilder.java new file mode 100644 index 00000000..80300f84 --- /dev/null +++ b/source/net/sourceforge/filebot/ui/panel/subtitle/SubtitlePanelBuilder.java @@ -0,0 +1,31 @@ + +package net.sourceforge.filebot.ui.panel.subtitle; + + +import javax.swing.Icon; +import javax.swing.JComponent; + +import net.sourceforge.filebot.ResourceManager; +import net.sourceforge.filebot.ui.PanelBuilder; + + +public class SubtitlePanelBuilder implements PanelBuilder { + + @Override + public String getName() { + return "Subtitles"; + } + + + @Override + public Icon getIcon() { + return ResourceManager.getIcon("panel.subtitle"); + } + + + @Override + public JComponent create() { + return new SubtitlePanel(); + } + +} diff --git a/source/net/sourceforge/tuned/MessageBus.java b/source/net/sourceforge/tuned/MessageBus.java deleted file mode 100644 index 769c2472..00000000 --- a/source/net/sourceforge/tuned/MessageBus.java +++ /dev/null @@ -1,86 +0,0 @@ - -package net.sourceforge.tuned; - - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.swing.SwingUtilities; - - -public class MessageBus { - - private static final MessageBus instance = new MessageBus(); - - - public static MessageBus getDefault() { - return instance; - } - - private final Map> handlers = new HashMap>(); - - - public synchronized void addMessageHandler(String topic, MessageHandler handler) { - if (handler == null) - return; - - List list = handlers.get(topic.toLowerCase()); - - if (list == null) { - list = new ArrayList(3); - handlers.put(topic.toLowerCase(), list); - } - - list.add(handler); - } - - - public synchronized void removeMessageHandler(String topic, MessageHandler handler) { - List list = handlers.get(topic.toLowerCase()); - - if (list != null) { - list.remove(handler); - } - } - - - public synchronized MessageHandler[] getHandlers(String topic) { - List list = handlers.get(topic.toLowerCase()); - - if (list == null) - return new MessageHandler[0]; - - return list.toArray(new MessageHandler[0]); - } - - - public void publish(final String topic, final Object... messages) { - if (SwingUtilities.isEventDispatchThread()) { - publishDirect(topic, messages); - } else { - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - publishDirect(topic, messages); - } - }); - } - } - - - private void publishDirect(String topic, Object... messages) { - for (MessageHandler handler : getHandlers(topic.toLowerCase())) { - try { - handler.handle(topic.toLowerCase(), messages); - } catch (Exception e) { - Logger.getLogger("global").log(Level.SEVERE, e.getMessage(), e); - } - } - } - -} diff --git a/source/net/sourceforge/tuned/MessageHandler.java b/source/net/sourceforge/tuned/MessageHandler.java deleted file mode 100644 index 5e7c6e7d..00000000 --- a/source/net/sourceforge/tuned/MessageHandler.java +++ /dev/null @@ -1,9 +0,0 @@ - -package net.sourceforge.tuned; - - -public interface MessageHandler { - - public void handle(String topic, Object... messages) throws Exception; - -} diff --git a/test/net/sourceforge/filebot/ArgumentBeanTest.java b/test/net/sourceforge/filebot/ArgumentBeanTest.java index 3a89eff2..c212ee73 100644 --- a/test/net/sourceforge/filebot/ArgumentBeanTest.java +++ b/test/net/sourceforge/filebot/ArgumentBeanTest.java @@ -15,40 +15,23 @@ public class ArgumentBeanTest { @Test public void clear() throws Exception { - ArgumentBean bean = parse("--sfv", "One Piece", "-clear"); + ArgumentBean bean = parse("-clear", "--analyze", "One Piece", "Naruto"); - assertTrue(bean.isClear()); - assertFalse(bean.isHelp()); - assertEquals("One Piece", bean.getSfvPanelFile().getName()); + assertTrue(bean.clear()); + assertFalse(bean.help()); + + assertEquals("One Piece", bean.arguments().get(0).toString()); + assertEquals("Naruto", bean.arguments().get(1).toString()); } @Test public void noClear() throws Exception { - ArgumentBean bean = parse("-help", "--sfv", "One Piece"); - - assertTrue(bean.isHelp()); - assertFalse(bean.isClear()); - assertEquals("One Piece", bean.getSfvPanelFile().getName()); - } - - - @Test - public void oneArgument() throws Exception { ArgumentBean bean = parse("--sfv", "One Piece.sfv"); - assertFalse(bean.isClear()); - assertFalse(bean.isHelp()); - assertEquals("One Piece.sfv", bean.getSfvPanelFile().getName()); - } - - - @Test - public void mixedArguments() throws Exception { - ArgumentBean bean = parse("--list", "Twin Peaks.txt", "--sfv", "Death Note.sfv"); - - assertEquals("Twin Peaks.txt", bean.getListPanelFile().getName()); - assertEquals("Death Note.sfv", bean.getSfvPanelFile().getName()); + assertFalse(bean.help()); + assertFalse(bean.clear()); + assertEquals("One Piece.sfv", bean.arguments().get(0).toString()); }