package org.geotools.styling.builder; import org.geotools.Builder; import org.geotools.factory.CommonFactoryFinder; import org.geotools.filter.expression.ExpressionBuilder; import org.geotools.styling.Font; import org.geotools.styling.LabelPlacement; import org.geotools.styling.StyleFactory; import org.geotools.styling.TextSymbolizer; import org.opengis.filter.expression.Expression; public class TextSymbolizerBuilder<P> implements Builder<TextSymbolizer> { StyleFactory sf = CommonFactoryFinder.getStyleFactory(null); P parent; FillBuilder<TextSymbolizerBuilder<P>> fill = new FillBuilder<TextSymbolizerBuilder<P>>(this); HaloBuilder<TextSymbolizerBuilder<P>> halo = new HaloBuilder(this).unset(); ExpressionBuilder label = new ExpressionBuilder(); String geometry; boolean unset = false; private LabelPlacement labelPlacement = null; // TODO: LabelPlacement builder public TextSymbolizerBuilder() { this(null); } public TextSymbolizerBuilder(P parent) { this.parent = parent; reset(); } public TextSymbolizerBuilder<P> geometry(String geometry) { this.geometry = geometry; return this; } public HaloBuilder<TextSymbolizerBuilder<P>> halo() { return halo; } public TextSymbolizer build() { if (unset) { return null; } Font[] fonts = null; TextSymbolizer ts = sf.createTextSymbolizer(fill.build(), fonts, halo.build(), label .build(), labelPlacement, geometry); reset(); return ts; } public TextSymbolizerBuilder<P> unset() { reset(); unset = true; return this; } public TextSymbolizerBuilder<P> reset() { fill.reset(); // TODO: default fill for text? halo.unset(); // no default halo label.unset(); geometry = null; labelPlacement = null; unset = false; return this; } public TextSymbolizerBuilder<P> reset(TextSymbolizer symbolizer) { fill.reset(symbolizer.getFill()); // TODO: default fill for text? halo.reset(symbolizer.getHalo()); // no default halo label.reset(symbolizer.getLabel()); geometry = symbolizer.getGeometryPropertyName(); labelPlacement = (LabelPlacement) symbolizer.getLabelPlacement(); unset = false; return this; } public ExpressionBuilder label() { unset = false; return label; } /** * Expression used to label features. * <p> * The label expression often refers to an existing property. <br/> * <code>textBuilder.label().property("fullname")</code> * <p> * You may wish to concatenate several expressions together into a single label:<br/> * <code>textBuilder.label().function("strConcat").param().property("city").param().literal("!")</code> * * @param expr * @return ExpressionBuilder for chaining */ public ExpressionBuilder label(Expression expr) { label.reset(expr); unset = false; return label; } }