// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.layer; import java.util.concurrent.CopyOnWriteArrayList; /** * This class implements the invalidation listener mechanism suggested by {@link MapViewPaintable} and a default #atta * * @author Michael Zangl * @since 10031 */ public abstract class AbstractMapViewPaintable implements MapViewPaintable { /** * This is the default implementation of the layer painter. * <p> * You should not use it. Write your own implementation and put your paint code into that class. * <p> * It propagates all calls to the * {@link MapViewPaintable#paint(java.awt.Graphics2D, org.openstreetmap.josm.gui.MapView, org.openstreetmap.josm.data.Bounds)} method. * @author Michael Zangl * @since 10458 */ protected class CompatibilityModeLayerPainter implements LayerPainter { @Override public void paint(MapViewGraphics graphics) { AbstractMapViewPaintable.this.paint( graphics.getDefaultGraphics(), graphics.getMapView(), graphics.getClipBounds().getLatLonBoundsBox()); } @Override public void detachFromMapView(MapViewEvent event) { // ignored in old implementation } } /** * A list of invalidation listeners to call when this layer is invalidated. */ private final CopyOnWriteArrayList<PaintableInvalidationListener> invalidationListeners = new CopyOnWriteArrayList<>(); /** * This method is called whenever this layer is added to a map view. * <p> * You need to return a painter here. * The {@link MapViewPaintable.LayerPainter#detachFromMapView} method is called when the layer is removed * from that map view. You are free to reuse painters. * <p> * You should always call the super method. See {@link #createMapViewPainter} if you want to influence painter creation. * <p> * This replaces {@link Layer#hookUpMapView} in the long run. * @param event the event. * @return A layer painter. * @since 10458 */ public LayerPainter attachToMapView(MapViewEvent event) { return createMapViewPainter(event); } /** * Creates a new LayerPainter. * @param event The event that triggered the creation. * @return The painter. * @since 10458 */ protected LayerPainter createMapViewPainter(MapViewEvent event) { return new CompatibilityModeLayerPainter(); } /** * Adds a new paintable invalidation listener. * @param l The listener to add. */ public void addInvalidationListener(PaintableInvalidationListener l) { invalidationListeners.add(l); } /** * Removes an added paintable invalidation listener. * @param l The listener to remove. */ public void removeInvalidationListener(PaintableInvalidationListener l) { invalidationListeners.remove(l); } /** * This needs to be called whenever the content of this view was invalidated. */ public void invalidate() { for (PaintableInvalidationListener l : invalidationListeners) { l.paintableInvalidated(new PaintableInvalidationEvent(this)); } } }