+package org.argeo.geotools.styling;
+
+import java.awt.Color;
+
+import org.argeo.ArgeoException;
+import org.geotools.factory.CommonFactoryFinder;
+import org.geotools.filter.text.cql2.CQL;
+import org.geotools.filter.text.cql2.CQLException;
+import org.geotools.styling.FeatureTypeStyle;
+import org.geotools.styling.LineSymbolizer;
+import org.geotools.styling.Rule;
+import org.geotools.styling.Stroke;
+import org.geotools.styling.Style;
+import org.geotools.styling.StyleFactory;
+import org.opengis.filter.Filter;
+import org.opengis.filter.FilterFactory;
+
+/** Utilities related to GeoTools styling */
+public class StylingUtils {
+ static StyleFactory styleFactory = CommonFactoryFinder
+ .getStyleFactory(null);
+ static FilterFactory filterFactory = CommonFactoryFinder
+ .getFilterFactory(null);
+
+ /**
+ * Style for a line
+ *
+ * @param color
+ * the AWT color in upper case
+ * @param width
+ * the width of the line
+ * @param cqlFilter
+ * filter in CQL formqt restricting the feqture upon which the
+ * style will apply
+ */
+ public static Style createLineStyle(String color, Integer width) {
+ Rule rule = styleFactory.createRule();
+ rule.symbolizers().add(createLineSymbolizer(color, width));
+ FeatureTypeStyle fts = styleFactory
+ .createFeatureTypeStyle(new Rule[] { rule });
+ Style style = styleFactory.createStyle();
+ style.featureTypeStyles().add(fts);
+ return style;
+ }
+
+ public static Style createFilteredLineStyle(String cqlFilter,
+ String matchedColor, Integer matchedWidth, String unmatchedColor,
+ Integer unmatchedWidth) {
+ // selection filter
+ Filter filter;
+ try {
+ filter = CQL.toFilter(cqlFilter);
+ } catch (CQLException e) {
+ throw new ArgeoException("Cannot parse CQL filter: " + cqlFilter, e);
+ }
+
+ Rule[] rules;
+ // matched
+ Rule ruleMatched = styleFactory.createRule();
+ ruleMatched.symbolizers().add(
+ createLineSymbolizer(matchedColor, matchedWidth));
+ ruleMatched.setFilter(filter);
+
+ // unmatched
+ if (unmatchedColor != null) {
+ Rule ruleUnMatched = styleFactory.createRule();
+ ruleUnMatched.symbolizers().add(
+ createLineSymbolizer(unmatchedColor,
+ unmatchedWidth != null ? unmatchedWidth
+ : matchedWidth));
+ ruleUnMatched.setFilter(filterFactory.not(filter));
+ rules = new Rule[] { ruleMatched, ruleUnMatched };
+ } else {
+ rules = new Rule[] { ruleMatched };
+ }
+
+ FeatureTypeStyle fts = styleFactory.createFeatureTypeStyle(rules);
+ Style style = styleFactory.createStyle();
+ style.featureTypeStyles().add(fts);
+ return style;
+ }
+
+ public static LineSymbolizer createLineSymbolizer(String color,
+ Integer width) {
+ Stroke stroke = styleFactory.createStroke(
+ filterFactory.literal(stringToColor(color)),
+ filterFactory.literal(width));
+ return styleFactory.createLineSymbolizer(stroke, null);
+ }
+
+ /**
+ * Converts a string to a color, using reflection, so that other methods
+ * don't need AWT dependencies in their signature. Package protected and not
+ * public so that it has less impact on the overall signature.
+ */
+ static Color stringToColor(String color) {
+ try {
+ return (Color) Color.class.getField(color).get(null);
+ } catch (Exception e) {
+ throw new ArgeoException("Color " + color + " not found", e);
+ }
+ }
+}