package de.lmu.ifi.dbs.elki.gui.configurator; /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2013 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 . */ import java.awt.Dimension; import java.awt.GridBagConstraints; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.EventListenerList; import de.lmu.ifi.dbs.elki.gui.icons.StockIcon; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.ListParameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.TrackParameters; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; /** * Abstract class to produce a configurator for a particular parameter. * * @author Erich Schubert * * @apiviz.has StockIcon * * @param parameter type */ public abstract class AbstractParameterConfigurator> implements ParameterConfigurator { /** * The parameter to configure */ final T param; /** * The parent container */ final JComponent parent; /** * The event listeners for this parameter. */ protected EventListenerList listenerList = new EventListenerList(); /** * Constructor. * * @param param Parameter * @param parent Parent */ public AbstractParameterConfigurator(T param, JComponent parent) { super(); this.param = param; this.parent = parent; } /** * Complete the current grid row, adding the icon at the end */ protected void finishGridRow() { GridBagConstraints constraints = new GridBagConstraints(); constraints.gridwidth = GridBagConstraints.REMAINDER; constraints.weightx = 0; final JLabel icon; if(param.isOptional()) { if(param.isDefined() && param.tookDefaultValue() && !(param instanceof Flag)) { // TODO: better icon for default value? icon = new JLabel(StockIcon.getStockIcon(StockIcon.DIALOG_INFORMATION)); icon.setToolTipText("Default value: "+param.getDefaultValueAsString()); } else { icon = new JLabel(); icon.setMinimumSize(new Dimension(16, 16)); } } else { if(!param.isDefined()) { icon = new JLabel(StockIcon.getStockIcon(StockIcon.DIALOG_ERROR)); icon.setToolTipText("Missing value."); } else { icon = new JLabel(); icon.setMinimumSize(new Dimension(16, 16)); } } parent.add(icon, constraints); } @Override public void addParameter(Object owner, Parameter param, TrackParameters track) { LoggingUtil.warning(this.getClass() + " does not support sub-parameters!"); } @Override public void addChangeListener(ChangeListener listener) { listenerList.add(ChangeListener.class, listener); } @Override public void removeChangeListener(ChangeListener listener) { listenerList.remove(ChangeListener.class, listener); } /** * Notify listeners of a changed value. */ protected void fireValueChanged() { // FIXME: compare with previous value? ChangeEvent evt = new ChangeEvent(this); for(ChangeListener listener : listenerList.getListeners(ChangeListener.class)) { listener.stateChanged(evt); } } @Override public void appendParameters(ListParameterization params) { Object val = getUserInput(); if(val instanceof String && ((String) val).length() == 0) { val = null; } if(val != null) { params.addParameter(param.getOptionID(), val); } } /** * Get the value given by the user. * * @return value for parameter */ public abstract Object getUserInput(); }