001 package org.shiftone.jrat.desktop.action.inject;
002
003 import org.shiftone.jrat.desktop.DesktopFrame;
004 import org.shiftone.jrat.inject.Injector;
005 import org.shiftone.jrat.util.io.IOUtil;
006 import org.shiftone.jrat.util.log.Logger;
007
008 import javax.swing.*;
009 import java.awt.event.ActionEvent;
010 import java.io.File;
011
012 /**
013 * @author (jeff@shiftone.org) Jeff Drost
014 */
015 public abstract class AbstractInjectAction extends AbstractAction {
016
017 private static final Logger LOG = Logger.getLogger(AbstractInjectAction.class);
018 private final DesktopFrame desktopFrame;
019 private final int fileSelectionMode;
020 private final String dialogTitle;
021
022 protected AbstractInjectAction(String string, DesktopFrame desktopFrame, int fileSelectionMode, String dialogTitle) {
023 super(string);
024 this.desktopFrame = desktopFrame;
025 this.fileSelectionMode = fileSelectionMode;
026 this.dialogTitle = dialogTitle;
027 }
028
029 protected abstract File getLastInjected();
030
031 protected abstract void setLastInjected(File file);
032
033
034 public void actionPerformed(ActionEvent actionEvent) {
035
036 LOG.info("actionPerformed");
037
038 JFileChooser chooser = new JFileChooser();
039 File lastInjected = getLastInjected();
040
041 chooser.setDialogTitle(dialogTitle);
042 chooser.setFileSelectionMode(fileSelectionMode);
043 chooser.setMultiSelectionEnabled(true);
044
045 if (lastInjected != null) {
046 chooser.setCurrentDirectory(IOUtil.getNearestExistingParent(lastInjected));
047 chooser.setSelectedFile(lastInjected);
048 }
049
050 if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(null)) {
051
052 File[] targets = chooser.getSelectedFiles();
053
054 if (targets.length > 0) {
055
056 setLastInjected(targets[0]);
057
058 RunnableLogPanel logPanel = new RunnableLogPanel();
059
060 desktopFrame.createView("Injecting", logPanel);
061
062 logPanel.run(new InjectRunnable(targets));
063
064 }
065 }
066 }
067
068 private class InjectRunnable implements Runnable {
069
070 private final File[] targets;
071 private final Injector injector = new Injector();
072
073 public InjectRunnable(File[] targets) {
074 this.targets = targets;
075 }
076
077 private void inject() {
078 for (int i = 0; i < targets.length; i++) {
079 injector.inject(targets[i]);
080 }
081 }
082
083 public void run() {
084 inject();
085 }
086 }
087 }