package org.geotools.styling.builder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 AbstractStyleBuilder<TextSymbolizer> {
FillBuilder fill = new FillBuilder(this).unset();
List<FontBuilder> fonts = new ArrayList<FontBuilder>();
FontBuilder font;
HaloBuilder halo = new HaloBuilder(this).unset();
Expression label;
String geometry;
Unit<Length> uom;
Builder<? extends LabelPlacement> placement = new PointPlacementBuilder(this).unset();
private Map<String, String> options = new HashMap<String, String>();
public TextSymbolizerBuilder() {
this(null);
}
public TextSymbolizerBuilder(RuleBuilder parent) {
super(parent);
reset();
}
public TextSymbolizerBuilder geometry(String geometry) {
this.geometry = geometry;
return this;
}
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 TextSymbolizer build() {
if (unset) {
return null;
}
Font[] 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(), geometry);
if (uom != null) {
ts.setUnitOfMeasure(uom);
}
if (ts instanceof TextSymbolizer2 && options != null) {
TextSymbolizer2 ts2 = (TextSymbolizer2) ts;
ts2.getOptions().putAll(options);
}
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();
options.clear();
uom = null;
unset = false;
return this;
}
public TextSymbolizerBuilder reset(TextSymbolizer symbolizer) {
fill.reset(symbolizer.getFill());
halo.reset(symbolizer.getHalo());
label = symbolizer.getLabel();
geometry = symbolizer.getGeometryPropertyName();
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);
}
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);
}
}