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

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

replaced JOptionPane.show* by OptionPaneUtil.show*
ExtendeDialog now always on top, too

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