// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.fixAddresses.gui.actions; import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.command.AddCommand; import org.openstreetmap.josm.command.ChangePropertyCommand; import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.RelationMember; import org.openstreetmap.josm.plugins.fixAddresses.AddressEditContainer; import org.openstreetmap.josm.plugins.fixAddresses.OSMAddress; import org.openstreetmap.josm.plugins.fixAddresses.OSMStreet; import org.openstreetmap.josm.plugins.fixAddresses.TagConstants; import org.openstreetmap.josm.plugins.fixAddresses.gui.AddressEditSelectionEvent; @SuppressWarnings("serial") public class ConvertToRelationAction extends AbstractAddressEditAction { public ConvertToRelationAction() { super(tr("Convert to relation."), "convert2rel_24", tr("Create relation between street and related addresses."), "fixaddresses/converttorelation"); } /** * Instantiates a new convert to relation action. * * @param name the name of the action * @param iconName the icon name * @param tooltip the tool tip to show on hover */ public ConvertToRelationAction(String name, String iconName, String tooltip, String toolbar) { super(name, iconName, tooltip, toolbar); } @Override public void addressEditActionPerformed(AddressEditSelectionEvent ev) { OSMStreet streetNode = ev.getSelectedStreet(); if (streetNode != null) { createRelationForStreet(streetNode); } } /** * Creates the 'associatedStreet' relation for a given street by adding all addresses which * matches the name of the street. * * @param streetNode the street node */ protected void createRelationForStreet(OSMStreet streetNode) { if (streetNode == null || !streetNode.hasAddresses()) return; beginTransaction(tr("Create address relation for ") + " '" + streetNode.getName() + "'"); // Create the relation Relation r = new Relation(); commands.add(new AddCommand(r)); commands.add(new ChangePropertyCommand(r, TagConstants.NAME_TAG, streetNode.getName())); commands.add(new ChangePropertyCommand(r, TagConstants.RELATION_TYPE, TagConstants.ASSOCIATEDSTREET_RELATION_TYPE)); // add street with role 'street' r.addMember(new RelationMember(TagConstants.STREET_RELATION_ROLE, streetNode.getOsmObject())); // add address members for (OSMAddress addrNode : streetNode.getAddresses()) { beginObjectTransaction(addrNode); r.addMember(new RelationMember(TagConstants.HOUSE_RELATION_ROLE, addrNode.getOsmObject())); addrNode.setStreetName(null); // remove street name finishObjectTransaction(addrNode); } finishTransaction(); } @Override public void addressEditActionPerformed(AddressEditContainer container) { // Nothing to do (yet). } @Override protected void updateEnabledState(AddressEditContainer container) { setEnabled(false); } @Override protected void updateEnabledState(AddressEditSelectionEvent event) { if (event == null) return; OSMStreet street = event.getSelectedStreet(); setEnabled(street != null && street.hasAddresses() && !street.hasAssociatedStreetRelation()); } }