/*
* 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.contextfree.cfdg;
import net.sf.jame.contextfree.figure.FigureConfigElement;
import net.sf.jame.contextfree.figure.FigureRuntimeElement;
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.core.config.ValueConfigElement;
import net.sf.jame.core.util.Color32bit;
/**
* @author Andrea Medeghini
*/
public class CFDGRuntimeElement extends RuntimeElement {
private CFDGConfigElement cfdgElement;
private String startshape;
private StartshapeListener startshapeListener;
private String variation;
private VariationListener variationListener;
private String baseDir;
private BaseDirListener baseDirListener;
private Boolean useSize;
private UseSizeListener useSizeListener;
private Boolean useTile;
private UseTileListener useTileListener;
private Float x;
private XListener xListener;
private Float y;
private YListener yListener;
private Float width;
private WidthListener widthListener;
private Float height;
private HeightListener heightListener;
private Float tileWidth;
private TileWidthListener tileWidthListener;
private Float tileHeight;
private TileHeightListener tileHeightListener;
private Color32bit background;
private BackgroundListener backgroundListener;
private ListRuntimeElement<FigureRuntimeElement> figureListElement;
private FigureListElementListener figureListElementListener;
/**
* Constructs a new CFDGRuntimeElement.
*
* @param registry
* @param CFDGRuntimeElementElement
*/
public CFDGRuntimeElement(final CFDGConfigElement cfdgElement) {
if (cfdgElement == null) {
throw new IllegalArgumentException("cfdgElement is null");
}
this.cfdgElement = cfdgElement;
setStartshape(cfdgElement.getStartshape());
startshapeListener = new StartshapeListener();
cfdgElement.getStartshapeElement().addChangeListener(startshapeListener);
setVariation(cfdgElement.getVariation());
variationListener = new VariationListener();
cfdgElement.getVariationElement().addChangeListener(variationListener);
setBaseDir(cfdgElement.getBaseDir());
baseDirListener = new BaseDirListener();
cfdgElement.getBaseDirElement().addChangeListener(baseDirListener);
setUseSize(cfdgElement.isUseSize());
useSizeListener = new UseSizeListener();
cfdgElement.getUseSizeElement().addChangeListener(useSizeListener);
setUseTile(cfdgElement.isUseTile());
useTileListener = new UseTileListener();
cfdgElement.getUseTileElement().addChangeListener(useTileListener);
setX(cfdgElement.getX());
xListener = new XListener();
cfdgElement.getXElement().addChangeListener(xListener);
setY(cfdgElement.getY());
yListener = new YListener();
cfdgElement.getYElement().addChangeListener(yListener);
setWidth(cfdgElement.getWidth());
widthListener = new WidthListener();
cfdgElement.getWidthElement().addChangeListener(widthListener);
setHeight(cfdgElement.getHeight());
heightListener = new HeightListener();
cfdgElement.getHeightElement().addChangeListener(heightListener);
setTileWidth(cfdgElement.getTileWidth());
tileWidthListener = new TileWidthListener();
cfdgElement.getTileWidthElement().addChangeListener(tileWidthListener);
setTileHeight(cfdgElement.getTileHeight());
tileHeightListener = new TileHeightListener();
cfdgElement.getTileHeightElement().addChangeListener(tileHeightListener);
setBackground(cfdgElement.getBackground());
backgroundListener = new BackgroundListener();
cfdgElement.getBackgroundElement().addChangeListener(backgroundListener);
figureListElement = new ListRuntimeElement<FigureRuntimeElement>();
for (int i = 0; i < cfdgElement.getFigureConfigElementCount(); i++) {
figureListElement.appendElement(new FigureRuntimeElement(cfdgElement.getFigureConfigElement(i)));
}
figureListElementListener = new FigureListElementListener();
cfdgElement.getFigureListElement().addChangeListener(figureListElementListener);
}
/**
* @see net.sf.jame.core.config.RuntimeElement#dispose()
*/
@Override
public void dispose() {
if ((cfdgElement != null) && (startshapeListener != null)) {
cfdgElement.getStartshapeElement().removeChangeListener(startshapeListener);
}
startshapeListener = null;
if ((cfdgElement != null) && (variationListener != null)) {
cfdgElement.getVariationElement().removeChangeListener(variationListener);
}
variationListener = null;
if ((cfdgElement != null) && (baseDirListener != null)) {
cfdgElement.getBaseDirElement().removeChangeListener(baseDirListener);
}
baseDirListener = null;
if ((cfdgElement != null) && (useSizeListener != null)) {
cfdgElement.getUseSizeElement().removeChangeListener(useSizeListener);
}
useSizeListener = null;
if ((cfdgElement != null) && (useTileListener != null)) {
cfdgElement.getUseTileElement().removeChangeListener(useTileListener);
}
useTileListener = null;
if ((cfdgElement != null) && (xListener != null)) {
cfdgElement.getXElement().removeChangeListener(xListener);
}
xListener = null;
if ((cfdgElement != null) && (yListener != null)) {
cfdgElement.getYElement().removeChangeListener(yListener);
}
yListener = null;
if ((cfdgElement != null) && (widthListener != null)) {
cfdgElement.getWidthElement().removeChangeListener(widthListener);
}
widthListener = null;
if ((cfdgElement != null) && (heightListener != null)) {
cfdgElement.getHeightElement().removeChangeListener(heightListener);
}
heightListener = null;
if ((cfdgElement != null) && (tileWidthListener != null)) {
cfdgElement.getTileWidthElement().removeChangeListener(tileWidthListener);
}
tileWidthListener = null;
if ((cfdgElement != null) && (tileHeightListener != null)) {
cfdgElement.getTileHeightElement().removeChangeListener(tileHeightListener);
}
tileHeightListener = null;
if ((cfdgElement != null) && (backgroundListener != null)) {
cfdgElement.getBackgroundElement().removeChangeListener(backgroundListener);
}
backgroundListener = null;
if ((cfdgElement != null) && (figureListElementListener != null)) {
cfdgElement.getFigureListElement().removeChangeListener(figureListElementListener);
}
figureListElement.dispose();
figureListElementListener = null;
cfdgElement = null;
super.dispose();
}
/**
* @see net.sf.jame.core.config.RuntimeElement#isChanged()
*/
@Override
public boolean isChanged() {
boolean cfdgChanged = false;
return super.isChanged() || cfdgChanged;
}
/**
* @return the startshape.
*/
public String getStartshape() {
return startshape;
}
private void setStartshape(final String startshape) {
this.startshape = startshape;
}
private class StartshapeListener 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 ValueConfigElement.VALUE_CHANGED: {
setStartshape((String) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the variation.
*/
public String getVariation() {
return variation;
}
private void setVariation(final String variation) {
this.variation = variation;
}
private class VariationListener 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 ValueConfigElement.VALUE_CHANGED: {
setVariation((String) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the baseDir.
*/
public String getBaseDir() {
return baseDir;
}
private void setBaseDir(final String baseDir) {
this.baseDir = baseDir;
}
private class BaseDirListener 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 ValueConfigElement.VALUE_CHANGED: {
setBaseDir((String) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the useSize.
*/
public Boolean isUseSize() {
return useSize;
}
private void setUseSize(final Boolean useSize) {
this.useSize = useSize;
}
private class UseSizeListener 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 ValueConfigElement.VALUE_CHANGED: {
setUseSize((Boolean) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the useTile.
*/
public Boolean isUseTile() {
return useTile;
}
private void setUseTile(final Boolean useTile) {
this.useTile = useTile;
}
private class UseTileListener 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 ValueConfigElement.VALUE_CHANGED: {
setUseTile((Boolean) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the x.
*/
public Float getX() {
return x;
}
private void setX(final Float x) {
this.x = x;
}
private class XListener 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 ValueConfigElement.VALUE_CHANGED: {
setX((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the y.
*/
public Float getY() {
return y;
}
private void setY(final Float y) {
this.y = y;
}
private class YListener 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 ValueConfigElement.VALUE_CHANGED: {
setY((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the width.
*/
public Float getWidth() {
return width;
}
private void setWidth(final Float width) {
this.width = width;
}
private class WidthListener 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 ValueConfigElement.VALUE_CHANGED: {
setWidth((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the height.
*/
public Float getHeight() {
return height;
}
private void setHeight(final Float height) {
this.height = height;
}
private class HeightListener 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 ValueConfigElement.VALUE_CHANGED: {
setHeight((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the tileWidth.
*/
public Float getTileWidth() {
return tileWidth;
}
private void setTileWidth(final Float tileWidth) {
this.tileWidth = tileWidth;
}
private class TileWidthListener 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 ValueConfigElement.VALUE_CHANGED: {
setTileWidth((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the tileHeight.
*/
public Float getTileHeight() {
return tileHeight;
}
private void setTileHeight(final Float tileHeight) {
this.tileHeight = tileHeight;
}
private class TileHeightListener 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 ValueConfigElement.VALUE_CHANGED: {
setTileHeight((Float) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* @return the background.
*/
public Color32bit getBackground() {
return background;
}
private void setBackground(final Color32bit background) {
this.background = background;
}
private class BackgroundListener 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 ValueConfigElement.VALUE_CHANGED: {
setBackground((Color32bit) e.getParams()[0]);
fireChanged();
break;
}
default: {
break;
}
}
}
}
/**
* Returns a figure element.
*
* @param index the figure index.
* @return the figure.
*/
public FigureRuntimeElement getFigureElement(final int index) {
return figureListElement.getElement(index);
}
/**
* Returns a figure element index.
*
* @param figureElement the figure element.
* @return the index.
*/
public int indexOfFigureElement(final FigureRuntimeElement figureElement) {
return figureListElement.indexOfElement(figureElement);
}
/**
* Returns the number of figure elements.
*
* @return the number of figure elements.
*/
public int getFigureElementCount() {
return figureListElement.getElementCount();
}
private void setFigureElement(final int index, FigureRuntimeElement element) {
figureListElement.setElement(index, element);
}
private void appendFigureElement(final FigureRuntimeElement figureElement) {
figureListElement.appendElement(figureElement);
}
private void insertFigureElementAfter(final int index, final FigureRuntimeElement figureElement) {
figureListElement.insertElementAfter(index, figureElement);
}
private void insertFigureElementBefore(final int index, final FigureRuntimeElement figureElement) {
figureListElement.insertElementBefore(index, figureElement);
}
private void removeFigureElement(final int index) {
figureListElement.removeElement(index);
}
private void moveUpFigureElement(final int index) {
figureListElement.moveElementUp(index);
}
private void moveDownFigureElement(final int index) {
figureListElement.moveElementDown(index);
}
private class FigureListElementListener 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: {
appendFigureElement(new FigureRuntimeElement ((FigureConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_AFTER: {
insertFigureElementAfter(((Integer) e.getParams()[1]).intValue(), new FigureRuntimeElement ((FigureConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_INSERTED_BEFORE: {
insertFigureElementBefore(((Integer) e.getParams()[1]).intValue(), new FigureRuntimeElement ((FigureConfigElement) e.getParams()[0]));
fireChanged();
break;
}
case ListConfigElement.ELEMENT_REMOVED: {
removeFigureElement(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_UP: {
moveUpFigureElement(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_MOVED_DOWN: {
moveDownFigureElement(((Integer) e.getParams()[1]).intValue());
fireChanged();
break;
}
case ListConfigElement.ELEMENT_CHANGED: {
setFigureElement(((Integer) e.getParams()[1]).intValue(), new FigureRuntimeElement ((FigureConfigElement) e.getParams()[0]));
fireChanged();
break;
}
default: {
break;
}
}
}
}
}