/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotools.styling;
import javax.measure.quantity.Length;
import javax.measure.unit.Unit;
import org.opengis.filter.expression.Expression;
import org.opengis.style.StyleVisitor;
import org.opengis.util.Cloneable;
/**
* Provides a representation of a PolygonSymbolizer in an SLD Document. A
* PolygonSymbolizer defines how a polygon geometry should be rendered.
*
* @author James Macgill, CCG
* @author Johann Sorel (Geomatys)
* @source $URL$
* @version $Id$
*/
public class PolygonSymbolizerImpl extends AbstractSymbolizer implements PolygonSymbolizer, Cloneable {
private Expression offset;
private DisplacementImpl disp;
private Fill fill = new FillImpl();
private StrokeImpl stroke = new StrokeImpl();
/**
* Creates a new instance of DefaultPolygonStyler
*/
protected PolygonSymbolizerImpl() {
this(null,null,null,null,null,null,null,null);
}
protected PolygonSymbolizerImpl(Stroke stroke,
Fill fill,
Displacement disp,
Expression offset,
Unit<Length> uom,
String geom,
String name,
Description desc) {
super(name, desc, geom, uom);
this.stroke = StrokeImpl.cast( stroke );
this.fill = fill;
this.disp = DisplacementImpl.cast( disp );
this.offset = offset;
}
public Expression getPerpendicularOffset() {
return offset;
}
public void setPerpendicularOffset(Expression offset ) {
this.offset = offset;
}
public Displacement getDisplacement() {
return disp;
}
public void setDisplacement(org.opengis.style.Displacement displacement) {
this.disp = DisplacementImpl.cast( displacement );
}
/**
* Provides the graphical-symbolization parameter to use to fill the area
* of the geometry.
*
* @return The Fill style to use when rendering the area.
*/
public Fill getFill() {
return fill;
}
/**
* Sets the graphical-symbolization parameter to use to fill the area of
* the geometry.
*
* @param fill The Fill style to use when rendering the area.
*/
public void setFill(org.opengis.style.Fill fill) {
if (this.fill == fill) {
return;
}
this.fill = FillImpl.cast(fill);
}
/**
* Provides the graphical-symbolization parameter to use for the outline of
* the Polygon.
*
* @return The Stroke style to use when rendering lines.
*/
public StrokeImpl getStroke() {
return stroke;
}
/**
* Sets the graphical-symbolization parameter to use for the outline of the
* Polygon.
*
* @param stroke The Stroke style to use when rendering lines.
*/
public void setStroke(org.opengis.style.Stroke stroke) {
if (this.stroke == stroke) {
return;
}
this.stroke = StrokeImpl.cast( stroke );
}
/**
* Accepts a StyleVisitor to perform some operation on this LineSymbolizer.
*
* @param visitor The visitor to accept.
*/
public Object accept(StyleVisitor visitor,Object data) {
return visitor.visit(this,data);
}
public void accept(org.geotools.styling.StyleVisitor visitor) {
visitor.visit(this);
}
/**
* Creates a deep copy clone. TODO: Need to complete the deep copy,
* currently only shallow copy.
*
* @return The deep copy clone.
*
* @throws RuntimeException DOCUMENT ME!
*/
public Object clone() {
PolygonSymbolizerImpl clone;
try {
clone = (PolygonSymbolizerImpl) super.clone();
if (fill != null) {
clone.fill = (Fill) ((Cloneable) fill).clone();
}
if (stroke != null) {
clone.stroke = (StrokeImpl) ((Cloneable) stroke).clone();
}
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e); // this should never happen.
}
return clone;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + ((disp == null) ? 0 : disp.hashCode());
result = prime * result + ((fill == null) ? 0 : fill.hashCode());
result = prime * result + ((offset == null) ? 0 : offset.hashCode());
result = prime * result + ((stroke == null) ? 0 : stroke.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
PolygonSymbolizerImpl other = (PolygonSymbolizerImpl) obj;
if (disp == null) {
if (other.disp != null)
return false;
} else if (!disp.equals(other.disp))
return false;
if (fill == null) {
if (other.fill != null)
return false;
} else if (!fill.equals(other.fill))
return false;
if (offset == null) {
if (other.offset != null)
return false;
} else if (!offset.equals(other.offset))
return false;
if (stroke == null) {
if (other.stroke != null)
return false;
} else if (!stroke.equals(other.stroke))
return false;
return true;
}
static PolygonSymbolizerImpl cast(org.opengis.style.Symbolizer symbolizer) {
if( symbolizer == null ){
return null;
}
else if (symbolizer instanceof PolygonSymbolizerImpl){
return (PolygonSymbolizerImpl) symbolizer;
}
else if( symbolizer instanceof org.opengis.style.PolygonSymbolizer ){
org.opengis.style.PolygonSymbolizer polygonSymbolizer = (org.opengis.style.PolygonSymbolizer) symbolizer;
PolygonSymbolizerImpl copy = new PolygonSymbolizerImpl();
copy.setStroke( StrokeImpl.cast(polygonSymbolizer.getStroke()));
copy.setDescription( polygonSymbolizer.getDescription() );
copy.setDisplacement( polygonSymbolizer.getDisplacement());
copy.setFill(polygonSymbolizer.getFill());
copy.setGeometryPropertyName( polygonSymbolizer.getGeometryPropertyName());
copy.setName(polygonSymbolizer.getName());
copy.setPerpendicularOffset(polygonSymbolizer.getPerpendicularOffset());
copy.setUnitOfMeasure( polygonSymbolizer.getUnitOfMeasure());
return copy;
}
else {
return null; // not possible
}
}
}