source: josm/trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java@ 2400

Last change on this file since 2400 was 2017, checked in by Gubaer, 15 years ago

removed OptionPaneUtil
cleanup of deprecated Layer API
cleanup of deprecated APIs in OsmPrimitive and Way
cleanup of imports

  • Property svn:eol-style set to native
File size: 9.4 KB
Line 
1// License: GPL. Copyright 2007 by Immanuel Scholz and others
2package org.openstreetmap.josm.gui.preferences;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Component;
7import java.awt.Dimension;
8import java.awt.GridBagLayout;
9import java.awt.event.ActionEvent;
10import java.awt.event.ActionListener;
11import java.awt.event.MouseAdapter;
12import java.awt.event.MouseEvent;
13import java.util.Map;
14import java.util.TreeMap;
15import java.util.TreeSet;
16import java.util.Map.Entry;
17
18import javax.swing.Box;
19import javax.swing.JButton;
20import javax.swing.JLabel;
21import javax.swing.JOptionPane;
22import javax.swing.JPanel;
23import javax.swing.JScrollPane;
24import javax.swing.JTable;
25import javax.swing.JTextField;
26import javax.swing.event.DocumentEvent;
27import javax.swing.event.DocumentListener;
28import javax.swing.table.DefaultTableCellRenderer;
29import javax.swing.table.DefaultTableModel;
30
31import org.openstreetmap.josm.Main;
32import org.openstreetmap.josm.tools.GBC;
33
34public class AdvancedPreference implements PreferenceSetting {
35
36 public static class Factory implements PreferenceSettingFactory {
37 public PreferenceSetting createPreferenceSetting() {
38 return new AdvancedPreference();
39 }
40 }
41
42 private Map<String,String> orig;
43 private Map<String,String> defaults;
44 private DefaultTableModel model;
45 protected Map<String, String> data;
46 protected JTextField txtFilter;
47
48 public void addGui(final PreferenceDialog gui) {
49 JPanel p = gui.createPreferenceTab("advanced", tr("Advanced Preferences"),
50 tr("Setting Preference entries directly. Use with caution!"), false);
51
52 txtFilter = new JTextField();
53 JLabel lbFilter = new JLabel(tr("Search: "));
54 lbFilter.setLabelFor(txtFilter);
55 p.add(lbFilter);
56 p.add(txtFilter, GBC.eol().fill(GBC.HORIZONTAL));
57 txtFilter.getDocument().addDocumentListener(new DocumentListener(){
58 public void changedUpdate(DocumentEvent e) {
59 action();
60 }
61
62 public void insertUpdate(DocumentEvent e) {
63 action();
64 }
65
66 public void removeUpdate(DocumentEvent e) {
67 action();
68 }
69
70 private void action() {
71 dataToModel();
72 }
73 });
74
75 model = new DefaultTableModel(new String[]{tr("Key"), tr("Value")},0) {
76 @Override public boolean isCellEditable(int row, int column) {
77 return column != 0;
78 }
79 @Override public void fireTableCellUpdated(int row, int column)
80 {
81 super.fireTableCellUpdated(row, column);
82 if(column == 1)
83 {
84 data.put((String) model.getValueAt(row, 0),
85 (String) model.getValueAt(row, 1));
86 }
87 }
88
89 };
90 DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(){
91 @Override
92 public Component getTableCellRendererComponent(JTable table, Object value,
93 boolean isSelected, boolean hasFocus, int row, int column)
94 {
95 JLabel label=new JLabel();
96 String s = defaults.get(value);
97 if(s != null)
98 {
99 if(s.equals(model.getValueAt(row, 1))) {
100 label.setToolTipText(tr("Current value is default."));
101 } else {
102 label.setToolTipText(tr("Default value is ''{0}''.", s));
103 }
104 } else {
105 label.setToolTipText(tr("Default value currently unknown (setting has not been used yet)."));
106 }
107 label.setText((String)value);
108 return label;
109 }
110 };
111 final JTable list = new JTable(model);
112 list.getColumn(tr("Key")).setCellRenderer(renderer);
113 JScrollPane scroll = new JScrollPane(list);
114 p.add(scroll, GBC.eol().fill(GBC.BOTH));
115 scroll.setPreferredSize(new Dimension(400,200));
116
117 orig = Main.pref.getAllPrefix("");
118 defaults = Main.pref.getDefaults();
119 orig.remove("osm-server.password");
120 defaults.remove("osm-server.password");
121 prepareData();
122 dataToModel();
123
124 JButton add = new JButton(tr("Add"));
125 p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
126 p.add(add, GBC.std().insets(0,5,0,0));
127 add.addActionListener(new ActionListener(){
128 public void actionPerformed(ActionEvent e) {
129 addPreference(gui);
130 }
131 });
132
133 JButton edit = new JButton(tr("Edit"));
134 p.add(edit, GBC.std().insets(5,5,5,0));
135 edit.addActionListener(new ActionListener(){
136 public void actionPerformed(ActionEvent e) {
137 editPreference(gui, list);
138 }
139 });
140
141 JButton delete = new JButton(tr("Delete"));
142 p.add(delete, GBC.std().insets(0,5,0,0));
143 delete.addActionListener(new ActionListener(){
144 public void actionPerformed(ActionEvent e) {
145 removePreference(gui, list);
146 }
147 });
148
149 list.addMouseListener(new MouseAdapter(){
150 @Override public void mouseClicked(MouseEvent e) {
151 if (e.getClickCount() == 2) {
152 editPreference(gui, list);
153 }
154 }
155 });
156 }
157
158 private void prepareData() {
159 TreeSet<String> ts = new TreeSet<String>(orig.keySet());
160 for (String s : defaults.keySet())
161 {
162 if(!ts.contains(s)) {
163 ts.add(s);
164 }
165 }
166 data = new TreeMap<String, String>();
167 for (String s : ts)
168 {
169 String val = Main.pref.get(s);
170 if(val == null) {
171 val = "";
172 }
173 data.put(s, val);
174 }
175 }
176
177 private void dataToModel() {
178 while (model.getRowCount() > 0) {
179 model.removeRow(0);
180 }
181 for (String prefKey : data.keySet()) {
182 String prefValue = data.get(prefKey);
183 String input[] = txtFilter.getText().split("\\s+");
184 boolean canHas = true;
185
186 // Make 'wmsplugin cache' search for e.g. 'cache.wmsplugin'
187 for (String bit : input) {
188 if (!prefKey.contains(bit) && !prefValue.contains(bit)) {
189 canHas = false;
190 }
191 }
192
193 if (canHas) {
194 model.addRow(new String[] {prefKey, prefValue});
195 }
196 }
197 }
198
199 public boolean ok() {
200 for (String key : data.keySet()) {
201 String value = data.get(key);
202 if(value.length() != 0)
203 {
204 String origValue = orig.get(key);
205 if (origValue == null || !origValue.equals(value)) {
206 Main.pref.put(key, value);
207 }
208 orig.remove(key); // processed.
209 }
210 }
211 for (Entry<String, String> e : orig.entrySet()) {
212 Main.pref.put(e.getKey(), null);
213 }
214 return false;
215 }
216
217
218 private void editPreference(final PreferenceDialog gui, final JTable list) {
219 if (list.getSelectedRowCount() != 1) {
220 JOptionPane.showMessageDialog(
221 gui,
222 tr("Please select the row to edit."),
223 tr("Warning"),
224 JOptionPane.WARNING_MESSAGE
225 );
226 return;
227 }
228 String v = (String) JOptionPane.showInputDialog(
229 Main.parent,
230 tr("New value for {0}", model.getValueAt(list.getSelectedRow(), 0)),
231 tr("New value"),
232 JOptionPane.QUESTION_MESSAGE,
233 null,
234 null,
235 model.getValueAt(list.getSelectedRow(), 1)
236 );
237 if (v != null) {
238 data.put((String) model.getValueAt(list.getSelectedRow(), 0), v);
239 model.setValueAt(v, list.getSelectedRow(), 1);
240 }
241 }
242
243 private void removePreference(final PreferenceDialog gui, final JTable list) {
244 if (list.getSelectedRowCount() == 0) {
245 JOptionPane.showMessageDialog(
246 gui,
247 tr("Please select the row to delete."),
248 tr("Warning"),
249 JOptionPane.WARNING_MESSAGE
250 );
251 return;
252 }
253 for(int row: list.getSelectedRows()) {
254 data.put((String) model.getValueAt(row, 0), "");
255 model.setValueAt("", row, 1);
256 }
257 }
258
259 private void addPreference(final PreferenceDialog gui) {
260 JPanel p = new JPanel(new GridBagLayout());
261 p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
262 JTextField key = new JTextField(10);
263 JTextField value = new JTextField(10);
264 p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
265 p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
266 p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
267 int answer = JOptionPane.showConfirmDialog(
268 gui, p,
269 tr("Enter a new key/value pair"),
270 JOptionPane.OK_CANCEL_OPTION,
271 JOptionPane.PLAIN_MESSAGE
272 );
273 if (answer == JOptionPane.OK_OPTION) {
274 data.put(key.getText(), value.getText());
275 model.addRow(new String[]{key.getText(), value.getText()});
276 }
277 }
278}
Note: See TracBrowser for help on using the repository browser.