// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.widgets;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.tools.GBC;
/**
* A {@link JList} containing items, and {@link JButton}s to add/edit/delete items.
*/
public class EditableList extends JPanel {
public final String title;
public final JList<String> sourcesList = new JList<>(new DefaultListModel<String>());
public final JButton addSrcButton = new JButton(tr("Add"));
public final JButton editSrcButton = new JButton(tr("Edit"));
public final JButton deleteSrcButton = new JButton(tr("Delete"));
/**
* Constructs a new {@code EditableList}.
* @param title The title displayed in input dialog
*/
public EditableList(String title) {
this.title = title;
build();
}
protected final void build() {
setLayout(new BorderLayout());
addSrcButton.addActionListener(e -> {
String source = JOptionPane.showInputDialog(
Main.parent,
title,
title,
JOptionPane.QUESTION_MESSAGE);
if (source != null && !source.isEmpty()) {
((DefaultListModel<String>) sourcesList.getModel()).addElement(source);
}
sourcesList.clearSelection();
});
editSrcButton.addActionListener(e -> {
int row = sourcesList.getSelectedIndex();
if (row == -1 && sourcesList.getModel().getSize() == 1) {
sourcesList.setSelectedIndex(0);
row = 0;
}
if (row == -1) {
if (sourcesList.getModel().getSize() == 0) {
String source1 = JOptionPane.showInputDialog(Main.parent, title, title, JOptionPane.QUESTION_MESSAGE);
if (source1 != null && !source1.isEmpty()) {
((DefaultListModel<String>) sourcesList.getModel()).addElement(source1);
}
} else {
JOptionPane.showMessageDialog(
Main.parent,
tr("Please select the row to edit."),
tr("Information"),
JOptionPane.INFORMATION_MESSAGE
);
}
} else {
String source2 = (String) JOptionPane.showInputDialog(Main.parent,
title,
title,
JOptionPane.QUESTION_MESSAGE, null, null,
sourcesList.getSelectedValue());
if (source2 != null && !source2.isEmpty()) {
((DefaultListModel<String>) sourcesList.getModel()).setElementAt(source2, row);
}
}
sourcesList.clearSelection();
});
deleteSrcButton.addActionListener(e -> {
if (sourcesList.getSelectedIndex() == -1) {
JOptionPane.showMessageDialog(Main.parent, tr("Please select the row to delete."), tr("Information"),
JOptionPane.QUESTION_MESSAGE);
} else {
((DefaultListModel<String>) sourcesList.getModel()).remove(sourcesList.getSelectedIndex());
}
});
sourcesList.setMinimumSize(new Dimension(300, 50));
sourcesList.setVisibleRowCount(3);
addSrcButton.setToolTipText(tr("Add a new source to the list."));
editSrcButton.setToolTipText(tr("Edit the selected source."));
deleteSrcButton.setToolTipText(tr("Delete the selected source from the list."));
final JPanel buttonPanel = new JPanel(new GridBagLayout());
buttonPanel.add(addSrcButton, GBC.std().insets(0, 5, 0, 0));
buttonPanel.add(editSrcButton, GBC.std().insets(5, 5, 5, 0));
buttonPanel.add(deleteSrcButton, GBC.std().insets(0, 5, 0, 0));
add(new JScrollPane(sourcesList), BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
setPreferredSize(new Dimension(300, 50 + (int) buttonPanel.getPreferredSize().getHeight()));
}
public void setItems(final Iterable<String> items) {
for (String source : items) {
((DefaultListModel<String>) sourcesList.getModel()).addElement(source);
}
}
public List<String> getItems() {
final List<String> items = new ArrayList<>(sourcesList.getModel().getSize());
for (int i = 0; i < sourcesList.getModel().getSize(); ++i) {
items.add(sourcesList.getModel().getElementAt(i));
}
return items;
}
@Override
public void setEnabled(boolean enabled) {
sourcesList.setEnabled(enabled);
addSrcButton.setEnabled(enabled);
editSrcButton.setEnabled(enabled);
deleteSrcButton.setEnabled(enabled);
}
}