package org.geotools.styling.builder;
import org.geotools.Builder;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.expression.ChildExpressionBuilder;
import org.geotools.styling.Mark;
import org.geotools.styling.StyleFactory;
import org.opengis.filter.expression.Expression;
public class MarkBuilder<P> implements Builder<Mark> {
StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
P parent;
StrokeBuilder<MarkBuilder<P>> strokeBuilder = new StrokeBuilder<MarkBuilder<P>>(this);
FillBuilder<MarkBuilder<P>> fill = new FillBuilder<MarkBuilder<P>>(this);
ExternalMarkBuilder<MarkBuilder<P>> externalMark = new ExternalMarkBuilder<MarkBuilder<P>>(this);
ChildExpressionBuilder<MarkBuilder<P>> wellKnownName = new ChildExpressionBuilder<MarkBuilder<P>>(this);
public MarkBuilder() {
this( null );
}
public MarkBuilder(P parent) {
this.parent = parent;
reset();
}
public ChildExpressionBuilder<MarkBuilder<P>> wellKnownName() {
externalMark.unset();
return wellKnownName;
}
public MarkBuilder<P> wellKnownName(Expression name) {
this.wellKnownName.reset(name);
this.externalMark.unset();
return this;
}
public MarkBuilder<P> name(Expression name) {
return wellKnownName(name);
}
public ExternalMarkBuilder<MarkBuilder<P>> externalMark() {
return externalMark;
}
public StrokeBuilder<MarkBuilder<P>> stroke() {
return strokeBuilder;
}
public FillBuilder<MarkBuilder<P>> fill() {
return fill;
}
public MarkBuilder<P> reset() {
// TODO: where is the default mark?
this.wellKnownName.reset().literal("square");
this.externalMark.unset();
this.strokeBuilder.reset();
this.fill.reset();
return this;
}
public Mark build() {
Mark mark = null;
if( !externalMark.isUnset() ){
mark = sf.mark( externalMark.build(), fill.build(), strokeBuilder.build());
}
if( !wellKnownName.isUnset() ){
mark = sf.mark(wellKnownName.build(), fill.build(), strokeBuilder.build());
}
if( parent == null ){
reset();
}
return mark;
}
public MarkBuilder<P> reset(Mark mark) {
if( mark == null) return unset();
this.wellKnownName.reset( mark.getWellKnownName() );
this.externalMark.reset( mark.getExternalMark() );
this.strokeBuilder.reset( mark.getStroke() );
this.fill.reset( mark.getFill() );
return null;
}
public MarkBuilder<P> unset() {
externalMark.unset();
wellKnownName.unset();
fill.unset();
strokeBuilder.unset();
return this;
}
}