blob: f894f274fe980f80dea19a5ec78bb64d51ce7d8f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.sis.style.se1;
import jakarta.xml.bind.annotation.XmlType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
// Specific to the geoapi-3.1 and geoapi-4.0 branches:
import org.opengis.filter.Expression;
/**
* The location inside a graphic or label to use as an "anchor" for positioning it relative to a point.
* The coordinates are given as (<var>x</var>,<var>y</var>) floating-point numbers between 0 and 1 inclusive.
* The bounding box of the graphic/label to be rendered is considered to be in a coordinate space from 0
* (lower-left corner) to 1 (upper-right corner), and the anchor position is specified as a point in this space.
* The default anchor point is <var>x</var> = 0.5, <var>y</var> = 0.5,
* which is at the middle height and middle length of the graphic/label.
*
* <!-- Following list of authors contains credits to OGC GeoAPI 2 contributors. -->
* @author Johann Sorel (Geomatys)
* @author Ian Turton (CCG)
* @author Martin Desruisseaux (Geomatys)
*
* @param <R> the type of data to style, such as {@code Feature} or {@code Coverage}.
*/
@XmlType(name = "AnchorPointType", propOrder = {
"anchorPointX",
"anchorPointY"
})
@XmlRootElement(name = "AnchorPoint")
public class AnchorPoint<R> extends StyleElement<R> {
/**
* The <var>x</var> coordinate of the anchor point.
* This property is mandatory.
*
* @see #getAnchorPointX()
* @see #setAnchorPointX(Expression)
*/
@XmlElement(name = "AnchorPointX", required = true)
protected Expression<R, ? extends Number> anchorPointX;
/**
* The <var>y</var> coordinate of the anchor point.
* This property is mandatory.
*
* @see #getAnchorPointY()
* @see #setAnchorPointY(Expression)
*/
@XmlElement(name = "AnchorPointY", required = true)
protected Expression<R, ? extends Number> anchorPointY;
/**
* For JAXB unmarshalling only.
*/
private AnchorPoint() {
// Thread-local factory will be used.
}
/**
* Creates an anchor point initialized to <var>x</var> = 0.5 and <var>y</var> = 0.5.
* This initial position is the center of the graphic/label.
*
* @param factory the factory to use for creating expressions and child elements.
*/
public AnchorPoint(final StyleFactory<R> factory) {
super(factory);
anchorPointX = anchorPointY = factory.half;
}
/**
* Creates a shallow copy of the given object.
* For a deep copy, see {@link #clone()} instead.
*
* @param source the object to copy.
*/
public AnchorPoint(final AnchorPoint<R> source) {
super(source);
anchorPointX = source.anchorPointX;
anchorPointY = source.anchorPointY;
}
/**
* Returns the <var>x</var> coordinate of the anchor point.
* It should be a floating point number between 0 and 1 inclusive.
*
* @return the expression fetching the <var>x</var> coordinate.
*/
public Expression<R, ? extends Number> getAnchorPointX() {
return anchorPointX;
}
/**
* Sets the <var>x</var> coordinate of the anchor point.
* If this method is never invoked, then the default value is literal 0.5.
*
* @param value new <var>x</var> coordinate, or {@code null} for resetting the default value.
*/
public void setAnchorPointX(final Expression<R, ? extends Number> value) {
anchorPointX = defaultToHalf(value);
}
/**
* Returns the <var>y</var> coordinate of the anchor point.
* It should be a floating point number between 0 and 1 inclusive.
*
* @return the expression fetching the <var>y</var> coordinate.
*/
public Expression<R, ? extends Number> getAnchorPointY() {
return anchorPointY;
}
/**
* Sets the <var>y</var> coordinate of the anchor point.
* If this method is never invoked, then the default value is literal 0.5.
*
* @param value new <var>y</var> coordinate, or {@code null} for resetting the default value.
*/
public void setAnchorPointY(final Expression<R, ? extends Number> value) {
anchorPointY = defaultToHalf(value);
}
/**
* Returns all properties contained in this class.
* This is used for {@link #equals(Object)} and {@link #hashCode()} implementations.
*/
@Override
final Object[] properties() {
return new Object[] {anchorPointX, anchorPointY};
}
/**
* Returns a deep clone of this object. All style elements are cloned,
* but expressions are not on the assumption that they are immutable.
*
* @return deep clone of all style elements.
*/
@Override
public AnchorPoint<R> clone() {
return (AnchorPoint<R>) super.clone();
}
}