001// License: GPL. For details, see LICENSE file. 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 027/** 028 * Editor for List preference entries. 029 */ 030public class ListEditor extends ExtendedDialog { 031 032 private List<String> data; 033 private final transient PrefEntry entry; 034 035 /** 036 * Constructs a new {@code ListEditor}. 037 * @param gui The parent component 038 * @param entry preference entry 039 * @param setting list setting 040 */ 041 public ListEditor(final JComponent gui, PrefEntry entry, ListSetting setting) { 042 super(gui, tr("Change list setting"), new String[] {tr("OK"), tr("Cancel")}); 043 this.entry = entry; 044 List<String> orig = setting.getValue(); 045 if (orig != null) { 046 data = new ArrayList<>(orig); 047 } else { 048 data = new ArrayList<>(); 049 } 050 setButtonIcons(new String[] {"ok.png", "cancel.png"}); 051 setRememberWindowGeometry(getClass().getName() + ".geometry", WindowGeometry.centerInWindow(gui, new Dimension(300, 350))); 052 setContent(build(), false); 053 } 054 055 /** 056 * Returns the list of values. 057 * @return The list of values. 058 */ 059 public List<String> getData() { 060 return new ArrayList<>(Utils.filter(data, new Predicate<String>() { 061 @Override 062 public boolean evaluate(String object) { 063 return object != null && !object.isEmpty(); 064 } 065 })); 066 } 067 068 protected final JPanel build() { 069 JPanel p = new JPanel(new GridBagLayout()); 070 p.add(new JLabel(tr("Key: {0}", entry.getKey())), GBC.eol().insets(0, 0, 5, 0)); 071 ListSettingTableModel listModel = new ListSettingTableModel(); 072 JTable table = new JTable(listModel); 073 table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 074 table.setTableHeader(null); 075 076 DefaultCellEditor editor = new DefaultCellEditor(new JosmTextField()); 077 editor.setClickCountToStart(1); 078 table.setDefaultEditor(table.getColumnClass(0), editor); 079 080 JScrollPane pane = new JScrollPane(table); 081 p.add(pane, GBC.eol().insets(5, 10, 0, 0).fill()); 082 return p; 083 } 084 085 class ListSettingTableModel extends AbstractTableModel { 086 087 public List<String> getData() { 088 return data; 089 } 090 091 @Override 092 public int getRowCount() { 093 return data.size() + 1; 094 } 095 096 @Override 097 public int getColumnCount() { 098 return 1; 099 } 100 101 @Override 102 public Object getValueAt(int row, int column) { 103 return data.size() == row ? "" : data.get(row); 104 } 105 106 @Override 107 public void setValueAt(Object o, int row, int column) { 108 String s = (String) o; 109 if (row == data.size()) { 110 data.add(s); 111 fireTableRowsInserted(row+1, row+1); 112 } else { 113 data.set(row, s); 114 } 115 fireTableCellUpdated(row, column); 116 } 117 118 @Override 119 public boolean isCellEditable(int row, int column) { 120 return true; 121 } 122 } 123}