/* * Geotoolkit - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2011, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.style.visitor; import org.geotoolkit.filter.visitor.PrepareFilterVisitor; import org.geotoolkit.style.DefaultStyleFactory; import org.geotoolkit.style.MutableStyleFactory; import org.opengis.feature.FeatureType; import org.opengis.filter.expression.Expression; import org.opengis.style.AnchorPoint; import org.opengis.style.ChannelSelection; import org.opengis.style.ColorMap; import org.opengis.style.ColorReplacement; import org.opengis.style.ContrastEnhancement; import org.opengis.style.Description; import org.opengis.style.Displacement; import org.opengis.style.ExtensionSymbolizer; import org.opengis.style.ExternalGraphic; import org.opengis.style.ExternalMark; import org.opengis.style.FeatureTypeStyle; import org.opengis.style.Fill; import org.opengis.style.Font; import org.opengis.style.Graphic; import org.opengis.style.GraphicFill; import org.opengis.style.GraphicLegend; import org.opengis.style.GraphicStroke; import org.opengis.style.Halo; import org.opengis.style.LabelPlacement; import org.opengis.style.LinePlacement; import org.opengis.style.LineSymbolizer; import org.opengis.style.Mark; import org.opengis.style.PointPlacement; import org.opengis.style.PointSymbolizer; import org.opengis.style.PolygonSymbolizer; import org.opengis.style.RasterSymbolizer; import org.opengis.style.Rule; import org.opengis.style.SelectedChannelType; import org.opengis.style.ShadedRelief; import org.opengis.style.Stroke; import org.opengis.style.Style; import org.opengis.style.StyleVisitor; import org.opengis.style.Symbolizer; import org.opengis.style.TextSymbolizer; /** * Copy and simplify operations * * @author Johann Sorel (Geomatys) * @module */ public class PrepareStyleVisitor extends PrepareFilterVisitor implements StyleVisitor{ private static final MutableStyleFactory SF = new DefaultStyleFactory(); public PrepareStyleVisitor(final Class clazz,final FeatureType expectedType){ super(clazz, expectedType); } @Override public Object visit(Style style, Object o) { //TODO return style; } @Override public Object visit(FeatureTypeStyle fts, Object o) { //TODO return fts; } @Override public Object visit(Rule rule, Object o) { //TODO return rule; } @Override public Object visit(PointSymbolizer ps, Object o) { final Graphic orig = ps.getGraphic(); if(orig == null){ return ps; } final Graphic opt = (Graphic)orig.accept(this, o); if(opt == orig){ return ps; } //recreate symbolizer return SF.pointSymbolizer( ps.getName(), visitGeometryExpression(ps, o), ps.getDescription(), ps.getUnitOfMeasure(), opt); } @Override public Object visit(LineSymbolizer ls, Object o) { Expression offset = ls.getPerpendicularOffset(); Stroke stroke = ls.getStroke(); if(offset != null){ offset = (Expression) offset.accept(this, o); } if(stroke != null){ stroke = (Stroke)stroke.accept(this, o); } //recreate symbolizer return SF.lineSymbolizer( ls.getName(), visitGeometryExpression(ls, o), ls.getDescription(), ls.getUnitOfMeasure(), stroke, offset); } @Override public Object visit(PolygonSymbolizer ps, Object o) { Displacement disp = ps.getDisplacement(); Fill fill = ps.getFill(); Expression offset = ps.getPerpendicularOffset(); Stroke stroke = ps.getStroke(); if(disp != null){ disp = (Displacement) disp.accept(this, o); } if(fill != null){ fill = (Fill) fill.accept(this, o); } if(offset != null){ offset = (Expression) offset.accept(this, o); } if(stroke != null){ stroke = (Stroke)stroke.accept(this, o); } //recreate symbolizer return SF.polygonSymbolizer(ps.getName(), visitGeometryExpression(ps, o), ps.getDescription(), ps.getUnitOfMeasure(), stroke, fill, disp, offset); } @Override public Object visit(TextSymbolizer ts, Object o) { Fill fill = ts.getFill(); Font font = ts.getFont(); Halo halo = ts.getHalo(); Expression label = ts.getLabel(); LabelPlacement place = ts.getLabelPlacement(); if(fill != null){ fill = (Fill)fill.accept(this, o); } if(font != null){ font = (Font)font.accept(this, o); } if(halo != null){ halo = (Halo)halo.accept(this, o); } if(label != null){ label = (Expression)label.accept(this, o); } if(place != null){ place = (LabelPlacement)place.accept(this, o); } //recreate symbolizer return SF.textSymbolizer(ts.getName(), visitGeometryExpression(ts, o), ts.getDescription(), ts.getUnitOfMeasure(), label, font, place, halo, fill); } @Override public Object visit(RasterSymbolizer rs, Object o) { //nothing to optimize here return rs; } @Override public Object visit(ExtensionSymbolizer es, Object o) { return es; } private Expression visitGeometryExpression(Symbolizer symbolizer, Object o){ final Expression exp = symbolizer.getGeometry(); if(exp==null) return null; return (Expression) exp.accept(this, o); } @Override public Object visit(Description d, Object o) { return d; } @Override public Object visit(Displacement d, Object o) { return SF.displacement( (Expression)d.getDisplacementX().accept(this, o), (Expression)d.getDisplacementY().accept(this, o)); } @Override public Object visit(Fill fill, Object o) { Expression color = fill.getColor(); GraphicFill gra = fill.getGraphicFill(); Expression opacity = fill.getOpacity(); if(color != null){ color = (Expression)color.accept(this, o); } if(gra != null){ gra = (GraphicFill)gra.accept(this, o); } if(opacity != null){ opacity = (Expression)opacity.accept(this, o); } return SF.fill(gra, color, opacity); } @Override public Object visit(Font font, Object o) { Expression size = font.getSize(); Expression style = font.getStyle(); Expression weight = font.getWeight(); if(size != null){ size = (Expression)size.accept(this, o); } if(style != null){ style = (Expression)style.accept(this, o); } if(weight != null){ weight = (Expression)weight.accept(this, o); } return SF.font(font.getFamily(), style, weight, size); } @Override public Object visit(Stroke stroke, Object o) { Expression color = stroke.getColor(); Expression offset = stroke.getDashOffset(); GraphicFill grafill = stroke.getGraphicFill(); GraphicStroke grastroke = stroke.getGraphicStroke(); Expression cap = stroke.getLineCap(); Expression join = stroke.getLineJoin(); Expression opacity = stroke.getOpacity(); Expression width = stroke.getWidth(); if(color != null){ color = (Expression)color.accept(this, o); } if(offset != null){ offset = (Expression)offset.accept(this, o); } if(grafill != null){ grafill = (GraphicFill)grafill.accept(this, o); } if(grastroke != null){ grastroke = (GraphicStroke)grastroke.accept(this, o); } if(cap != null){ cap = (Expression)cap.accept(this, o); } if(join != null){ join = (Expression)join.accept(this, o); } if(opacity != null){ opacity = (Expression)opacity.accept(this, o); } if(width != null){ width = (Expression)width.accept(this, o); } if(grafill != null){ return SF.stroke(grafill, color, opacity, width, join, cap, stroke.getDashArray(), offset); }else if(grastroke != null){ return SF.stroke(grastroke, color, opacity, width, join, cap, stroke.getDashArray(), offset); }else{ return SF.stroke(color, opacity, width, join, cap, stroke.getDashArray(), offset); } } @Override public Object visit(Graphic grphc, Object o) { //TODO return grphc; } @Override public Object visit(GraphicFill gf, Object o) { //TODO return gf; } @Override public Object visit(GraphicStroke gs, Object o) { //TODO return gs; } @Override public Object visit(Mark mark, Object o) { //TODO return mark; } @Override public Object visit(ExternalMark em, Object o) { //TODO return em; } @Override public Object visit(ExternalGraphic eg, Object o) { //TODO return eg; } @Override public Object visit(PointPlacement pp, Object o) { //TODO return pp; } @Override public Object visit(AnchorPoint ap, Object o) { //TODO return ap; } @Override public Object visit(LinePlacement lp, Object o) { //TODO return lp; } @Override public Object visit(GraphicLegend gl, Object o) { return gl; } @Override public Object visit(Halo halo, Object o) { //TODO return halo; } @Override public Object visit(ColorMap cm, Object o) { return cm; } @Override public Object visit(ColorReplacement cr, Object o) { return cr; } @Override public Object visit(ContrastEnhancement ce, Object o) { return ce; } @Override public Object visit(ChannelSelection cs, Object o) { return cs; } @Override public Object visit(SelectedChannelType sct, Object o) { return sct; } @Override public Object visit(ShadedRelief sr, Object o) { return sr; } }