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    }