src.gov.nasa.worldwind.layers.LayerList Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of worldwindx Show documentation
Show all versions of worldwindx Show documentation
World Wind is a collection of components that interactively display 3D geographic information within Java applications or applets.
/*
* Copyright (C) 2012 United States Government as represented by the Administrator of the
* National Aeronautics and Space Administration.
* All Rights Reserved.
*/
package gov.nasa.worldwind.layers;
import gov.nasa.worldwind.*;
import gov.nasa.worldwind.avlist.*;
import gov.nasa.worldwind.event.Message;
import gov.nasa.worldwind.util.Logging;
import java.beans.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* @author Tom Gaskins
* @version $Id: LayerList.java 1171 2013-02-11 21:45:02Z dcollins $
*/
public class LayerList extends CopyOnWriteArrayList implements WWObject
{
private WWObjectImpl wwo = new WWObjectImpl(this);
public LayerList()
{
}
public LayerList(Layer[] layers)
{
if (layers == null)
{
String message = Logging.getMessage("nullValue.LayersIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
this.addAll(Arrays.asList(layers));
}
public LayerList(LayerList layerList)
{
super(layerList);
}
public String getDisplayName()
{
return this.getStringValue(AVKey.DISPLAY_NAME);
}
public void setDisplayName(String displayName)
{
this.setValue(AVKey.DISPLAY_NAME, displayName);
}
protected LayerList makeShallowCopy(LayerList sourceList)
{
return new LayerList(sourceList);
}
public static List getListDifference(LayerList oldList, LayerList newList)
{
ArrayList deltaList = new ArrayList();
for (Layer layer : newList)
{
if (!oldList.contains(layer))
deltaList.add(layer);
}
return deltaList;
}
/**
* Aggregate the contents of a group of layer lists into a single one. All layers are placed in the first designated
* list and removed from the subsequent lists.
*
* @param lists an array containing the lists to aggregate. All members of the second and subsequent lists in the
* array are added to the first list in the array.
*
* @return the aggregated list.
*
* @throws IllegalArgumentException if the layer-lists array is null or empty.
*/
public static LayerList collapseLists(LayerList[] lists)
{
if (lists == null || lists.length == 0)
{
String message = Logging.getMessage("nullValue.LayersListArrayIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
LayerList list = lists[0];
for (int i = 1; i < lists.length; i++)
{
LayerList ll = lists[i];
for (Layer layer : ll)
{
list.add(layer);
}
for (Layer layer : ll)
{
ll.remove(layer);
}
}
return list;
}
public static List getLayersAdded(LayerList oldList, LayerList newList)
{
return getListDifference(oldList, newList);
}
public static List getLayersRemoved(LayerList oldList, LayerList newList)
{
return getListDifference(newList, oldList);
}
public boolean add(Layer layer)
{
if (layer == null)
{
String message = Logging.getMessage("nullValue.LayerIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
LayerList copy = makeShallowCopy(this);
super.add(layer);
layer.addPropertyChangeListener(this);
this.firePropertyChange(AVKey.LAYERS, copy, this);
return true;
}
public void add(int index, Layer layer)
{
if (layer == null)
{
String message = Logging.getMessage("nullValue.LayerIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
LayerList copy = makeShallowCopy(this);
super.add(index, layer);
layer.addPropertyChangeListener(this);
this.firePropertyChange(AVKey.LAYERS, copy, this);
}
public void remove(Layer layer)
{
if (layer == null)
{
String msg = Logging.getMessage("nullValue.LayerIsNull");
Logging.logger().severe(msg);
throw new IllegalArgumentException(msg);
}
if (!this.contains(layer))
return;
LayerList copy = makeShallowCopy(this);
layer.removePropertyChangeListener(this);
super.remove(layer);
this.firePropertyChange(AVKey.LAYERS, copy, this);
}
public Layer remove(int index)
{
Layer layer = get(index);
if (layer == null)
return null;
LayerList copy = makeShallowCopy(this);
layer.removePropertyChangeListener(this);
super.remove(index);
this.firePropertyChange(AVKey.LAYERS, copy, this);
return layer;
}
public boolean moveLower(Layer targetLayer)
{
int index = this.indexOf(targetLayer);
if (index <= 0)
return false;
this.remove(index);
this.add(index - 1, targetLayer);
return true;
}
public boolean moveHigher(Layer targetLayer)
{
int index = this.indexOf(targetLayer);
if (index < 0)
return false;
this.remove(index);
this.add(index + 1, targetLayer);
return true;
}
public Layer set(int index, Layer layer)
{
if (layer == null)
{
String message = Logging.getMessage("nullValue.LayerIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
Layer oldLayer = this.get(index);
if (oldLayer != null)
oldLayer.removePropertyChangeListener(this);
LayerList copy = makeShallowCopy(this);
super.set(index, layer);
layer.addPropertyChangeListener(this);
this.firePropertyChange(AVKey.LAYERS, copy, this);
return oldLayer;
}
public boolean remove(Object o)
{
for (Layer layer : this)
{
if (layer.equals(o))
layer.removePropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean removed = super.remove(o);
if (removed)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return removed;
}
public boolean addIfAbsent(Layer layer)
{
for (Layer l : this)
{
if (l.equals(layer))
return false;
}
layer.addPropertyChangeListener(this);
LayerList copy = makeShallowCopy(this);
boolean added = super.addIfAbsent(layer);
if (added)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return added;
}
public boolean removeAll(Collection objects)
{
for (Layer layer : this)
{
layer.removePropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean removed = super.removeAll(objects);
if (removed)
this.firePropertyChange(AVKey.LAYERS, copy, this);
for (Layer layer : this)
{
layer.addPropertyChangeListener(this);
}
return removed;
}
public boolean removeAll()
{
for (Layer layer : this)
{
layer.removePropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean removed = super.retainAll(new ArrayList()); // retain no layers
if (removed)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return removed;
}
public int addAllAbsent(Collection layers)
{
for (Layer layer : layers)
{
if (!this.contains(layer))
layer.addPropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
int numAdded = super.addAllAbsent(layers);
if (numAdded > 0)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return numAdded;
}
public boolean addAll(Collection layers)
{
for (Layer layer : layers)
{
layer.addPropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean added = super.addAll(layers);
if (added)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return added;
}
public boolean addAll(int i, Collection layers)
{
for (Layer layer : layers)
{
layer.addPropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean added = super.addAll(i, layers);
if (added)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return added;
}
@SuppressWarnings( {"SuspiciousMethodCalls"})
public boolean retainAll(Collection objects)
{
for (Layer layer : this)
{
if (!objects.contains(layer))
layer.removePropertyChangeListener(this);
}
LayerList copy = makeShallowCopy(this);
boolean added = super.retainAll(objects);
if (added)
this.firePropertyChange(AVKey.LAYERS, copy, this);
return added;
}
public void replaceAll(Collection layers)
{
ArrayList toDelete = new ArrayList();
ArrayList toKeep = new ArrayList();
for (Layer layer : layers)
{
if (!this.contains(layer))
toDelete.add(layer);
else
toKeep.add(layer);
}
for (Layer layer : toDelete)
{
this.remove(layer);
}
super.clear();
for (Layer layer : layers)
{
if (!toKeep.contains(layer))
layer.addPropertyChangeListener(this);
super.add(layer);
}
}
public Layer getLayerByName(String name)
{
if (name == null)
{
String message = Logging.getMessage("nullValue.NameIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
for (Layer l : this)
{
if (l.getName().equals(name))
return l;
}
return null;
}
public List getLayersByClass(Class classToFind)
{
if (classToFind == null)
{
String message = Logging.getMessage("nullValue.ClassIsNull");
Logging.logger().severe(message);
throw new IllegalArgumentException(message);
}
ArrayList layers = new ArrayList();
for (Layer l : this)
{
if (l.getClass().equals(classToFind))
layers.add(l);
}
return layers;
}
public Object getValue(String key)
{
return wwo.getValue(key);
}
public Collection