package org.geotools.styling.builder;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.swing.Icon;
import org.geotools.Builder;
import org.geotools.factory.CommonFactoryFinder;
import org.geotools.styling.AnchorPoint;
import org.geotools.styling.ExternalGraphic;
import org.geotools.styling.StyleFactory;
import org.opengis.metadata.citation.OnLineResource;
import org.opengis.style.ColorReplacement;
public class ExternalGraphicBuilder<P> implements Builder<ExternalGraphic> {
private StyleFactory sf = CommonFactoryFinder.getStyleFactory(null);
private P parent;
boolean unset = true; // current value is null
private Icon inline;
private String format;
private OnLineResource resource;
private Set<ColorReplacementBuilder<ExternalGraphicBuilder<P>>> replacements = new HashSet<ColorReplacementBuilder<ExternalGraphicBuilder<P>>>();
public ExternalGraphicBuilder() {
this(null);
}
public ExternalGraphicBuilder(P parent) {
this.parent = parent;
reset();
}
public String format() {
return format;
}
public ExternalGraphicBuilder<P> format(String format) {
this.format = format;
return this;
}
public Icon inline() {
return inline;
}
public ExternalGraphicBuilder<P> inline(Icon icon) {
this.inline = icon;
return this;
}
public Set<ColorReplacementBuilder<ExternalGraphicBuilder<P>>> replacements() {
return replacements;
}
public ColorReplacementBuilder<ExternalGraphicBuilder<P>> replacement() {
ColorReplacementBuilder<ExternalGraphicBuilder<P>> replacement = new ColorReplacementBuilder<ExternalGraphicBuilder<P>>(this);
this.replacements.add( replacement );
return replacement;
}
public OnLineResource resource() {
return resource;
}
public ExternalGraphicBuilder<P> resource(OnLineResource resource) {
this.resource = resource;
return this;
}
public ExternalGraphic build() {
if (unset) {
return null;
}
ExternalGraphic externalGraphic;
Collection<ColorReplacement> set = new HashSet<ColorReplacement>();
for (ColorReplacementBuilder<ExternalGraphicBuilder<P>> replacement : replacements) {
set.add(replacement.build());
}
if (inline != null) {
externalGraphic = sf.externalGraphic(inline, set);
} else {
externalGraphic = sf.externalGraphic(resource, format, set);
}
if (parent == null) reset();
return externalGraphic;
}
public P end() {
return parent;
}
public ExternalGraphicBuilder<P> reset() {
unset = false;
return this;
}
public ExternalGraphicBuilder<P> reset(AnchorPoint original) {
if (original == null) {
return reset();
}
unset = false;
return this;
}
public ExternalGraphicBuilder<P> unset() {
unset = true;
return this;
}
public ExternalGraphicBuilder<P> reset(ExternalGraphic original) {
return null;
}
}