/*******************************************************************************
* Copyright 2014 Geoscience Australia
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package au.gov.ga.earthsci.layer;
import gov.nasa.worldwind.layers.Layer;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import au.gov.ga.earthsci.layer.tree.ILayerNode;
/**
* Layer draw order constants.
*
* @author Michael de Hoog (michael.dehoog@ga.gov.au)
*/
public enum DrawOrder
{
Pre(-20, Messages.DrawOrder_PreLabel),
Below(-10, Messages.DrawOrder_BelowLabel),
Surface(0, Messages.DrawOrder_SurfaceLabel),
Above(10, Messages.DrawOrder_AboveLabel),
Post(20, Messages.DrawOrder_PostLabel);
public final int value;
public final String label;
private DrawOrder(int value, String label)
{
this.value = value;
this.label = label;
}
public static String getLabel(Integer value)
{
if (value != null)
{
for (DrawOrder order : DrawOrder.values())
{
if (order.value == value)
{
return order.label;
}
}
}
return Messages.DrawOrder_UnknownLabel;
}
public static int getDefaultDrawOrder(Class<? extends Layer> layerClass)
{
Integer value = ExtensionManager.getInstance().getDrawOrderFor(layerClass);
if (value != null)
{
return value;
}
return Surface.value;
}
/**
* Sort the unsorted list of layers according to their {@link DrawOrder}
* value. Layers have a draw order value associated with them if they
* implement {@link ILayerNode}. Any non-{@link ILayerNode} layers are
* inserted at the end of the list.
*
* @param unsorted
* List of layers to sort
* @param sorted
* List in which the sorted layers get added to
* @see ILayerNode#getDrawOrder()
*/
public static void sortLayers(List<Layer> unsorted, List<Layer> sorted)
{
//return empty if no layers
if (unsorted == null)
{
return;
}
//find a sorted set of all draw order values
SortedSet<Integer> drawOrders = new TreeSet<Integer>();
for (Layer layer : unsorted)
{
if (layer instanceof ILayerNode)
{
drawOrders.add(((ILayerNode) layer).getDrawOrder());
}
}
//for each draw order, add the the layers with that draw order to the sorted list
for (Integer drawOrder : drawOrders)
{
for (Layer layer : unsorted)
{
if (layer instanceof ILayerNode)
{
if (drawOrder == ((ILayerNode) layer).getDrawOrder())
{
sorted.add(layer);
}
}
}
}
//add any layers without draw orders to the end to be rendered last
for (Layer layer : unsorted)
{
if (!(layer instanceof ILayerNode))
{
sorted.add(layer);
}
}
}
}