/*
* 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.CFDGBuilder;
import net.sf.jame.contextfree.figure.FigureConfigElement;
import net.sf.jame.core.common.BooleanElement;
import net.sf.jame.core.common.ColorElement;
import net.sf.jame.core.common.FloatElement;
import net.sf.jame.core.common.StringElement;
import net.sf.jame.core.config.AbstractConfigElement;
import net.sf.jame.core.config.ConfigContext;
import net.sf.jame.core.config.ConfigElement;
import net.sf.jame.core.config.ListConfigElement;
import net.sf.jame.core.util.Color32bit;
import net.sf.jame.core.util.Colors;
/**
* @author Andrea Medeghini
*/
public class CFDGConfigElement extends AbstractConfigElement {
private static final long serialVersionUID = 1L;
public static final String CLASS_ID = "CFDG";
private final StringElement startshapeElement = new StringElement("");
private final StringElement variationElement = new StringElement("ABCD");
private final StringElement baseDirElement = new StringElement(System.getProperty("user.home"));
private final BooleanElement useSizeElement = new BooleanElement(false);
private final BooleanElement useTileElement = new BooleanElement(false);
private final FloatElement xElement = new FloatElement(0f);
private final FloatElement yElement = new FloatElement(0f);
private final FloatElement widthElement = new FloatElement(1f);
private final FloatElement heightElement = new FloatElement(1f);
private final FloatElement tileWidthElement = new FloatElement(1f);
private final FloatElement tileHeightElement = new FloatElement(1f);
private final ColorElement backgroundElement = new ColorElement(new Color32bit(0xFFFFFFFF));
private final ListConfigElement<FigureConfigElement> figureListElement = new ListConfigElement<FigureConfigElement>("figureListElement");
/**
* Constructs a new element.
*/
public CFDGConfigElement() {
super(CFDGConfigElement.CLASS_ID);
}
/**
* @see net.sf.jame.core.config.AbstractConfigElement#setContext(net.sf.jame.core.config.ConfigContext)
*/
@Override
public void setContext(final ConfigContext context) {
super.setContext(context);
startshapeElement.setContext(context);
variationElement.setContext(context);
baseDirElement.setContext(context);
useSizeElement.setContext(context);
useTileElement.setContext(context);
xElement.setContext(context);
yElement.setContext(context);
widthElement.setContext(context);
heightElement.setContext(context);
tileWidthElement.setContext(context);
tileHeightElement.setContext(context);
backgroundElement.setContext(context);
figureListElement.setContext(context);
}
/**
* @return
*/
@Override
public CFDGConfigElement clone() {
final CFDGConfigElement element = new CFDGConfigElement();
element.setStartshape(getStartshape());
element.setVariation(getVariation());
element.setBaseDir(getBaseDir());
element.setUseSize(isUseSize());
element.setUseTile(isUseTile());
element.setX(getX());
element.setY(getY());
element.setWidth(getWidth());
element.setHeight(getHeight());
element.setTileWidth(getTileWidth());
element.setTileHeight(getTileHeight());
element.setBackground(getBackground());
element.figureListElement.copyFrom(getFigureListElement());
return element;
}
/**
*
*/
public void copyFrom(ConfigElement source) {
CFDGConfigElement cfdgElement = (CFDGConfigElement) source;
setStartshape(cfdgElement.getStartshape());
setVariation(cfdgElement.getVariation());
setBaseDir(cfdgElement.getBaseDir());
setUseSize(cfdgElement.isUseSize());
setUseTile(cfdgElement.isUseTile());
setX(cfdgElement.getX());
setY(cfdgElement.getY());
setWidth(cfdgElement.getWidth());
setHeight(cfdgElement.getHeight());
setTileWidth(cfdgElement.getTileWidth());
setTileHeight(cfdgElement.getTileHeight());
setBackground(cfdgElement.getBackground());
figureListElement.copyFrom(cfdgElement.getFigureListElement());
}
/**
* @return
*/
public StringElement getStartshapeElement() {
return startshapeElement;
}
/**
* @return
*/
public String getStartshape() {
return startshapeElement.getValue();
}
/**
* @param value
*/
public void setStartshape(final String value) {
startshapeElement.setValue(value);
}
/**
* @return
*/
public StringElement getVariationElement() {
return variationElement;
}
/**
* @return
*/
public String getVariation() {
return variationElement.getValue();
}
/**
* @param value
*/
public void setVariation(final String value) {
variationElement.setValue(value);
}
/**
* @return
*/
public StringElement getBaseDirElement() {
return baseDirElement;
}
/**
* @return
*/
public String getBaseDir() {
return baseDirElement.getValue();
}
/**
* @param value
*/
public void setBaseDir(final String value) {
baseDirElement.setValue(value);
}
/**
* @return
*/
public BooleanElement getUseSizeElement() {
return useSizeElement;
}
/**
* @return
*/
public Boolean isUseSize() {
return useSizeElement.getValue();
}
/**
* @param value
*/
public void setUseSize(final Boolean value) {
useSizeElement.setValue(value);
}
/**
* @return
*/
public BooleanElement getUseTileElement() {
return useTileElement;
}
/**
* @return
*/
public Boolean isUseTile() {
return useTileElement.getValue();
}
/**
* @param value
*/
public void setUseTile(final Boolean value) {
useTileElement.setValue(value);
}
/**
* @return
*/
public FloatElement getXElement() {
return xElement;
}
/**
* @return
*/
public Float getX() {
return xElement.getValue();
}
/**
* @param value
*/
public void setX(final Float value) {
xElement.setValue(value);
}
/**
* @return
*/
public FloatElement getYElement() {
return yElement;
}
/**
* @return
*/
public Float getY() {
return yElement.getValue();
}
/**
* @param value
*/
public void setY(final Float value) {
yElement.setValue(value);
}
/**
* @return
*/
public FloatElement getWidthElement() {
return widthElement;
}
/**
* @return
*/
public Float getWidth() {
return widthElement.getValue();
}
/**
* @param value
*/
public void setWidth(final Float value) {
widthElement.setValue(value);
}
/**
* @return
*/
public FloatElement getHeightElement() {
return heightElement;
}
/**
* @return
*/
public Float getHeight() {
return heightElement.getValue();
}
/**
* @param value
*/
public void setHeight(final Float value) {
heightElement.setValue(value);
}
/**
* @return
*/
public FloatElement getTileWidthElement() {
return tileWidthElement;
}
/**
* @return
*/
public Float getTileWidth() {
return tileWidthElement.getValue();
}
/**
* @param value
*/
public void setTileWidth(final Float value) {
tileWidthElement.setValue(value);
}
/**
* @return
*/
public FloatElement getTileHeightElement() {
return tileHeightElement;
}
/**
* @return
*/
public Float getTileHeight() {
return tileHeightElement.getValue();
}
/**
* @param value
*/
public void setTileHeight(final Float value) {
tileHeightElement.setValue(value);
}
/**
* @return
*/
public ColorElement getBackgroundElement() {
return backgroundElement;
}
/**
* @return
*/
public Color32bit getBackground() {
return backgroundElement.getValue();
}
/**
* @param value
*/
public void setBackground(final Color32bit value) {
backgroundElement.setValue(value);
}
/**
* @return
*/
public ListConfigElement<FigureConfigElement> getFigureListElement() {
return figureListElement;
}
/**
* Returns a figure element.
*
* @param index the figure index.
* @return the figure.
*/
public FigureConfigElement getFigureConfigElement(final int index) {
return figureListElement.getElement(index);
}
/**
* Returns a figure element index.
*
* @param figureElement the figure element.
* @return the index.
*/
public int indexOfFigureConfigElement(final FigureConfigElement figureElement) {
return figureListElement.indexOfElement(figureElement);
}
/**
* Returns the number of figure elements.
*
* @return the number of figure elements.
*/
public int getFigureConfigElementCount() {
return figureListElement.getElementCount();
}
/**
* Adds a figure element.
*
* @param figureElement the figure to add.
*/
public void appendFigureConfigElement(final FigureConfigElement figureElement) {
figureListElement.appendElement(figureElement);
}
/**
* Adds a figure element.
*
* @param index the index.
* @param figureElement the figure to add.
*/
public void insertFigureConfigElementAfter(final int index, final FigureConfigElement figureElement) {
figureListElement.insertElementAfter(index, figureElement);
}
/**
* Adds a figure element.
*
* @param index the index.
* @param figureElement the figure to add.
*/
public void insertFigureConfigElementBefore(final int index, final FigureConfigElement figureElement) {
figureListElement.insertElementBefore(index, figureElement);
}
/**
* Removes a figure element.
*
* @param index the element index to remove.
*/
public void removeFigureConfigElement(final int index) {
figureListElement.removeElement(index);
}
/**
* Removes a figure element.
*
* @param figureElement the figure to remove.
*/
public void removeFigureConfigElement(final FigureConfigElement figureElement) {
figureListElement.removeElement(figureElement);
}
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
final CFDGConfigElement other = (CFDGConfigElement) obj;
if (startshapeElement == null) {
if (other.startshapeElement != null) {
return false;
}
}
else if (!startshapeElement.equals(other.startshapeElement)) {
return false;
}
if (variationElement == null) {
if (other.variationElement != null) {
return false;
}
}
else if (!variationElement.equals(other.variationElement)) {
return false;
}
if (baseDirElement == null) {
if (other.baseDirElement != null) {
return false;
}
}
else if (!baseDirElement.equals(other.baseDirElement)) {
return false;
}
if (useSizeElement == null) {
if (other.useSizeElement != null) {
return false;
}
}
else if (!useSizeElement.equals(other.useSizeElement)) {
return false;
}
if (useTileElement == null) {
if (other.useTileElement != null) {
return false;
}
}
else if (!useTileElement.equals(other.useTileElement)) {
return false;
}
if (xElement == null) {
if (other.xElement != null) {
return false;
}
}
else if (!xElement.equals(other.xElement)) {
return false;
}
if (yElement == null) {
if (other.yElement != null) {
return false;
}
}
else if (!yElement.equals(other.yElement)) {
return false;
}
if (widthElement == null) {
if (other.widthElement != null) {
return false;
}
}
else if (!widthElement.equals(other.widthElement)) {
return false;
}
if (heightElement == null) {
if (other.heightElement != null) {
return false;
}
}
else if (!heightElement.equals(other.heightElement)) {
return false;
}
if (tileWidthElement == null) {
if (other.tileWidthElement != null) {
return false;
}
}
else if (!tileWidthElement.equals(other.tileWidthElement)) {
return false;
}
if (tileHeightElement == null) {
if (other.tileHeightElement != null) {
return false;
}
}
else if (!tileHeightElement.equals(other.tileHeightElement)) {
return false;
}
if (backgroundElement == null) {
if (other.backgroundElement != null) {
return false;
}
}
else if (!backgroundElement.equals(other.backgroundElement)) {
return false;
}
if (figureListElement == null) {
if (other.figureListElement != null) {
return false;
}
}
else if (!figureListElement.equals(other.figureListElement)) {
return false;
}
return true;
}
/**
* @see net.sf.jame.core.config.AbstractConfigElement#dispose()
*/
@Override
public void dispose() {
startshapeElement.dispose();
variationElement.dispose();
baseDirElement.dispose();
useSizeElement.dispose();
useTileElement.dispose();
xElement.dispose();
yElement.dispose();
widthElement.dispose();
heightElement.dispose();
tileWidthElement.dispose();
tileHeightElement.dispose();
backgroundElement.dispose();
figureListElement.dispose();
super.dispose();
}
public void toCFDG(CFDGBuilder builder) {
if (getStartshape() != null) {
builder.append("startshape ");
builder.append(getStartshape());
builder.append("\n\n");
}
if (isUseSize()) {
builder.append("size {");
if ((getWidth() != 1f) || (getHeight() != 1f)) {
builder.append(" s");
if (getWidth() != 1f) {
builder.append(" ");
builder.append(getWidth());
}
if (getHeight() != 1f) {
builder.append(" ");
builder.append(getHeight());
}
}
if (getX() != 0f) {
builder.append(" x ");
builder.append(getX());
}
if (getY() != 0f) {
builder.append(" y ");
builder.append(getY());
}
builder.append(" }\n\n");
}
if (isUseTile()) {
builder.append("tile { ");
builder.append("s");
if (getTileWidth() != 1f) {
builder.append(" ");
builder.append(getTileWidth());
}
if (getTileHeight() != 1f) {
builder.append(" ");
builder.append(getTileHeight());
}
builder.append(" }\n\n");
}
if (getBackground() != null) {
builder.append("background { ");
if (getBackground().getAlpha() != 255) {
builder.append("a ");
builder.append(1f - getBackground().getAlpha() / 255f);
builder.append(" ");
}
float[] hsbvals = new float[3];
Colors.toHSB(getBackground().getARGB(), hsbvals );
if (hsbvals[0] != 0) {
builder.append("h ");
builder.append(0f - hsbvals[0] * 360f);
}
if (hsbvals[2] != 0) {
builder.append("b ");
builder.append(1f - hsbvals[2]);
}
if (hsbvals[1] != 0) {
builder.append("sat ");
builder.append(0f - hsbvals[1]);
}
builder.append(" }\n\n");
}
for (int i = 0; i < figureListElement.getElementCount(); i++) {
figureListElement.getElement(i).toCFDG(builder);
builder.append("\n");
}
}
}