Package org.locationtech.udig.style.advanced.common.styleattributeclasses

Source Code of org.locationtech.udig.style.advanced.common.styleattributeclasses.TextSymbolizerWrapper

/*
* JGrass - Free Open Source Java GIS http://www.jgrass.org
* (C) HydroloGIS - www.hydrologis.com
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* (http://www.eclipse.org/legal/epl-v10.html), and the HydroloGIS BSD
* License v1.0 (http://udig.refractions.net/files/hsd3-v10.html).
*/
package org.locationtech.udig.style.advanced.common.styleattributeclasses;

import static org.locationtech.udig.style.advanced.utils.Utilities.DEFAULT_COLOR;
import static org.locationtech.udig.style.advanced.utils.Utilities.ff;
import static org.locationtech.udig.style.advanced.utils.Utilities.sb;

import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import org.locationtech.udig.style.sld.SLD;
import org.locationtech.udig.ui.graphics.SLDs;

import org.eclipse.swt.graphics.FontData;
import org.geotools.styling.AnchorPoint;
import org.geotools.styling.Displacement;
import org.geotools.styling.Fill;
import org.geotools.styling.Font;
import org.geotools.styling.Halo;
import org.geotools.styling.LabelPlacement;
import org.geotools.styling.LinePlacement;
import org.geotools.styling.PointPlacement;
import org.geotools.styling.Symbolizer;
import org.geotools.styling.TextSymbolizer;
import org.opengis.filter.expression.Expression;

import org.locationtech.udig.style.advanced.utils.VendorOptions;

