/*
* JAME 6.2.1
* http://jame.sourceforge.net
*
* Copyright 2001, 2016 Andrea Medeghini
*
* This file is part of JAME.
*
* JAME is an application for creating fractals and other graphics artifacts.
*
* JAME is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* JAME is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with JAME. If not, see <http://www.gnu.org/licenses/>.
*
*/
package net.sf.jame.twister.frame;
import net.sf.jame.core.config.ListConfigElement;
import net.sf.jame.core.config.ListRuntimeElement;
import net.sf.jame.core.config.RuntimeElement;
import net.sf.jame.core.config.ValueChangeEvent;
import net.sf.jame.core.config.ValueChangeListener;
import net.sf.jame.twister.frameFilter.FrameFilterConfigElement;
import net.sf.jame.twister.frameFilter.FrameFilterRuntimeElement;
import net.sf.jame.twister.layer.GroupLayerConfigElement;
import net.sf.jame.twister.layer.GroupLayerRuntimeElement;
/**
* @author Andrea Medeghini
*/
public class FrameRuntimeElement extends RuntimeElement {
private final ListRuntimeElement<GroupLayerRuntimeElement> layerListElement = new ListRuntimeElement<GroupLayerRuntimeElement>(1);
private final ListRuntimeElement<FrameFilterRuntimeElement> filterListElement = new ListRuntimeElement<FrameFilterRuntimeElement>(0);
private FilterListElementListener filtersListener;
private LayerListElementListener layersListener;
private FrameConfigElement frameElement;
/**
* Constructs a new frame.
*
* @param frameElement
*/
public FrameRuntimeElement(final FrameConfigElement frameElement) {
if (frameElement == null) {
throw new IllegalArgumentException("frameElement is null");
}
this.frameElement = frameElement;
createFilters(frameElement);
filtersListener = new FilterListElementListener();
frameElement.getFilterListElement().addChangeListener(filtersListener);
createLayers(frameElement);
layersListener = new LayerListElementListener();
frameElement.getLayerListElement().addChangeListener(layersListener);
}
/**
* @see net.sf.jame.core.config.RuntimeElement#dispose()
*/
@Override
public void dispose() {
if ((frameElement != null) && (filtersListener != null)) {
frameElement.getFilterListElement().removeChangeListener(filtersListener);
}
filtersListener = null;
if ((frameElement != null) && (layersListener != null)) {
frameElement.getLayerListElement().removeChangeListener(layersListener);
}
layersListener = null;
filterListElement.dispose();
layerListElement.dispose();
frameElement = null;
super.dispose();
}
private void createFilters(final FrameConfigElement frameElement) {
for (int i = 0; i < frameElement.getFilterConfigElementCount(); i++) {
final FrameFilterConfigElement filterElement = frameElement.getFilterConfigElement(i);
final FrameFilterRuntimeElement filter = new FrameFilterRuntimeElement(filterElement);
appendFilter(filter);
}
}
private void createLayers(final FrameConfigElement frameElement) {
for (int i = 0; i < frameElement.getLayerConfigElementCount(); i++) {
final GroupLayerConfigElement layerElement = frameElement.getLayerConfigElement(i);
final GroupLayerRuntimeElement layer = new GroupLayerRuntimeElement(layerElement);
appendLayer(layer);
}
}
/**
* Returns a layer.
*
* @param index the layer index.
* @return the layer.
*/
public GroupLayerRuntimeElement getLayer(final int index) {
return layerListElement.getElement(index);
}
/**
* Returns the layer index.
*
* @param layer the layer.
* @return the index.
*/
public int indexOfLayer(final GroupLayerRuntimeElement layer) {
return layerListElement.indexOfElement(layer);
}
/**
* Returns the number of layers.
*
* @return the number of layers.
*/
public int getLayerCount() {
return layerListElement.getElementCount();
}
private void appendLayer(final GroupLayerRuntimeElement layer) {
layerListElement.appendElement(layer);
}
private void insertLayerAfter(final int index, final GroupLayerRuntimeElement layer) {
layerListElement.insertElementAfter(index, layer);
}
private void insertLayerBefore(final int index, final GroupLayerRuntimeElement layer) {
layerListElement.insertElementBefore(index, layer);
}
private void removeLayer(final int index) {
layerListElement.getElement(index).dispose();
layerListElement.removeElement(index);
}
/**
* Returns a filter.
*
* @param index the filter index.
* @return the filter.
*/
public FrameFilterRuntimeElement getFilter(final int index) {
return filterListElement.getElement(index);
}
/**
* Returns the filter index.
*
* @param filter the filter.
* @return the index.
*/
public int indexOfFilter(final FrameFilterRuntimeElement filter) {
return filterListElement.indexOfElement(filter);
}
/**
* Returns the number of filters.
*
* @return the number of filters.
*/
public int getFilterCount() {
return filterListElement.getElementCount();
}
private void appendFilter(final FrameFilterRuntimeElement filter) {
filterListElement.appendElement(filter);
}
private void insertFilterAfter(final int index, final FrameFilterRuntimeElement filter) {
filterListElement.insertElementAfter(index, filter);
}
private void insertFilterBefore(final int index, final FrameFilterRuntimeElement filter) {
filterListElement.insertElementBefore(index, filter);
}
private void removeFilter(final int index) {
filterListElement.getElement(index).dispose();
filterListElement.removeElement(index);
}
private void moveUpLayer(final int index) {
layerListElement.moveElementUp(index);
}
private void moveDownLayer(final int index) {
layerListElement.moveElementDown(index);
}
private void setLayer(final int index, final GroupLayerRuntimeElement layer) {
layerListElement.setElement(index, layer);
}
private void moveUpFilter(final int index) {
filterListElement.moveElementUp(index);
}
private void moveDownFilter(final int index) {
filterListElement.moveElementDown(index);
}
private void setFilter(final int index, final FrameFilterRuntimeElement filter) {
filterListElement.setElement(index, filter);
}
/**
* @see net.sf.jame.core.config.RuntimeElement#isChanged()
*/
@Override
public boolean isChanged() {
final boolean layersChanged = layerListElement.isChanged();
final boolean filtersChanged = filterListElement.isChanged();
return super.isChanged() || layersChanged || filtersChanged;
}
private class LayerListElementListener implements ValueChangeListener {
/**
* @see net.sf.jame.core.config.ValueChangeListener#valueChanged(net.sf.jame.core.config.ValueChangeEvent)
*/
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ListConfigElement.ELEMENT_ADDED: {
appendLayer(new GroupLayerRuntimeElement((GroupLayerConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_AFTER: {
insertLayerAfter(((Integer) e.getParams()[1]).intValue(), new GroupLayerRuntimeElement((GroupLayerConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_BEFORE: {
insertLayerBefore(((Integer) e.getParams()[1]).intValue(), new GroupLayerRuntimeElement((GroupLayerConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_REMOVED: {
removeLayer(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_UP: {
moveUpLayer(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_DOWN: {
moveDownLayer(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_CHANGED: {
setLayer(((Integer) e.getParams()[1]).intValue(), new GroupLayerRuntimeElement((GroupLayerConfigElement) e.getParams()[0]));
fireChanged();
break;
}
default: {
break;
}
}
}
}
private class FilterListElementListener implements ValueChangeListener {
/**
* @see net.sf.jame.core.config.ValueChangeListener#valueChanged(net.sf.jame.core.config.ValueChangeEvent)
*/
public void valueChanged(final ValueChangeEvent e) {
switch (e.getEventType()) {
case ListConfigElement.ELEMENT_ADDED: {
appendFilter(new FrameFilterRuntimeElement((FrameFilterConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_AFTER: {
insertFilterAfter(((Integer) e.getParams()[1]).intValue(), new FrameFilterRuntimeElement((FrameFilterConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_BEFORE: {
insertFilterBefore(((Integer) e.getParams()[1]).intValue(), new FrameFilterRuntimeElement((FrameFilterConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_REMOVED: {
removeFilter(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_UP: {
moveUpFilter(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_DOWN: {
moveDownFilter(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_CHANGED: {
setFilter(((Integer) e.getParams()[1]).intValue(), new FrameFilterRuntimeElement((FrameFilterConfigElement) e.getParams()[0]));
fireChanged();
break;
}
default: {
break;
}
}
}
}
}