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