Index: /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java	(revision 1575)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java	(revision 1576)
@@ -12,4 +12,5 @@
 import java.awt.event.MouseEvent;
 import java.util.Map;
+import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.Map.Entry;
@@ -23,4 +24,6 @@
 import javax.swing.JTable;
 import javax.swing.JTextField;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;
@@ -34,8 +37,33 @@
     private Map<String,String> defaults;
     private DefaultTableModel model;
+    protected Map<String, String> data;
+    protected JTextField txtFilter;
 
     public void addGui(final PreferenceDialog gui) {
         JPanel p = gui.createPreferenceTab("advanced", tr("Advanced Preferences"),
                 tr("Setting Preference entries directly. Use with caution!"), false);
+        
+        txtFilter = new JTextField();
+        JLabel lbFilter = new JLabel(tr("Search: "));
+        lbFilter.setLabelFor(txtFilter);
+        p.add(lbFilter);
+        p.add(txtFilter, GBC.eol().fill(GBC.HORIZONTAL));
+        txtFilter.getDocument().addDocumentListener(new DocumentListener(){
+            public void changedUpdate(DocumentEvent e) {
+                action();
+            }
+            
+            public void insertUpdate(DocumentEvent e) {
+                action();
+            }
+            
+            public void removeUpdate(DocumentEvent e) {
+                action();
+            }
+            
+            private void action() {
+                dataToModel();
+            }
+        });
 
         model = new DefaultTableModel(new String[]{tr("Key"), tr("Value")},0) {
@@ -73,4 +101,41 @@
         orig.remove("osm-server.password");
         defaults.remove("osm-server.password");
+        prepareData();
+        dataToModel();
+
+        JButton add = new JButton(tr("Add"));
+        p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
+        p.add(add, GBC.std().insets(0,5,0,0));
+        add.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                addPreference(gui);
+            }
+        });
+
+        JButton edit = new JButton(tr("Edit"));
+        p.add(edit, GBC.std().insets(5,5,5,0));
+        edit.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                editPreference(gui, list);
+            }
+        });
+
+        JButton delete = new JButton(tr("Delete"));
+        p.add(delete, GBC.std().insets(0,5,0,0));
+        delete.addActionListener(new ActionListener(){
+            public void actionPerformed(ActionEvent e) {
+                removePreference(gui, list);
+            }
+        });
+
+        list.addMouseListener(new MouseAdapter(){
+            @Override public void mouseClicked(MouseEvent e) {
+                if (e.getClickCount() == 2)
+                    editPreference(gui, list);
+            }
+        });
+    }
+
+    private void prepareData() {
         TreeSet<String> ts = new TreeSet<String>(orig.keySet());
         for (String s : defaults.keySet())
@@ -79,65 +144,31 @@
                 ts.add(s);
         }
-
+        data = new TreeMap<String, String>();
         for (String s : ts)
         {
             String val = Main.pref.get(s);
             if(val == null) val = "";
-            model.addRow(new String[]{s, val});
-        }
-
-        JButton add = new JButton(tr("Add"));
-        p.add(Box.createHorizontalGlue(), GBC.std().fill(GBC.HORIZONTAL));
-        p.add(add, GBC.std().insets(0,5,0,0));
-        add.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                JPanel p = new JPanel(new GridBagLayout());
-                p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
-                JTextField key = new JTextField(10);
-                JTextField value = new JTextField(10);
-                p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
-                p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
-                p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
-                int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter a new key/value pair"), JOptionPane.OK_CANCEL_OPTION);
-                if (answer == JOptionPane.OK_OPTION)
-                    model.addRow(new String[]{key.getText(), value.getText()});
-            }
-        });
-
-        JButton edit = new JButton(tr("Edit"));
-        p.add(edit, GBC.std().insets(5,5,5,0));
-        edit.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                edit(gui, list);
-            }
-        });
-
-        JButton delete = new JButton(tr("Delete"));
-        p.add(delete, GBC.std().insets(0,5,0,0));
-        delete.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                if (list.getSelectedRowCount() == 0) {
-                    JOptionPane.showMessageDialog(gui, tr("Please select the row to delete."));
-                    return;
-                }
-                for(int row: list.getSelectedRows())
-                    model.setValueAt("", row, 1);
-            }
-        });
-
-        list.addMouseListener(new MouseAdapter(){
-            @Override public void mouseClicked(MouseEvent e) {
-                if (e.getClickCount() == 2)
-                    edit(gui, list);
-            }
-        });
+            data.put(s, val);
+        }
+    }
+    
+    private void dataToModel() {
+        while (model.getRowCount() > 0) {
+            model.removeRow(0);
+        }
+        for (String prefKey : data.keySet()) {
+            String prefValue = data.get(prefKey);
+            if (prefKey.contains(txtFilter.getText()) ||
+                    prefValue.contains(txtFilter.getText())) {
+                model.addRow(new String[] {prefKey, prefValue});
+            }
+        }
     }
 
     public boolean ok() {
-        for (int i = 0; i < model.getRowCount(); ++i) {
-            String value = model.getValueAt(i,1).toString();
+        for (String key : data.keySet()) {
+            String value = data.get(key);
             if(value.length() != 0)
             {
-                String key = model.getValueAt(i,0).toString();
                 String origValue = orig.get(key);
                 if (origValue == null || !origValue.equals(value))
@@ -152,5 +183,5 @@
 
 
-    private void edit(final PreferenceDialog gui, final JTable list) {
+    private void editPreference(final PreferenceDialog gui, final JTable list) {
         if (list.getSelectedRowCount() != 1) {
             JOptionPane.showMessageDialog(gui, tr("Please select the row to edit."));
@@ -158,6 +189,34 @@
         }
         String v = JOptionPane.showInputDialog(tr("New value for {0}", model.getValueAt(list.getSelectedRow(), 0)), model.getValueAt(list.getSelectedRow(), 1));
-        if (v != null)
+        if (v != null) {
+            data.put((String) model.getValueAt(list.getSelectedRow(), 0), v);
             model.setValueAt(v, list.getSelectedRow(), 1);
+        }
+    }
+
+    private void removePreference(final PreferenceDialog gui, final JTable list) {
+        if (list.getSelectedRowCount() == 0) {
+            JOptionPane.showMessageDialog(gui, tr("Please select the row to delete."));
+            return;
+        }
+        for(int row: list.getSelectedRows()) {
+            data.put((String) model.getValueAt(row, 0), "");
+            model.setValueAt("", row, 1);
+        }
+    }
+
+    private void addPreference(final PreferenceDialog gui) {
+        JPanel p = new JPanel(new GridBagLayout());
+        p.add(new JLabel(tr("Key")), GBC.std().insets(0,0,5,0));
+        JTextField key = new JTextField(10);
+        JTextField value = new JTextField(10);
+        p.add(key, GBC.eop().insets(5,0,0,0).fill(GBC.HORIZONTAL));
+        p.add(new JLabel(tr("Value")), GBC.std().insets(0,0,5,0));
+        p.add(value, GBC.eol().insets(5,0,0,0).fill(GBC.HORIZONTAL));
+        int answer = JOptionPane.showConfirmDialog(gui, p, tr("Enter a new key/value pair"), JOptionPane.OK_CANCEL_OPTION);
+        if (answer == JOptionPane.OK_OPTION) {
+            data.put(key.getText(), value.getText());
+            model.addRow(new String[]{key.getText(), value.getText()});
+        }
     }
 }
