diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java | 96 |
1 files changed, 87 insertions, 9 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java b/src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java index f60ac69e..9624a0d6 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java +++ b/src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.gui.minigui; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -24,6 +24,7 @@ package de.lmu.ifi.dbs.elki.gui.minigui; */ import java.awt.Dimension; +import java.awt.Event; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; @@ -34,9 +35,11 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.BitSet; +import java.util.Collections; import java.util.List; import java.util.logging.Level; +import javax.swing.AbstractAction; import javax.swing.AbstractListModel; import javax.swing.BoxLayout; import javax.swing.ComboBoxModel; @@ -46,19 +49,24 @@ import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; +import javax.swing.KeyStroke; import javax.swing.SwingWorker; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import de.lmu.ifi.dbs.elki.KDDTask; import de.lmu.ifi.dbs.elki.application.AbstractApplication; +import de.lmu.ifi.dbs.elki.application.ELKILauncher; +import de.lmu.ifi.dbs.elki.application.KDDCLIApplication; import de.lmu.ifi.dbs.elki.gui.GUIUtil; import de.lmu.ifi.dbs.elki.gui.util.DynamicParameters; import de.lmu.ifi.dbs.elki.gui.util.LogPanel; import de.lmu.ifi.dbs.elki.gui.util.ParameterTable; import de.lmu.ifi.dbs.elki.gui.util.ParametersModel; import de.lmu.ifi.dbs.elki.gui.util.SavedSettingsFile; +import de.lmu.ifi.dbs.elki.logging.CLISmartHandler; import de.lmu.ifi.dbs.elki.logging.Logging; +import de.lmu.ifi.dbs.elki.logging.LoggingConfiguration; import de.lmu.ifi.dbs.elki.utilities.Alias; import de.lmu.ifi.dbs.elki.utilities.FormatUtil; import de.lmu.ifi.dbs.elki.utilities.exceptions.UnableToComplyException; @@ -66,6 +74,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.ParameterException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.UnspecifiedParameterException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.SerializedParameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.TrackParameters; +import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; import de.lmu.ifi.dbs.elki.workflow.LoggingStep; import de.lmu.ifi.dbs.elki.workflow.OutputStep; @@ -79,7 +88,7 @@ import de.lmu.ifi.dbs.elki.workflow.OutputStep; * @apiviz.owns ParameterTable * @apiviz.owns DynamicParameters */ -@Alias({"mini", "minigui"}) +@Alias({ "mini", "minigui" }) public class MiniGUI extends AbstractApplication { /** * Filename for saved settings. @@ -97,6 +106,11 @@ public class MiniGUI extends AbstractApplication { private static final Logging LOG = Logging.getLogger(MiniGUI.class); /** + * Quit action, for mnemonics. + */ + protected static final String ACTION_QUIT = "quit"; + + /** * The frame */ JFrame frame; @@ -142,6 +156,11 @@ public class MiniGUI extends AbstractApplication { protected JButton runButton; /** + * Application to configure / run. + */ + private Class<? extends AbstractApplication> maincls = KDDCLIApplication.class; + + /** * Constructor. */ public MiniGUI() { @@ -305,6 +324,26 @@ public class MiniGUI extends AbstractApplication { LOG.exception(e); } + { + KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK); + panel.getInputMap().put(key, ACTION_QUIT); + } + { + KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_W, Event.CTRL_MASK); + panel.getInputMap().put(key, ACTION_QUIT); + } + panel.getActionMap().put(ACTION_QUIT, new AbstractAction() { + /** + * Serial version + */ + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + frame.dispose(); + } + }); + // Finalize the frame. frame.setContentPane(panel); frame.pack(); @@ -331,7 +370,7 @@ public class MiniGUI extends AbstractApplication { SerializedParameterization config = new SerializedParameterization(params); TrackParameters track = new TrackParameters(config); track.tryInstantiate(LoggingStep.class); - track.tryInstantiate(KDDTask.class); + track.tryInstantiate(maincls); config.logUnusedParameters(); // config.logAndClearReportedErrors(); final boolean hasErrors = (config.getErrors().size() > 0); @@ -367,6 +406,18 @@ public class MiniGUI extends AbstractApplication { } /** + * Auto-load the last task from the history file. + */ + protected void loadLatest() { + int size = store.size(); + if(size > 0) { + final Pair<String, ArrayList<String>> pair = store.getElementAt(size - 1); + savedSettingsModel.setSelectedItem(pair.first); + doSetParameters(pair.second); + } + } + + /** * Do a full run of the KDDTask with the specified parameters. */ protected void startTask() { @@ -385,7 +436,7 @@ public class MiniGUI extends AbstractApplication { public Void doInBackground() { SerializedParameterization config = new SerializedParameterization(params); config.tryInstantiate(LoggingStep.class); - KDDTask task = config.tryInstantiate(KDDTask.class); + AbstractApplication task = config.tryInstantiate(maincls); try { config.logUnusedParameters(); if(config.getErrors().size() == 0) { @@ -455,14 +506,41 @@ public class MiniGUI extends AbstractApplication { try { final MiniGUI gui = new MiniGUI(); gui.run(); + List<String> params = Collections.emptyList(); if(args != null && args.length > 0) { - gui.doSetParameters(Arrays.asList(args)); - } - else { - gui.doSetParameters(new ArrayList<String>()); + params = new ArrayList<>(Arrays.asList(args)); + // TODO: it would be nicer to use the Parameterization API for this! + if(params.size() > 0) { + try { + gui.maincls = ELKILauncher.findMainClass(params.get(0)); + params.remove(0); // on success + } + catch(ClassNotFoundException e) { + // Ignore. + } + } + if(params.remove("-minigui.last")) { + javax.swing.SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + gui.loadLatest(); + } + }); + } + if(params.remove("-minigui.autorun")) { + javax.swing.SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + gui.startTask(); + } + }); + } } + gui.doSetParameters(params); } - catch(UnableToComplyException e) { + catch(Exception | Error e) { + // Restore error handler, as the GUI is likely broken. + LoggingConfiguration.replaceDefaultHandler(new CLISmartHandler()); LOG.exception(e); } } |