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}