// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.fixAddresses.gui.actions; import static org.openstreetmap.josm.tools.I18n.tr; import java.util.List; import org.openstreetmap.josm.Main; import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer; import org.openstreetmap.josm.plugins.fixAddresses.GuessAddressRunnable; import org.openstreetmap.josm.plugins.fixAddresses.IProgressMonitorFinishedListener; import org.openstreetmap.josm.plugins.fixAddresses.OSMAddress; import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditSelectionEvent; /** * Guesses address tags by picking the closest street node with a name. The same is done * with city, post code, state,... However, I strongly encourage you to check the result. * * @author Oliver Wieland <oliver.wieland@online.de> */ @SuppressWarnings("serial") public class GuessAddressDataAction extends AbstractAddressEditAction implements IProgressMonitorFinishedListener { /** * Instantiates a new "guess address data" action. */ public GuessAddressDataAction() { super(tr("Guess"), "guessstreets_24", tr("Tries to guess address data by picking the name of the closest object with according tag."), "fixaddresses/guessaddressdata"); } @Override public void updateEnabledState(AddressEditSelectionEvent ev) { setEnabled(ev != null && ev.hasAddresses()); } @Override protected void updateEnabledState(AddressEditContainer container) { setEnabled(container != null && container.getNumberOfInvalidAddresses() > 0); } @Override public void addressEditActionPerformed(AddressEditContainer container) { if (container == null || container.getNumberOfInvalidAddresses() == 0) return; internalGuessAddresses(container.getAllAddressesToFix()); } @Override public void addressEditActionPerformed(AddressEditSelectionEvent ev) { if (ev == null || !ev.hasAddresses()) return; // guess tags for selected addresses only internalGuessAddresses(ev.getSelectedIncompleteAddresses()); internalGuessAddresses(ev.getSelectedUnresolvedAddresses()); } /** * Internal method to start several threads guessing tag values for the given list of addresses. */ private void internalGuessAddresses(List<OSMAddress> nodes) { if (nodes == null) return; // Launch address guessing thread GuessAddressRunnable aft = new GuessAddressRunnable(nodes, tr("Guessing address values")); aft.addFinishListener(this); Main.worker.submit(aft); } @Override public void finished() { if (container != null) { container.invalidate(); } } }