/*
* Copyright 2013 Serdar.
*
* 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 de.fub.agg2graphui;
import de.fub.agg2graphui.controller.AbstractLayer;
import de.fub.agg2graphui.controller.LayerManager;
import de.fub.agg2graphui.layers.LayerEvent;
import de.fub.agg2graphui.layers.LayerListener;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.util.ArrayList;
import java.util.Collection;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.openide.util.WeakListeners;
/**
*
* @author Serdar
*/
public class LayerStackPanel extends LayerPanel implements ChangeListener, LayerListener {
private static final long serialVersionUID = 1L;
private transient final Object MUTEX = new Object();
private transient LayerManager layerManager;
private transient SortedSet<AbstractLayer<?>> layers = new TreeSet<AbstractLayer<?>>();
/**
* Creates new form LayerPanel
*/
public LayerStackPanel() {
initComponents();
}
public LayerStackPanel(LayerManager layerManager) {
this();
this.layerManager = layerManager;
this.layerManager.addChangeListener(LayerStackPanel.this);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 222, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 119, Short.MAX_VALUE)
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
public LayerManager getLayerManager() {
return layerManager;
}
public Collection<AbstractLayer<?>> getLayers() {
synchronized (MUTEX) {
ArrayList<AbstractLayer<?>> list = new ArrayList< AbstractLayer<?>>();
if (layers != null) {
list.addAll(layers);
}
return list;
}
}
public void addLayer(AbstractLayer<?> abstractLayer) {
synchronized (getTreeLock()) {
getLayers().add(abstractLayer);
stateChanged(new ChangeEvent(this));
}
}
public void removeLayer(AbstractLayer<?> layer) {
synchronized (getTreeLock()) {
getLayers().remove(layer);
stateChanged(new ChangeEvent(this));
}
}
@Override
protected void printComponent(Graphics g) {
super.printComponent(g);
synchronized (getTreeLock()) {
for (AbstractLayer<?> layer : getLayers()) {
layer.paintLayer(g, new Rectangle(getSize()));
}
}
}
@Override
public void stateChanged(ChangeEvent e) {
synchronized (getTreeLock()) {
getLayers().clear();
for (AbstractLayer<?> layer : layerManager.getLayers()) {
getLayers().add(layer);
layer.addLayerListener(WeakListeners.create(LayerListener.class, LayerStackPanel.this, layer));
}
repaint();
}
}
@Override
public void requestRender(LayerEvent event) {
repaint();
}
/**
* @param layers the layers to set
*/
protected void setLayers(SortedSet<AbstractLayer<?>> layers) {
this.layers = layers;
}
}