summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/gui/minigui/MiniGUI.java
diff options
context:
space:
mode:
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.java96
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);
}
}