/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2002-2008, Open Source Geospatial Foundation (OSGeo)
*
* 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.geotools.gui.swing.contexttree.column;
import java.awt.GridLayout;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.geotools.filter.Filters;
import org.geotools.gui.swing.contexttree.renderer.RenderAndEditComponent;
import org.geotools.map.MapLayer;
import org.geotools.styling.FeatureTypeStyle;
import org.geotools.styling.LineSymbolizer;
import org.geotools.styling.Mark;
import org.geotools.styling.PointSymbolizer;
import org.geotools.styling.PolygonSymbolizer;
import org.geotools.styling.RasterSymbolizer;
import org.geotools.styling.Rule;
import org.geotools.styling.StyleBuilder;
import org.geotools.styling.Symbolizer;
import org.opengis.filter.expression.Expression;
/**
* Component used to present opacity
*
* @author Johann Sorel
*
* @source $URL$
*/
public final class OpacityComponent extends RenderAndEditComponent {
private MapLayer layer = null;
private Symbolizer symb = null;
private JSlider slide = new JSlider(0, 100);
/**
* opacity component, slider
*/
public OpacityComponent() {
super();
setLayout(new GridLayout(1, 1));
slide.setOpaque(false);
slide.setPaintTicks(true);
slide.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
applyOpacity(slide.getValue() / 100d);
}
});
}
public void parse(Object value) {
double valeur = 1;
boolean correct = false;
layer = null;
symb = null;
if (value instanceof MapLayer) {
valeur = format((MapLayer) value);
if (valeur > 1) {
valeur = 1d;
} else if (valeur < 0) {
valeur = 0d;
}
correct = true;
valeur *= 100;
slide.setValue(Double.valueOf(valeur).intValue());
this.layer = (MapLayer) value;
} else if (value instanceof Symbolizer) {
if (value instanceof PolygonSymbolizer) {
PolygonSymbolizer sym = (PolygonSymbolizer) value;
valeur = Filters.asDouble(sym.getFill().getOpacity());
} else if (value instanceof PointSymbolizer) {
PointSymbolizer sym = (PointSymbolizer) value;
valeur = Filters.asDouble(sym.getGraphic().getOpacity());
} else if (value instanceof LineSymbolizer) {
LineSymbolizer sym = (LineSymbolizer) value;
valeur = Filters.asDouble(sym.getStroke().getOpacity());
} else if (value instanceof RasterSymbolizer) {
RasterSymbolizer sym = (RasterSymbolizer) value;
valeur = Filters.asDouble(sym.getOpacity());
}
correct = true;
valeur *= 100;
slide.setValue(Double.valueOf(valeur).intValue());
this.symb = (Symbolizer) value;
}
removeAll();
if (correct) {
add(slide);
}
}
public Object getValue() {
return slide.getValue() / 100d;
}
private Double format(MapLayer layer) {
FeatureTypeStyle[] sty = layer.getStyle().getFeatureTypeStyles();
double valeur = 1d;
Rule[] rules = sty[0].getRules();
for (int i = 0; i < rules.length; i++) {
Rule r = rules[i];
//on regarde si la regle s'applique au maplayer (s'il n'y a aucun filtre)
if (r.getFilter() == null) {
Symbolizer[] symbolizers = r.getSymbolizers();
for (int j = 0; j < symbolizers.length; j++) {
if (symbolizers[j] instanceof PolygonSymbolizer) {
PolygonSymbolizer sym = (PolygonSymbolizer) symbolizers[j];
valeur = Filters.asDouble(sym.getFill().getOpacity());
} else if (symbolizers[j] instanceof PointSymbolizer) {
PointSymbolizer sym = (PointSymbolizer) symbolizers[j];
//valeur = SLD.pointOpacity(sym);
valeur = Filters.asDouble(sym.getGraphic().getOpacity());
} else if (symbolizers[j] instanceof LineSymbolizer) {
LineSymbolizer sym = (LineSymbolizer) symbolizers[j];
valeur = Filters.asDouble(sym.getStroke().getOpacity());
} else if (symbolizers[j] instanceof RasterSymbolizer) {
RasterSymbolizer sym = (RasterSymbolizer) symbolizers[j];
valeur = Filters.asDouble(sym.getOpacity());
}
}
}
}
return valeur;
}
private void applyOpacity(Double d) {
StyleBuilder sb = new StyleBuilder();
Expression opa = sb.literalExpression(d);
if (layer != null) {
FeatureTypeStyle[] sty = layer.getStyle().getFeatureTypeStyles();
Rule[] rules = sty[0].getRules();
for (int i = 0; i < rules.length; i++) {
Rule r = rules[i];
//on regarde si la regle s'applique au maplayer (s'il n'y a aucun filtre)
if (r.getFilter() == null) {
Symbolizer[] symbolizers = r.getSymbolizers();
for (int j = 0; j < symbolizers.length; j++) {
applyOpacity(symbolizers[j], opa);
}
}
}
layer.setStyle(layer.getStyle());
} else if (symb != null) {
applyOpacity(symb, opa);
}
}
private void applyOpacity(Symbolizer symbol, Expression opa) {
if (symbol instanceof PolygonSymbolizer) {
PolygonSymbolizer sym = (PolygonSymbolizer) symbol;
sym.getFill().setOpacity(opa);
sym.getStroke().setOpacity(opa);
} else if (symbol instanceof PointSymbolizer) {
PointSymbolizer sym = (PointSymbolizer) symbol;
sym.getGraphic().setOpacity(opa);
Mark[] marks = sym.getGraphic().getMarks();
for (int k = 0; k < marks.length; k++) {
marks[k].getFill().setOpacity(opa);
marks[k].getStroke().setOpacity(opa);
}
} else if (symbol instanceof LineSymbolizer) {
LineSymbolizer sym = (LineSymbolizer) symbol;
sym.getStroke().setOpacity(opa);
} else if (symbol instanceof RasterSymbolizer) {
RasterSymbolizer sym = (RasterSymbolizer) symbol;
sym.setOpacity(opa);
}
}
}