/**
* A wrapper for a {@link TextSymbolizer} to ease interaction with gui.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class TextSymbolizerWrapper extends SymbolizerWrapper {

    private String fontFamily;
    private String fontStyle;
    private String fontWeight;
    private String fontSize;
    private String color;
    private String opacity;
    private String haloColor;
    private String anchorX;
    private String anchorY;
    private String displacementX;
    private String displacementY;
    private String rotation;
    private String maxDisplacementVO;
    private String repeatVO;
    private String autoWrapVO;
    private String spaceAroundVO;
    private Font font;

    private TextSymbolizer textSymbolizer;
    private Fill fill;
    private Halo halo;
    private Fill haloFill;
    private PointPlacement pointPlacement;
    private LinePlacement linePlacement;
    private AnchorPoint anchorPoint;
    private Displacement displacement;
    private String haloRadius;
    private String initialGap;
    private String perpendicularOffset;
    private String followLineVO;
    private String maxAngleDeltaVO;
    private SLD geomType;
    private String labelName;

    public TextSymbolizerWrapper( Symbolizer symbolizer, RuleWrapper parent, SLD geomType ) {
        super(symbolizer, parent);
        this.geomType = geomType;

        textSymbolizer = (TextSymbolizer) symbolizer;

        Expression labelExpression = textSymbolizer.getLabel();
        if (labelExpression != null) {
            labelName = expressionToString(labelExpression);
        }

        font = textSymbolizer.getFont();
        if (font != null) {
            List<Expression> family = font.getFamily();
            fontFamily = family.get(0).evaluate(null, String.class);

            Expression styleExpression = font.getStyle();
            fontStyle = styleExpression.evaluate(null, String.class);

            Expression styleWeight = font.getWeight();
            fontWeight = styleWeight.evaluate(null, String.class);

            Expression styleSize = font.getSize();
            fontSize = styleSize.evaluate(null, String.class);
        }

        fill = textSymbolizer.getFill();
        if (fill != null) {
            Expression colorExpression = fill.getColor();
            color = colorExpression.evaluate(null, String.class);
            Expression opacityExpression = fill.getOpacity();
            if (opacityExpression != null) {
                opacity = expressionToString(opacityExpression);
            }
        }

        halo = textSymbolizer.getHalo();
        if (halo != null) {
            haloFill = halo.getFill();
            Expression haloColorExpression = haloFill.getColor();
            haloColor = haloColorExpression.evaluate(null, String.class);

            Expression haloRadiusExpression = halo.getRadius();
            haloRadius = haloRadiusExpression.evaluate(null, String.class);
        }

        LabelPlacement labelPlacement = textSymbolizer.getLabelPlacement();
        if (geomType != null) {
            switch( geomType ) {
            case POINT:
            case POLYGON:
                if (labelPlacement instanceof PointPlacement) {
                    pointPlacement = (PointPlacement) labelPlacement;
                    if (pointPlacement != null) {
                        anchorPoint = pointPlacement.getAnchorPoint();
                        if (anchorPoint != null) {
                            Expression anchorPointXExpression = anchorPoint.getAnchorPointX();
                            anchorX = anchorPointXExpression.evaluate(null, String.class);
                            Expression anchorPointYExpression = anchorPoint.getAnchorPointY();
                            anchorY = anchorPointYExpression.evaluate(null, String.class);
                        }

                        displacement = pointPlacement.getDisplacement();
                        if (displacement != null) {
                            Expression displacementXExpression = displacement.getDisplacementX();
                            displacementX = displacementXExpression.evaluate(null, String.class);
                            Expression displacementYExpression = displacement.getDisplacementY();
                            displacementY = displacementYExpression.evaluate(null, String.class);
                        } else {
                            displacementX = "0.0"; //$NON-NLS-1$
                            displacementY = "0.0"; //$NON-NLS-1$
                        }

                        Expression rotationExpression = pointPlacement.getRotation();
                        rotation = expressionToString(rotationExpression);
                    }
                }
                break;
            case LINE:
                if (labelPlacement instanceof LinePlacement) {
                    linePlacement = (LinePlacement) labelPlacement;
                    if (linePlacement != null) {
                        Expression initialGapExpression = linePlacement.getInitialGap();
                        if (initialGapExpression != null)
                            initialGap = initialGapExpression.evaluate(null, String.class);

                        Expression perpendicularOffsetExpression = linePlacement.getPerpendicularOffset();
                        if (perpendicularOffset != null)
                            perpendicularOffset = perpendicularOffsetExpression.evaluate(null, String.class);
                    }
                }
                break;
            default:
                break;
            }
        }

        /*
         * vendoroptions
         */
        Map<String, String> vendorOptions = textSymbolizer.getOptions();
        Set<Entry<String, String>> entrySet = vendorOptions.entrySet();
        for( Entry<String, String> entry : entrySet ) {
            String key = entry.getKey();
            String value = entry.getValue();

            switch( VendorOptions.toVendorOption(key) ) {
            case VENDOROPTION_MAXDISPLACEMENT:
                maxDisplacementVO = value;
                break;
            case VENDOROPTION_REPEAT:
                repeatVO = value;
                break;
            case VENDOROPTION_AUTOWRAP:
                autoWrapVO = value;
                break;
            case VENDOROPTION_SPACEAROUND:
                spaceAroundVO = value;
                break;
            case VENDOROPTION_FOLLOWLINE:
                followLineVO = value;
                break;
            case VENDOROPTION_MAXANGLEDELTA:
                maxAngleDeltaVO = value;
                break;
            default:
                break;
            }
        }
    }

    public FontData[] getFontData() {
        return SLDs.textFont((TextSymbolizer) getSymbolizer());
    }

    private void checkFontExists() {
        if (font == null) {
            font = sb.createFont("Arial", false, false, 12); //$NON-NLS-1$
            textSymbolizer.setFont(font);
        }
    }

    private void checkFillExists() {
        if (fill == null) {
            fill = sb.createFill(ff.literal(DEFAULT_COLOR));
            textSymbolizer.setFill(fill);
        }
    }

    private void checkHaloFillExists() {
        if (haloFill == null) {
            haloFill = sb.createFill(ff.literal(DEFAULT_COLOR));
            checkHaloExists();
            halo.setFill(haloFill);
        }
    }

    private void checkHaloExists() {
        if (halo == null) {
            halo = sb.createHalo();
            textSymbolizer.setHalo(halo);
        }
    }

    private void checkPlacementExists() {
        switch( geomType ) {
        case POINT:
        case POLYGON:
            if (pointPlacement == null) {
                pointPlacement = sb.createPointPlacement();
                textSymbolizer.setLabelPlacement(pointPlacement);
            }
            break;
        case LINE:
            if (linePlacement == null) {
                linePlacement = sb.createLinePlacement(0.0);
                textSymbolizer.setLabelPlacement(linePlacement);
            }
            break;

        default:
            break;
        }
    }

    private void checkAnchorPointExists() {
        if (anchorPoint == null) {
            anchorPoint = sb.createAnchorPoint(0.5, 0.5);
            checkPlacementExists();
            pointPlacement.setAnchorPoint(anchorPoint);
        }
    }

    private void checkDisplacementExists() {
        if (displacement == null) {
            displacement = sb.createDisplacement(0.0, 0.0);
            checkPlacementExists();
            pointPlacement.setDisplacement(displacement);
        }
    }

    public void setLabelName( String labelName, boolean fromField ) {
        this.labelName = labelName;
        if (fromField) {
            textSymbolizer.setLabel(ff.property(labelName));
        } else {
            textSymbolizer.setLabel(ff.literal(labelName));
        }
    }

    public void setFont( Font font ) {
        this.font = font;
        textSymbolizer.setFont(font);
    }

    public void setFontFamily( String fontFamily ) {
        this.fontFamily = fontFamily;
        checkFontExists();
        font.getFamily().set(0, ff.literal(fontFamily));
    }

    public void setFontStyle( String fontStyle ) {
        this.fontStyle = fontStyle;
        checkFontExists();
        font.setStyle(ff.literal(fontStyle));
    }

    public void setFontWeight( String fontWeight ) {
        this.fontWeight = fontWeight;
        checkFontExists();
        font.setWeight(ff.literal(fontWeight));
    }

    public void setFontSize( String fontSize ) {
        this.fontSize = fontSize;
        checkFontExists();
        font.setSize(ff.literal(fontSize));
    }

    public void setColor( String color ) {
        this.color = color;
        checkFillExists();
        fill.setColor(ff.literal(color));
    }

    public void setOpacity( String opacity, boolean fromField ) {
        this.opacity = opacity;
        checkFillExists();
        if (fromField) {
            fill.setOpacity(ff.property(opacity));
        } else {
            fill.setOpacity(ff.literal(opacity));
        }
    }

    public void setHaloColor( String haloColor ) {
        this.haloColor = haloColor;
        checkHaloFillExists();
        haloFill.setColor(ff.literal(haloColor));
    }

    public void setHaloRadius( String haloRadius ) {
        this.haloRadius = haloRadius;
        checkHaloExists();
        halo.setRadius(ff.literal(haloRadius));
    }

    public void setAnchorX( String anchorX ) {
        this.anchorX = anchorX;
        checkAnchorPointExists();
        anchorPoint.setAnchorPointX(ff.literal(anchorX));
    }

    public void setAnchorY( String anchorY ) {
        this.anchorY = anchorY;
        checkAnchorPointExists();
        anchorPoint.setAnchorPointY(ff.literal(anchorY));
    }

    public void setDisplacement( String displacement ) {
        if (displacement == null || displacement.indexOf(',') == -1) {
            return;
        }
        String[] split = displacement.split(","); //$NON-NLS-1$
        try {
            Double.parseDouble(split[0]);
            Double.parseDouble(split[1]);
            setDisplacementX(split[0]);
            setDisplacementY(split[1]);
        } catch (Exception e) {
            // ignore wrong stuff
        }
    }

    public void setDisplacementX( String displacementX ) {
        this.displacementX = displacementX;
        checkDisplacementExists();
        displacement.setDisplacementX(ff.literal(displacementX));
    }

    public void setDisplacementY( String displacementY ) {
        this.displacementY = displacementY;
        checkDisplacementExists();
        displacement.setDisplacementY(ff.literal(displacementY));
    }

    public void setRotation( String rotation, boolean fromField ) {
        this.rotation = rotation;
        checkPlacementExists();
        if (fromField) {
            pointPlacement.setRotation(ff.property(rotation));
        } else {
            pointPlacement.setRotation(ff.literal(rotation));
        }
    }

    public void setInitialGap( String initialGap ) {
        this.initialGap = initialGap;
        checkPlacementExists();
        linePlacement.setInitialGap(ff.literal(initialGap));
    }

    public void setPerpendicularOffset( String perpendicularOffset ) {
        this.perpendicularOffset = perpendicularOffset;
        checkPlacementExists();
        linePlacement.setPerpendicularOffset(ff.literal(perpendicularOffset));
    }

    public void setMaxDisplacementVO( String maxDisplacementVO ) {
        this.maxDisplacementVO = maxDisplacementVO;
        if (maxDisplacementVO == null || maxDisplacementVO.equals("")) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_MAXDISPLACEMENT.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_MAXDISPLACEMENT.toString(), maxDisplacementVO);
        }
    }

    public void setRepeatVO( String repeatVO ) {
        this.repeatVO = repeatVO;
        if (repeatVO == null || repeatVO.equals("") || geomType != SLD.LINE) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_REPEAT.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_REPEAT.toString(), repeatVO);
        }
    }

    public void setAutoWrapVO( String autoWrapVO ) {
        this.autoWrapVO = autoWrapVO;
        if (autoWrapVO == null || autoWrapVO.equals("")) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_AUTOWRAP.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_AUTOWRAP.toString(), autoWrapVO);
        }
    }

    public void setSpaceAroundVO( String spaceAroundVO ) {
        this.spaceAroundVO = spaceAroundVO;
        if (spaceAroundVO == null || spaceAroundVO.equals("")) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_SPACEAROUND.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_SPACEAROUND.toString(), spaceAroundVO);
        }
    }

    public void setFollowLineVO( String followLineVO ) {
        this.followLineVO = followLineVO;
        if (followLineVO == null || followLineVO.equals("") || geomType != SLD.LINE) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_FOLLOWLINE.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_FOLLOWLINE.toString(), followLineVO);
        }
    }

    public void setMaxAngleDeltaVO( String maxAngleDeltaVO ) {
        this.maxAngleDeltaVO = maxAngleDeltaVO;
        if (maxAngleDeltaVO == null || maxAngleDeltaVO.equals("") || geomType != SLD.LINE) { //$NON-NLS-1$
            textSymbolizer.getOptions().remove(VendorOptions.VENDOROPTION_MAXANGLEDELTA.toString());
        } else {
            textSymbolizer.getOptions().put(VendorOptions.VENDOROPTION_MAXANGLEDELTA.toString(), maxAngleDeltaVO);
        }
    }

    // getters
    public String getLabelName() {
        return labelName;
    }

    public String getFontFamily() {
        return fontFamily;
    }

    public String getFontStyle() {
        return fontStyle;
    }

    public String getFontWeight() {
        return fontWeight;
    }

    public String getFontSize() {
        return fontSize;
    }

    public String getColor() {
        return color;
    }

    public String getOpacity() {
        return opacity;
    }

    public String getHaloColor() {
        return haloColor;
    }

    public String getHaloRadius() {
        return haloRadius;
    }

    public String getAnchorX() {
        return anchorX;
    }

    public String getAnchorY() {
        return anchorY;
    }

    public String getDisplacementX() {
        return displacementX;
    }

    public String getDisplacementY() {
        return displacementY;
    }

    public String getRotation() {
        return rotation;
    }

    public String getInitialGap() {
        return initialGap;
    }

    public String getPerpendicularOffset() {
        return perpendicularOffset;
    }

    public String getMaxDisplacementVO() {
        return maxDisplacementVO;
    }

    public String getRepeatVO() {
        return repeatVO;
    }

    public String getAutoWrapVO() {
        return autoWrapVO;
    }

    public String getSpaceAroundVO() {
        return spaceAroundVO;
    }

    public String getFollowLineVO() {
        return followLineVO;
    }

    public String getMaxAngleDeltaVO() {
        return maxAngleDeltaVO;
    }
}
TOP

Related Classes of org.locationtech.udig.style.advanced.common.styleattributeclasses.TextSymbolizerWrapper

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.