001package org.openstreetmap.josm.gui.tagging;
002
003import org.openstreetmap.josm.Main;
004import org.openstreetmap.josm.actions.JosmAction;
005import org.openstreetmap.josm.data.osm.OsmPrimitive;
006import org.openstreetmap.josm.gui.ExtendedDialog;
007import org.openstreetmap.josm.tools.Shortcut;
008import org.openstreetmap.josm.tools.Utils;
009
010import java.awt.event.ActionEvent;
011import java.awt.event.ActionListener;
012import java.awt.event.KeyEvent;
013import java.util.HashSet;
014
015import static org.openstreetmap.josm.tools.I18n.tr;
016
017/**
018 * A dialog that allows to select a preset and then selects all matching OSM objects.
019 * @see org.openstreetmap.josm.gui.tagging.TaggingPresetSearchDialog
020 */
021public final class TaggingPresetSearchPrimitiveDialog extends ExtendedDialog {
022
023    private TaggingPresetSelector selector;
024
025    private static TaggingPresetSearchPrimitiveDialog instance;
026
027    /**
028     * Returns the unique instance of {@code TaggingPresetSearchPrimitiveDialog}.
029     * @return the unique instance of {@code TaggingPresetSearchPrimitiveDialog}.
030     */
031    public static TaggingPresetSearchPrimitiveDialog getInstance() {
032        if (instance == null) {
033            instance = new TaggingPresetSearchPrimitiveDialog();
034        }
035        return instance;
036    }
037
038    TaggingPresetSearchPrimitiveDialog() {
039        super(Main.parent, tr("Presets"), new String[] {tr("Search"), tr("Cancel")});
040        selector = new TaggingPresetSelector(false, false);
041        setContent(selector);
042        selector.setDblClickListener(new ActionListener() {
043            @Override
044            public void actionPerformed(ActionEvent e) {
045                buttonAction(0, null);
046            }
047        });
048    }
049
050    @Override
051    public ExtendedDialog showDialog() {
052        selector.init();
053        super.showDialog();
054        selector.clearSelection();
055        return this;
056    }
057
058    @Override
059    protected void buttonAction(int buttonIndex, ActionEvent evt) {
060        super.buttonAction(buttonIndex, evt);
061        if (buttonIndex == 0) {
062            TaggingPreset preset = selector.getSelectedPreset();
063            if (preset != null) {
064                final HashSet<OsmPrimitive> matching = new HashSet<>(Utils.filter(Main.main.getCurrentDataSet().allPrimitives(), preset));
065                Main.main.getCurrentDataSet().setSelected(matching);
066            }
067        }
068    }
069
070    /**
071     * An action executing {@link TaggingPresetSearchPrimitiveDialog}.
072     */
073    public static class Action extends JosmAction {
074
075        /**
076         * Constructs a new {@link TaggingPresetSearchPrimitiveDialog.Action}.
077         */
078        public Action() {
079            super(tr("Search for objects by preset"), "dialogs/search", tr("Show preset search dialog"),
080                    Shortcut.registerShortcut("preset:search-objects", tr("Search for objects by preset"), KeyEvent.VK_F3, Shortcut.SHIFT), false);
081            putValue("toolbar", "presets/search-objects");
082            Main.toolbar.register(this);
083        }
084
085        @Override
086        public void actionPerformed(ActionEvent e) {
087            if (Main.main.hasEditLayer()) {
088                TaggingPresetSearchPrimitiveDialog.getInstance().showDialog();
089            }
090        }
091    }
092
093}