// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.utilsplugin2.actions;
import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
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.LinkedList;
import java.util.List;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.command.AddCommand;
import org.openstreetmap.josm.command.Command;
import org.openstreetmap.josm.command.SequenceCommand;
import org.openstreetmap.josm.data.osm.Node;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.osm.Way;
import org.openstreetmap.josm.plugins.utilsplugin2.command.ChangeRelationMemberCommand;
import org.openstreetmap.josm.tools.Shortcut;
/**
* Duplicate nodes, ways and relations that are used by multiple relations.
*
* Resulting nodes, ways and relations are identical as the orginals.
*
* @author Kalle Lampila
*
*/
public class UnGlueRelationAction extends JosmAction {
/**
* Create a new UnGlueRelationAction.
*/
public UnGlueRelationAction() {
super(tr("UnGlue Relation"), "ungluerelations", tr("Duplicate nodes, ways and relations that are used by multiple relations."),
Shortcut.registerShortcut("tools:ungluerelation", tr("Tool: {0}", tr("UnGlue Relations")), KeyEvent.VK_G, Shortcut.ALT_SHIFT),
true);
putValue("help", ht("/Action/UnGlueRelation"));
}
/**
* Called when the action is executed.
*/
@Override
public void actionPerformed(ActionEvent e) {
LinkedList<Command> cmds = new LinkedList<>();
List<OsmPrimitive> newPrimitives = new LinkedList<>();
Collection<OsmPrimitive> selection = getLayerManager().getEditDataSet().getSelected();
for (OsmPrimitive p : selection) {
boolean first = true;
for (Relation relation : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
if (relation.isDeleted()) {
continue;
}
if (!first) {
OsmPrimitive newp;
switch(p.getType()) {
case NODE: newp = new Node((Node) p, true); break;
case WAY: newp = new Way((Way) p, true); break;
case RELATION: newp = new Relation((Relation) p, true); break;
default: throw new AssertionError();
}
newPrimitives.add(newp);
cmds.add(new AddCommand(newp));
cmds.add(new ChangeRelationMemberCommand(relation, p, newp));
} else {
first = false;
}
}
}
if (newPrimitives.isEmpty()) {
// error message nothing to do
} else {
Main.main.undoRedo.add(new SequenceCommand(tr("Unglued Relations"), cmds));
//Set selection all primiteves (new and old)
newPrimitives.addAll(selection);
getLayerManager().getEditDataSet().setSelected(newPrimitives);
Main.map.mapView.repaint();
}
}
@Override
protected void updateEnabledState() {
updateEnabledStateOnCurrentSelection();
}
@Override
protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
setEnabled(selection != null && !selection.isEmpty());
}
}