/*
* Copyright (c) 2008 Stiftung Deutsches Elektronen-Synchrotron,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
/**
*
*/
package org.csstudio.sds.internal.model;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import org.csstudio.sds.model.ContainerModel;
/**
* Encapsulates layer relevant model information.
*
* @author swende
*
*/
public final class LayerSupport implements PropertyChangeListener {
/**
* ID for <i>add layer</i> events.
*/
public static final String PROP_LAYER_ADDED = "PROP_LAYER_ADDED";
/**
* ID for <i>remove layer</i> events.
*/
public static final String PROP_LAYER_REMOVED = "PROP_LAYER_REMOVED";
/**
* ID for <i>moved layer</i> events.
*/
public static final String PROP_LAYER_MOVED = "PROP_LAYER_MOVED";
/**
* ID for <i>layer detail</i> events.
*/
public static final String PROP_LAYER_DETAILS = "PROP_LAYER_DETAILS";
/**
* The default name for a Layer.
*/
public static final String DEFAULT_NAME = "DEFAULT";
/**
* The id of the default layer.
*/
public static final String DEFAULT_LAYER_ID = "DEFAULT_LAYER_ID";
/**
* A list that contains all layers.
*/
private List<Layer> _layers;
/**
* Contains all layer model listeners.
*/
private List<ILayerModelListener> _listeners;
/**
* The default layer. (Will always exist and cannot be deleted).
*/
private Layer _defaultLayer;
/**
* The layer that is marked as active layer.
*/
private Layer _activeLayer;
/**
* The {@link ContainerModel} of this {@link LayerSupport}.
*/
private final ContainerModel _parent;
/**
* Constructor.
* @param parent
* The parent for this {@link LayerSupport}
*/
public LayerSupport(final ContainerModel parent) {
_parent = parent;
_layers = new ArrayList<Layer>();
_listeners = new ArrayList<ILayerModelListener>();
// add default layer
_defaultLayer = new Layer(DEFAULT_LAYER_ID, DEFAULT_NAME);
doAddLayer(_defaultLayer, 0);
// mark default layer as active layer
_activeLayer = _defaultLayer;
}
/**
* Returns the parent of this {@link LayerSupport}.
* @return The parent
*/
public ContainerModel getParent() {
return _parent;
}
/**
* Adds a layer model listener.
*
* @param listener
* the listener
*/
public void addLayerModelListener(final ILayerModelListener listener) {
if (!_listeners.contains(listener)) {
_listeners.add(listener);
}
}
/**
* Removes a layer model listener.
*
* @param listener
* the listener
*/
public void removeLayerModelListener(final ILayerModelListener listener) {
if (_listeners.contains(listener)) {
_listeners.remove(listener);
}
}
/**
* Adds the specified layer to the layer model.
*
* @param layer
* the layer
*/
public void addLayer(final Layer layer) {
doAddLayer(layer, _layers.size());
}
/**
* Adds the specified layer to the layer model using a certain insert
* position.
*
* @param layer
* the layer
* @param index
* the index of the insert position for the new layer
*/
public void addLayer(final Layer layer, final int index) {
doAddLayer(layer, index);
}
/**
* Removes the specified layer.
*
* @param layer
* the layer
*/
public void removeLayer(final Layer layer) {
if (_layers.contains(layer) && layer != _defaultLayer) {
_layers.remove(layer);
layer.removePropertyChangeListener(this);
fireLayerModelChangeEvent(layer, PROP_LAYER_REMOVED);
}
}
/**
* Gets the index of the specified layer.
*
* @param layer
* the layer
* @return the index position of the specified layer
*/
public int getLayerIndex(final Layer layer) {
return _layers.indexOf(layer);
}
/**
* Returns the default layer.
*
* @return the default layer
*/
public Layer getDefaultLayer() {
return _defaultLayer;
}
/**
* Sets the active layer.
*
* @param layer
* the active layer
*/
public void setActiveLayer(final Layer layer) {
assert layer != null;
assert _layers.contains(layer) : "_layers.contains(layer)";
_activeLayer = layer;
}
/**
* Returns the active layer.
*
* @return the active layer
*/
public Layer getActiveLayer() {
return _activeLayer;
}
/**
* Returns all layers.
*
* @return all layers
*/
public List<Layer> getLayers() {
return new ArrayList<Layer>(_layers);
}
/**
* Changes the index position of the specified layer.
*
* @param layer
* the layer
* @param newPos
* the new index position
*/
public void changeLayerPosition(final Layer layer, final int newPos) {
assert layer != null;
assert _layers.contains(layer) : "_layers.contains(layer)";
assert newPos >= 0 : "newPos>=0";
assert newPos < _layers.size() : "newPos<_layers.size()";
_layers.remove(layer);
_layers.add(newPos, layer);
fireLayerModelChangeEvent(layer, PROP_LAYER_MOVED);
}
/**
* Tries to find a layer with the specified id.
*
* @param layerId
* the layer id
* @return a layer with that id or null if no layer was found
*/
public Layer findLayer(final String layerDescription) {
assert layerDescription != null;
boolean found = false;
Layer result = _defaultLayer;
for (Layer layer : _layers) {
if (layer.getId().equals(layerDescription)) {
result = layer;
found = true;
}
}
if (!found) {
for (Layer layer : _layers) {
if (layer.getDescription().equals(layerDescription)) {
result = layer;
}
}
}
return result;
}
/**
* {@inheritDoc}
*/
@Override
public void propertyChange(final PropertyChangeEvent evt) {
fireLayerModelChangeEvent((Layer) evt.getSource(), evt.getPropertyName());
}
/**
* Adds the specified layer to the model.
*
* @param layer
* the layer
* @param index
* the insert position
*/
private void doAddLayer(final Layer layer, final int index) {
int layerIndex = index;
if (layer.getId().equals(DEFAULT_LAYER_ID)) {
// Layer oldDefaultLayer = _defaultLayer;
layerIndex = Math.max(getLayerIndex(_defaultLayer), 0);
removeLayer(_defaultLayer);
_defaultLayer = layer;
}
if (!_layers.contains(layer)) {
_layers.add(layerIndex, layer);
layer.addPropertyChangeListener(this);
fireLayerModelChangeEvent(layer, PROP_LAYER_ADDED);
}
}
/**
* Fires a layer model change event, which is forwarded to all registered
* {@link ILayerModelListener}.
*
* @param layer
* the layer that caused the event
* @param property
* the property name which identifies the event type
*/
private void fireLayerModelChangeEvent(final Layer layer, final String property) {
for (ILayerModelListener l : _listeners) {
l.layerChanged(layer, property);
}
}
public boolean isLayerId(String layerDescription) {
for (Layer layer : _layers) {
if (layer.getId().equals(layerDescription)) {
return true;
}
}
return false;
}
public boolean isLayerName(String layerDescription) {
for (Layer layer : _layers) {
if (layer.getDescription().equals(layerDescription)) {
return true;
}
}
return false;
}
}