/** * Add a layer to the current MapView. The layer will be added at topmost position. * * @param layer The layer to add */ public void addLayer(Layer layer) { boolean isOsmDataLayer = layer instanceof OsmDataLayer; layerLock.writeLock().lock(); layerLock.readLock().lock(); EnumSet<LayerListenerType> listenersToFire = EnumSet.noneOf(LayerListenerType.class); Layer oldActiveLayer = activeLayer; OsmDataLayer oldEditLayer = editLayer; try { try { if (layer instanceof MarkerLayer && playHeadMarker == null) { playHeadMarker = PlayHeadMarker.create(); } if (layer instanceof GpxLayer) { addGpxLayer((GpxLayer) layer); } else if (layers.isEmpty()) { layers.add(layer); } else if (layer.isBackgroundLayer()) { int i = 0; for (; i < layers.size(); i++) { if (layers.get(i).isBackgroundLayer()) { break; } } layers.add(i, layer); } else { layers.add(0, layer); } if (isOsmDataLayer || oldActiveLayer == null) { // autoselect the new layer listenersToFire.addAll(setActiveLayer(layer, true)); } } finally { layerLock.writeLock().unlock(); } fireLayerAdded(layer); if (isOsmDataLayer) { ((OsmDataLayer) layer).addLayerStateChangeListener(this); } onActiveEditLayerChanged(oldActiveLayer, oldEditLayer, listenersToFire); layer.addPropertyChangeListener(this); Main.addProjectionChangeListener(layer); AudioPlayer.reset(); } finally { layerLock.readLock().unlock(); } if (!listenersToFire.isEmpty()) { repaint(); } }