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

Last change on this file since 2535 was 2512, checked in by stoecker, 14 years ago

i18n updated, fixed files to reduce problems when applying patches, fix #4017

  • 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 private void editPreference(final PreferenceDialog gui, final JTable list) {
218 if (list.getSelectedRowCount() != 1) {
219 JOptionPane.showMessageDialog(
220 gui,
221 tr("Please select the row to edit."),
222 tr("Warning"),
223 JOptionPane.WARNING_MESSAGE
224 );
225 return;
226 }
227 String v = (String) JOptionPane.showInputDialog(
228 Main.parent,
229 tr("New value for {0}", model.getValueAt(list.getSelectedRow(), 0)),
230 tr("New value"),
231 JOptionPane.QUESTION_MESSAGE,
232 null,
233 null,
234 model.getValueAt(list.getSelectedRow(), 1)
235 );
236 if (v != null) {
237 data.put((String) model.getValueAt(list.getSelectedRow(), 0), v);
238 model.setValueAt(v, list.getSelectedRow(), 1);
239 }
240 }
241
242 private void removePreference(final PreferenceDialog gui, final JTable list) {
243 if (list.getSelectedRowCount() == 0) {
244 JOptionPane.showMessageDialog(
245 gui,
246 tr("Please select the row to delete."),
247 tr("Warning"),
248 JOptionPane.WARNING_MESSAGE
249 );
250 return;
251 }
252 for(int row: list.getSelectedRows()) {
253 data.put((String) model.getValueAt(row, 0), "");
254 model.setValueAt("", row, 1);
255 }
256 }
257
258 private void addPreference(final PreferenceDialog gui) {
259 JPanel p = new JPanel(new GridBagLayout());
260 p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
261 JTextField key = new JTextField(10);
262 JTextField value = new JTextField(10);
263 p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
264 p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
265 p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
266 int answer = JOptionPane.showConfirmDialog(
267 gui, p,
268 tr("Enter a new key/value pair"),
269 JOptionPane.OK_CANCEL_OPTION,
270 JOptionPane.PLAIN_MESSAGE
271 );
272 if (answer == JOptionPane.OK_OPTION) {
273 data.put(key.getText(), value.getText());
274 model.addRow(new String[]{key.getText(), value.getText()});
275 }
276 }
277}
Note: See TracBrowser for help on using the repository browser.