// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Component;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.io.File;
import java.util.EventObject;
import java.util.concurrent.CopyOnWriteArrayList;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.CellEditorListener;
import javax.swing.event.ChangeEvent;
import javax.swing.table.TableCellEditor;
import org.openstreetmap.josm.actions.SaveActionBase;
/**
* This is a {@see TableCellEditor} for filenames. It provides a text input field and
* a button for launchinig a {@see JFileChooser}.
*
*
*/
class FilenameCellEditor extends JPanel implements TableCellEditor {
private JTextField tfFileName;
private CopyOnWriteArrayList<CellEditorListener> listeners;
private File value;
/**
* build the GUI
*/
protected void build() {
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy = 0;
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 1.0;
gc.weighty = 1.0;
add(tfFileName = new JTextField(), gc);
gc.gridx = 1;
gc.gridy = 0;
gc.fill = GridBagConstraints.BOTH;
gc.weightx = 0.0;
gc.weighty = 1.0;
add(new JButton(new LaunchFileChooserAction()));
tfFileName.addFocusListener(
new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
tfFileName.selectAll();
}
}
);
}
public FilenameCellEditor() {
listeners = new CopyOnWriteArrayList<CellEditorListener>();
build();
}
public void addCellEditorListener(CellEditorListener l) {
if (l != null) {
listeners.addIfAbsent(l);
}
}
protected void fireEditingCanceled() {
for (CellEditorListener l: listeners) {
l.editingCanceled(new ChangeEvent(this));
}
}
protected void fireEditingStopped() {
for (CellEditorListener l: listeners) {
l.editingStopped(new ChangeEvent(this));
}
}
public void cancelCellEditing() {
fireEditingCanceled();
}
public Object getCellEditorValue() {
return value;
}
public boolean isCellEditable(EventObject anEvent) {
return true;
}
public void removeCellEditorListener(CellEditorListener l) {
listeners.remove(l);
}
public boolean shouldSelectCell(EventObject anEvent) {
return true;
}
public boolean stopCellEditing() {
if (tfFileName.getText() == null || tfFileName.getText().trim().equals("")) {
value = null;
} else {
value = new File(tfFileName.getText());
}
fireEditingStopped();
return true;
}
public void setInitialValue(File initialValue) {
this.value = initialValue;
if (initialValue == null) {
this.tfFileName.setText("");
} else {
this.tfFileName.setText(initialValue.toString());
}
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
SaveLayerInfo info = (SaveLayerInfo)value;
setInitialValue(info.getFile());
tfFileName.selectAll();
return this;
}
class LaunchFileChooserAction extends AbstractAction {
public LaunchFileChooserAction() {
putValue(NAME, "...");
putValue(SHORT_DESCRIPTION, tr("Launch a file chooser to select a file"));
}
public void actionPerformed(ActionEvent e) {
File f = SaveActionBase.createAndOpenSaveFileChooser(tr("Select filename"), "osm");
if (f != null) {
FilenameCellEditor.this.tfFileName.setText(f.toString());
FilenameCellEditor.this.tfFileName.selectAll();
}
}
}
}