001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.widgets; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.awt.BorderLayout; 007import java.awt.Dimension; 008import java.awt.GridBagLayout; 009import java.util.ArrayList; 010import java.util.List; 011 012import javax.swing.DefaultListModel; 013import javax.swing.JButton; 014import javax.swing.JList; 015import javax.swing.JOptionPane; 016import javax.swing.JPanel; 017import javax.swing.JScrollPane; 018 019import org.openstreetmap.josm.Main; 020import org.openstreetmap.josm.tools.GBC; 021 022/** 023 * A {@link JList} containing items, and {@link JButton}s to add/edit/delete items. 024 */ 025public class EditableList extends JPanel { 026 027 public final String title; 028 public final JList<String> sourcesList = new JList<>(new DefaultListModel<String>()); 029 public final JButton addSrcButton = new JButton(tr("Add")); 030 public final JButton editSrcButton = new JButton(tr("Edit")); 031 public final JButton deleteSrcButton = new JButton(tr("Delete")); 032 033 /** 034 * Constructs a new {@code EditableList}. 035 * @param title The title displayed in input dialog 036 */ 037 public EditableList(String title) { 038 this.title = title; 039 build(); 040 } 041 042 protected final void build() { 043 044 setLayout(new BorderLayout()); 045 046 addSrcButton.addActionListener(e -> { 047 String source = JOptionPane.showInputDialog( 048 Main.parent, 049 title, 050 title, 051 JOptionPane.QUESTION_MESSAGE); 052 if (source != null && !source.isEmpty()) { 053 ((DefaultListModel<String>) sourcesList.getModel()).addElement(source); 054 } 055 sourcesList.clearSelection(); 056 }); 057 058 editSrcButton.addActionListener(e -> { 059 int row = sourcesList.getSelectedIndex(); 060 if (row == -1 && sourcesList.getModel().getSize() == 1) { 061 sourcesList.setSelectedIndex(0); 062 row = 0; 063 } 064 if (row == -1) { 065 if (sourcesList.getModel().getSize() == 0) { 066 String source1 = JOptionPane.showInputDialog(Main.parent, title, title, JOptionPane.QUESTION_MESSAGE); 067 if (source1 != null && !source1.isEmpty()) { 068 ((DefaultListModel<String>) sourcesList.getModel()).addElement(source1); 069 } 070 } else { 071 JOptionPane.showMessageDialog( 072 Main.parent, 073 tr("Please select the row to edit."), 074 tr("Information"), 075 JOptionPane.INFORMATION_MESSAGE 076 ); 077 } 078 } else { 079 String source2 = (String) JOptionPane.showInputDialog(Main.parent, 080 title, 081 title, 082 JOptionPane.QUESTION_MESSAGE, null, null, 083 sourcesList.getSelectedValue()); 084 if (source2 != null && !source2.isEmpty()) { 085 ((DefaultListModel<String>) sourcesList.getModel()).setElementAt(source2, row); 086 } 087 } 088 sourcesList.clearSelection(); 089 }); 090 091 deleteSrcButton.addActionListener(e -> { 092 if (sourcesList.getSelectedIndex() == -1) { 093 JOptionPane.showMessageDialog(Main.parent, tr("Please select the row to delete."), tr("Information"), 094 JOptionPane.QUESTION_MESSAGE); 095 } else { 096 ((DefaultListModel<String>) sourcesList.getModel()).remove(sourcesList.getSelectedIndex()); 097 } 098 }); 099 sourcesList.setMinimumSize(new Dimension(300, 50)); 100 sourcesList.setVisibleRowCount(3); 101 102 addSrcButton.setToolTipText(tr("Add a new source to the list.")); 103 editSrcButton.setToolTipText(tr("Edit the selected source.")); 104 deleteSrcButton.setToolTipText(tr("Delete the selected source from the list.")); 105 106 final JPanel buttonPanel = new JPanel(new GridBagLayout()); 107 buttonPanel.add(addSrcButton, GBC.std().insets(0, 5, 0, 0)); 108 buttonPanel.add(editSrcButton, GBC.std().insets(5, 5, 5, 0)); 109 buttonPanel.add(deleteSrcButton, GBC.std().insets(0, 5, 0, 0)); 110 111 add(new JScrollPane(sourcesList), BorderLayout.CENTER); 112 add(buttonPanel, BorderLayout.SOUTH); 113 setPreferredSize(new Dimension(300, 50 + (int) buttonPanel.getPreferredSize().getHeight())); 114 115 } 116 117 public void setItems(final Iterable<String> items) { 118 for (String source : items) { 119 ((DefaultListModel<String>) sourcesList.getModel()).addElement(source); 120 } 121 } 122 123 public List<String> getItems() { 124 final List<String> items = new ArrayList<>(sourcesList.getModel().getSize()); 125 for (int i = 0; i < sourcesList.getModel().getSize(); ++i) { 126 items.add(sourcesList.getModel().getElementAt(i)); 127 } 128 return items; 129 } 130 131 @Override 132 public void setEnabled(boolean enabled) { 133 sourcesList.setEnabled(enabled); 134 addSrcButton.setEnabled(enabled); 135 editSrcButton.setEnabled(enabled); 136 deleteSrcButton.setEnabled(enabled); 137 } 138}