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 }