001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.tagging.presets.items;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.event.MouseAdapter;
007import java.awt.event.MouseEvent;
008import java.util.Collection;
009import java.util.List;
010import java.util.Optional;
011
012import javax.swing.JLabel;
013import javax.swing.JPanel;
014
015import org.openstreetmap.josm.data.osm.OsmPrimitive;
016import org.openstreetmap.josm.data.osm.Tag;
017import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
018import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
019import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetLabel;
020import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
021import org.openstreetmap.josm.tools.GBC;
022
023/**
024 * Adds a link to another preset.
025 * @since 8863
026 */
027public class PresetLink extends TextItem {
028
029    static final class TaggingPresetMouseAdapter extends MouseAdapter {
030        private final TaggingPreset t;
031        private final Collection<OsmPrimitive> sel;
032
033        TaggingPresetMouseAdapter(TaggingPreset t, Collection<OsmPrimitive> sel) {
034            this.t = t;
035            this.sel = sel;
036        }
037
038        @Override
039        public void mouseClicked(MouseEvent e) {
040            t.showAndApply(sel);
041        }
042    }
043
044    /** The exact name of the preset to link to. Required. */
045    public String preset_name = ""; // NOSONAR
046
047    /**
048     * Creates a label to be inserted aboive this link
049     * @return a label
050     */
051    public JLabel createLabel() {
052        initializeLocaleText(tr("Edit also …"));
053        return new JLabel(locale_text);
054    }
055
056    @Override
057    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
058        final String presetName = preset_name;
059        Optional<TaggingPreset> found = TaggingPresets.getTaggingPresets().stream().filter(preset -> presetName.equals(preset.name)).findFirst();
060        if (found.isPresent()) {
061            TaggingPreset t = found.get();
062            JLabel lbl = new TaggingPresetLabel(t);
063            lbl.addMouseListener(new TaggingPresetMouseAdapter(t, support.getSelected()));
064            lbl.applyComponentOrientation(support.getDefaultComponentOrientation());
065            p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
066        }
067        return false;
068    }
069
070    @Override
071    public void addCommands(List<Tag> changedTags) {
072        // Do nothing
073    }
074
075    @Override
076    public String toString() {
077        return "PresetLink [preset_name=" + preset_name + ']';
078    }
079}