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

Last change on this file since 1673 was 1673, checked in by stoecker, 15 years ago

fix #2738 - patch by avar - improve prefs search a bit

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