/*
* 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;
// OpenGIS dependencies
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.factory.GeoTools;
import org.geotools.resources.Utilities;
import org.opengis.filter.FilterFactory;
import org.opengis.filter.expression.Expression;
import org.opengis.style.StyleVisitor;
import org.opengis.util.Cloneable;
/**
* DOCUMENT ME!
*
* @author Ian Turton, CCG
* @source $URL$
* @version $Id$
*/
public class PointPlacementImpl implements PointPlacement, Cloneable {
/** The logger for the default core module. */
private static final java.util.logging.Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geotools.core");
// TODO: make container ready
private final FilterFactory filterFactory;
private AnchorPointImpl anchorPoint = new AnchorPointImpl();
private DisplacementImpl displacement = new DisplacementImpl();
private Expression rotation = null;
public PointPlacementImpl(){
this( CommonFactoryFinder.getFilterFactory(GeoTools.getDefaultHints()));
}
public PointPlacementImpl(FilterFactory factory) {
filterFactory = factory;
try {
rotation = filterFactory.literal(new Integer(0));
} catch (org.geotools.filter.IllegalFilterException ife) {
LOGGER.severe("Failed to build defaultPointPlacement: " + ife);
}
}
/**
* Returns the AnchorPoint which identifies the location inside a text
* label to use as an "anchor" for positioning it relative to a point
* geometry.
*
* @return Label's AnchorPoint.
*/
public AnchorPointImpl getAnchorPoint() {
return anchorPoint;
}
/**
* Setter for property anchorPoint.
*
* @param anchorPoint New value of property anchorPoint.
*/
public void setAnchorPoint(org.opengis.style.AnchorPoint anchorPoint) {
if( this.anchorPoint == anchorPoint ){
return;
}
this.anchorPoint = AnchorPointImpl.cast( anchorPoint );
}
/**
* Returns the Displacement which gives X and Y offset displacements to use
* for rendering a text label near a point.
*
* @return The label displacement.
*/
public Displacement getDisplacement() {
return displacement;
}
/**
* Setter for property displacement.
*
* @param displacement New value of property displacement.
*/
public void setDisplacement(org.opengis.style.Displacement displacement) {
if (this.displacement == displacement) {
return;
}
this.displacement = DisplacementImpl.cast( displacement );
}
/**
* Returns the rotation of the label.
*
* @return The rotation of the label.
*/
public Expression getRotation() {
return rotation;
}
/**
* Setter for property rotation.
*
* @param rotation New value of property rotation.
*/
public void setRotation(Expression rotation) {
this.rotation = rotation;
}
public Object accept(StyleVisitor visitor,Object data) {
return visitor.visit(this,data);
}
public void accept(org.geotools.styling.StyleVisitor visitor) {
visitor.visit(this);
}
/* (non-Javadoc)
* @see Cloneable#clone()
*/
public Object clone() {
try {
PointPlacementImpl clone = (PointPlacementImpl) super.clone();
clone.anchorPoint = (AnchorPointImpl) ((Cloneable) anchorPoint).clone();
clone.displacement = (DisplacementImpl) ((Cloneable) displacement)
.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Won't happen");
}
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof PointPlacementImpl) {
PointPlacementImpl other = (PointPlacementImpl) obj;
return Utilities.equals(anchorPoint, other.anchorPoint)
&& Utilities.equals(displacement, other.displacement)
&& Utilities.equals(rotation, other.rotation);
}
return false;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
final int PRIME = 37;
int result = 17;
if (anchorPoint != null) {
result = (result * PRIME) + anchorPoint.hashCode();
}
if (displacement != null) {
result = (result * PRIME) + displacement.hashCode();
}
if (rotation != null) {
result = (result * PRIME) + rotation.hashCode();
}
return result;
}
static PointPlacementImpl cast(org.opengis.style.LabelPlacement placement) {
if( placement == null ){
return null;
}
else if (placement instanceof PointPlacementImpl){
return (PointPlacementImpl) placement;
}
else if (placement instanceof org.opengis.style.PointPlacement){
org.opengis.style.PointPlacement pointPlacement = (org.opengis.style.PointPlacement) placement;
PointPlacementImpl copy = new PointPlacementImpl();
copy.setAnchorPoint( AnchorPointImpl.cast( pointPlacement.getAnchorPoint() ) );
copy.setDisplacement( DisplacementImpl.cast( pointPlacement.getDisplacement() ));
return copy;
}
return null;
}
}