/*
* Copyright (C) 2012 United States Government as represented by the Administrator of the
* National Aeronautics and Space Administration.
* All Rights Reserved.
*/
package org.jgrasstools.nww.layers.defaults.other;
import java.util.Iterator;
import java.util.List;
import gov.nasa.worldwind.layers.AbstractLayer;
import gov.nasa.worldwind.render.DrawContext;
import gov.nasa.worldwind.render.markers.Marker;
import gov.nasa.worldwind.render.markers.MarkerRenderer;
import gov.nasa.worldwind.terrain.SectorGeometryList;
import gov.nasa.worldwind.util.Logging;
/**
* @author tag
* @version $Id: MarkerLayer.java 1171 2013-02-11 21:45:02Z dcollins $
*/
public class MarkerLayer extends AbstractLayer {
private MarkerRenderer markerRenderer = new MarkerRenderer();
private List<Marker> markers;
private int maxMarkers = -1;
private volatile int markersCount = 0;
public MarkerLayer() {
}
public MarkerLayer(List<Marker> markers) {
this.markers = markers;
markersCount = markers.size();
}
public List<Marker> getMarkers() {
return markers;
}
public void setMarkers(List<Marker> markers) {
this.markers = markers;
markersCount = markers.size();
}
public void addMarker(Marker marker) {
synchronized (markers) {
markers.add(marker);
markersCount++;
if (maxMarkers != -1 && markersCount > maxMarkers) {
// remove previous markers
int toRemove = markersCount - maxMarkers;
Iterator<Marker> iterator = markers.iterator();
int removeCount = 0;
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
markersCount--;
if (removeCount++ >= toRemove) {
break;
}
}
}
}
}
public void setMaxMarkers(int maxMarkers) {
this.maxMarkers = maxMarkers;
}
public double getElevation() {
return this.getMarkerRenderer().getElevation();
}
public void setElevation(double elevation) {
this.getMarkerRenderer().setElevation(elevation);
}
public boolean isOverrideMarkerElevation() {
return this.getMarkerRenderer().isOverrideMarkerElevation();
}
public void setOverrideMarkerElevation(boolean overrideMarkerElevation) {
this.getMarkerRenderer().setOverrideMarkerElevation(overrideMarkerElevation);
}
public boolean isKeepSeparated() {
return this.getMarkerRenderer().isKeepSeparated();
}
public void setKeepSeparated(boolean keepSeparated) {
this.getMarkerRenderer().setKeepSeparated(keepSeparated);
}
public boolean isEnablePickSizeReturn() {
return this.getMarkerRenderer().isEnablePickSizeReturn();
}
public void setEnablePickSizeReturn(boolean enablePickSizeReturn) {
this.getMarkerRenderer().setEnablePickSizeReturn(enablePickSizeReturn);
}
/**
* Opacity is not applied to layers of this type because each marker has an
* attribute set with opacity control.
*
* @param opacity
* the current opacity value, which is ignored by this layer.
*/
@Override
public void setOpacity(double opacity) {
super.setOpacity(opacity);
}
/**
* Returns the layer's opacity value, which is ignored by this layer because
* each of its markers has an attribute with its own opacity control.
*
* @return The layer opacity, a value between 0 and 1.
*/
@Override
public double getOpacity() {
return super.getOpacity();
}
protected MarkerRenderer getMarkerRenderer() {
return markerRenderer;
}
protected void setMarkerRenderer(MarkerRenderer markerRenderer) {
this.markerRenderer = markerRenderer;
}
protected void doRender(DrawContext dc) {
this.draw(dc, null);
}
@Override
protected void doPick(DrawContext dc, java.awt.Point pickPoint) {
this.draw(dc, pickPoint);
}
protected void draw(DrawContext dc, java.awt.Point pickPoint) {
if (this.markers == null)
return;
if (dc.getVisibleSector() == null)
return;
SectorGeometryList geos = dc.getSurfaceGeometry();
if (geos == null)
return;
// Adds markers to the draw context's ordered renderable queue. During
// picking, this gets
// the pick point and the
// current layer from the draw context.
this.getMarkerRenderer().render(dc, this.markers);
}
@Override
public String toString() {
return Logging.getMessage("layers.MarkerLayer.Name");
}
}