/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2014, 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.builder;
import java.util.ArrayList;
import java.util.List;
import javax.measure.quantity.Length;
import javax.measure.unit.Unit;
import org.geotools.Builder;
import org.geotools.styling.Font;
import org.geotools.styling.LabelPlacement;
import org.geotools.styling.LinePlacement;
import org.geotools.styling.PointPlacement;
import org.geotools.styling.TextSymbolizer;
import org.geotools.styling.TextSymbolizer2;
import org.opengis.filter.expression.Expression;
/**
*
*
* @source $URL$
*/
public class TextSymbolizerBuilder extends SymbolizerBuilder<TextSymbolizer> {
FillBuilder fill = new FillBuilder(this).unset();
List<FontBuilder> fonts = new ArrayList<FontBuilder>();
FontBuilder font;
HaloBuilder halo = new HaloBuilder(this).unset();
Expression label;
Expression geometry = null;
Unit<Length> uom;
GraphicBuilder shield = new GraphicBuilder(this).unset();
Builder<? extends LabelPlacement> placement = new PointPlacementBuilder(this).unset();
private Expression priority;
public TextSymbolizerBuilder() {
this(null);
}
public TextSymbolizerBuilder(RuleBuilder parent) {
super(parent);
reset();
}
public TextSymbolizerBuilder geometry(Expression geometry) {
this.geometry = geometry;
return this;
}
public TextSymbolizerBuilder geometry(String cqlExpression) {
return geometry(cqlExpression(cqlExpression));
}
public HaloBuilder halo() {
unset = false;
return halo;
}
public FillBuilder fill() {
unset = false;
return fill;
}
public FontBuilder newFont() {
unset = false;
FontBuilder font = new FontBuilder(this);
fonts.add(font);
return font;
}
public LinePlacementBuilder linePlacement() {
if (!(placement instanceof LinePlacementBuilder)) {
placement = new LinePlacementBuilder(this);
}
unset = false;
return (LinePlacementBuilder) placement;
}
public PointPlacementBuilder pointPlacement() {
if (!(placement instanceof PointPlacementBuilder)) {
placement = new PointPlacementBuilder(this);
}
unset = false;
return (PointPlacementBuilder) placement;
}
public TextSymbolizerBuilder uom(Unit<Length> uom) {
unset = false;
this.uom = uom;
return this;
}
public GraphicBuilder shield() {
unset = false;
return shield;
}
public TextSymbolizer build() {
if (unset) {
return null;
}
Font[] array = null;
if (!fonts.isEmpty()) {
array = new Font[fonts.size()];
for (int i = 0; i < array.length; i++) {
array[i] = fonts.get(i).build();
}
}
TextSymbolizer ts = sf.createTextSymbolizer(fill.build(), array, halo.build(), label,
placement.build(), null);
ts.setGeometry(geometry);
if (uom != null) {
ts.setUnitOfMeasure(uom);
}
ts.getOptions().putAll(options);
ts.setPriority(priority);
if (ts instanceof TextSymbolizer2) {
TextSymbolizer2 ts2 = (TextSymbolizer2) ts;
if (!shield.isUnset()) {
ts2.setGraphic(shield.build());
}
}
reset();
return ts;
}
public TextSymbolizerBuilder unset() {
return (TextSymbolizerBuilder) super.unset();
}
public TextSymbolizerBuilder reset() {
fill.reset(); // TODO: default fill for text?
halo.unset(); // no default halo
label = null;
geometry = null;
placement.reset();
placement.unset();
options.clear();
uom = null;
priority = null;
unset = false;
return this;
}
public TextSymbolizerBuilder reset(TextSymbolizer symbolizer) {
fill.reset(symbolizer.getFill());
halo.reset(symbolizer.getHalo());
label = symbolizer.getLabel();
geometry = null;
LabelPlacement otherPlacement = symbolizer.getLabelPlacement();
if (symbolizer.getLabelPlacement() instanceof PointPlacement) {
PointPlacementBuilder builder = new PointPlacementBuilder(this);
builder.reset((PointPlacement) otherPlacement);
placement = builder;
} else if (symbolizer.getLabelPlacement() instanceof LabelPlacement) {
LinePlacementBuilder builder = new LinePlacementBuilder(this);
builder.reset((LinePlacement) otherPlacement);
placement = builder;
} else {
throw new IllegalArgumentException("Unrecognized label placement: " + otherPlacement);
}
priority = symbolizer.getPriority();
unset = false;
return this;
}
public TextSymbolizerBuilder option(String name, Object value) {
options.put(name, value.toString());
unset = false;
return this;
}
public TextSymbolizerBuilder label(Expression label) {
unset = false;
this.label = label;
return this;
}
public TextSymbolizerBuilder label(String cqlExpression) {
return label(cqlExpression(cqlExpression));
}
public TextSymbolizerBuilder labelText(String text) {
return label(literal(text));
}
protected void buildStyleInternal(StyleBuilder sb) {
sb.featureTypeStyle().rule().text().init(this);
}
public TextSymbolizerBuilder priority(Expression priority) {
unset = false;
this.priority = priority;
return this;
}
public TextSymbolizerBuilder priority(String cql) {
return priority(cqlExpression(cql));
}
public TextSymbolizerBuilder priority(int priority) {
return priority(literal(priority));
}
}