Index: trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1605)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1606)
@@ -9,4 +9,6 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.Cursor;
+import java.awt.Dimension;
 import java.awt.Font;
 import java.awt.GridBagLayout;
@@ -19,5 +21,5 @@
 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;
@@ -60,5 +62,4 @@
 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;
@@ -138,5 +139,7 @@
         objKey=key;
 
-        String msg = "<html>"+trn("This will change up to {0} object.", "This will change up to {0} objects.", sel.size(), sel.size())+"<br><br>("+tr("An empty value deletes the key.", key)+")</html>";
+        String msg = "<html>"+trn("This will change up to {0} object.",
+        "This will change up to {0} objects.", sel.size(), sel.size())
+        +"<br><br>("+tr("An empty value deletes the key.", key)+")</html>";
 
         JPanel panel = new JPanel(new BorderLayout());
@@ -159,6 +162,8 @@
         final AutoCompleteComboBox values = new AutoCompleteComboBox();
         values.setRenderer(new DefaultListCellRenderer() {
-            @Override public Component getListCellRendererComponent(JList list,  Object value, int index, boolean isSelected,  boolean cellHasFocus) {
-                Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+            @Override public Component getListCellRendererComponent(JList list,
+            Object value, int index, boolean isSelected,  boolean cellHasFocus){
+                Component c = super.getListCellRendererComponent(list, value,
+                index, isSelected, cellHasFocus);
                 if (c instanceof JLabel) {
                     String str = null;
@@ -257,5 +262,8 @@
                 commands.add(new ChangePropertyCommand(sel, newkey, value));
             }
-            Main.main.undoRedo.add(new SequenceCommand(trn("Change properties of up to {0} object", "Change properties of up to {0} objects", sel.size(), sel.size()), commands));
+            Main.main.undoRedo.add(new SequenceCommand(
+            trn("Change properties of up to {0} object",
+            "Change properties of up to {0} objects", sel.size(), sel.size()),
+            commands));
         }
 
@@ -279,5 +287,6 @@
      * @param values
      */
-    private void updateListData(String key, final TreeMap<String, TreeSet<String>> allData, final AutoCompleteComboBox values) {
+    private void updateListData(String key, final TreeMap<String, TreeSet<String>> allData,
+    final AutoCompleteComboBox values) {
         Collection<String> newItems;
         if (allData.containsKey(key)) {
@@ -309,6 +318,7 @@
 
         JPanel p = new JPanel(new BorderLayout());
-        p.add(new JLabel("<html>"+trn("This will change up to {0} object.","This will change up to {0} objects.", sel.size(),sel.size())+"<br><br>"+tr("Please select a key")),
-                BorderLayout.NORTH);
+        p.add(new JLabel("<html>"+trn("This will change up to {0} object.",
+        "This will change up to {0} objects.", sel.size(),sel.size())
+        +"<br><br>"+tr("Please select a key")), BorderLayout.NORTH);
         final TreeMap<String, TreeSet<String>> allData = createAutoCompletionInfo(false);
         final AutoCompleteComboBox keys = new AutoCompleteComboBox();
@@ -352,5 +362,6 @@
      * @param values
      */
-    private void addFocusAdapter(final int row, final TreeMap<String, TreeSet<String>> allData,final AutoCompleteComboBox keys, final AutoCompleteComboBox values) {
+    private void addFocusAdapter(final int row, final TreeMap<String, TreeSet<String>> allData,
+    final AutoCompleteComboBox keys, final AutoCompleteComboBox values) {
         // get the combo box' editor component
         JTextComponent editor = (JTextComponent)values.getEditor()
@@ -442,7 +453,8 @@
     private final SideButton btnEdit;
     private final SideButton btnDel;
-    private final JMultilineLabel presets = new JMultilineLabel("");
-
-    private final JLabel selectSth = new JLabel("<html><p>" + tr("Please select the objects you want to change properties for.") + "</p></html>");
+    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>");
 
     /**
@@ -459,5 +471,6 @@
 
         propertyTable.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer(){
-            @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+            @Override public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int column) {
                 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
                 if (c instanceof JLabel) {
@@ -489,5 +502,6 @@
 
         membershipTable.getColumnModel().getColumn(0).setCellRenderer(new DefaultTableCellRenderer() {
-            @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+            @Override public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int column) {
                 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
                 if (c instanceof JLabel) {
@@ -500,5 +514,6 @@
 
         membershipTable.getColumnModel().getColumn(1).setCellRenderer(new DefaultTableCellRenderer() {
-            @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+            @Override public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int column) {
                 Component c = super.getTableCellRendererComponent(table, value, isSelected, false, row, column);
                 if (c instanceof JLabel) {
@@ -525,4 +540,5 @@
         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));
@@ -530,5 +546,4 @@
         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();
@@ -540,5 +555,5 @@
 
         selectSth.setPreferredSize(scrollPane.getSize());
-        presets.setPreferredSize(scrollPane.getSize());
+        presets.setSize(scrollPane.getSize());
 
         JPanel buttonPanel = new JPanel(new GridLayout(1,3));
@@ -629,48 +644,82 @@
     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);
-                }
-            }
-        }
-        String t = "";
-        for(TaggingPreset tp : p)
-        {
-            if(t.length() > 0)
-                t += "\n";
-            t += tp.getName();
-        }
-        presets.setText(t);
-        presets.setVisible(t.length() > 0);
+                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));
+            }
+        }
+
+        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);
     }
 
@@ -746,4 +795,6 @@
         }
 
+        checkPresets(nodes, ways, relations, closedways);
+
         membershipTable.getTableHeader().setVisible(membershipData.getRowCount() > 0);
         membershipTable.setVisible(membershipData.getRowCount() > 0);
@@ -761,6 +812,4 @@
         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}",
