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}