Ticket #13175: patch-fix-13175-2.patch

File patch-fix-13175-2.patch, 9.3 KB (added by michael2402, 8 years ago)
  • src/org/openstreetmap/josm/data/osm/DataSet.java

    diff --git a/src/org/openstreetmap/josm/data/osm/DataSet.java b/src/org/openstreetmap/josm/data/osm/DataSet.java
    index eaad637..991703c 100644
    a b public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    752752            return;
    753753
    754754        highlightedVirtualNodes = waySegments;
    755         // can't use fireHighlightingChanged because it requires an OsmPrimitive
    756         highlightUpdateCount++;
     755        fireHighlightingChanged();
    757756    }
    758757
    759758    /**
    public final class DataSet implements Data, Cloneable, ProjectionChangeListener  
    765764            return;
    766765
    767766        highlightedWaySegments = waySegments;
    768         // can't use fireHighlightingChanged because it requires an OsmPrimitive
    769         highlightUpdateCount++;
     767        fireHighlightingChanged();
    770768    }
    771769
    772770    /**
  • src/org/openstreetmap/josm/gui/MapView.java

    diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
    index 63e4bb4..eed786c 100644
    a b import java.util.Arrays;  
    2626import java.util.Collection;
    2727import java.util.Collections;
    2828import java.util.HashMap;
     29import java.util.IdentityHashMap;
    2930import java.util.LinkedHashSet;
    3031import java.util.List;
    3132import java.util.Set;
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    149150     */
    150151    private class LayerInvalidatedListener implements PaintableInvalidationListener {
    151152        private boolean ignoreRepaint;
     153
     154        private final Set<MapViewPaintable> invalidatedLayers = Collections.newSetFromMap(new IdentityHashMap<MapViewPaintable, Boolean>());
     155
    152156        @Override
    153157        public void paintableInvalidated(PaintableInvalidationEvent event) {
     158            invalidate(event.getLayer());
     159        }
     160
     161        public synchronized void invalidate(MapViewPaintable mapViewPaintable) {
    154162            ignoreRepaint = true;
     163            invalidatedLayers.add(mapViewPaintable);
    155164            repaint();
    156165        }
    157166
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    159168         * Temporary until all {@link MapViewPaintable}s support this.
    160169         * @param p The paintable.
    161170         */
    162         public void addTo(MapViewPaintable p) {
     171        public synchronized void addTo(MapViewPaintable p) {
    163172            if (p instanceof AbstractMapViewPaintable) {
    164173                ((AbstractMapViewPaintable) p).addInvalidationListener(this);
    165174            }
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    169178         * Temporary until all {@link MapViewPaintable}s support this.
    170179         * @param p The paintable.
    171180         */
    172         public void removeFrom(MapViewPaintable p) {
     181        public synchronized void removeFrom(MapViewPaintable p) {
    173182            if (p instanceof AbstractMapViewPaintable) {
    174183                ((AbstractMapViewPaintable) p).removeInvalidationListener(this);
    175184            }
     185            invalidatedLayers.remove(p);
    176186        }
    177187
    178188        /**
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    185195            }
    186196            ignoreRepaint = false;
    187197        }
     198
     199        /**
     200         * Retrives a set of all layers that have been marked as invalid since the last call to this method.
     201         * @return The layers
     202         */
     203        protected synchronized Set<MapViewPaintable> collectInvalidatedLayers() {
     204            Set<MapViewPaintable> layers = Collections.newSetFromMap(new IdentityHashMap<MapViewPaintable, Boolean>());
     205            layers.addAll(invalidatedLayers);
     206            invalidatedLayers.clear();
     207            return layers;
     208        }
    188209    }
    189210
    190211    /**
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    505526    private transient BufferedImage offscreenBuffer;
    506527    // Layers that wasn't changed since last paint
    507528    private final transient List<Layer> nonChangedLayers = new ArrayList<>();
    508     private transient Layer changedLayer;
    509529    private int lastViewID;
    510530    private boolean paintPreferencesChanged = true;
    511531    private Rectangle lastClipBounds = new Rectangle();
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    521541     */
    522542    private final HashMap<Layer, LayerPainter> registeredLayers = new HashMap<>();
    523543
     544
     545
    524546    /**
    525547     * Constructs a new {@code MapView}.
    526548     * @param layerManager The layers to display.
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    843865        List<Layer> visibleLayers = layerManager.getVisibleLayersInZOrder();
    844866
    845867        int nonChangedLayersCount = 0;
     868        Set<MapViewPaintable> invalidated = invalidatedListener.collectInvalidatedLayers();
    846869        for (Layer l: visibleLayers) {
    847             if (l.isChanged() || l == changedLayer) {
     870            if (l.isChanged() || invalidated.contains(l)) {
    848871                break;
    849872            } else {
    850873                nonChangedLayersCount++;
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    901924        }
    902925
    903926        nonChangedLayers.clear();
    904         changedLayer = null;
    905927        for (int i = 0; i < nonChangedLayersCount; i++) {
    906928            nonChangedLayers.add(visibleLayers.get(i));
    907929        }
    LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {  
    12351257                evt.getPropertyName().equals(Layer.FILTER_STATE_PROP)) {
    12361258            Layer l = (Layer) evt.getSource();
    12371259            if (l.isVisible()) {
    1238                 changedLayer = l;
    1239                 repaint();
     1260                invalidatedListener.invalidate(l);
    12401261            }
    12411262        }
    12421263    }
  • src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
    index faf94af..a57bd9a 100644
    a b implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    136136     * Initial zoom lvl is set to bestZoom
    137137     */
    138138    public int currentZoomLevel;
    139     private boolean needRedraw;
    140139
    141140    private final AttributionSupport attribution = new AttributionSupport();
    142141    private final TileHolder clickedTileHolder = new TileHolder();
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    263262            tile.setImage(null);
    264263        }
    265264        tile.setLoaded(success);
    266         needRedraw = true;
    267         if (Main.map != null) {
    268             Main.map.repaint(100);
    269         }
     265        // TODO: Delay 100 ms
     266        invalidate();
    270267        if (Main.isDebugEnabled()) {
    271268            Main.debug("tileLoadingFinished() tile: " + tile + " success: " + success);
    272269        }
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    296293     * @see #invalidate() To trigger a repaint of all places where the layer is displayed.
    297294     */
    298295    protected void redraw() {
    299         needRedraw = true;
    300         if (isVisible()) Main.map.repaint();
    301     }
    302 
    303     @Override
    304     public void invalidate() {
    305         needRedraw = true;
    306         super.invalidate();
     296        invalidate();
    307297    }
    308298
    309299    /**
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    10351025    @Override
    10361026    public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
    10371027        boolean done = (infoflags & (ERROR | FRAMEBITS | ALLBITS)) != 0;
    1038         needRedraw = true;
    10391028        if (Main.isDebugEnabled()) {
    10401029            Main.debug("imageUpdate() done: " + done + " calling repaint");
    10411030        }
    1042         Main.map.repaint(done ? 0 : 100);
     1031        // TODO: Trigger delayed invalidation if !done.
     1032        invalidate();
    10431033        return !done;
    10441034    }
    10451035
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    15211511    public void paint(Graphics2D g, MapView mv, Bounds bounds) {
    15221512        ProjectionBounds pb = mv.getState().getViewArea().getProjectionBounds();
    15231513
    1524         needRedraw = false;
    1525 
    15261514        int zoom = currentZoomLevel;
    15271515        if (getDisplaySettings().isAutoZoom()) {
    15281516            zoom = getBestZoom();
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    17581746
    17591747    @Override
    17601748    public boolean isChanged() {
    1761         return needRedraw;
     1749        // we use #invalidate()
     1750        return false;
    17621751    }
    17631752
    17641753    /**
  • src/org/openstreetmap/josm/gui/layer/Layer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/Layer.java b/src/org/openstreetmap/josm/gui/layer/Layer.java
    index 7347110..f70f0d8 100644
    a b public abstract class Layer extends AbstractMapViewPaintable implements Destroya  
    425425     * Check changed status of layer
    426426     *
    427427     * @return True if layer was changed since last paint
     428     * @deprecated This is not supported by multiple map views.
     429     * Fire an {@link #invalidate()} to trigger a repaint.
     430     * Let this method return false if you only use invalidation events.
    428431     */
     432    @Deprecated
    429433    public boolean isChanged() {
    430434        return true;
    431435    }