package org.geotools.styling.builder;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.geotools.Builder;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.filter.expression.ChildExpressionBuilder;
import org.geotools.metadata.iso.citation.OnLineResourceImpl;
import org.geotools.styling.Graphic;
import org.geotools.styling.StyleFactory;
import org.geotools.styling.Symbol;
import org.opengis.filter.expression.Expression;
import org.opengis.style.GraphicalSymbol;
public class GraphicBuilder<P> implements Builder<org.opengis.style.Graphic> {
boolean unset = false;
P parent;
StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
List<SymbolBuilder<GraphicBuilder<P>>> symbols = new ArrayList<SymbolBuilder<GraphicBuilder<P>>>();
ChildExpressionBuilder<GraphicBuilder<P>> opacity = new ChildExpressionBuilder<GraphicBuilder<P>>(
this);
ChildExpressionBuilder<GraphicBuilder<P>> size = new ChildExpressionBuilder<GraphicBuilder<P>>(
this);
ChildExpressionBuilder<GraphicBuilder<P>> rotation = new ChildExpressionBuilder<GraphicBuilder<P>>(
this);
private AnchorPointBuilder<GraphicBuilder<P>> anchor = new AnchorPointBuilder<GraphicBuilder<P>>(
this);
private DisplacementBuilder<GraphicBuilder<P>> displacement = new DisplacementBuilder<GraphicBuilder<P>>(
this);
public GraphicBuilder() {
this.parent = null;
reset();
}
public GraphicBuilder(P parent) {
this.parent = parent;
reset();
}
public GraphicBuilder<P> opacity(Expression opacity) {
this.opacity.reset(opacity);
return this;
}
public GraphicBuilder<P> size(Expression size) {
this.size.reset(size);
return this;
}
public GraphicBuilder<P> rotation(Expression rotation) {
this.rotation.reset(rotation);
return this;
}
public ExternalGraphicBuilder<GraphicBuilder<P>> externalGraphic() {
SymbolBuilder<GraphicBuilder<P>> symbolBuilder = new SymbolBuilder<GraphicBuilder<P>>(this);
symbols.add( symbolBuilder );
return symbolBuilder.external();
}
public ExternalGraphicBuilder<GraphicBuilder<P>> externalGraphic(URL onlineResource, String format) {
SymbolBuilder<GraphicBuilder<P>> symbolBuilder = new SymbolBuilder<GraphicBuilder<P>>(this);
symbols.add( symbolBuilder );
ExternalGraphicBuilder<GraphicBuilder<P>> external = symbolBuilder.external().format(format);
try {
external.resource( new OnLineResourceImpl( onlineResource.toURI() ) );
} catch (URISyntaxException e) {
}
return external;
}
public GraphicBuilder<P> externalGraphic(String onlineResource, String format) {
SymbolBuilder<GraphicBuilder<P>> symbolBuilder = new SymbolBuilder<GraphicBuilder<P>>(this);
symbols.add( symbolBuilder );
ExternalGraphicBuilder<GraphicBuilder<P>> external = symbolBuilder.external().format(format);
try {
external.resource( new OnLineResourceImpl( new URI( onlineResource) ));
} catch (URISyntaxException e) {
}
return this;
}
public MarkBuilder<GraphicBuilder<P>> mark() {
SymbolBuilder<GraphicBuilder<P>> symbolBuilder = new SymbolBuilder<GraphicBuilder<P>>(this);
symbols.add( symbolBuilder );
return symbolBuilder.mark();
}
public GraphicBuilder<P> mark(String wellKnownName ) {
SymbolBuilder<GraphicBuilder<P>> symbolBuilder = new SymbolBuilder<GraphicBuilder<P>>(this);
symbols.add( symbolBuilder );
symbolBuilder.mark().wellKnownName().literal(wellKnownName);
return this;
}
public Graphic build() {
if (unset) {
return null;
}
List<GraphicalSymbol> list = new ArrayList<GraphicalSymbol>();
for( SymbolBuilder<GraphicBuilder<P>> symbol : symbols ){
list.add( symbol.build() );
}
Graphic g = sf.graphic(list, opacity.build(), size.build(), rotation.build(), anchor
.build(), displacement.build());
if( parent == null ) reset();
return g;
}
public GraphicBuilder<P> unset() {
unset = true;
symbols.clear();
opacity.unset();
size.unset();
rotation.unset();
displacement.unset();
anchor.unset();
return this;
}
public GraphicBuilder<P> reset() {
unset = false;
symbols.clear();
opacity.reset().literal(1.0);
size.reset().literal(16);
rotation.reset().literal(0);
displacement.reset();
anchor.reset();
return this;
}
@SuppressWarnings("unchecked")
public GraphicBuilder<P> reset(org.opengis.style.Graphic graphic) {
if (graphic == null) {
return unset();
}
unset = false;
symbols.clear();
for( GraphicalSymbol graphicalSymbol : graphic.graphicalSymbols()){
if( graphicalSymbol instanceof Symbol){
Symbol symbol = (Symbol) graphicalSymbol;
symbols.add(new SymbolBuilder<GraphicBuilder<P>>(this).reset( symbol ));
}
}
opacity.reset( graphic.getOpacity() );
size.reset( graphic.getSize() );
rotation.reset( graphic.getRotation() );
displacement.reset( graphic.getDisplacement() );
anchor.reset( graphic.getAnchorPoint() );
return this;
}
}