package org.geotools.styling.builder; import org.geotools.Builder; import org.geotools.styling.LabelPlacement; import org.geotools.styling.LinePlacement; import org.geotools.styling.PointPlacement; public class LabelPlacementBuilder<P> implements Builder<LabelPlacement> { private P parent; Builder<? extends LabelPlacement> delegate; public LabelPlacementBuilder() { this(null); } public LabelPlacementBuilder(P parent) { this.parent = parent; reset(); } @SuppressWarnings("unchecked") public PointPlacementBuilder<P> point(){ if( delegate instanceof PointPlacementBuilder<?>){ return (PointPlacementBuilder<P>) delegate; } delegate = new PointPlacementBuilder<P>(parent); return (PointPlacementBuilder<P>) delegate; } @SuppressWarnings("unchecked") public LinePlacementBuilder<P> line(){ if( delegate instanceof LinePlacementBuilder<?>){ return (LinePlacementBuilder<P>) delegate; } delegate = new LinePlacementBuilder<P>(parent); return (LinePlacementBuilder<P>) delegate; } public LabelPlacement build() { if (delegate == null) { return null; } return delegate.build(); } public P end() { return parent; } public LabelPlacementBuilder<P> reset() { delegate = new PointPlacementBuilder<P>().reset(); return this; } public LabelPlacementBuilder<P> reset(LabelPlacement placement) { if (placement == null) { delegate = null; } else if (placement instanceof PointPlacement ){ PointPlacement pointPlacement = (PointPlacement) placement; delegate = new PointPlacementBuilder<P>(parent).reset( pointPlacement ); } else if (placement instanceof LinePlacement ){ LinePlacement linePlacement = (LinePlacement) placement; delegate = new LinePlacementBuilder<P>(parent).reset( linePlacement ); } return this; } public LabelPlacementBuilder<P> unset() { delegate = null; return this; } }