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) 2015
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.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTextField;
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.parameters.FileParameter;
/**
* Provide a configuration panel to choose a file with a file selector button.
*
* @author Erich Schubert
*
* @apiviz.uses FileParameter
*/
public class FileParameterConfigurator extends AbstractSingleParameterConfigurator implements ActionListener {
/**
* The panel to store the components
*/
final JPanel panel;
/**
* Text field to store the name
*/
final JTextField textfield;
/**
* The button to open the file selector
*/
final JButton button;
/**
* Constructor.
*
* @param fp File parameter
* @param parent Component to attach to.
*/
public FileParameterConfigurator(FileParameter fp, JComponent parent) {
super(fp, parent);
// create components
textfield = new JTextField();
textfield.setToolTipText(param.getShortDescription());
textfield.addActionListener(this);
button = new JButton(StockIcon.getStockIcon(StockIcon.DOCUMENT_OPEN));
button.setToolTipText(param.getShortDescription());
button.addActionListener(this);
// fill with value
File f = null;
if (fp.isDefined()) {
f = fp.getValue();
}
if (f != null) {
String fn = f.getPath();
textfield.setText(fn);
} else {
textfield.setText("");
}
// make a panel
GridBagConstraints constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.HORIZONTAL;
constraints.weightx = 1.0;
panel = new JPanel(new BorderLayout());
panel.add(textfield, BorderLayout.CENTER);
panel.add(button, BorderLayout.EAST);
parent.add(panel, constraints);
finishGridRow();
}
/**
* Button callback to show the file selector
*/
@Override
public void actionPerformed(ActionEvent e) {
// Use a new JFileChooser. Inconsistent behaviour otherwise!
final JFileChooser fc = new JFileChooser(new File("."));
if (param.isDefined()) {
fc.setSelectedFile(param.getValue());
}
if (e.getSource() == button) {
int returnVal = fc.showOpenDialog(button);
if (returnVal == JFileChooser.APPROVE_OPTION) {
textfield.setText(fc.getSelectedFile().getPath());
fireValueChanged();
} else {
// Do nothing on cancel.
}
} else if (e.getSource() == textfield) {
fireValueChanged();
} else {
LoggingUtil.warning("actionPerformed triggered by unknown source: " + e.getSource());
}
}
@Override
public String getUserInput() {
return textfield.getText();
}
}