Ticket #5563: ungluerelation.patch

File ungluerelation.patch, 8.1 KB (added by Kalle Lampila, 3 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);