Index: src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1594)
+++ src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(working copy)
@@ -8,6 +8,8 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
@@ -18,7 +20,7 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.lang.String;
+import java.awt.event.MouseListener;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -59,7 +61,6 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.NameVisitor;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.JMultilineLabel;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.preferences.TaggingPresetPreference;
@@ -440,7 +441,7 @@
     private final SideButton btnAdd;
     private final SideButton btnEdit;
     private final SideButton btnDel;
-    private final JMultilineLabel presets = new JMultilineLabel("");
+    private final JPanel presets = new JPanel(new GridBagLayout());
 
     private final JLabel selectSth = new JLabel("<html><p>" + tr("Please select the objects you want to change properties for.") + "</p></html>");
 
@@ -519,16 +520,17 @@
                 return c;
             }
         });
+       
 
         // combine both tables and wrap them in a scrollPane
         JPanel bothTables = new JPanel();
         bothTables.setLayout(new GridBagLayout());
+        bothTables.add(presets, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 2, 5, 2));
         bothTables.add(selectSth, GBC.eol().fill().insets(10, 10, 10, 10));
         bothTables.add(propertyTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
         bothTables.add(propertyTable, GBC.eol().fill(GBC.BOTH));
         bothTables.add(membershipTable.getTableHeader(), GBC.eol().fill(GBC.HORIZONTAL));
         bothTables.add(membershipTable, GBC.eol().fill(GBC.BOTH));
-        bothTables.add(presets, GBC.eol().fill().insets(5, 2, 5, 2));
 
         DblClickWatch dblClickWatch = new DblClickWatch();
         propertyTable.addMouseListener(dblClickWatch);
@@ -538,7 +540,7 @@
         add(scrollPane, BorderLayout.CENTER);
 
         selectSth.setPreferredSize(scrollPane.getSize());
-        presets.setPreferredSize(scrollPane.getSize());
+        presets.setSize(scrollPane.getSize());
 
         JPanel buttonPanel = new JPanel(new GridLayout(1,3));
         ActionListener buttonAction = new ActionListener(){
@@ -627,50 +629,84 @@
 
     private void checkPresets(int nodes, int ways, int relations, int closedways)
     {
+        /**
+         * Small helper class that manages the highlighting of the label on hover as well as opening
+         * the corresponding preset when clicked
+         */
+        class PresetLabelML implements MouseListener {
+            JLabel label;
+            Font bold;
+            Font normal;
+            TaggingPreset tag;
+            PresetLabelML(JLabel lbl, TaggingPreset t) {
+                super();
+                label = lbl;
+                lbl.setCursor(new Cursor(Cursor.HAND_CURSOR));
+                normal = label.getFont();
+                bold = normal.deriveFont(normal.getStyle() ^ Font.BOLD);
+                tag = t;
+            }
+            public void mouseClicked(MouseEvent arg0) {
+                tag.actionPerformed(null);
+            }
+            public void mouseEntered(MouseEvent arg0) {
+                label.setFont(bold);
+            }            
+            public void mouseExited(MouseEvent arg0) {
+                label.setFont(normal);
+            }
+            public void mousePressed(MouseEvent arg0) {}            
+            public void mouseReleased(MouseEvent arg0) {}
+        }
+        
         LinkedList<TaggingPreset> p = new LinkedList<TaggingPreset>();
+        presets.removeAll();
         int total = nodes+ways+relations+closedways;
-        if(total != 0)
-        {
-            for(TaggingPreset t : TaggingPresetPreference.taggingPresets)
+        if(total == 0) {
+            presets.setVisible(false);
+            return;
+        }
+        
+        for(TaggingPreset t : TaggingPresetPreference.taggingPresets) {
+            if(t.types == null || !((relations > 0 && !t.types.contains("relation")) &&
+            (nodes > 0 && !t.types.contains("node")) &&
+            (ways+closedways > 0 && !t.types.contains("way")) &&
+            (closedways > 0 && !t.types.contains("closedway"))))
             {
-                if(t.types == null || !((relations > 0 && !t.types.contains("relation")) &&
-                (nodes > 0 && !t.types.contains("node")) &&
-                (ways+closedways > 0 && !t.types.contains("way")) &&
-                (closedways > 0 && !t.types.contains("closedway"))))
-                {
-                    int found = 0;
-                    for(TaggingPreset.Item i : t.data)
-                    {
-                        if(i instanceof TaggingPreset.Key)
-                        {
-                            String val = ((TaggingPreset.Key)i).value;
-                            String key = ((TaggingPreset.Key)i).key;
-                            // we subtract 100 if not found and add 1 if found
-                            found -= 100;
-                            if(valueCount.containsKey(key))
-                            {
-                                Map<String, Integer> v = valueCount.get(key);
-                                if(v.size() == 1 && v.containsKey(val) && v.get(val) == total)
-                                {
-                                    found += 101;
-                                }
-                            }
-                        }
-                    }
-                    if(found > 0)
-                        p.add(t);
+                int found = 0;
+                for(TaggingPreset.Item i : t.data) {
+                    if(!(i instanceof TaggingPreset.Key))
+                        continue;
+                    String val = ((TaggingPreset.Key)i).value;
+                    String key = ((TaggingPreset.Key)i).key;
+                    // we subtract 100 if not found and add 1 if found
+                    found -= 100;
+                    if(!valueCount.containsKey(key))
+                        continue;
+
+                    Map<String, Integer> v = valueCount.get(key);
+                    if(v.size() == 1 && v.containsKey(val) && v.get(val) == total)
+                        found += 101;
                 }
+                
+                if(found <= 0)
+                    continue;
+                
+                JLabel lbl = new JLabel(t.getName());
+                lbl.addMouseListener(new PresetLabelML(lbl, t));
+                presets.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
             }
         }
-        String t = "";
-        for(TaggingPreset tp : p)
-        {
-            if(t.length() > 0)
-                t += "\n";
-            t += tp.getName();
-        }
-        presets.setText(t);
-        presets.setVisible(t.length() > 0);
+        
+        if(presets.getComponentCount() > 0) {
+            presets.setVisible(true);
+            // This ensures the presets are exactly as high as needed.
+            int height = presets.getComponentCount() * presets.getComponent(0).getHeight();
+            Dimension size = new Dimension(presets.getWidth(), height);
+            presets.setMaximumSize(size);
+            presets.setMinimumSize(size);        
+        } else
+            presets.setVisible(false);
     }
 
     public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
@@ -743,6 +779,8 @@
         for (Entry<Relation, Collection<RelationMember>> e : roles.entrySet()) {
             membershipData.addRow(new Object[]{e.getKey(), e.getValue()});
         }
+        
+        checkPresets(nodes, ways, relations, closedways);
 
         membershipTable.getTableHeader().setVisible(membershipData.getRowCount() > 0);
         membershipTable.setVisible(membershipData.getRowCount() > 0);
@@ -759,8 +797,6 @@
         if(hasTags) propertyTable.changeSelection(0, 0, false, false);
         else if(hasMemberships) membershipTable.changeSelection(0, 0, false, false);
 
-        checkPresets(nodes, ways, relations, closedways);
-
         if(propertyData.getRowCount() != 0 || membershipData.getRowCount() != 0) {
             setTitle(tr("Properties: {0} / Memberships: {1}",
                 propertyData.getRowCount(), membershipData.getRowCount()), true);
