001 // License: GPL. See LICENSE file for details.
002 package org.openstreetmap.josm.gui.preferences.advanced;
003
004 import static org.openstreetmap.josm.tools.I18n.tr;
005
006 import java.awt.Dimension;
007 import java.awt.GridBagLayout;
008 import java.util.ArrayList;
009 import java.util.List;
010
011 import javax.swing.DefaultCellEditor;
012 import javax.swing.JLabel;
013 import javax.swing.JPanel;
014 import javax.swing.JScrollPane;
015 import javax.swing.JTable;
016 import javax.swing.JTextField;
017 import javax.swing.table.AbstractTableModel;
018
019 import org.openstreetmap.josm.data.Preferences.ListSetting;
020 import org.openstreetmap.josm.gui.ExtendedDialog;
021 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
022 import org.openstreetmap.josm.gui.preferences.advanced.AdvancedPreference.PrefEntry;
023 import org.openstreetmap.josm.tools.GBC;
024 import org.openstreetmap.josm.tools.WindowGeometry;
025
026 public class ListEditor extends ExtendedDialog {
027
028 List<String> data;
029 PrefEntry entry;
030
031 public ListEditor(final PreferenceTabbedPane gui, PrefEntry entry, ListSetting setting) {
032 super(gui, tr("Change list setting"), new String[] {tr("OK"), tr("Cancel")});
033 this.entry = entry;
034 List<String> orig = setting.getValue();
035 if (orig != null) {
036 data = new ArrayList<String>(orig);
037 } else {
038 data = new ArrayList<String>();
039 }
040 setButtonIcons(new String[] {"ok.png", "cancel.png"});
041 setRememberWindowGeometry(getClass().getName() + ".geometry", WindowGeometry.centerInWindow(gui, new Dimension(300, 350)));
042 setContent(build(), false);
043 }
044
045 public List<String> getData() {
046 return data;
047 }
048
049 protected JPanel build() {
050 JPanel p = new JPanel(new GridBagLayout());
051 p.add(new JLabel(tr("Key: {0}", entry.getKey())), GBC.eol().insets(0,0,5,0));
052 ListSettingTableModel listModel = new ListSettingTableModel();
053 JTable table = new JTable(listModel);
054 table.putClientProperty("terminateEditOnFocusLost", true);
055 table.setTableHeader(null);
056
057 DefaultCellEditor editor = new DefaultCellEditor(new JTextField());
058 editor.setClickCountToStart(1);
059 table.setDefaultEditor(table.getColumnClass(0), editor);
060
061 JScrollPane pane = new JScrollPane(table);
062 p.add(pane, GBC.eol().insets(5,10,0,0).fill());
063 return p;
064 }
065
066 class ListSettingTableModel extends AbstractTableModel {
067
068 public List<String> getData() {
069 return data;
070 }
071
072 @Override
073 public int getRowCount() {
074 return data.size() + 1;
075 }
076
077 @Override
078 public int getColumnCount() {
079 return 1;
080 }
081
082 @Override
083 public Object getValueAt(int row, int column) {
084 return data.size() == row ? "" : data.get(row);
085 }
086
087 @Override
088 public void setValueAt(Object o, int row, int column) {
089 String s = (String)o;
090 if(row == data.size()) {
091 data.add(s);
092 fireTableRowsInserted(row+1, row+1);
093 } else {
094 data.set(row, s);
095 }
096 fireTableCellUpdated(row, column);
097 }
098
099 @Override
100 public boolean isCellEditable(int row, int column) {
101 return true;
102 }
103 }
104
105 }