source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/advanced/MapListEditor.java@ 18224

Last change on this file since 18224 was 18224, checked in by Don-vip, 3 years ago

fix #21320 - see #20258 - fix IOOBE in MapListEditor

  • Property svn:eol-style set to native
File size: 5.0 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.preferences.advanced;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.util.ArrayList;
7import java.util.Arrays;
8import java.util.Collections;
9import java.util.LinkedHashMap;
10import java.util.List;
11import java.util.Map;
12import java.util.Map.Entry;
13
14import javax.swing.JComponent;
15import javax.swing.JPanel;
16import javax.swing.table.AbstractTableModel;
17
18import org.openstreetmap.josm.spi.preferences.MapListSetting;
19
20/**
21 * Editor for List of Maps preference entries.
22 * @since 4634
23 */
24public class MapListEditor extends AbstractTableListEditor<Map<String, String>> {
25
26 private final transient List<List<String>> dataKeys;
27 private final transient List<List<String>> dataValues;
28 private final transient List<String> dataLabels;
29
30 /**
31 * Constructs a new {@code MapListEditor}.
32 * @param gui The parent component
33 * @param entry preference entry
34 * @param setting list of maps setting
35 */
36 public MapListEditor(JComponent gui, PrefEntry entry, MapListSetting setting) {
37 super(gui, tr("Change list of maps setting"), entry);
38 List<Map<String, String>> orig = setting.getValue();
39
40 dataKeys = new ArrayList<>();
41 dataValues = new ArrayList<>();
42 dataLabels = new ArrayList<>();
43 if (orig != null) {
44 int index = 0;
45 for (Map<String, String> m : orig) {
46 List<String> keys = new ArrayList<>();
47 List<String> values = new ArrayList<>();
48 for (Entry<String, String> e : m.entrySet()) {
49 keys.add(e.getKey());
50 values.add(e.getValue());
51 }
52 dataKeys.add(keys);
53 dataValues.add(values);
54 dataLabels.add(m.getOrDefault("name", tr("Entry {0}", index + 1)));
55 index++;
56 }
57 }
58 }
59
60 @Override
61 public List<Map<String, String>> getData() {
62 List<Map<String, String>> data = new ArrayList<>();
63 for (int i = 0; i < dataKeys.size(); ++i) {
64 Map<String, String> m = new LinkedHashMap<>();
65 for (int j = 0; j < dataKeys.get(i).size(); ++j) {
66 m.put(dataKeys.get(i).get(j), dataValues.get(i).get(j));
67 }
68 data.add(m);
69 }
70 return data;
71 }
72
73 @Override
74 protected final JPanel build() {
75 table.getTableHeader().getColumnModel().getColumn(0).setHeaderValue(tr("Key"));
76 table.getTableHeader().getColumnModel().getColumn(1).setHeaderValue(tr("Value"));
77 return super.build();
78 }
79
80 private class EntryListModel extends AbstractEntryListModel {
81
82 @Override
83 public String getElementAt(int index) {
84 return dataLabels.get(index);
85 }
86
87 @Override
88 public int getSize() {
89 return dataKeys.size();
90 }
91
92 @Override
93 public void add() {
94 dataKeys.add(new ArrayList<String>());
95 dataValues.add(new ArrayList<String>());
96 dataLabels.add("");
97 fireIntervalAdded(this, getSize() - 1, getSize() - 1);
98 }
99
100 @Override
101 public void remove(int idx) {
102 dataKeys.remove(idx);
103 dataValues.remove(idx);
104 dataLabels.remove(idx);
105 fireIntervalRemoved(this, idx, idx);
106 }
107 }
108
109 private class MapTableModel extends AbstractTableModel {
110
111 private List<List<String>> data() {
112 return entryIdx == null ? Collections.<List<String>>emptyList() : Arrays.asList(dataKeys.get(entryIdx), dataValues.get(entryIdx));
113 }
114
115 private int size() {
116 return entryIdx == null ? 0 : dataKeys.get(entryIdx).size();
117 }
118
119 @Override
120 public int getRowCount() {
121 return entryIdx == null ? 0 : size() + 1;
122 }
123
124 @Override
125 public int getColumnCount() {
126 return 2;
127 }
128
129 @Override
130 public String getColumnName(int column) {
131 return column == 0 ? tr("Key") : tr("Value");
132 }
133
134 @Override
135 public Object getValueAt(int row, int column) {
136 return size() == row ? "" : data().get(column).get(row);
137 }
138
139 @Override
140 public void setValueAt(Object o, int row, int column) {
141 String s = (String) o;
142 if (row == size()) {
143 data().get(0).add("");
144 data().get(1).add("");
145 data().get(column).set(row, s);
146 fireTableRowsInserted(row+1, row+1);
147 } else {
148 data().get(column).set(row, s);
149 fireTableCellUpdated(row, column);
150 }
151 }
152
153 @Override
154 public boolean isCellEditable(int row, int column) {
155 return true;
156 }
157 }
158
159 @Override
160 protected final AbstractEntryListModel newEntryListModel() {
161 return new EntryListModel();
162 }
163
164 @Override
165 protected final AbstractTableModel newTableModel() {
166 return new MapTableModel();
167 }
168}
Note: See TracBrowser for help on using the repository browser.