Ticket #13538: 13538-v2.patch

File 13538-v2.patch, 8.3 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/actions/CreateCircleAction.java

     
    212212                double alpha = angles[i].a + (j+1)*delta/(count[i]+1);
    213213                double x = center.east() + r*Math.cos(alpha);
    214214                double y = center.north() + r*Math.sin(alpha);
    215                 LatLon ll = ProjectionRegistry.getProjection().eastNorth2latlon(new EastNorth(x, y));
    216                 if (ll.isOutSideWorld()) {
     215                if (new Node(new EastNorth(x, y)).isOutSideWorld()) {
    217216                    notifyNodesNotOnCircle();
    218217                    return;
    219218                }
     219                LatLon ll = ProjectionRegistry.getProjection().eastNorth2latlon(new EastNorth(x, y));
    220220                Node n = new Node(ll);
    221221                nodesToAdd.add(n);
    222222                cmds.add(new AddCommand(ds, n));
  • src/org/openstreetmap/josm/actions/MoveAction.java

     
    151151        }
    152152
    153153        for (Node n : affectedNodes) {
    154             if (n.isLatLonKnown() && n.getCoor().isOutSideWorld()) {
    155                 // Revert move
    156                 ((MoveCommand) c).moveAgain(-distx, -disty);
     154            if (n.isLatLonKnown() && n.isOutSideWorld()) {
     155                // Undo move
    157156                JOptionPane.showMessageDialog(
    158157                        MainApplication.getMainFrame(),
    159158                        tr("Cannot move objects outside of the world."),
     
    160159                        tr("Warning"),
    161160                        JOptionPane.WARNING_MESSAGE
    162161                );
     162                UndoRedoHandler.getInstance().undo(1);
    163163                return;
    164164            }
    165165        }
  • src/org/openstreetmap/josm/actions/mapmode/DrawAction.java

     
    529529        List<Way> replacedWays = new ArrayList<>();
    530530
    531531        if (newNode) {
    532             if (n.getCoor().isOutSideWorld()) {
     532            if (n.isOutSideWorld()) {
    533533                JOptionPane.showMessageDialog(
    534534                        MainApplication.getMainFrame(),
    535535                        tr("Cannot add a node outside of the world."),
  • src/org/openstreetmap/josm/actions/mapmode/ImproveWayAccuracyAction.java

     
    415415            }
    416416        } else if (state == State.IMPROVING) {
    417417            // Checking if the new coordinate is outside of the world
    418             if (mv.getLatLon(mousePos.x, mousePos.y).isOutSideWorld()) {
     418            Node test = new Node(mv.getEastNorth(mousePos.x, mousePos.y));
     419            if (test.isOutSideWorld()) {
    419420                JOptionPane.showMessageDialog(MainApplication.getMainFrame(),
    420421                        tr("Cannot add a node outside of the world."),
    421422                        tr("Warning"), JOptionPane.WARNING_MESSAGE);
  • src/org/openstreetmap/josm/actions/mapmode/SelectAction.java

     
    3131import org.openstreetmap.josm.command.SequenceCommand;
    3232import org.openstreetmap.josm.data.UndoRedoHandler;
    3333import org.openstreetmap.josm.data.coor.EastNorth;
    34 import org.openstreetmap.josm.data.coor.LatLon;
    3534import org.openstreetmap.josm.data.osm.DataSet;
    3635import org.openstreetmap.josm.data.osm.Node;
    3736import org.openstreetmap.josm.data.osm.OsmData;
     
    722721                    UndoRedoHandler.getInstance().add(c);
    723722                }
    724723                for (Node n : affectedNodes) {
    725                     LatLon ll = n.getCoor();
    726                     if (ll != null && ll.isOutSideWorld()) {
    727                         // Revert move
    728                         if (c instanceof MoveCommand) {
    729                             ((MoveCommand) c).resetToCheckpoint();
    730                         }
     724                    if (n.isOutSideWorld()) {
    731725                        // TODO: We might use a simple notification in the lower left corner.
    732726                        JOptionPane.showMessageDialog(
    733727                                MainApplication.getMainFrame(),
     
    734728                                tr("Cannot move objects outside of the world."),
    735729                                tr("Warning"),
    736730                                JOptionPane.WARNING_MESSAGE);
     731                        // Undo move
     732                        if (c instanceof MoveCommand) {
     733                            UndoRedoHandler.getInstance().undo(1);
     734                        }
    737735                        mv.setNewCursor(cursor, this);
    738736                        return false;
    739737                    }
  • src/org/openstreetmap/josm/data/osm/Node.java

     
    402402    public List<Way> getParentWays() {
    403403        return referrers(Way.class).collect(Collectors.toList());
    404404    }
     405
     406    /**
     407     * Determines if this node is outside of the world. See also #13538.
     408     * @return <code>true</code>, if the coordinate is outside the world, compared by using lat/lon and east/north
     409     * @since xxx
     410     */
     411    public boolean isOutSideWorld() {
     412        LatLon ll = getCoor();
     413        if (ll != null) {
     414            if (ll.isOutSideWorld())
     415                return true;
     416            if (!new Node(ll).getEastNorth().equalsEpsilon(getEastNorth(), 1.0)) {
     417                // we get here if a node was moved or created left from -180 or right from +180
     418                return true;
     419            }
     420        }
     421        return false;
     422    }
    405423}
  • test/unit/org/openstreetmap/josm/data/osm/NodeTest.java

     
    1111import org.junit.Test;
    1212import org.openstreetmap.josm.data.Bounds;
    1313import org.openstreetmap.josm.data.DataSource;
     14import org.openstreetmap.josm.data.coor.EastNorth;
    1415import org.openstreetmap.josm.data.coor.LatLon;
    1516import org.openstreetmap.josm.testutils.JOSMTestRules;
    1617
     
    2627     */
    2728    @Rule
    2829    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
    29     public JOSMTestRules test = new JOSMTestRules();
     30    public JOSMTestRules test = new JOSMTestRules().projection();
    3031
    3132    /**
    3233     * Non-regression test for ticket #12060.
     
    103104    public void testLoadIAE() {
    104105        new Node().load(new WayData());
    105106    }
     107
     108    /**
     109     * Test that {@link Node#isOutSideWorld} works as expected.
     110     */
     111    @Test
     112    public void testOutsideWorld() {
     113        Node n = new Node(1, 1);
     114        n.setCoor(LatLon.ZERO);
     115        assertFalse(n.isOutSideWorld());
     116        n.setCoor(null);
     117        assertFalse(n.isOutSideWorld());
     118        n.setCoor(LatLon.NORTH_POLE);
     119        assertTrue(n.isOutSideWorld());
     120        n.setCoor(new LatLon(0, 180.0));
     121        assertFalse(n.isOutSideWorld());
     122        // simulate a small move east
     123        n.setEastNorth(new EastNorth(n.getEastNorth().getX() + 0.1, n.getEastNorth().getY()));
     124        assertTrue(n.isOutSideWorld());
     125        n.setCoor(new LatLon(0, -180.0));
     126        assertFalse(n.isOutSideWorld());
     127        // simulate a small move west
     128        n.setEastNorth(new EastNorth(n.getEastNorth().getX() - 0.1, n.getEastNorth().getY()));
     129        assertTrue(n.isOutSideWorld());
     130    }
     131
    106132}