/*
* Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 3 of the License, or (at your option)
* any later version.
* This program 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 General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, see http://www.gnu.org/licenses/
*/
package org.esa.snap.ui.product;
import com.bc.ceres.swing.figure.FigureFactory;
import com.bc.ceres.swing.figure.FigureStyle;
import com.bc.ceres.swing.figure.PointFigure;
import com.bc.ceres.swing.figure.ShapeFigure;
import com.bc.ceres.swing.figure.support.DefaultFigureStyle;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.geom.MultiLineString;
import com.vividsolutions.jts.geom.Point;
import org.esa.snap.core.datamodel.PlainFeatureFactory;
import org.esa.snap.core.datamodel.SceneTransformProvider;
import org.esa.snap.core.util.AwtGeomToJtsGeomConverter;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;
import org.opengis.referencing.operation.TransformException;
import java.awt.Color;
import java.awt.Shape;
import java.awt.geom.Point2D;
public class SimpleFeatureFigureFactory implements FigureFactory {
private final SimpleFeatureType simpleFeatureType;
private final AwtGeomToJtsGeomConverter toJtsGeom;
private long currentFeatureId;
private SceneTransformProvider sceneTransformProvider;
public SimpleFeatureFigureFactory(SimpleFeatureType simpleFeatureType, SceneTransformProvider provider) {
this.simpleFeatureType = simpleFeatureType;
this.toJtsGeom = new AwtGeomToJtsGeomConverter();
this.currentFeatureId = System.nanoTime();
this.sceneTransformProvider = provider;
}
@Override
public PointFigure createPointFigure(Point2D point, FigureStyle style) {
final Point point1 = toJtsGeom.createPoint(point);
return createPointFigure(point1, style);
}
@Override
public ShapeFigure createLineFigure(Shape shape, FigureStyle style) {
MultiLineString multiLineString = toJtsGeom.createMultiLineString(shape);
Geometry geometry = multiLineString;
if (multiLineString.getNumGeometries() == 1) {
geometry = multiLineString.getGeometryN(0);
}
final Geometry geometryInSceneCoords;
try {
geometryInSceneCoords = sceneTransformProvider.getModelToSceneTransform().transform(geometry);
} catch (TransformException e) {
return null;
}
return createShapeFigure(geometryInSceneCoords, style);
}
@Override
public ShapeFigure createPolygonFigure(Shape shape, FigureStyle style) {
Geometry geometry = toJtsGeom.createPolygon(shape);
try {
geometry = sceneTransformProvider.getModelToSceneTransform().transform(geometry);
} catch (TransformException e) {
return null;
}
return createShapeFigure(geometry, style);
}
private PointFigure createPointFigure(Point geometry, FigureStyle style) {
return new SimpleFeaturePointFigure(createSimpleFeature(geometry), sceneTransformProvider, style);
}
public SimpleFeatureFigure createSimpleFeatureFigure(SimpleFeature simpleFeature, String defaultStyleCss) {
final String css = getStyleCss(simpleFeature, defaultStyleCss);
final FigureStyle normalStyle = DefaultFigureStyle.createFromCss(css);
final FigureStyle selectedStyle = deriveSelectedStyle(normalStyle);
final Object geometry = simpleFeature.getDefaultGeometry();
if (geometry instanceof Point) {
return new SimpleFeaturePointFigure(simpleFeature, sceneTransformProvider, normalStyle, selectedStyle);
} else {
return new SimpleFeatureShapeFigure(simpleFeature, sceneTransformProvider, normalStyle, selectedStyle);
}
}
static String getStyleCss(SimpleFeature simpleFeature, String defaultStyleCss) {
Object styleAttribute = simpleFeature.getAttribute(PlainFeatureFactory.ATTRIB_NAME_STYLE_CSS);
if (styleAttribute instanceof String) {
String css = (String) styleAttribute;
if (!css.trim().isEmpty()) {
final StringBuilder sb = new StringBuilder(css);
final String[] cssAttributes = defaultStyleCss.split(";");
for (String cssAttribute : cssAttributes) {
if (!css.contains(cssAttribute.split(":")[0].trim())) {
sb.append(";");
sb.append(cssAttribute);
}
}
return sb.toString();
}
}
return defaultStyleCss;
}
private ShapeFigure createShapeFigure(Geometry geometry, FigureStyle style) {
return new SimpleFeatureShapeFigure(createSimpleFeature(geometry), sceneTransformProvider, style, deriveSelectedStyle(style));
}
private SimpleFeature createSimpleFeature(Geometry geometry) {
return PlainFeatureFactory.createPlainFeature(simpleFeatureType,
"ID" + Long.toHexString(currentFeatureId++),
geometry,
null);
}
public FigureStyle deriveSelectedStyle(FigureStyle style) {
DefaultFigureStyle figureStyle = new DefaultFigureStyle();
figureStyle.setFillColor(style.getFillColor());
figureStyle.setFillOpacity(style.getFillOpacity());
figureStyle.setStrokeColor(Color.YELLOW);
figureStyle.setStrokeOpacity(0.75);
figureStyle.setStrokeWidth(style.getStrokeWidth() + 1.0);
figureStyle.setSymbolName(style.getSymbolName());
figureStyle.setSymbolImagePath(style.getSymbolImagePath());
figureStyle.setSymbolRefX(style.getSymbolRefX());
figureStyle.setSymbolRefY(style.getSymbolRefY());
return figureStyle;
}
}