/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2011-2014, 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 java.util.Collection;
import java.util.List;
import java.util.Map;
import org.opengis.filter.Filter;
import org.opengis.filter.Id;
import org.opengis.filter.expression.Expression;
import org.opengis.filter.expression.Function;
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.GraphicalSymbol;
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;
/**
* Expression visitor that returns a list of all Feature attributs requiered by this style.
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class ListingPropertyVisitor extends org.geotoolkit.filter.visitor.ListingPropertyVisitor implements StyleVisitor{
public static final ListingPropertyVisitor VISITOR = new ListingPropertyVisitor();
@Override
public Object visit(final Style style, Object data) {
final List<? extends FeatureTypeStyle> ftss = style.featureTypeStyles();
if(ftss != null){
for(FeatureTypeStyle fts : ftss){
data = fts.accept(this, data);
}
}
final Symbolizer def = style.getDefaultSpecification();
if(def != null){
data = def.accept(this, data);
}
return data;
}
@Override
public Object visit(final FeatureTypeStyle featureTypeStyle, Object data) {
final Id ids = featureTypeStyle.getFeatureInstanceIDs();
if(ids != null){
data = ids.accept(this, data);
}
final List<? extends Rule> rules = featureTypeStyle.rules();
if(rules != null){
for(Rule r : rules){
data = r.accept(this, data);
}
}
return data;
}
@Override
public Object visit(final Rule rule, Object data) {
final Filter filter = rule.getFilter();
if(filter != null){
data = filter.accept(this, data);
}
final GraphicLegend legend = rule.getLegend();
if(legend != null){
data = legend.accept(this, data);
}
final List<? extends Symbolizer> symbols = rule.symbolizers();
if(symbols != null){
for(Symbolizer symbol : symbols){
data = symbol.accept(this, data);
}
}
return data;
}
private void visitGeomName(Symbolizer symbolizer, Object data){
final Expression exp = symbolizer.getGeometry();
if(exp!=null){
exp.accept(this, data);
}
}
@Override
public Object visit(final PointSymbolizer pointSymbolizer, Object data) {
visitGeomName(pointSymbolizer, data);
final Graphic gra = pointSymbolizer.getGraphic();
if(gra != null){
data = gra.accept(this, data);
}
return data;
}
@Override
public Object visit(final LineSymbolizer lineSymbolizer, Object data) {
visitGeomName(lineSymbolizer, data);
final Expression offset = lineSymbolizer.getPerpendicularOffset();
if(offset != null){
data = offset.accept(this, data);
}
final Stroke stroke = lineSymbolizer.getStroke();
if(stroke != null){
data = stroke.accept(this, data);
}
return data;
}
@Override
public Object visit(final PolygonSymbolizer polygonSymbolizer, Object data) {
visitGeomName(polygonSymbolizer, data);
final Displacement disp = polygonSymbolizer.getDisplacement();
if(disp != null){
data = disp.accept(this, data);
}
final Fill fill = polygonSymbolizer.getFill();
if(fill != null){
data = fill.accept(this, data);
}
final Expression offset = polygonSymbolizer.getPerpendicularOffset();
if(offset != null){
data = offset.accept(this, data);
}
final Stroke stroke = polygonSymbolizer.getStroke();
if(stroke != null){
data = stroke.accept(this, data);
}
return data;
}
@Override
public Object visit(final TextSymbolizer textSymbolizer, Object data) {
visitGeomName(textSymbolizer, data);
final Fill fill = textSymbolizer.getFill();
if(fill != null){
data = fill.accept(this, data);
}
final Font font = textSymbolizer.getFont();
if(font != null){
data = font.accept(this, data);
}
final Halo halo = textSymbolizer.getHalo();
if(halo != null){
data = halo.accept(this, data);
}
final Expression label = textSymbolizer.getLabel();
if(label != null){
data = label.accept(this, data);
}
final LabelPlacement place = textSymbolizer.getLabelPlacement();
if(place != null){
data = place.accept(this, data);
}
return data;
}
@Override
public Object visit(final RasterSymbolizer rasterSymbolizer, Object data) {
visitGeomName(rasterSymbolizer, data);
final ChannelSelection cs = rasterSymbolizer.getChannelSelection();
if(cs != null){
data = cs.accept(this, data);
}
final ColorMap cm = rasterSymbolizer.getColorMap();
if(cm != null){
data = cm.accept(this, data);
}
final ContrastEnhancement ce = rasterSymbolizer.getContrastEnhancement();
if(ce != null){
data = ce.accept(this, data);
}
final Symbolizer sym = rasterSymbolizer.getImageOutline();
if(sym != null){
data = sym.accept(this, data);
}
final Expression opa = rasterSymbolizer.getOpacity();
if(opa != null){
data = opa.accept(this, data);
}
final ShadedRelief shade = rasterSymbolizer.getShadedRelief();
if(shade != null){
data = shade.accept(this, data);
}
return data;
}
@Override
public Object visit(final ExtensionSymbolizer extension, Object data) {
visitGeomName(extension, data);
final Map<String,Expression> exps = extension.getParameters();
if(exps != null){
for(Expression exp : exps.values()){
data = exp.accept(this, data);
}
}
return data;
}
@Override
public Object visit(final Description description, final Object data) {
return data;
}
@Override
public Object visit(final Displacement displacement, Object data) {
final Expression x = displacement.getDisplacementX();
if(x != null){
data = x.accept(this, data);
}
final Expression y = displacement.getDisplacementY();
if(y != null){
data = y.accept(this, data);
}
return data;
}
@Override
public Object visit(final Fill fill, Object data) {
final Expression color = fill.getColor();
if(color != null){
data = color.accept(this, data);
}
final GraphicFill gf = fill.getGraphicFill();
if(gf != null){
data = gf.accept(this, data);
}
final Expression opa = fill.getOpacity();
if(opa != null){
data = opa.accept(this, data);
}
return data;
}
@Override
public Object visit(final Font font, Object data) {
final List<Expression> families = font.getFamily();
if(families != null){
for(Expression family : families){
data = family.accept(this, data);
}
}
final Expression size = font.getSize();
if(size != null){
data = size.accept(this, data);
}
final Expression style = font.getStyle();
if(style != null){
data = style.accept(this, data);
}
final Expression weight = font.getWeight();
if(weight != null){
data = weight.accept(this, data);
}
return data;
}
@Override
public Object visit(final Stroke stroke, Object data) {
final Expression color = stroke.getColor();
if(color != null){
data = color.accept(this, data);
}
final Expression offset = stroke.getDashOffset();
if(offset != null){
data = offset.accept(this, data);
}
final GraphicFill gf = stroke.getGraphicFill();
if(gf != null){
data = gf.accept(this, data);
}
final GraphicStroke gs = stroke.getGraphicStroke();
if(gs != null){
data = gs.accept(this, data);
}
final Expression lc = stroke.getLineCap();
if(lc != null){
data = lc.accept(this, data);
}
final Expression lj = stroke.getLineJoin();
if(lj != null){
data = lj.accept(this, data);
}
final Expression opa = stroke.getOpacity();
if(opa != null){
data = opa.accept(this, data);
}
final Expression width = stroke.getWidth();
if(width != null){
data = width.accept(this, data);
}
return data;
}
@Override
public Object visit(final Graphic graphic, Object data) {
final AnchorPoint ac = graphic.getAnchorPoint();
if(ac != null){
data = ac.accept(this, data);
}
final Displacement disp = graphic.getDisplacement();
if(disp != null){
data = disp.accept(this, data);
}
final Expression opa = graphic.getOpacity();
if(opa != null){
data = opa.accept(this, data);
}
final Expression rot = graphic.getRotation();
if(rot != null){
data = rot.accept(this, data);
}
final Expression size = graphic.getSize();
if(size != null){
data = size.accept(this, data);
}
final List<GraphicalSymbol> symbols = graphic.graphicalSymbols();
if(symbols != null){
for(GraphicalSymbol gs : symbols){
if(gs instanceof Mark){
data = ((Mark)gs).accept(this, data);
}else if(gs instanceof ExternalGraphic){
data = ((ExternalGraphic)gs).accept(this, data);
}
}
}
return data;
}
@Override
public Object visit(final GraphicFill graphicFill, final Object data) {
return visit((Graphic)graphicFill, data);
}
@Override
public Object visit(final GraphicStroke graphicStroke, Object data) {
data = visit((Graphic)graphicStroke, data);
final Expression gap = graphicStroke.getGap();
if(gap != null){
data = gap.accept(this, data);
}
final Expression igap = graphicStroke.getInitialGap();
if(igap != null){
data = igap.accept(this, data);
}
return data;
}
@Override
public Object visit(final Mark mark, Object data) {
final ExternalMark em = mark.getExternalMark();
if(em != null){
data = em.accept(this, data);
}
final Fill fill = mark.getFill();
if(fill != null){
data = fill.accept(this, data);
}
final Stroke stroke = mark.getStroke();
if(stroke != null){
data = stroke.accept(this, data);
}
final Expression wkn = mark.getWellKnownName();
if(wkn != null){
data = wkn.accept(this, data);
}
return data;
}
@Override
public Object visit(final ExternalMark externalMark, final Object data) {
return data;
}
@Override
public Object visit(final ExternalGraphic externalGraphic, Object data) {
final Collection<ColorReplacement> replaces = externalGraphic.getColorReplacements();
if(replaces != null){
for(ColorReplacement r : replaces){
data = r.accept(this, data);
}
}
return data;
}
@Override
public Object visit(final PointPlacement pointPlacement, Object data) {
final AnchorPoint ap = pointPlacement.getAnchorPoint();
if(ap != null){
data = ap.accept(this, data);
}
final Displacement disp = pointPlacement.getDisplacement();
if(disp != null){
data = disp.accept(this, data);
}
final Expression rot = pointPlacement.getRotation();
if(rot != null){
data = rot.accept(this, data);
}
return data;
}
@Override
public Object visit(final AnchorPoint anchorPoint, Object data) {
final Expression x = anchorPoint.getAnchorPointX();
if(x != null){
data = x.accept(this, data);
}
final Expression y = anchorPoint.getAnchorPointY();
if(y != null){
data = y.accept(this, data);
}
return data;
}
@Override
public Object visit(final LinePlacement linePlacement, Object data) {
final Expression gap = linePlacement.getGap();
if(gap != null){
data = gap.accept(this, data);
}
final Expression igap = linePlacement.getInitialGap();
if(igap != null){
data = igap.accept(this, data);
}
final Expression offset = linePlacement.getPerpendicularOffset();
if(offset != null){
data = offset.accept(this, data);
}
return data;
}
@Override
public Object visit(final GraphicLegend graphicLegend, final Object data) {
return visit((Graphic)graphicLegend, data);
}
@Override
public Object visit(final Halo halo, Object data) {
final Fill fill = halo.getFill();
if(fill != null){
data = fill.accept(this, data);
}
final Expression radius = halo.getRadius();
if(radius != null){
data = radius.accept(this, data);
}
return data;
}
@Override
public Object visit(final ColorMap colorMap, Object data) {
final Function fct = colorMap.getFunction();
if(fct != null){
data = fct.accept(this, data);
}
return data;
}
@Override
public Object visit(final ColorReplacement colorReplacement, Object data) {
final Function fct = colorReplacement.getRecoding();
if(fct != null){
data = fct.accept(this, data);
}
return data;
}
@Override
public Object visit(final ContrastEnhancement contrastEnhancement, Object data) {
final Expression gamma = contrastEnhancement.getGammaValue();
if(gamma != null){
data = gamma.accept(this, data);
}
return data;
}
@Override
public Object visit(final ChannelSelection channelSelection, Object data) {
final SelectedChannelType sct = channelSelection.getGrayChannel();
if(sct != null){
data = sct.accept(this, data);
}
final SelectedChannelType[] scts = channelSelection.getRGBChannels();
if(scts != null){
for(SelectedChannelType sc : scts){
if(sc != null){
data = sc.accept(this, data);
}
}
}
return data;
}
@Override
public Object visit(final SelectedChannelType selectChannelType, Object data) {
final ContrastEnhancement enc = selectChannelType.getContrastEnhancement();
if(enc != null){
data = enc.accept(this, data);
}
return data;
}
@Override
public Object visit(final ShadedRelief shadedRelief, Object data) {
final Expression exp = shadedRelief.getReliefFactor();
if(exp != null){
data = exp.accept(this, data);
}
return data;
}
}