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