001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.dialogs.properties; 003 004import org.openstreetmap.josm.data.osm.OsmPrimitive; 005import org.openstreetmap.josm.gui.tagging.PresetHandler; 006import org.openstreetmap.josm.gui.tagging.TaggingPreset; 007import org.openstreetmap.josm.gui.tagging.TaggingPresetType; 008import org.openstreetmap.josm.gui.tagging.PresetLabel; 009import org.openstreetmap.josm.tools.GBC; 010 011import javax.swing.JLabel; 012import javax.swing.JPanel; 013import java.awt.Dimension; 014import java.awt.GridBagLayout; 015import java.awt.event.MouseAdapter; 016import java.awt.event.MouseEvent; 017import java.util.Collection; 018import java.util.Map; 019 020/** 021 * A list of matching presets for a set of tags. 022 */ 023public class PresetListPanel extends JPanel { 024 025 /** 026 * Constructs a new {@code PresetListPanel}. 027 */ 028 public PresetListPanel() { 029 super(new GridBagLayout()); 030 } 031 032 /** 033 * Updates the preset list based on the {@code tags} and {@code types}, 034 * and associates an interaction with (matching) presets via {@code presetHandler}. 035 */ 036 public void updatePresets(final Collection<TaggingPresetType> types, final Map<String, String> tags, final PresetHandler presetHandler) { 037 038 removeAll(); 039 if (types.isEmpty()) { 040 setVisible(false); 041 return; 042 } 043 044 for (final TaggingPreset t : TaggingPreset.getMatchingPresets(types, tags, true)) { 045 final JLabel lbl = new PresetLabel(t); 046 lbl.addMouseListener(new MouseAdapter() { 047 @Override 048 public void mouseClicked(MouseEvent e) { 049 Collection<OsmPrimitive> selection = t.createSelection(presetHandler.getSelection()); 050 if (selection == null || selection.isEmpty()) 051 return; 052 int answer = t.showDialog(selection, false); 053 054 if (answer == TaggingPreset.DIALOG_ANSWER_APPLY) { 055 presetHandler.updateTags(t.getChangedTags()); 056 } 057 } 058 }); 059 add(lbl, GBC.eol().fill(GBC.HORIZONTAL)); 060 } 061 062 if (getComponentCount() > 0) { 063 setVisible(true); 064 // This ensures the presets are exactly as high as needed. 065 int height = getComponentCount() * getComponent(0).getHeight(); 066 Dimension size = new Dimension(getWidth(), height); 067 setMaximumSize(size); 068 setMinimumSize(size); 069 } else { 070 setVisible(false); 071 } 072 } 073}