commit 5908bdda0af3ec3f2d718560b50ef6e40cbfdb2a
Author: Simon Legner <Simon.Legner@gmail.com>
Date:   2020-01-27 20:51:04 +0100

    autofilter

diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
index a3e6d40aa..27c97dd0b 100644
--- a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
+++ b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
@@ -7,12 +7,15 @@
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
 
+import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
 
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.data.preferences.NamedColorProperty;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.preferences.display.DrawingPreference;
 
 /**
  * A button associated to an auto filter. If clicked twice, the filter is reset.
@@ -62,4 +65,15 @@ protected void paintComponent(Graphics g) {
         g.fillRoundRect(0, 0, getWidth(), getHeight(), 3, 3);
         super.paintComponent(g);
     }
+
+    static AutoFilterButton forOsmKey(String key) {
+        final AutoFilterButton button = new AutoFilterButton(new AutoFilter(key, "", null));
+        button.setAction(new AbstractAction(key) {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                PreferencesAction.forPreferenceSubTab("", "null", DrawingPreference.class).actionPerformed(e);
+            }
+        });
+        return button;
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
index 0b33f328f..5d32de6c7 100644
--- a/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
+++ b/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
@@ -181,9 +181,13 @@ public boolean match(OsmPrimitive osm) {
     }
 
     private synchronized void addNewButtons(NavigableSet<String> values) {
+        if (values.isEmpty()) {
+            return;
+        }
         int i = 0;
         int maxWidth = 16;
-        MapView mapView = MainApplication.getMap().mapView;
+        final AutoFilterButton keyButton = AutoFilterButton.forOsmKey(enabledRule.getKey());
+        addButton(keyButton, "-999", i++);
         for (final String value : values.descendingSet()) {
             CompiledFilter filter = new CompiledFilter(enabledRule.getKey(), value);
             String label = enabledRule.getValueFormatter().apply(value);
@@ -192,14 +196,19 @@ private synchronized void addNewButtons(NavigableSet<String> values) {
             if (autoFilter.equals(currentAutoFilter)) {
                 button.getModel().setPressed(true);
             }
-            buttons.put(value, button);
             maxWidth = Math.max(maxWidth, button.getPreferredSize().width);
-            mapView.add(button).setLocation(3, 60 + 22*i++);
+            addButton(button, value, i++);
         }
         for (AutoFilterButton b : buttons.values()) {
-            b.setSize(maxWidth, 20);
+            b.setSize(b == keyButton ? b.getPreferredSize().width : maxWidth, 20);
         }
-        mapView.validate();
+        MainApplication.getMap().mapView.validate();
+    }
+
+    private void addButton(AutoFilterButton button, String value, int i) {
+        MapView mapView = MainApplication.getMap().mapView;
+        buttons.put(value, button);
+        mapView.add(button).setLocation(3, 60 + 22*i);
     }
 
     private void removeAllButtons() {
