Changeset 4458 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2011-09-24T12:09:32+02:00 (13 years ago)
Author:
simon04
Message:

fix #3951 - user should be warned when unglue-ing two ways outside the download area

Location:
trunk/src/org/openstreetmap/josm
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java

    r4310 r4458  
    334334        // TODO: Only display this warning when nodes outside dataSourceArea are deleted
    335335        Area dataSourceArea = Main.main.getCurrentDataSet().getDataSourceArea();
    336         if (dataSourceArea != null) {
    337             for (Node node : allNodes) {
    338                 if (!dataSourceArea.contains(node.getCoor())) {
    339                     int option = JOptionPane.showConfirmDialog(Main.parent,
    340                             trn("The selected way has nodes outside of the downloaded data region.",
    341                                     "The selected ways have nodes outside of the downloaded data region.",
    342                                     ways.size()) + "\n"
    343                                     + tr("This can lead to nodes being deleted accidentally.") + "\n"
    344                                     + tr("Are you really sure to continue?"),
    345                                     tr("Please abort if you are not sure"), JOptionPane.YES_NO_OPTION,
    346                                     JOptionPane.WARNING_MESSAGE);
    347 
    348                     if (option != JOptionPane.YES_OPTION) return;
    349                     break;
    350                 }
    351             }
    352         }
     336        boolean ok = Command.checkAndConfirmOutlyingOperation("joinarea", tr("Join area confirmation"),
     337                trn("The selected way has nodes outside of the downloaded data region.",
     338                    "The selected ways have nodes outside of the downloaded data region.",
     339                    ways.size()) + "<br/>"
     340                    + tr("This can lead to nodes being deleted accidentally.") + "<br/>"
     341                    + tr("Are you really sure to continue?")
     342                    + tr("Please abort if you are not sure"),
     343                tr("The selected area is incomplete. Continue?"),
     344                dataSourceArea, allNodes, null);
     345        if(!ok) return;
    353346
    354347        //analyze multipolygon relations and collect all areas
  • trunk/src/org/openstreetmap/josm/actions/UnGlueAction.java

    r3538 r4458  
    6161     * This method does some checking on the selection and calls the matching unGlueWay method.
    6262     */
     63    @Override
    6364    public void actionPerformed(ActionEvent e) {
    6465
     
    6768        String errMsg = null;
    6869        if (checkSelection(selection)) {
     70            if (!checkAndConfirmOutlyingUnglue()) {
     71                return;
     72            }
    6973            int count = 0;
    7074            for (Way w : OsmPrimitive.getFilteredList(selectedNode.getReferrers(), Way.class)) {
     
    8791            }
    8892        } else if (checkSelection2(selection)) {
     93            if (!checkAndConfirmOutlyingUnglue()) {
     94                return;
     95            }
    8996            ArrayList<Node> tmpNodes = new ArrayList<Node>();
    9097            for (Node n : selectedNodes) {
     
    408415        setEnabled(selection != null && !selection.isEmpty());
    409416    }
     417
     418    protected boolean checkAndConfirmOutlyingUnglue() {
     419        List<OsmPrimitive> primitives = new ArrayList<OsmPrimitive>(2 + (selectedNodes == null ? 0 : selectedNodes.size()));
     420        if (selectedNodes != null)
     421            primitives.addAll(selectedNodes);
     422        if (selectedNode != null)
     423            primitives.add(selectedNode);
     424        if (selectedWay != null)
     425            primitives.add(selectedWay);
     426        return Command.checkAndConfirmOutlyingOperation("unglue",
     427                tr("Unglue confirmation"),
     428                tr("You are about to unglue nodes outside of the area you have downloaded."
     429                        + "<br>"
     430                        + "This can cause problems because other objects (that you do not see) might use them."
     431                        + "<br>"
     432                        + "Do you really want to unglue?"),
     433                tr("You are about to unglue incomplete objects."
     434                        + "<br>"
     435                        + "This will cause problems because you don''t see the real object."
     436                        + "<br>" + "Do you really want to unglue?"),
     437                getEditLayer().data.getDataSourceArea(), primitives, null);
     438    }
    410439}
  • trunk/src/org/openstreetmap/josm/command/Command.java

    r4191 r4458  
    22package org.openstreetmap.josm.command;
    33
     4import static org.openstreetmap.josm.tools.I18n.tr;
     5
     6import java.awt.GridBagLayout;
     7import java.awt.geom.Area;
    48import java.util.ArrayList;
    59import java.util.Collection;
     
    913import java.util.Map.Entry;
    1014
     15import javax.swing.JLabel;
     16import javax.swing.JOptionPane;
     17import javax.swing.JPanel;
    1118import javax.swing.tree.DefaultMutableTreeNode;
    1219import javax.swing.tree.MutableTreeNode;
     
    1926import org.openstreetmap.josm.data.osm.Way;
    2027import org.openstreetmap.josm.data.osm.visitor.AbstractVisitor;
     28import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
    2129import org.openstreetmap.josm.gui.layer.Layer;
    2230import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    171179    }
    172180
     181    /**
     182     * Check whether user is about to operate on data outside of the download area.
     183     * Request confirmation if he is.
     184     *
     185     * @param layer the layer in whose context data is deleted
     186     * @param primitives the primitives to operate on
     187     * @return true, if deleting outlying primitives is OK; false, otherwise
     188     */
     189    public static boolean checkAndConfirmOutlyingOperation(String operation,
     190            String dialogTitle, String outsideDialogMessage, String incompleteDialogMessage,
     191            Area area, Collection<? extends OsmPrimitive> primitives, OsmPrimitive ignore) {
     192        boolean outside = false;
     193        boolean incomplete = false;
     194        if (area != null) {
     195            for (OsmPrimitive osm : primitives) {
     196                if (osm.isIncomplete()) {
     197                    incomplete = true;
     198                } else if (osm instanceof Node && !osm.isNewOrUndeleted()
     199                        && !area.contains(((Node) osm).getCoor())
     200                        && (ignore == null || !ignore.equals(osm))) {
     201                    outside = true;
     202                }
     203            }
     204        } else {
     205            for (OsmPrimitive osm : primitives) {
     206                if (osm.isIncomplete()) {
     207                    incomplete = true;
     208                }
     209            }
     210        }
     211        if (outside) {
     212            JPanel msg = new JPanel(new GridBagLayout());
     213            msg.add(new JLabel("<html>" + outsideDialogMessage + "</html>"));
     214            boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
     215                    operation + "_outside_nodes",
     216                    Main.parent,
     217                    msg,
     218                    dialogTitle,
     219                    JOptionPane.YES_NO_OPTION,
     220                    JOptionPane.QUESTION_MESSAGE,
     221                    JOptionPane.YES_OPTION);
     222            if(!answer)
     223                return false;
     224        }
     225        if (incomplete) {
     226            JPanel msg = new JPanel(new GridBagLayout());
     227            msg.add(new JLabel("<html>" + incompleteDialogMessage + "</html>"));
     228            boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
     229                    operation + "_incomplete",
     230                    Main.parent,
     231                    msg,
     232                    dialogTitle,
     233                    JOptionPane.YES_NO_OPTION,
     234                    JOptionPane.QUESTION_MESSAGE,
     235                    JOptionPane.YES_OPTION);
     236            if(!answer)
     237                return false;
     238        }
     239        return true;
     240    }
     241
    173242}
  • trunk/src/org/openstreetmap/josm/command/DeleteCommand.java

    r4325 r4458  
    22package org.openstreetmap.josm.command;
    33
     4import java.awt.geom.Area;
    45import static org.openstreetmap.josm.tools.I18n.marktr;
    56import static org.openstreetmap.josm.tools.I18n.tr;
    67import static org.openstreetmap.josm.tools.I18n.trn;
    78
    8 import java.awt.GridBagLayout;
    9 import java.awt.geom.Area;
    109import java.util.ArrayList;
    1110import java.util.Collection;
     
    2120
    2221import javax.swing.JLabel;
    23 import javax.swing.JOptionPane;
    24 import javax.swing.JPanel;
    25 
    26 import org.openstreetmap.josm.Main;
     22
    2723import org.openstreetmap.josm.actions.SplitWayAction;
    2824import org.openstreetmap.josm.data.osm.Node;
     
    3430import org.openstreetmap.josm.data.osm.Way;
    3531import org.openstreetmap.josm.data.osm.WaySegment;
    36 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
    3732import org.openstreetmap.josm.gui.DefaultNameFormatter;
    3833import org.openstreetmap.josm.gui.actionsupport.DeleteFromRelationConfirmationDialog;
     
    234229        if (parents.isEmpty())
    235230            return null;
    236         if (!silent && !checkAndConfirmOutlyingDeletes(layer,parents))
     231        if (!silent && !checkAndConfirmOutlyingDelete(layer, parents, null))
    237232            return null;
    238233        return new DeleteCommand(layer,parents);
     
    331326        }
    332327
    333         if (!silent && !checkAndConfirmOutlyingDeletes(layer,primitivesToDelete))
     328        if (!silent && !checkAndConfirmOutlyingDelete(layer, primitivesToDelete, null))
    334329            return null;
    335330
     
    427422    }
    428423
    429     /**
    430      * Check whether user is about to delete data outside of the download area. Request confirmation
    431      * if he is.
    432      *
    433      * @param layer the layer in whose context data is deleted
    434      * @param primitivesToDelete the primitives to delete
    435      * @return true, if deleting outlying primitives is OK; false, otherwise
    436      */
    437     private static boolean checkAndConfirmOutlyingDeletes(OsmDataLayer layer, Collection<OsmPrimitive> primitivesToDelete) {
    438         Area a = layer.data.getDataSourceArea();
    439         boolean outside = false;
    440         boolean incomplete = false;
    441         if (a != null) {
    442             for (OsmPrimitive osm : primitivesToDelete) {
    443                 if (osm.isIncomplete()) {
    444                     incomplete = true;
    445                 } else if (osm instanceof Node && !osm.isNewOrUndeleted()
    446                         && !a.contains(((Node) osm).getCoor())) {
    447                     outside = true;
    448                 }
    449             }
    450         }
    451         else
    452         {
    453             for (OsmPrimitive osm : primitivesToDelete)
    454                 if (osm.isIncomplete()) {
    455                     incomplete = true;
    456                 }
    457         }
    458         if(outside)
    459         {
    460             JPanel msg = new JPanel(new GridBagLayout());
    461             msg.add(new JLabel(
    462                     "<html>" +
    463                     // leave message in one tr() as there is a grammatical
    464                     // connection.
    465                     tr("You are about to delete nodes outside of the area you have downloaded."
    466                             + "<br>"
    467                             + "This can cause problems because other objects (that you do not see) might use them."
    468                             + "<br>" + "Do you really want to delete?") + "</html>"));
    469             boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
    470                     "delete_outside_nodes",
    471                     Main.parent,
    472                     msg,
    473                     tr("Delete confirmation"),
    474                     JOptionPane.YES_NO_OPTION,
    475                     JOptionPane.QUESTION_MESSAGE,
    476                     JOptionPane.YES_OPTION
    477             );
    478             if(!answer)
    479                 return false;
    480         }
    481         if(incomplete)
    482         {
    483             JPanel msg = new JPanel(new GridBagLayout());
    484             msg.add(new JLabel(
    485                     "<html>" +
    486                     // leave message in one tr() as there is a grammatical
    487                     // connection.
    488                     tr("You are about to delete incomplete objects."
    489                             + "<br>"
    490                             + "This will cause problems because you don''t see the real object."
    491                             + "<br>" + "Do you really want to delete?") + "</html>"));
    492             boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
    493                     "delete_incomplete",
    494                     Main.parent,
    495                     msg,
    496                     tr("Delete confirmation"),
    497                     JOptionPane.YES_NO_OPTION,
    498                     JOptionPane.QUESTION_MESSAGE,
    499                     JOptionPane.YES_OPTION
    500             );
    501             if(!answer)
    502                 return false;
    503         }
    504         return true;
    505     }
     424    public static boolean checkAndConfirmOutlyingDelete(OsmDataLayer layer, Collection<? extends OsmPrimitive> primitives, OsmPrimitive ignore) {
     425        return checkAndConfirmOutlyingDelete(layer.data.getDataSourceArea(), primitives, ignore);
     426    }
     427
     428    public static boolean checkAndConfirmOutlyingDelete(Area area, Collection<? extends OsmPrimitive> primitives, OsmPrimitive ignore) {
     429        return Command.checkAndConfirmOutlyingOperation("delete",
     430                tr("Delete confirmation"),
     431                tr("You are about to delete nodes outside of the area you have downloaded."
     432                        + "<br>"
     433                        + "This can cause problems because other objects (that you do not see) might use them."
     434                        + "<br>"
     435                        + "Do you really want to delete?"),
     436                tr("You are about to delete incomplete objects."
     437                        + "<br>"
     438                        + "This will cause problems because you don''t see the real object."
     439                        + "<br>" + "Do you really want to delete?"),
     440                area, primitives, ignore);
     441    }
     442
    506443}
  • trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java

    r4043 r4458  
    2424import org.openstreetmap.josm.actions.MergeNodesAction;
    2525import org.openstreetmap.josm.command.Command;
     26import org.openstreetmap.josm.command.DeleteCommand;
    2627import org.openstreetmap.josm.data.coor.LatLon;
    2728import org.openstreetmap.josm.data.osm.Hash;
     
    390391        }
    391392
    392         if (checkAndConfirmOutlyingDeletes(nodes, target))
     393        if (DeleteCommand.checkAndConfirmOutlyingDelete(Main.main.getCurrentDataSet().getDataSourceArea(), nodes, target))
    393394            return MergeNodesAction.mergeNodes(Main.main.getEditLayer(), nodes, target);
    394395
     
    406407        return true;
    407408    }
    408 
    409     /**
    410      * Check whether user is about to delete data outside of the download area.
    411      * Request confirmation if he is.
    412      */
    413     private static boolean checkAndConfirmOutlyingDeletes(LinkedHashSet<Node> del, Node ignore) {
    414         Area a = Main.main.getCurrentDataSet().getDataSourceArea();
    415         if (a != null) {
    416             for (OsmPrimitive osm : del) {
    417                 if (osm instanceof Node && !osm.isNew() && osm != ignore) {
    418                     Node n = (Node) osm;
    419                     if (!a.contains(n.getCoor())) {
    420                         JPanel msg = new JPanel(new GridBagLayout());
    421                         msg.add(new JLabel(
    422                                 "<html>" +
    423                                 // leave message in one tr() as there is a grammatical
    424                                 // connection.
    425                                 tr("You are about to delete nodes outside of the area you have downloaded."
    426                                         + "<br>"
    427                                         + "This can cause problems because other objects (that you do not see) might use them."
    428                                         + "<br>" + "Do you really want to delete?") + "</html>"));
    429 
    430                         return ConditionalOptionPaneUtil.showConfirmationDialog(
    431                                 "delete_outside_nodes",
    432                                 Main.parent,
    433                                 msg,
    434                                 tr("Delete confirmation"),
    435                                 JOptionPane.YES_NO_OPTION,
    436                                 JOptionPane.QUESTION_MESSAGE,
    437                                 JOptionPane.YES_OPTION);
    438                     }
    439                 }
    440             }
    441         }
    442         return true;
    443     }
    444409}
Note: See TracChangeset for help on using the changeset viewer.