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.GridBagLayout; 007import java.util.ArrayList; 008import java.util.List; 009 010import javax.swing.DefaultCellEditor; 011import javax.swing.JComponent; 012import javax.swing.JLabel; 013import javax.swing.JPanel; 014import javax.swing.JScrollPane; 015import javax.swing.JTable; 016import javax.swing.table.AbstractTableModel; 017 018import org.openstreetmap.josm.gui.util.TableHelper; 019import org.openstreetmap.josm.gui.widgets.JosmTextField; 020import org.openstreetmap.josm.spi.preferences.ListSetting; 021import org.openstreetmap.josm.tools.GBC; 022import org.openstreetmap.josm.tools.SubclassFilteredCollection; 023import org.openstreetmap.josm.tools.Utils; 024 025/** 026 * Editor for List preference entries. 027 * @since 4634 028 */ 029public class ListEditor extends AbstractListEditor<String> { 030 031 private final ListSettingTableModel model; 032 033 /** 034 * Constructs a new {@code ListEditor}. 035 * @param gui The parent component 036 * @param entry preference entry 037 * @param setting list setting 038 */ 039 public ListEditor(final JComponent gui, PrefEntry entry, ListSetting setting) { 040 super(gui, tr("Change list setting"), entry); 041 model = new ListSettingTableModel(setting.getValue()); 042 setContent(build(), false); 043 } 044 045 @Override 046 public List<String> getData() { 047 return new ArrayList<>(SubclassFilteredCollection.filter(model.getData(), object -> !Utils.isEmpty(object))); 048 } 049 050 @Override 051 protected final JPanel build() { 052 JPanel p = new JPanel(new GridBagLayout()); 053 p.add(new JLabel(tr("Key: {0}", entry.getKey())), GBC.eol().insets(0, 0, 5, 0)); 054 JTable table = new JTable(model); 055 TableHelper.setFont(table, getClass()); 056 table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 057 table.setTableHeader(null); 058 059 DefaultCellEditor editor = new DefaultCellEditor(new JosmTextField()); 060 editor.setClickCountToStart(1); 061 table.setDefaultEditor(table.getColumnClass(0), editor); 062 063 JScrollPane pane = new JScrollPane(table); 064 p.add(pane, GBC.eol().insets(5, 10, 0, 0).fill()); 065 return p; 066 } 067 068 static class ListSettingTableModel extends AbstractTableModel { 069 070 private final List<String> data; 071 072 ListSettingTableModel(List<String> orig) { 073 if (orig != null) { 074 data = new ArrayList<>(orig); 075 } else { 076 data = new ArrayList<>(); 077 } 078 } 079 080 public List<String> getData() { 081 return data; 082 } 083 084 @Override 085 public int getRowCount() { 086 return data.size() + 1; 087 } 088 089 @Override 090 public int getColumnCount() { 091 return 1; 092 } 093 094 @Override 095 public Object getValueAt(int row, int column) { 096 return data.size() == row ? "" : data.get(row); 097 } 098 099 @Override 100 public void setValueAt(Object o, int row, int column) { 101 String s = (String) o; 102 if (row == data.size()) { 103 data.add(s); 104 fireTableRowsInserted(row+1, row+1); 105 } else { 106 data.set(row, s); 107 } 108 fireTableCellUpdated(row, column); 109 } 110 111 @Override 112 public boolean isCellEditable(int row, int column) { 113 return true; 114 } 115 } 116}