Ignore:
Timestamp:
2012-05-12T15:39:13+02:00 (12 years ago)
Author:
Don-vip
Message:

fix #7684 - Various improvements in "upload=false" layers handling

File:
1 edited

Legend:

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

    r4982 r5233  
    77import java.awt.event.ActionEvent;
    88import java.awt.event.KeyEvent;
     9import java.util.Collection;
     10import java.util.Collections;
    911import java.util.List;
    1012
     
    1214import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
    1315import org.openstreetmap.josm.gui.layer.Layer;
     16import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     17import org.openstreetmap.josm.gui.util.GuiHelper;
     18import org.openstreetmap.josm.tools.ImageProvider;
    1419import org.openstreetmap.josm.tools.Shortcut;
    1520
     
    2530    }
    2631
    27     public void merge(List<Layer> sourceLayers) {
    28         Layer targetLayer = askTargetLayer(sourceLayers);
     32    protected void doMerge(List<Layer> targetLayers, final Collection<Layer> sourceLayers) {
     33        final Layer targetLayer = askTargetLayer(targetLayers);
    2934        if (targetLayer == null)
    3035            return;
    31         for (Layer l: sourceLayers) {
    32             if (l != targetLayer) {
    33                 targetLayer.mergeFrom(l);
    34                 Main.map.mapView.removeLayer(l);
     36        Main.worker.submit(new Runnable() {
     37            @Override
     38            public void run() {
     39                boolean layerMerged = false;
     40                for (Layer sourceLayer: sourceLayers) {
     41                    if (sourceLayer != null && sourceLayer != targetLayer) {
     42                        if (sourceLayer instanceof OsmDataLayer && targetLayer instanceof OsmDataLayer
     43                                && ((OsmDataLayer)sourceLayer).isUploadDiscouraged() != ((OsmDataLayer)targetLayer).isUploadDiscouraged()) {
     44                            if (warnMergingUploadDiscouragedLayers(sourceLayer, targetLayer)) {
     45                                break;
     46                            }
     47                        }
     48                        targetLayer.mergeFrom(sourceLayer);
     49                        Main.map.mapView.removeLayer(sourceLayer);
     50                        layerMerged = true;
     51                    }
     52                }
     53                if (layerMerged) {
     54                    Main.map.mapView.setActiveLayer(targetLayer);
     55                }
    3556            }
    36         }
    37         Main.map.mapView.setActiveLayer(targetLayer);
     57        });
     58    }
     59   
     60    public void merge(List<Layer> sourceLayers) {
     61        doMerge(sourceLayers, sourceLayers);
    3862    }
    3963
    40     public void merge(final Layer sourceLayer) {
     64    public void merge(Layer sourceLayer) {
    4165        if (sourceLayer == null)
    4266            return;
     
    4670            return;
    4771        }
    48         final Layer targetLayer = askTargetLayer(targetLayers);
    49         if (targetLayer == null)
    50             return;
    51         Main.worker.submit(new Runnable() {
    52             @Override
    53             public void run() {
    54                 targetLayer.mergeFrom(sourceLayer);
    55                 Main.map.mapView.removeLayer(sourceLayer);
    56                 Main.map.mapView.setActiveLayer(targetLayer);
    57             }
    58         });
     72        doMerge(targetLayers, Collections.singleton(sourceLayer));
    5973    }
    6074
     
    7488        setEnabled(!LayerListDialog.getInstance().getModel().getPossibleMergeTargets(getEditLayer()).isEmpty());
    7589    }
     90   
     91    /**
     92     * returns true if the user wants to cancel, false if they want to continue
     93     */
     94    public static final boolean warnMergingUploadDiscouragedLayers(Layer sourceLayer, Layer targetLayer) {
     95        return GuiHelper.warnUser(tr("Merging layers with different upload policies"),
     96                "<html>" +
     97                tr("You are about to merge data between layers ''{0}'' and ''{1}''.<br /><br />"+
     98                        "These layers have different upload policies and should not been merged as it.<br />"+
     99                        "Merging them will result to enforce the stricter policy (upload discouraged) to ''{1}''.<br /><br />"+
     100                        "<b>This is not the recommended way of merging such data</b>.<br />"+
     101                        "You should instead check and merge each object, one by one, by using ''<i>Merge selection</i>''.<br /><br />"+
     102                        "Are you sure you want to continue?", sourceLayer.getName(), targetLayer.getName(), targetLayer.getName())+
     103                "</html>",
     104                ImageProvider.get("dialogs", "mergedown"), tr("Ignore this hint and merge anyway"));
     105    }
    76106}
Note: See TracChangeset for help on using the changeset viewer.