Ticket #7253: IWAMode.java.patch

File IWAMode.java.patch, 6.2 KB (added by ToeBee, 14 years ago)

Patch for IWAMode.java

  • IWAMode.java

     
    2525import java.awt.geom.GeneralPath;
    2626import java.util.ArrayList;
    2727import java.util.Collection;
     28import java.util.Iterator;
    2829import java.util.LinkedList;
    2930import java.util.List;
     31import java.util.Map;
    3032
    3133import javax.swing.JOptionPane;
    3234
     
    3537import org.openstreetmap.josm.command.AddCommand;
    3638import org.openstreetmap.josm.command.ChangeCommand;
    3739import org.openstreetmap.josm.command.Command;
     40import org.openstreetmap.josm.command.DeleteCommand;
    3841import org.openstreetmap.josm.command.MoveCommand;
    3942import org.openstreetmap.josm.command.SequenceCommand;
    4043import org.openstreetmap.josm.data.Bounds;
     
    7982    final private Cursor cursorSelectHover;
    8083    final private Cursor cursorImprove;
    8184    final private Cursor cursorImproveAdd;
     85    final private Cursor cursorImproveDelete;
    8286    final private Cursor cursorImproveAddLock;
    8387    final private Cursor cursorImproveLock;
    8488
    8589    private boolean shift = false;
    8690    private boolean ctrl = false;
    87     private boolean oldShift = false;
    88     private boolean oldCtrl = false;
     91    private boolean alt = false;
    8992
    9093    private final Color guideColor;
    9194    private final BasicStroke selectTargetWayStroke;
     
    107110        cursorSelect = ImageProvider.getCursor("normal", "mode");
    108111        cursorSelectHover = ImageProvider.getCursor("hand", "mode");
    109112        cursorImprove = ImageProvider.getCursor("crosshair", null);
    110         cursorImproveAdd = ImageProvider.getCursor("crosshair", "add_node");
     113        cursorImproveAdd = ImageProvider.getCursor("crosshair", "addnode");
     114        cursorImproveDelete = ImageProvider.getCursor("crosshair", "delete_node");
    111115        cursorImproveAddLock = ImageProvider.getCursor("crosshair",
    112116                "add_node_lock");
    113117        cursorImproveLock = ImageProvider.getCursor("crosshair", "lock");
     
    354358                return;
    355359            }
    356360
    357             if (ctrl && candidateSegment != null) {
     361            if (ctrl && !alt && candidateSegment != null) {
    358362                // Adding a new node to the highlighted segment
    359363                // Important: If there are other ways containing the same
    360364                // segment, a node must added to all of that ways.
     
    412416
    413417                Main.main.undoRedo.add(new SequenceCommand(text, virtualCmds));
    414418
     419            } else if(alt && ctrl && candidateNode != null) {
     420               
     421                //check to see if node has interesting keys
     422                Iterator<String> keyIterator = candidateNode.getKeys().keySet().iterator();
     423                boolean hasTags = false;
     424                while(keyIterator.hasNext()) {
     425                        String key = keyIterator.next();
     426                        if(!OsmPrimitive.isUninterestingKey(key)) {
     427                                hasTags = true;
     428                                break;
     429                        }
     430                }
     431               
     432                //check to see if node is in use by more than one object
     433                List<OsmPrimitive> referrers = candidateNode.getReferrers();
     434                List<Way> ways = OsmPrimitive.getFilteredList(referrers, Way.class);
     435                if(referrers.size() != 1 || ways.size() != 1) {
     436                        JOptionPane.showMessageDialog(Main.parent,
     437                            tr("Cannot delete node that is referenced by multiple objects"),
     438                            tr("Error"), JOptionPane.ERROR_MESSAGE);
     439                }
     440                else if(hasTags) {
     441                        JOptionPane.showMessageDialog(Main.parent,
     442                            tr("Cannot delete node that has tags"),
     443                            tr("Error"), JOptionPane.ERROR_MESSAGE);
     444                }
     445                else {
     446                        List<Node> nodeList = new ArrayList<Node>();
     447                        nodeList.add(candidateNode);
     448                        Command deleteCmd = DeleteCommand.delete(getEditLayer(), nodeList, true);
     449                        Main.main.undoRedo.add(deleteCmd);
     450                }
     451               
     452               
    415453            } else if (candidateNode != null) {
    416454                // Moving the highlighted node
    417455                EastNorth nodeEN = candidateNode.getEastNorth();
     
    449487     */
    450488    @Override
    451489    protected void updateKeyModifiers(InputEvent e) {
    452         oldCtrl = ctrl;
    453         oldShift = shift;
    454490        ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
    455491        shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
     492        alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
    456493    }
    457494
    458495    /**
     
    468505            mv.setNewCursor(targetWay == null ? cursorSelect
    469506                    : cursorSelectHover, this);
    470507        } else if (state == State.improving) {
    471             mv.setNewCursor(ctrl ? (shift || dragging ? cursorImproveAddLock
    472                     : cursorImproveAdd)
    473                     : (shift || dragging ? cursorImproveLock : cursorImprove),
    474                     this);
     508                if(alt && ctrl) {
     509                        mv.setNewCursor(cursorImproveDelete, this);
     510                } else if(shift || dragging) {
     511                        if(ctrl) {
     512                                mv.setNewCursor(cursorImproveAddLock, this);
     513                        } else {
     514                                mv.setNewCursor(cursorImproveLock, this);
     515                        }
     516                }
     517                else if(ctrl && !alt){
     518                        mv.setNewCursor(cursorImproveAdd, this);
     519                }
     520                else {
     521                        mv.setNewCursor(cursorImprove, this);
     522                }
    475523        }
    476524    }
    477525
     
    481529     */
    482530    public void updateCursorDependentObjectsIfNeeded() {
    483531        if (state == State.improving && (shift || dragging)
    484                 && (ctrl == oldCtrl)
    485532                && !(candidateNode == null && candidateSegment == null))
    486533            return;
    487534
     
    494541        if (state == State.selecting) {
    495542            targetWay = IWATargetWayHelper.findWay(mv, mousePos);
    496543        } else if (state == State.improving) {
    497             if (ctrl) {
     544            if (ctrl && !alt) {
    498545                candidateSegment = IWATargetWayHelper.findCandidateSegment(mv,
    499546                        targetWay, mousePos);
    500547                candidateNode = null;