// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.utilsplugin2.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.command.ChangePropertyCommand; import org.openstreetmap.josm.data.osm.OsmPrimitive; import org.openstreetmap.josm.tools.Shortcut; /** * Remembers last source value and put it on selected object(s). * * @author Zverik */ public class TagSourceAction extends JosmAction { private static final String TITLE = tr("Add Source Tag"); private String source; private Set<OsmPrimitive> selectionBuf = new HashSet<>(); private boolean clickedTwice = false; public TagSourceAction() { super(TITLE, "dumbutils/sourcetag", tr("Add remembered source tag"), Shortcut.registerShortcut("tools:sourcetag", tr("Tool: {0}", tr("Add Source Tag")), KeyEvent.VK_S, Shortcut.ALT_CTRL), true, false); source = Main.pref.get("sourcetag.value"); // The fields are not initialized while the super constructor is running, so we have to call this afterwards: installAdapters(); } @Override public void actionPerformed(ActionEvent e) { Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected(); if (selection.isEmpty() || source == null || source.length() == 0) return; Main.main.undoRedo.add(new ChangePropertyCommand(selection, "source", source)); } @Override protected void updateEnabledState() { if (getLayerManager().getEditDataSet() == null) { setEnabled(false); if (selectionBuf != null) selectionBuf.clear(); } else updateEnabledState(getLayerManager().getEditDataSet().getSelected()); } @Override protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) { if (selection == null || selection.isEmpty()) { selectionBuf.clear(); clickedTwice = false; setEnabled(false); return; } if (selectionBuf.size() == selection.size() && selectionBuf.containsAll(selection)) { if (!clickedTwice) clickedTwice = true; else { // tags may have been changed, get the source String newSource = null; for (OsmPrimitive p : selection) { String value = p.get("source"); if (value != null && newSource == null) newSource = value; else if (value != null ? !value.equals(newSource) : newSource != null) { newSource = ""; break; } } if (newSource != null && newSource.length() > 0 && !newSource.equals(source)) { source = newSource; Main.pref.put("sourcetag.value", source); } } } else clickedTwice = false; selectionBuf.clear(); selectionBuf.addAll(selection); setEnabled(source != null && source.length() > 0); } }