diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/gui/multistep')
8 files changed, 445 insertions, 232 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/MultiStepGUI.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/MultiStepGUI.java index cf7f2a3c..ae550837 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/MultiStepGUI.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/MultiStepGUI.java @@ -1,33 +1,35 @@ package de.lmu.ifi.dbs.elki.gui.multistep; -/* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures - -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; -import javax.swing.AbstractListModel; -import javax.swing.ComboBoxModel; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JPanel; @@ -36,15 +38,18 @@ import javax.swing.JTabbedPane; import javax.swing.UIManager; import de.lmu.ifi.dbs.elki.KDDTask; +import de.lmu.ifi.dbs.elki.gui.minigui.MiniGUI; import de.lmu.ifi.dbs.elki.gui.multistep.panels.AlgorithmTabPanel; import de.lmu.ifi.dbs.elki.gui.multistep.panels.EvaluationTabPanel; import de.lmu.ifi.dbs.elki.gui.multistep.panels.InputTabPanel; import de.lmu.ifi.dbs.elki.gui.multistep.panels.LoggingTabPanel; import de.lmu.ifi.dbs.elki.gui.multistep.panels.OutputTabPanel; +import de.lmu.ifi.dbs.elki.gui.multistep.panels.SavedSettingsTabPanel; import de.lmu.ifi.dbs.elki.gui.util.LogPanel; import de.lmu.ifi.dbs.elki.gui.util.SavedSettingsFile; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.ListParameterization; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; import de.lmu.ifi.dbs.elki.workflow.OutputStep; /** @@ -86,6 +91,8 @@ public class MultiStepGUI extends JPanel { private LoggingTabPanel logTab; + private SavedSettingsTabPanel setTab; + /** * Constructor */ @@ -130,33 +137,70 @@ public class MultiStepGUI extends JPanel { } private void addPanels(JTabbedPane panels) { + SavedSettingsFile settings = new SavedSettingsFile(MiniGUI.SAVED_SETTINGS_FILENAME); + try { + settings.load(); + } + catch(FileNotFoundException e) { + logger.warning("Error loading saved settings."); + } + catch(IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + inputTab = new InputTabPanel(); algTab = new AlgorithmTabPanel(inputTab); evalTab = new EvaluationTabPanel(inputTab, algTab); outTab = new OutputTabPanel(inputTab, evalTab); logTab = new LoggingTabPanel(); + setTab = new SavedSettingsTabPanel(settings, this); panels.addTab("Input", inputTab); panels.addTab("Algorithm", algTab); panels.addTab("Evaluation", evalTab); panels.addTab("Output", outTab); panels.addTab("Logging", logTab); + panels.addTab("Saved Settings", setTab); - ListParameterization config = new ListParameterization(); + setParameters(new ListParameterization()); + } + + /** + * Set the parameters. + * + * @param config Parameterization + */ + public void setParameters(Parameterization config) { // Clear errors after each step, so they don't consider themselves failed // because of earlier errors. logTab.setParameters(config); - config.clearErrors(); + //config.clearErrors(); inputTab.setParameters(config); - config.clearErrors(); + //config.clearErrors(); algTab.setParameters(config); - config.clearErrors(); + //config.clearErrors(); evalTab.setParameters(config); - config.clearErrors(); + //config.clearErrors(); outTab.setParameters(config); - config.clearErrors(); + //config.clearErrors(); } /** + * Get the serialized parameters + * + * @return Serialized parameters + */ + public ArrayList<String> serializeParameters() { + ListParameterization params = new ListParameterization(); + logTab.appendParameters(params); + inputTab.appendParameters(params); + algTab.appendParameters(params); + evalTab.appendParameters(params); + outTab.appendParameters(params); + return params.serialize(); + } + + /** * Create the GUI and show it. For thread safety, this method should be * invoked from the event-dispatching thread. */ @@ -201,67 +245,4 @@ public class MultiStepGUI extends JPanel { } }); } - - /** - * Class to interface between the saved settings list and a JComboBox - * - * @author Erich Schubert - * - * @apiviz.composedOf de.lmu.ifi.dbs.elki.gui.util.SavedSettingsFile - */ - class SettingsComboboxModel extends AbstractListModel implements ComboBoxModel { - /** - * Serial version - */ - private static final long serialVersionUID = 1L; - - /** - * Settings storage - */ - protected SavedSettingsFile store; - - /** - * Selected entry - */ - protected String selected = null; - - /** - * Constructor - * - * @param store Store to access - */ - public SettingsComboboxModel(SavedSettingsFile store) { - super(); - this.store = store; - } - - @Override - public String getSelectedItem() { - return selected; - } - - @Override - public void setSelectedItem(Object anItem) { - if(anItem instanceof String) { - selected = (String) anItem; - } - } - - @Override - public Object getElementAt(int index) { - return store.getElementAt(index).first; - } - - @Override - public int getSize() { - return store.size(); - } - - /** - * Force an update - */ - public void update() { - fireContentsChanged(this, 0, getSize() + 1); - } - } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/AlgorithmTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/AlgorithmTabPanel.java index 3dde0889..4f294468 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/AlgorithmTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/AlgorithmTabPanel.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; + /* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures - -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import java.lang.ref.WeakReference; diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/EvaluationTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/EvaluationTabPanel.java index 0f7a6776..4f6d0879 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/EvaluationTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/EvaluationTabPanel.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; + /* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures - -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import java.lang.ref.WeakReference; diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/InputTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/InputTabPanel.java index 86d7a013..833d5ba8 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/InputTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/InputTabPanel.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; + /* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/LoggingTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/LoggingTabPanel.java index 1ab722f0..143887fc 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/LoggingTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/LoggingTabPanel.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; + /* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import de.lmu.ifi.dbs.elki.logging.LoggingConfiguration; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/OutputTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/OutputTabPanel.java index 7e599a62..acbde125 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/OutputTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/OutputTabPanel.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; + /* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import java.lang.ref.WeakReference; diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/ParameterTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/ParameterTabPanel.java index 175b9100..1bfe0000 100644 --- a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/ParameterTabPanel.java +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/ParameterTabPanel.java @@ -1,34 +1,33 @@ package de.lmu.ifi.dbs.elki.gui.multistep.panels; -/* -This file is part of ELKI: -Environment for Developing KDD-Applications Supported by Index-Structures - -Copyright (C) 2011 -Ludwig-Maximilians-Universität München -Lehr- und Forschungseinheit für Datenbanksysteme -ELKI Development Team - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Affero General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU Affero General Public License for more details. - -You should have received a copy of the GNU Affero General Public License -along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; -import java.util.BitSet; -import java.util.List; import javax.swing.BoxLayout; import javax.swing.JButton; @@ -39,13 +38,11 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import de.lmu.ifi.dbs.elki.gui.configurator.ConfiguratorPanel; -import de.lmu.ifi.dbs.elki.gui.util.DynamicParameters; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.utilities.FormatUtil; import de.lmu.ifi.dbs.elki.utilities.designpattern.Observable; import de.lmu.ifi.dbs.elki.utilities.designpattern.Observer; import de.lmu.ifi.dbs.elki.utilities.designpattern.Observers; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; 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.ListParameterization; @@ -131,7 +128,7 @@ public abstract class ParameterTabPanel extends JPanel implements Observable<Par runButton.setMnemonic(KeyEvent.VK_R); runButton.addActionListener(new ActionListener() { @Override - public void actionPerformed(@SuppressWarnings("unused") ActionEvent e) { + public void actionPerformed(ActionEvent e) { Thread r = new Thread() { @Override public void run() { @@ -183,6 +180,9 @@ public abstract class ParameterTabPanel extends JPanel implements Observable<Par ListParameterization config = new ListParameterization(); parameterTable.appendParameters(config); setParameters(config); + if(config.getErrors().size() > 0) { + reportErrors(config); + } config.clearErrors(); parameterTable.setEnabled(true); } @@ -192,14 +192,9 @@ public abstract class ParameterTabPanel extends JPanel implements Observable<Par * * @param config Parameterization */ - public void setParameters(ListParameterization config) { + public void setParameters(Parameterization config) { TrackParameters track = new TrackParameters(config); configureStep(track); - //config.logUnusedParameters(); - if(config.getErrors().size() > 0) { - reportErrors(config); - } - List<Pair<OptionID, Object>> remainingParameters = config.getRemainingParameters(); // update parameter table { @@ -210,21 +205,6 @@ public abstract class ParameterTabPanel extends JPanel implements Observable<Par parameterTable.addParameter(pair.first, pair.getSecond(), track); } //parameters.updateFromTrackParameters(track); - // Add remaining parameters - if(remainingParameters != null && !remainingParameters.isEmpty()) { - DynamicParameters.RemainingOptions remo = new DynamicParameters.RemainingOptions(); - try { - remo.setValue("FIXME"); //FormatUtil.format(remainingParameters, " ")); - } - catch(ParameterException e) { - logger.exception(e); - } - BitSet bits = new BitSet(); - bits.set(DynamicParameters.BIT_INVALID); - bits.set(DynamicParameters.BIT_SYNTAX_ERROR); - //parameters.addParameter(remo, remo.getValue(), bits, 0); - parameterTable.addParameter(null, remo, track); - } parameterTable.revalidate(); parameterTable.setEnabled(true); @@ -234,6 +214,15 @@ public abstract class ParameterTabPanel extends JPanel implements Observable<Par updateStatus(); observers.notifyObservers(this); } + + /** + * Collect parameters + * + * @param params Parameter list to add to + */ + public void appendParameters(ListParameterization params) { + parameterTable.appendParameters(params); + } /** * Report errors in a single error log record. diff --git a/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/SavedSettingsTabPanel.java b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/SavedSettingsTabPanel.java new file mode 100644 index 00000000..147943eb --- /dev/null +++ b/src/de/lmu/ifi/dbs/elki/gui/multistep/panels/SavedSettingsTabPanel.java @@ -0,0 +1,238 @@ +package de.lmu.ifi.dbs.elki.gui.multistep.panels; +/* + This file is part of ELKI: + Environment for Developing KDD-Applications Supported by Index-Structures + + Copyright (C) 2011 + Ludwig-Maximilians-Universität München + Lehr- und Forschungseinheit für Datenbanksysteme + ELKI Development Team + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.io.IOException; +import java.util.ArrayList; + +import javax.swing.AbstractListModel; +import javax.swing.BoxLayout; +import javax.swing.ComboBoxModel; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JPanel; + +import de.lmu.ifi.dbs.elki.gui.multistep.MultiStepGUI; +import de.lmu.ifi.dbs.elki.gui.util.SavedSettingsFile; +import de.lmu.ifi.dbs.elki.logging.Logging; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.SerializedParameterization; + +/** + * Tab panel to manage saved settings. + * + * @author Erich Schubert + */ +public class SavedSettingsTabPanel extends JPanel { + /** + * Serial version + */ + private static final long serialVersionUID = 1L; + + /** + * Logger + */ + protected static final Logging logger = Logging.getLogger(SavedSettingsTabPanel.class); + + /** + * The settings file to display. + */ + SavedSettingsFile store; + + /** + * Settings combo box. + */ + SettingsComboboxModel savedSettingsModel; + + /** + * The combo box to use + */ + JComboBox savedCombo; + + /** + * The UI to set parameters on. + * + * TODO: Use an Interface instead? + */ + private MultiStepGUI gui; + + /** + * Constructor. + * + * @param store2 Settings store. + * @param gui2 UI to use + */ + public SavedSettingsTabPanel(SavedSettingsFile store2, MultiStepGUI gui2) { + super(); + this.store = store2; + this.gui = gui2; + this.setLayout(new GridBagLayout()); + // Dropdown for saved settings + { + savedSettingsModel = new SettingsComboboxModel(store); + savedCombo = new JComboBox(savedSettingsModel); + savedCombo.setEditable(true); + savedCombo.setSelectedItem("[Saved Settings]"); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridx = 0; + constraints.gridy = 0; + constraints.weightx = 1.0; + constraints.weighty = 0.01; + add(savedCombo, constraints); + } + // Button panel + { + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); + + // button to load settings + JButton loadButton = new JButton("Load"); + loadButton.setMnemonic(KeyEvent.VK_L); + loadButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String key = savedSettingsModel.getSelectedItem(); + ArrayList<String> settings = store.get(key); + SerializedParameterization config = new SerializedParameterization(settings); + gui.setParameters(config); + config.logUnusedParameters(); + config.clearErrors(); + } + }); + buttonPanel.add(loadButton); + // button to save settings + JButton saveButton = new JButton("Save"); + saveButton.setMnemonic(KeyEvent.VK_S); + saveButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String key = savedSettingsModel.getSelectedItem(); + store.put(key, gui.serializeParameters()); + try { + store.save(); + } + catch(IOException e1) { + logger.exception(e1); + } + savedSettingsModel.update(); + } + }); + buttonPanel.add(saveButton); + // button to remove saved settings + JButton removeButton = new JButton("Remove"); + removeButton.setMnemonic(KeyEvent.VK_E); + removeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String key = savedSettingsModel.getSelectedItem(); + store.remove(key); + try { + store.save(); + } + catch(IOException e1) { + logger.exception(e1); + } + savedCombo.setSelectedItem("[Saved Settings]"); + savedSettingsModel.update(); + } + }); + buttonPanel.add(removeButton); + + GridBagConstraints constraints = new GridBagConstraints(); + constraints.fill = GridBagConstraints.HORIZONTAL; + constraints.gridx = 0; + constraints.gridy = 1; + constraints.weightx = 1.0; + constraints.weighty = 0.01; + add(buttonPanel, constraints); + } + } + + /** + * Class to interface between the saved settings list and a JComboBox + * + * @author Erich Schubert + * + * @apiviz.composedOf de.lmu.ifi.dbs.elki.gui.util.SavedSettingsFile + */ + class SettingsComboboxModel extends AbstractListModel implements ComboBoxModel { + /** + * Serial version + */ + private static final long serialVersionUID = 1L; + + /** + * Settings storage + */ + protected SavedSettingsFile store; + + /** + * Selected entry + */ + protected String selected = null; + + /** + * Constructor + * + * @param store Store to access + */ + public SettingsComboboxModel(SavedSettingsFile store) { + super(); + this.store = store; + } + + @Override + public String getSelectedItem() { + return selected; + } + + @Override + public void setSelectedItem(Object anItem) { + if(anItem instanceof String) { + selected = (String) anItem; + } + } + + @Override + public Object getElementAt(int index) { + return store.getElementAt(index).first; + } + + @Override + public int getSize() { + return store.size(); + } + + /** + * Force an update + */ + public void update() { + fireContentsChanged(this, 0, getSize() + 1); + } + } +}
\ No newline at end of file |