Ticket #8509: bug-fix.patch

File bug-fix.patch, 3.4 KB (added by udit, 8 years ago)

Bug fix for deletion

  • src/org/openstreetmap/josm/gui/layer/MainLayerManager.java

     
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    6 import java.util.ArrayList;
    7 import java.util.Collection;
    8 import java.util.List;
    9 import java.util.ListIterator;
     6import java.util.*;
    107import java.util.concurrent.CopyOnWriteArrayList;
    118
    129import javax.swing.JOptionPane;
     
    1310
    1411import org.openstreetmap.josm.data.osm.DataSet;
    1512import org.openstreetmap.josm.gui.MainApplication;
     13import org.openstreetmap.josm.gui.io.AsynchronousUploadPrimitivesTask;
    1614import org.openstreetmap.josm.gui.util.GuiHelper;
    1715
    1816/**
     
    273271
    274272    @Override
    275273    protected Collection<Layer> realRemoveSingleLayer(Layer layer) {
    276         if (layer == activeLayer || layer == editLayer) {
    277             Layer nextActive = suggestNextActiveLayer(layer);
    278             setActiveLayer(nextActive, true);
    279         }
     274        if ((layer instanceof OsmDataLayer) && (((OsmDataLayer) layer).isReadOnly())) {
     275            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(MainApplication.parent,
     276                    tr("Trying to delete the layer with background upload. " +
     277                            "Please wait till the upload is finished.")));
    280278
    281         Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
    282         if (getLayers().isEmpty()) {
    283             LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
    284             for (LayerAvailabilityListener l : layerAvailabilityListeners) {
    285                 l.afterLastLayerRemoved(e);
     279            // Return an empty collection for
     280            // allowing to delete other layers
     281            return new ArrayList<>();
     282        } else {
     283            if (layer == activeLayer || layer == editLayer) {
     284                Layer nextActive = suggestNextActiveLayer(layer);
     285                setActiveLayer(nextActive, true);
    286286            }
     287
     288            Collection<Layer> toDelete = super.realRemoveSingleLayer(layer);
     289            if (getLayers().isEmpty()) {
     290                LayerAvailabilityEvent e = new LayerAvailabilityEvent(this, false);
     291                for (LayerAvailabilityListener l : layerAvailabilityListeners) {
     292                    l.afterLastLayerRemoved(e);
     293                }
     294            }
     295            return toDelete;
    287296        }
    288         return toDelete;
    289297    }
    290298
    291299    /**
     
    408416
    409417    @Override
    410418    protected synchronized void realResetState() {
    411         // active and edit layer are unset automatically
    412         super.realResetState();
     419        // Reset state iff no asynchronous upload is under progress
     420        if (!AsynchronousUploadPrimitivesTask.getCurrentAsynchronousUploadTask().isPresent()) {
     421            // active and edit layer are unset automatically
     422            super.realResetState();
    413423
    414         activeLayerChangeListeners.clear();
    415         layerAvailabilityListeners.clear();
     424            activeLayerChangeListeners.clear();
     425            layerAvailabilityListeners.clear();
     426        } else {
     427            GuiHelper.runInEDT(() -> JOptionPane.showMessageDialog(MainApplication.parent,
     428                    tr("A background upload is already in progress. " +
     429                            "Cannot reset state till the upload is finished.")));
     430        }
    416431    }
    417432
    418433    /**