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}