Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/utils/ThemeUtil.java @ 3318:dbe2f85bf160
merged flys-artifacts/2.8
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:35 +0200 |
parents | f062b5a90e26 |
children | f091f2f55f88 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/utils/ThemeUtil.java Fri Sep 28 12:14:35 2012 +0200 @@ -0,0 +1,719 @@ +package de.intevation.flys.utils; + +import de.intevation.artifacts.common.utils.XMLUtils; +import de.intevation.flys.artifacts.model.MapserverStyle; +import de.intevation.flys.artifacts.model.MapserverStyle.Clazz; +import de.intevation.flys.artifacts.model.MapserverStyle.Expression; +import de.intevation.flys.artifacts.model.MapserverStyle.Label; +import de.intevation.flys.artifacts.model.MapserverStyle.Style; + +import java.awt.Color; +import java.awt.Font; + +import javax.xml.xpath.XPathConstants; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + + +/** + * Utility to deal with themes and their representations. + */ +public class ThemeUtil { + + private static Logger logger = + Logger.getLogger(ThemeUtil.class); + + public final static String XPATH_FILL_COLOR = + "/theme/field[@name='fillcolor']/@default"; + + public final static String XPATH_LINE_COLOR = + "/theme/field[@name='linecolor']/@default"; + + public static final String XPATH_LINE_SIZE = + "/theme/field[@name='linesize']/@default"; + + public static final String XPATH_LINE_STYLE = + "/theme/field[@name='linetype']/@default"; + + public static final String XPATH_POINT_SIZE = + "/theme/field[@name='pointsize']/@default"; + + public static final String XPATH_POINT_COLOR = + "/theme/field[@name='pointcolor']/@default"; + + public final static String XPATH_SHOW_BORDER = + "/theme/field[@name='showborder']/@default"; + + public final static String XPATH_SHOW_POINTS = + "/theme/field[@name='showpoints']/@default"; + + public final static String XPATH_SHOW_LINE = + "/theme/field[@name='showlines']/@default"; + + public final static String XPATH_SHOW_VERTICAL_LINE = + "/theme/field[@name='showverticalline']/@default"; + + public final static String XPATH_SHOW_HORIZONTAL_LINE = + "/theme/field[@name='showhorizontalline']/@default"; + + public final static String XPATH_SHOW_LINE_LABEL = + "/theme/field[@name='showlinelabel']/@default"; + + public final static String XPATH_SHOW_POINT_LABEL = + "/theme/field[@name='showpointlabel']/@default"; + + public final static String XPATH_LINE_LABEL_FONT = + "/theme/field[@name='linelabelfont']/@default"; + + public final static String XPATH_LINE_LABEL_COLOR = + "/theme/field[@name='linelabelcolor']/@default"; + + public final static String XPATH_LINE_LABEL_SIZE = + "/theme/field[@name='linelabelsize']/@default"; + + public final static String XPATH_LINE_LABEL_STYLE = + "/theme/field[@name='linelabelstyle']/@default"; + + public final static String XPATH_LINE_LABEL_BGCOLOR = + "/theme/field[@name='linelabelbgcolor']/@default"; + + public final static String XPATH_LINE_LABEL_SHOWBG = + "/theme/field[@name='linelabelshowbg']/@default"; + + public final static String XPATH_SHOW_WIDTH = + "/theme/field[@name='showwidth']/@default"; + + public final static String XPATH_SHOW_LEVEL = + "/theme/field[@name='showwidth']/@default"; + + public final static String XPATH_TRANSPARENCY = + "/theme/field[@name='transparent']/@default"; + + public final static String XPATH_TRANSPARENCY_ALPHA = + "/theme/field[@name='alpha']/@default"; + + public final static String XPATH_SHOW_AREA = + "/theme/field[@name='showarea']/@default"; + + public final static String XPATH_SHOW_MIDDLE_HEIGHT = + "/theme/field[@name='showmiddleheight']/@default"; + + public final static String XPATH_TEXT_COLOR = + "/theme/field[@name='textcolor']/@default"; + + public final static String XPATH_TEXT_SIZE = + "/theme/field[@name='textsize']/@default"; + + public final static String XPATH_TEXT_FONT = + "/theme/field[@name='font']/@default"; + + public final static String XPATH_TEXT_STYLE = + "/theme/field[@name='textstyle']/@default"; + + public final static String XPATH_TEXT_ORIENTATION = + "/theme/field[@name='textorientation']/@default"; + + public final static String XPATH_TEXT_BACKGROUND = + "/theme/field[@name='backgroundcolor']/@default"; + + public final static String XPATH_SHOW_BACKGROUND = + "/theme/field[@name='showbackground']/@default"; + + public final static String XPATH_SYMBOL = + "/theme/field[@name='symbol']/@default"; + + public final static String XPATH_SHOW_MINIMUM = + "/theme/field[@name='showminimum']/@default"; + + public final static String XPATH_SHOW_MAXIMUM = + "/theme/field[@name='showmaximum']/@default"; + + public final static String XPATH_WSPLGEN_FIELDS = + "/theme[@name='WSPLGEN']/field"; + + + /** Parse string to be boolean with default if empty or unrecognized. */ + public static boolean parseBoolean(String value, boolean defaultsTo) { + if (value == null || value.length() == 0) { + return defaultsTo; + } + if (value.equals("false")) { + return false; + } + else if (value.equals("true")) { + return true; + } + else { + return defaultsTo; + } + } + + + public static int parseInteger(String value, int defaultsTo) { + if (value == null || value.length() == 0) { + return defaultsTo; + } + + try { + return Integer.valueOf(value); + } + catch (NumberFormatException nfe) { + // do nothing + } + + return defaultsTo; + } + + + /** + * Parses line width, defaulting to 0. + * @param theme the theme + */ + public static int parseLineWidth(Document theme) { + String size = XMLUtils.xpathString(theme, XPATH_LINE_SIZE, null); + if (size == null || size.length() == 0) { + return 0; + } + + try { + return Integer.valueOf(size); + } + catch (NumberFormatException nfe) { + logger.warn("Unable to set line size from string: '" + size + "'"); + } + return 0; + } + + + public static int parsePointWidth(Document theme) { + String width = XMLUtils.xpathString(theme, XPATH_POINT_SIZE, null); + + return parseInteger(width, 3); + } + + + public static Color parsePointColor(Document theme) { + String color = XMLUtils.xpathString(theme, XPATH_POINT_COLOR, null); + logger.debug("parsePointColor(): color = " + color); + return parseColor(color); + } + + + /** + * Parses the line style, defaulting to '10'. + * @param theme The theme. + */ + public static float[] parseLineStyle(Document theme) { + String dash = XMLUtils.xpathString(theme, XPATH_LINE_STYLE, null); + + float[] def = {10}; + if (dash == null || dash.length() == 0) { + return def; + } + + String[] pattern = dash.split(","); + if(pattern.length == 1) { + return def; + } + + try { + float[] dashes = new float[pattern.length]; + for (int i = 0; i < pattern.length; i++) { + dashes[i] = Float.parseFloat(pattern[i]); + } + return dashes; + } + catch(NumberFormatException nfe) { + logger.warn("Unable to set dash from string: '" + dash + "'"); + return def; + } + } + + + /** + * Parses text size, defaulting to 10. + * @param theme The theme. + */ + public static int parseTextSize(Document theme, String path) { + String size = XMLUtils.xpathString(theme, path, null); + if (size == null || size.length() == 0) { + return 10; + } + + try { + return Integer.valueOf(size); + } + catch (NumberFormatException nfe) { + } + return 10; + } + + + public static int parseTextSize(Document theme) { + return parseTextSize(theme, XPATH_TEXT_SIZE); + } + + + public static int parseLineLabelSize(Document theme) { + return parseTextSize(theme, XPATH_LINE_LABEL_SIZE); + } + + + /** + * Parses the attribute 'showpoints', defaults to false. + * @param theme The theme. + */ + public static boolean parseShowPoints(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_POINTS, null); + return parseBoolean(show, false); + } + + /** + * Parses the attribute 'showmiddleheight', defaults to false. + * @param theme The theme. + */ + public static boolean parseShowMiddleHeight(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_MIDDLE_HEIGHT, null); + return parseBoolean(show, false); + } + + /** + * Parses the attribute 'showarea', defaults to false. + * @param theme The theme. + */ + public static boolean parseShowArea(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_AREA, null); + return parseBoolean(show, false); + } + + /** + * Parses the attribute 'showverticalline', defaults to true. + * @param theme The theme. + */ + public static boolean parseShowVerticalLine(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_VERTICAL_LINE, null); + return parseBoolean(show, true); + } + + /** + * Parses the attribute 'showhorizontalline', defaults to true. + * @param theme The theme. + */ + public static boolean parseShowHorizontalLine(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_HORIZONTAL_LINE, null); + return parseBoolean(show, true); + } + + /** + * Parses the attribute 'showlines', defaults to true. + * @param theme The theme. + */ + public static boolean parseShowLine(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_LINE, null); + return parseBoolean(show, true); + } + + /** + * Parses the attribute 'showlinelabel', defaults to true. + * @param theme The theme. + */ + public static boolean parseShowLineLabel(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_LINE_LABEL, null); + return parseBoolean(show, false); + } + + public static boolean parseShowPointLabel(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_POINT_LABEL, null); + return parseBoolean(show, false); + } + + /** + * Parses text color. + * @param theme The theme. + */ + public static Color parseTextColor(Document theme) { + return parseRGB(getTextColorString(theme)); + } + + + /** Parse color for line label(s text). */ + public static Color parseLineLabelTextColor(Document theme) { + return parseRGB(getLineLabelTextColorString(theme)); + } + + /** Parse bg color for line label(s text). */ + public static Color parseLineLabelBGColor(Document theme) { + return parseRGB(getLineLabelBGColorString(theme)); + } + + // TODO showbg and bg color for linelabels + + + /** + * Parses the font. + * @param theme The theme. + */ + public static Font parseTextFont(Document theme) { + String font = XMLUtils.xpathString(theme, XPATH_TEXT_FONT, null); + if (font == null || font.length() == 0) { + return null; + } + + int size = parseTextSize(theme); + int style = parseTextStyle(theme); + Font f = new Font (font, style, size); + return f; + } + + /** Parse font (name, size and style) for linelabels. */ + public static Font parseLineLabelFont(Document theme) { + String font = XMLUtils.xpathString(theme, XPATH_LINE_LABEL_FONT, null); + if (font == null || font.length() == 0) { + return null; + } + + int size = parseLineLabelSize(theme); + int style = parseLineLabelStyle(theme); + + Font f = new Font (font, style, size); + return f; + } + + + /** + * Parses the text style, defaults to 'Font.PLAIN'. + * @param theme The theme. + */ + public static int parseTextStyle(Document theme, String path) { + String style = XMLUtils.xpathString(theme, path, null); + if (style == null || style.length() == 0) { + return Font.PLAIN; + } + + if (style.equals("italic")) { + return Font.ITALIC; + } + else if (style.equals("bold")) { + return Font.BOLD; + } + else { + return Font.PLAIN; + } + } + + + public static int parseTextStyle(Document theme) { + return parseTextStyle(theme, XPATH_TEXT_STYLE); + } + + + public static int parseLineLabelStyle(Document theme) { + return parseTextStyle(theme, XPATH_LINE_LABEL_STYLE); + } + + + public static boolean parseShowWidth(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_WIDTH, null); + return parseBoolean(show, false); + } + + public static boolean parseShowLevel(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_LEVEL, null); + return parseBoolean(show, false); + } + + /** + * Parses the textorientation, defaults to 'vertical'. + * @param theme The theme. + */ + public static String parseTextOrientation(Document theme) { + String o = XMLUtils.xpathString(theme, XPATH_TEXT_ORIENTATION, null); + if ("true".equals(o)) { + return "horizontal"; + } + else { + return "vertical"; + } + } + + + /** + * Parses the text background color, defaults to white. + * @param theme The theme. + */ + public static Color parseTextBackground(Document theme) { + String color = getBackgroundColorString(theme); + if (color == null || color.length() == 0) { + return Color.WHITE; + } + return parseRGB(color); + } + + + /** + * Parses the attribute whether to show background or not, defaults to + * false. + * @param theme The theme. + */ + public static boolean parseShowTextBackground(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_SHOW_BACKGROUND, null); + return parseBoolean(show, false); + } + + + /** + * Parses the attribute whether to show line labels background or not, + * defaults to false. + * @param theme The theme. + */ + public static boolean parseShowLineLabelBG(Document theme) { + String show = XMLUtils.xpathString(theme, XPATH_LINE_LABEL_SHOWBG, null); + return parseBoolean(show, false); + } + + + public static Color parseColor(String colorString) { + if (colorString == null || colorString.length() == 0) { + return null; + } + else if (colorString.indexOf("#") == 0) { + return parseHexColor(colorString); + } + else if (colorString.indexOf(",") >= 0) { + return parseRGB(colorString); + } + + return null; + } + + + /** + * Parse a string like "#00CC22" and return the corresponding color. + * + * @param hex The hex color value. + * + * @return a Color or null, if <i>hex</i> is empty. + */ + public static Color parseHexColor(String hex) { + if (hex == null) { + return null; + } + + return Color.decode(hex); + } + + /** + * Parse a string like "103, 100, 0" and return a corresping color. + * @param rgbtext Color as string representation, e.g. "255,0,20". + * @return Color, null in case of issues. + */ + public static Color parseRGB(String rgbtext) { + if (rgbtext == null) { + return null; + } + String rgb[] = rgbtext.split(","); + Color c = null; + try { + c = new Color( + Integer.valueOf(rgb[0].trim()), + Integer.valueOf(rgb[1].trim()), + Integer.valueOf(rgb[2].trim())); + } + catch (NumberFormatException nfe) { + c = null; + } + return c; + } + + + public static String getLineColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_LINE_COLOR, null); + } + + /** Get show border as string. */ + public static String getShowBorderString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_SHOW_BORDER, null); + } + + /** Get fill color as string. */ + public static String getFillColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_FILL_COLOR, null); + } + + public static String getBackgroundColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_TEXT_BACKGROUND, null); + } + + + public static String getTextColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_TEXT_COLOR, null); + } + + public static String getLineLabelTextColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_LINE_LABEL_COLOR, null); + } + + public static String getLineLabelBGColorString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_LINE_LABEL_BGCOLOR, null); + } + + public static String getSymbol(Document theme) { + return XMLUtils.xpathString(theme, XPATH_SYMBOL, null); + } + + public static String getTransparencyString(Document theme) { + return XMLUtils.xpathString(theme, XPATH_TRANSPARENCY, null); + } + + + public static String getTransparencyAlpha(Document theme) { + return XMLUtils.xpathString(theme, XPATH_TRANSPARENCY_ALPHA, null); + } + + + public static String getShowMinimum(Document theme) { + return XMLUtils.xpathString(theme, XPATH_SHOW_MINIMUM, null); + } + + + public static String getShowMaximum(Document theme) { + return XMLUtils.xpathString(theme, XPATH_SHOW_MAXIMUM, null); + } + + + /** + * Gets color from color field. + * @param theme the theme document. + * @return color. + */ + public static Color parseFillColorField(Document theme) { + return parseRGB(getFillColorString(theme)); + } + + public static boolean parseShowBorder(Document theme) { + return parseBoolean(getShowBorderString(theme), false); + } + + public static boolean parseTransparency(Document theme) { + return parseBoolean(getTransparencyString(theme), false); + } + + /** + * Gets color from color field. + * @param theme the theme document. + * @return color. + */ + public static Color parseLineColorField(Document theme) { + String lineColorStr = getLineColorString(theme); + logger.debug("parseLineColorField: lineColorStr = " + + (lineColorStr == null ? "null" : lineColorStr)); + return parseRGB(lineColorStr); + } + + + public static boolean parseShowMinimum(Document theme) { + return parseBoolean(getShowMinimum(theme), false); + } + + public static boolean parseShowMaximum(Document theme) { + return parseBoolean(getShowMaximum(theme), false); + } + + + public static String createWSPLGENStyle(Document theme) { + NodeList categories = (NodeList) XMLUtils.xpath( + theme, + XPATH_WSPLGEN_FIELDS, + XPathConstants.NODESET); + + return createWSPLGENStyle(categories).toString(); + } + + protected static MapserverStyle createWSPLGENStyle(NodeList categories) { + MapserverStyle ms = new MapserverStyle(); + + for (int i = 0, n = categories.getLength(); i < n; i++) { + Element cat = (Element) categories.item(i); + String color = cat.getAttribute("default"); + String name = cat.getAttribute("name"); + + String expr; + + try { + int length = name.length(); + int idx = Integer.valueOf(name.substring(length-1, length)); + + expr = createWSPLGENExpression(idx); + } + catch (NumberFormatException nfe) { + logger.warn("Error while parsing WSPLGEN category.", nfe); + continue; + } + + Clazz c = new Clazz(expr); + Style s = new Style(); + s.setColor(color.replace(",", "")); + s.setSize(5); + + c.addItem(new Expression("(" + expr + ")")); + c.addItem(s); + + ms.addClazz(c); + } + + return ms; + } + + + protected static String createWSPLGENExpression(int idx) { + if (idx < 5) { + int lower = idx - 1; + return "[DIFF] >= " + lower + " AND [DIFF] < " + idx; + } + else { + return "[DIFF] >= 4"; + } + } + + + public static String createMapserverStyle(Document theme) { + String symbol = getSymbol(theme); + String backcolor = getBackgroundColorString(theme); + String linecolor = getLineColorString(theme); + + int linewidth = parseLineWidth(theme); + + MapserverStyle ms = new MapserverStyle(); + + Clazz c = new Clazz(" "); + + Style s = new Style(); + s.setOutlineColor(linecolor.replace(",", "")); + + if (backcolor != null && backcolor.length() > 0) { + s.setColor(backcolor.replace(",", "")); + } + + s.setSize(linewidth); + s.setSymbol(symbol); + c.addItem(s); + + String textcolor = getTextColorString(theme); + int textsize = parseTextSize(theme); + + if (textcolor != null && textcolor.length() > 0 && textsize > 0) { + Label l = new Label(); + l.setColor(textcolor.replace(",", "")); + l.setSize(textsize); + c.addItem(l); + } + + ms.addClazz(c); + + return ms.toString(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :