Ticket #5563: ungluerelation.patch

File ungluerelation.patch, 8.1 KB (added by KalleLampila, 15 years ago)
  • new file src/org/openstreetmap/josm/actions/UnGlueRelationAction.java

    diff --git a/src/org/openstreetmap/josm/actions/UnGlueRelationAction.java b/src/org/openstreetmap/josm/actions/UnGlueRelationAction.java
    new file mode 100644
    index 0000000..d8646e2
    - +  
     1// License: GPL v2 or later. Copyright 2010 by Kalle Lampila and others
     2// See LICENSE file for details.
     3package org.openstreetmap.josm.actions;
     4
     5import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
     6import static org.openstreetmap.josm.tools.I18n.tr;
     7import static org.openstreetmap.josm.tools.I18n.trn;
     8
     9import java.awt.event.KeyEvent;
     10import java.awt.event.ActionEvent;
     11
     12import java.util.Collection;
     13import java.util.Collections;
     14import java.util.LinkedList;
     15import java.util.List;
     16
     17import org.openstreetmap.josm.Main;
     18import org.openstreetmap.josm.tools.Shortcut;
     19import org.openstreetmap.josm.command.AddCommand;
     20import org.openstreetmap.josm.command.ChangeCommand;
     21import org.openstreetmap.josm.command.Command;
     22import org.openstreetmap.josm.command.SequenceCommand;
     23import org.openstreetmap.josm.data.osm.OsmPrimitive;
     24import org.openstreetmap.josm.data.osm.Relation;
     25import org.openstreetmap.josm.data.osm.RelationMember;
     26
     27/**
     28 * Duplicate nodes, ways and relations that are used by multiple relations.
     29 *
     30 * Resulting nodes, ways and relations are identical as the orginals.
     31 *
     32 * @author Kalle Lampila
     33 *
     34 */
     35public class UnGlueRelationAction extends JosmAction {
     36
     37    /**
     38     * Create a new UnGlueRelationAction.
     39     */
     40    public UnGlueRelationAction() {
     41        super(tr("UnGlue Relation"), "ungluerelations", tr("Duplicate nodes, ways and relations that are used by multiple relations."),
     42              Shortcut.registerShortcut("tools:ungluerelation", tr("Tool: {0}", tr("UnGlue Relations")), KeyEvent.VK_G, Shortcut.GROUP_EDIT, Shortcut.SHIFT_DEFAULT ), true);
     43        putValue("help", ht("/Action/UnGlueRelation"));
     44    }
     45
     46    /**
     47     * Called when the action is executed.
     48     */
     49    public void actionPerformed(ActionEvent e) {
     50
     51        LinkedList<Command> cmds = new LinkedList<Command>();
     52        List<OsmPrimitive> newPrimitives = new LinkedList<OsmPrimitive>();
     53        Collection<OsmPrimitive> selection = getCurrentDataSet().getSelected();
     54
     55        for (OsmPrimitive p : selection) {
     56            boolean first = true;
     57            for (Relation relation : OsmPrimitive.getFilteredList(p.getReferrers(), Relation.class)) {
     58                if (relation.isDeleted()) {
     59                    continue;
     60                }
     61                if (!first) {
     62                    OsmPrimitive newp = p.makeClone(true);
     63                    newPrimitives.add(newp);
     64                    cmds.add(new AddCommand(newp));
     65                    cmds.add(new ChangeCommand(relation, changeRelationMember(relation, p, newp)));
     66                } else {
     67                    first = false;
     68                }
     69            }
     70        }
     71
     72        if (newPrimitives.isEmpty() ) {
     73            // error message nothing to do
     74        }
     75        else {
     76            Main.main.undoRedo.add(new SequenceCommand(tr("Unglued Relations"), cmds));
     77            //Set selection all primiteves (new and old)
     78            newPrimitives.addAll(selection);
     79            getCurrentDataSet().setSelected(newPrimitives);
     80            Main.map.mapView.repaint();
     81        }
     82    }
     83
     84    /**
     85     * Change member in relation to another one
     86     * @param relation
     87     * @param orginalMember member to change
     88     * @param newMember
     89     * @return new relation were change is made
     90     */
     91    private Relation changeRelationMember(Relation relation, OsmPrimitive orginalMember, OsmPrimitive newMember) {
     92        LinkedList<RelationMember> newrms = new LinkedList<RelationMember>();
     93        for (RelationMember rm : relation.getMembers()) {
     94            if (rm.getMember() == orginalMember) {
     95                newrms.add(new RelationMember(rm.getRole(),newMember));
     96            } else {
     97                newrms.add(rm);
     98            }
     99        }
     100        Relation newRelation  = new Relation(relation);
     101        newRelation.setMembers(newrms);
     102        return newRelation;
     103    }
     104
     105    @Override
     106    protected void updateEnabledState() {
     107        if (getCurrentDataSet() == null) {
     108            setEnabled(false);
     109        } else {
     110            updateEnabledState(getCurrentDataSet().getSelected());
     111        }
     112    }
     113
     114    @Override
     115    protected void updateEnabledState(Collection<? extends OsmPrimitive> selection) {
     116        setEnabled(selection != null && !selection.isEmpty());
     117    }
     118
     119}
  • src/org/openstreetmap/josm/data/osm/Node.java

    diff --git a/src/org/openstreetmap/josm/data/osm/Node.java b/src/org/openstreetmap/josm/data/osm/Node.java
    index 4a185a2..d529d7c 100644
    a b public final class Node extends OsmPrimitive {  
    251251
    252252        return builder.toString();
    253253    }
     254
     255    @Override
     256    public Node makeClone(boolean clearId) {
     257        return new Node(this, clearId);
     258    }
    254259}
  • src/org/openstreetmap/josm/data/osm/OsmPrimitive.java

    diff --git a/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java b/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
    index a4ad2e2..f24351f 100644
    a b abstract public class OsmPrimitive implements Comparable<OsmPrimitive>, Tagged,  
    15591559        return (int)id;
    15601560    }
    15611561
     1562    /**
     1563     * Make clone
     1564     * @param clearId If true, set version to 0 and id to new unique value
     1565     */
     1566    abstract public OsmPrimitive makeClone(boolean clearId);
     1567
    15621568}
  • src/org/openstreetmap/josm/data/osm/Relation.java

    diff --git a/src/org/openstreetmap/josm/data/osm/Relation.java b/src/org/openstreetmap/josm/data/osm/Relation.java
    index d29712e..dd1b6f2 100644
    a b public final class Relation extends OsmPrimitive {  
    478478        }
    479479        return ret;
    480480    }
     481
     482    @Override
     483    public Relation makeClone(boolean clearId) {
     484        return new Relation(this, clearId);
     485    }
    481486}
  • src/org/openstreetmap/josm/data/osm/Way.java

    diff --git a/src/org/openstreetmap/josm/data/osm/Way.java b/src/org/openstreetmap/josm/data/osm/Way.java
    index 535ef36..235c879 100644
    a b public final class Way extends OsmPrimitive {  
    492492    public boolean isDrawable() {
    493493        return super.isDrawable() && !hasIncompleteNodes();
    494494    }
     495
     496    @Override
     497    public Way makeClone(boolean clearId) {
     498        return new Way(this, clearId);
     499    }
    495500}
  • src/org/openstreetmap/josm/gui/MainMenu.java

    diff --git a/src/org/openstreetmap/josm/gui/MainMenu.java b/src/org/openstreetmap/josm/gui/MainMenu.java
    index 9324b48..e3be904 100644
    a b import org.openstreetmap.josm.actions.SimplifyWayAction;  
    6565import org.openstreetmap.josm.actions.SplitWayAction;
    6666import org.openstreetmap.josm.actions.ToggleGPXLinesAction;
    6767import org.openstreetmap.josm.actions.UnGlueAction;
     68import org.openstreetmap.josm.actions.UnGlueRelationAction;
    6869import org.openstreetmap.josm.actions.UndoAction;
    6970import org.openstreetmap.josm.actions.UnselectAllAction;
    7071import org.openstreetmap.josm.actions.UpdateDataAction;
    public class MainMenu extends JMenuBar {  
    151152    public final JosmAction mergeNodes = new MergeNodesAction();
    152153    public final JosmAction joinNodeWay = new JoinNodeWayAction();
    153154    public final JosmAction unglueNodes = new UnGlueAction();
     155    public final JosmAction unglueRelationNodes = new UnGlueRelationAction();
    154156    public final JosmAction simplifyWay = new SimplifyWayAction();
    155157    public final JosmAction joinAreas = new JoinAreasAction();
    156158    public final InfoAction info = new InfoAction();
    public class MainMenu extends JMenuBar {  
    315317        add(toolsMenu, mergeNodes);
    316318        add(toolsMenu, joinNodeWay);
    317319        add(toolsMenu, unglueNodes);
     320        add(toolsMenu, unglueRelationNodes);
    318321        add(toolsMenu, joinAreas);
    319322        toolsMenu.addSeparator();
    320323        add(toolsMenu, info);