blob: 0a52d5860119d3d17919198bb4518ce7d563d74c [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 main branch:
import org.apache.sis.filter.Expression;
/**
* Instructions about where and how a text label should be rendered relative to a line.
*
* <!-- 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 = "LinePlacementType", propOrder = {
"perpendicularOffset",
"isRepeated",
"initialGap",
"gap",
"isAligned",
"generalizeLine"
})
@XmlRootElement(name = "LinePlacement")
public class LinePlacement<R> extends LabelPlacement<R> {
/**
* Perpendicular distance away from a line where to draw a label, or {@code null} for the default value.
*
* @see #getPerpendicularOffset()
* @see #setPerpendicularOffset(Expression)
*/
@XmlElement(name = "PerpendicularOffset")
protected Expression<R, ? extends Number> perpendicularOffset;
/**
* Whether the label will be repeatedly drawn along the line, or {@code null} for the default value.
*
* @see #isRepeated()
* @see #setRepeated(Expression)
*
* @todo Needs an adapter from expression to plain boolean.
*/
@XmlElement(name = "IsRepeated")
protected Expression<R,Boolean> isRepeated;
/**
* How far away the first label will be drawn, or {@code null} for the default value.
*
* @see #getInitialGap()
* @see #setInitialGap(Expression)
*/
@XmlElement(name = "InitialGap")
protected Expression<R, ? extends Number> initialGap;
/**
* Distance between two labels, or {@code null} for the default value.
*
* @see #getGap()
* @see #setGap(Expression)
*/
@XmlElement(name = "Gap")
protected Expression<R, ? extends Number> gap;
/**
* Whether labels are aligned to the line geometry, or {@code null} for the default value.
* If false, labels are drawn horizontally.
*
* @see #isAligned()
* @see #setAligned(Expression)
*
* @todo Needs an adapter from expression to plain boolean.
*/
@XmlElement(name = "IsAligned")
protected Expression<R,Boolean> isAligned;
/**
* Whether to allow the geometry to be generalized, or {@code null} for the default value.
*
* @see #getGeneralizeLine()
* @see #setGeneralizeLine(Expression)
*
* @todo Needs an adapter from expression to plain boolean.
*/
@XmlElement(name = "GeneralizeLine")
protected Expression<R,Boolean> generalizeLine;
/**
* For JAXB unmarshalling only.
*/
private LinePlacement() {
// Thread-local factory will be used.
}
/**
* Creates a line placement initialized to no offset, no repetition and no gap.
*
* @param factory the factory to use for creating expressions and child elements.
*/
public LinePlacement(final StyleFactory<R> factory) {
super(factory);
}
/**
* Creates a shallow copy of the given object.
* For a deep copy, see {@link #clone()} instead.
*
* @param source the object to copy.
*/
public LinePlacement(final LinePlacement<R> source) {
super(source);
perpendicularOffset = source.perpendicularOffset;
isRepeated = source.isRepeated;
initialGap = source.initialGap;
gap = source.gap;
isAligned = source.isAligned;
generalizeLine = source.generalizeLine;
}
/**
* Returns a perpendicular distance away from a line where to draw a label.
* The distance units of measurement is given by {@link Symbolizer#getUnitOfMeasure()}.
* The value is positive to the left-hand side of the line string.
* Negative numbers mean right. The default offset is 0.
*
* @return perpendicular distance away from a line where to draw a label.
*/
public Expression<R, ? extends Number> getPerpendicularOffset() {
return defaultToZero(perpendicularOffset);
}
/**
* Sets a perpendicular distance away from a line where to draw a label.
* If this method is never invoked, then the default value is literal 0.
* That default value is standardized by OGC 05-077r4.
*
* @param value new distance to apply for drawing label, or {@code null} for resetting the default value.
*/
public void setPerpendicularOffset(final Expression<R, ? extends Number> value) {
perpendicularOffset = value;
}
/**
* Returns whether the label will be repeatedly drawn along the line.
* If {@code true}, the repetition will use the {@linkplain #getInitialGap() initial gap}
* and {@linkplain #getGap() gap} for defining the spaces at the beginning and between labels.
*
* @return whether the label will be repeatedly drawn along the line.
*/
public Expression<R,Boolean> isRepeated() {
return defaultToFalse(isRepeated);
}
/**
* Sets whether the label will be repeatedly drawn along the line.
* If this method is never invoked, then the default value is literal false.
*
* @param value whether the label will be repeated, or {@code null} for resetting the default value.
*/
public void setRepeated(final Expression<R,Boolean> value) {
isRepeated = value;
}
/**
* Returns how far away the first label will be drawn relative to the start of the rendering line.
*
* @return distance of first label relative to the rendering start.
*/
public Expression<R, ? extends Number> getInitialGap() {
return defaultToZero(initialGap);
}
/**
* Sets how far away the first label will be drawn relative to the start of the rendering line.
* If this method is never invoked, then the default value is literal 0.
*
* @param value new distance relative to rendering start, or {@code null} for resetting the default value.
*/
public void setInitialGap(final Expression<R, ? extends Number> value) {
initialGap = value;
}
/**
* Returns the distance between two labels.
*
* @return distance between two labels.
*/
public Expression<R, ? extends Number> getGap() {
return defaultToZero(gap);
}
/**
* Sets the distance between two labels.
* If this method is never invoked, then the default value is literal 0.
*
* @param value new distance between two labels, or {@code null} for resetting the default value.
*/
public void setGap(final Expression<R, ? extends Number> value) {
gap = value;
}
/**
* Returns whether labels are aligned to the line geometry or drawn horizontally.
*
* @return whether labels are aligned to the line geometry or drawn horizontally.
*/
public Expression<R,Boolean> isAligned() {
return defaultToTrue(isAligned);
}
/**
* Sets whether labels are aligned to the line geometry or drawn horizontally.
* If this method is never invoked, then the default value is literal true.
* That default value is standardized by OGC 05-077r4.
*
* @param value whether labels are aligned to the line geometry, or {@code null} for resetting the default value.
*/
public void setAligned(final Expression<R,Boolean> value) {
isAligned = value;
}
/**
* Returns whether to allow the geometry to be generalized for label placement.
*
* @return whether to allow the geometry to be generalized for label placement.
*/
public Expression<R,Boolean> getGeneralizeLine() {
return defaultToFalse(generalizeLine);
}
/**
* Sets whether to allow the geometry to be generalized for label placement.
* If this method is never invoked, then the default value is literal false.
*
* @param value whether to allow the geometry to be generalized, or {@code null} for resetting the default value.
*/
public void setGeneralizeLine(final Expression<R,Boolean> value) {
generalizeLine = 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[] {perpendicularOffset, isRepeated, initialGap, gap, isAligned, generalizeLine};
}
/**
* 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 LinePlacement<R> clone() {
return (LinePlacement<R>) super.clone();
}
}