teichmann@6905: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@6905: * Software engineering by Intevation GmbH teichmann@6905: * teichmann@6905: * This file is Free Software under the GNU AGPL (>=v3) teichmann@6905: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@6905: * documentation coming with Dive4Elements River for details. teichmann@6905: */ teichmann@6905: teichmann@6905: package org.dive4elements.river.themes; teichmann@6905: teichmann@6905: import java.awt.Color; teichmann@6905: import java.awt.Font; teichmann@6905: teichmann@6906: import org.apache.log4j.Logger; teichmann@6905: import org.dive4elements.artifacts.CallMeta; teichmann@6906: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@6906: import org.dive4elements.river.artifacts.model.MapserverStyle; teichmann@6906: import org.dive4elements.river.artifacts.model.MapserverStyle.Clazz; teichmann@6906: import org.dive4elements.river.artifacts.model.MapserverStyle.Expression; teichmann@6906: import org.dive4elements.river.artifacts.model.MapserverStyle.Label; teichmann@6906: import org.dive4elements.river.artifacts.model.MapserverStyle.Style; teichmann@6906: import org.dive4elements.river.artifacts.resources.Resources; teichmann@6905: import org.w3c.dom.Document; teichmann@6905: teichmann@6905: public class ThemeDocument teichmann@6905: { teichmann@6906: private static Logger logger = Logger.getLogger(ThemeDocument.class); teichmann@6906: teichmann@6906: private static final String MSG_ISOBATH_CLASS = "floodmap.isobath.class"; teichmann@6906: teichmann@6906: private static final String MSG_ISOBATH_LASTCLASS = "floodmap.isobath.lastclass"; teichmann@6906: teichmann@6906: public final static String XPATH_FILL_COLOR = teichmann@6906: "/theme/field[@name='fillcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LINE_COLOR = teichmann@6906: "/theme/field[@name='linecolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_AREA_LINE_COLOR = teichmann@6906: "/theme/field[@name='areabordercolor']/@default"; teichmann@6906: teichmann@6906: public static final String XPATH_LINE_SIZE = teichmann@6906: "/theme/field[@name='linesize']/@default"; teichmann@6906: teichmann@6906: public static final String XPATH_LINE_STYLE = teichmann@6906: "/theme/field[@name='linetype']/@default"; teichmann@6906: teichmann@6906: public static final String XPATH_POINT_SIZE = teichmann@6906: "/theme/field[@name='pointsize']/@default"; teichmann@6906: teichmann@6906: public static final String XPATH_POINT_COLOR = teichmann@6906: "/theme/field[@name='pointcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_BORDER = teichmann@6906: "/theme/field[@name='showborder']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_AREA_SHOW_BORDER = teichmann@6906: "/theme/field[@name='showborder']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_POINTS = teichmann@6906: "/theme/field[@name='showpoints']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_LINE = teichmann@6906: "/theme/field[@name='showlines']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_VERTICAL_LINE = teichmann@6906: "/theme/field[@name='showverticalline']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_HORIZONTAL_LINE = teichmann@6906: "/theme/field[@name='showhorizontalline']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_LINE_LABEL = teichmann@6906: "/theme/field[@name='showlinelabel']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_POINT_LABEL = teichmann@6906: "/theme/field[@name='showpointlabel']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_WIDTH = teichmann@6906: "/theme/field[@name='showwidth']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_LEVEL = teichmann@6906: "/theme/field[@name='showlevel']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_TRANSPARENCY = teichmann@6906: "/theme/field[@name='transparency']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_AREA_TRANSPARENCY = teichmann@6906: "/theme/field[@name='areatransparency']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_AREA = teichmann@6906: "/theme/field[@name='showarea']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_MIDDLE_HEIGHT = teichmann@6906: "/theme/field[@name='showmiddleheight']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_FONT_COLOR = teichmann@6906: "/theme/field[@name='labelfontcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_FONT_SIZE = teichmann@6906: "/theme/field[@name='labelfontsize']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_FONT_FACE = teichmann@6906: "/theme/field[@name='labelfontface']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_FONT_STYLE = teichmann@6906: "/theme/field[@name='labelfontstyle']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_TEXT_ORIENTATION = teichmann@6906: "/theme/field[@name='textorientation']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_BGCOLOR = teichmann@6906: "/theme/field[@name='labelbgcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_LABEL_SHOW_BACKGROUND = teichmann@6906: "/theme/field[@name='labelshowbg']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_BACKGROUND_COLOR = teichmann@6906: "/theme/field[@name='backgroundcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_AREA_BACKGROUND_COLOR = teichmann@6906: "/theme/field[@name='areabgcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SYMBOL = teichmann@6906: "/theme/field[@name='symbol']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_MINIMUM = teichmann@6906: "/theme/field[@name='showminimum']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_SHOW_MAXIMUM = teichmann@6906: "/theme/field[@name='showmaximum']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_WSPLGEN_FIELDS = teichmann@6906: "/theme[@name='WSPLGEN']/field"; teichmann@6906: teichmann@6906: public final static String XPATH_WSPLGEN_STARTCOLOR = teichmann@6906: "/theme/field[@name='startcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_WSPLGEN_ENDCOLOR = teichmann@6906: "/theme/field[@name='endcolor']/@default"; teichmann@6906: teichmann@6906: public final static String XPATH_WSPLGEN_NUMCLASSES = teichmann@6906: "/theme/field[@name='numclasses']/@default"; teichmann@6906: teichmann@6906: /** XPATH to bandwidth field. */ teichmann@6906: public final static String XPATH_BANDWIDTH = teichmann@6906: "/theme/field[@name='bandwidth']/@default"; teichmann@6906: teichmann@6906: /** XPATH to find showextramark field. */ teichmann@6906: public final static String XPATH_SHOWEXTRAMARK = teichmann@6906: "/theme/field[@name='showextramark']/@default"; teichmann@6906: teichmann@6905: private Document document; teichmann@6905: teichmann@6905: public ThemeDocument() { teichmann@6905: } teichmann@6905: teichmann@6905: public ThemeDocument(Document document) { teichmann@6905: this.document = document; teichmann@6905: } teichmann@6905: teichmann@6905: public Document getDocument() { teichmann@6905: return document; teichmann@6905: } teichmann@6905: teichmann@6906: /** Parse string to be boolean with default if empty or unrecognized. */ teichmann@6906: public static boolean parseBoolean(String value, boolean defaultsTo) { teichmann@6906: if (value == null || value.length() == 0) { teichmann@6906: return defaultsTo; teichmann@6906: } teichmann@6906: if (value.equals("false")) { teichmann@6906: return false; teichmann@6906: } teichmann@6906: else if (value.equals("true")) { teichmann@6906: return true; teichmann@6906: } teichmann@6906: else { teichmann@6906: return defaultsTo; teichmann@6906: } teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** teichmann@6906: * Attempt converting \param value to an integer, in failing cases, teichmann@6906: * return \param defaultsTo. teichmann@6906: * @param value String to be converted to integer. teichmann@6906: * @param defaultsTo Default to return if conversion failed. teichmann@6906: * @return \param value as integer or defaultsto if conversion failed. teichmann@6906: */ teichmann@6906: public static int parseInteger(String value, int defaultsTo) { teichmann@6906: if (value == null || value.length() == 0) { teichmann@6906: return defaultsTo; teichmann@6906: } teichmann@6906: teichmann@6906: try { teichmann@6906: return Integer.parseInt(value); teichmann@6906: } teichmann@6906: catch (NumberFormatException nfe) { teichmann@6906: // do nothing teichmann@6906: } teichmann@6906: teichmann@6906: return defaultsTo; teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** teichmann@6906: * Attempt converting \param value to a double, in failing cases, teichmann@6906: * return \param defaultsTo. teichmann@6906: * @param value String to be converted to double. teichmann@6906: * @param defaultsTo Default to return if conversion failed. teichmann@6906: * @return \param value as integer or defaultsto if conversion failed. teichmann@6906: */ teichmann@6906: public static double parseDouble(String value, double defaultsTo) { teichmann@6906: if (value == null || value.length() == 0) { teichmann@6906: return defaultsTo; teichmann@6906: } teichmann@6906: teichmann@6906: try { teichmann@6906: return Double.parseDouble(value); teichmann@6906: } teichmann@6906: catch (NumberFormatException nfe) { teichmann@6906: // do nothing teichmann@6906: } teichmann@6906: teichmann@6906: return defaultsTo; teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowLineLabel() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_LINE_LABEL, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowWidth() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_WIDTH, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowLevel() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_LEVEL, null); teichmann@6906: return parseBoolean(show, false); teichmann@6906: } teichmann@6906: teichmann@6906: public String parseTextOrientation() { teichmann@6906: String o = XMLUtils.xpathString(document, XPATH_TEXT_ORIENTATION, null); teichmann@6906: if ("true".equals(o)) { teichmann@6906: return "horizontal"; teichmann@6906: } teichmann@6906: else { teichmann@6906: return "vertical"; teichmann@6906: } teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowMiddleHeight() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_MIDDLE_HEIGHT, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseLabelShowBackground() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_LABEL_SHOW_BACKGROUND, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public Font parseTextFont() { teichmann@6906: String font = XMLUtils.xpathString(document, XPATH_LABEL_FONT_FACE, null); teichmann@6906: if (font == null || font.length() == 0) { teichmann@6906: return null; teichmann@6906: } teichmann@6906: teichmann@6906: int size = parseTextSize(); teichmann@6906: int style = parseTextStyle(); teichmann@6906: Font f = new Font(font, style, size); teichmann@6906: return f; teichmann@6905: } teichmann@6905: teichmann@6905: public Color parseTextColor() { teichmann@6906: return parseRGB(getTextColorString()); teichmann@6906: } teichmann@6906: teichmann@6906: public String getTextColorString() { teichmann@6906: String textColor = XMLUtils.xpathString(document, XPATH_LABEL_FONT_COLOR, null); teichmann@6906: return textColor; teichmann@6905: } teichmann@6905: teichmann@6905: public Color parseTextBackground() { teichmann@6906: String color = getLabelBackgroundColorString(); teichmann@6906: if (color == null || color.length() == 0) { teichmann@6906: return Color.WHITE; teichmann@6906: } teichmann@6906: return parseRGB(color); teichmann@6905: } teichmann@6905: teichmann@6906: public String getLabelBackgroundColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_LABEL_BGCOLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6905: public int parseLineWidth() { teichmann@6906: String size = XMLUtils.xpathString(document, XPATH_LINE_SIZE, null); teichmann@6906: if (size == null || size.length() == 0) { teichmann@6906: return 0; teichmann@6906: } teichmann@6906: teichmann@6906: try { teichmann@6906: return Integer.parseInt(size); teichmann@6906: } teichmann@6906: catch (NumberFormatException nfe) { teichmann@6906: logger.warn("Unable to set line size from string: '" + size + "'"); teichmann@6906: } teichmann@6905: return 0; teichmann@6905: } teichmann@6905: teichmann@6905: public float [] parseLineStyle() { teichmann@6906: String dash = XMLUtils.xpathString(document, XPATH_LINE_STYLE, null); teichmann@6906: teichmann@6906: float[] def = {10}; teichmann@6906: if (dash == null || dash.length() == 0) { teichmann@6906: return def; teichmann@6906: } teichmann@6906: teichmann@6906: String[] pattern = dash.split(","); teichmann@6906: if(pattern.length == 1) { teichmann@6906: return def; teichmann@6906: } teichmann@6906: teichmann@6906: try { teichmann@6906: float[] dashes = new float[pattern.length]; teichmann@6906: for (int i = 0; i < pattern.length; i++) { teichmann@6906: dashes[i] = Float.parseFloat(pattern[i]); teichmann@6906: } teichmann@6906: return dashes; teichmann@6906: } teichmann@6906: catch(NumberFormatException nfe) { teichmann@6906: logger.warn("Unable to set dash from string: '" + dash + "'"); teichmann@6906: return def; teichmann@6906: } teichmann@6905: } teichmann@6905: teichmann@6905: public int parsePointWidth() { teichmann@6906: String width = XMLUtils.xpathString(document, XPATH_POINT_SIZE, null); teichmann@6906: teichmann@6906: return parseInteger(width, 3); teichmann@6905: } teichmann@6905: teichmann@6905: public Color parsePointColor() { teichmann@6906: String color = XMLUtils.xpathString(document, XPATH_POINT_COLOR, null); teichmann@6906: logger.debug("parsePointColor(): color = " + color); teichmann@6906: return parseColor(color); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowPoints() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_POINTS, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowLine() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_LINE, null); teichmann@6906: return parseBoolean(show, true); teichmann@6905: } teichmann@6905: teichmann@6906: public int parseTextStyle() { teichmann@6906: return parseTextStyle(XPATH_LABEL_FONT_STYLE); teichmann@6905: } teichmann@6905: teichmann@6906: public int parseTextStyle(String path) { teichmann@6906: String style = XMLUtils.xpathString(document, path, null); teichmann@6906: if (style == null || style.length() == 0) { teichmann@6906: return Font.PLAIN; teichmann@6906: } teichmann@6906: teichmann@6906: if (style.equals("italic")) { teichmann@6906: return Font.ITALIC; teichmann@6906: } teichmann@6906: else if (style.equals("bold")) { teichmann@6906: return Font.BOLD; teichmann@6906: } teichmann@6906: else { teichmann@6906: return Font.PLAIN; teichmann@6906: } teichmann@6906: } teichmann@6906: teichmann@6906: public TextStyle parseComplexTextStyle() { teichmann@6906: return new TextStyle( teichmann@6906: parseTextColor(), teichmann@6906: parseTextFont(), teichmann@6906: parseTextBackground(), teichmann@6906: parseLabelShowBackground(), teichmann@6906: !parseTextOrientation().equals("horizontal")); teichmann@6905: } teichmann@6905: teichmann@6905: public LineStyle parseComplexLineStyle() { teichmann@6906: return new LineStyle( teichmann@6906: parseLineColorField(), teichmann@6906: Integer.valueOf(parseLineWidth())); teichmann@6905: } teichmann@6905: teichmann@6905: public Color parseComplexLineColorField() { teichmann@6905: return null; teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowVerticalLine() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_VERTICAL_LINE, null); teichmann@6906: return parseBoolean(show, true); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowHorizontalLine() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_HORIZONTAL_LINE, null); teichmann@6906: return parseBoolean(show, true); teichmann@6905: } teichmann@6905: teichmann@6905: public double parseBandWidth() { teichmann@6906: String bandWidth = XMLUtils.xpathString(document, XPATH_BANDWIDTH, null); teichmann@6906: return parseDouble(bandWidth, 0); teichmann@6905: } teichmann@6905: teichmann@6906: public static Color parseColor(String colorString) { teichmann@6906: if (colorString == null || colorString.length() == 0) { teichmann@6906: return null; teichmann@6906: } teichmann@6906: else if (colorString.indexOf("#") == 0) { teichmann@6906: return parseHexColor(colorString); teichmann@6906: } teichmann@6906: else if (colorString.indexOf(",") >= 0) { teichmann@6906: return parseRGB(colorString); teichmann@6906: } teichmann@6905: teichmann@6905: return null; teichmann@6905: } teichmann@6905: teichmann@6906: teichmann@6906: /** teichmann@6906: * Parse a string like "#00CC22" and return the corresponding color. teichmann@6906: * teichmann@6906: * @param hex The hex color value. teichmann@6906: * teichmann@6906: * @return a Color or null, if hex is empty. teichmann@6906: */ teichmann@6906: public static Color parseHexColor(String hex) { teichmann@6906: if (hex == null) { teichmann@6906: return null; teichmann@6906: } teichmann@6906: teichmann@6906: return Color.decode(hex); teichmann@6905: } teichmann@6905: teichmann@6905: teichmann@6905: public boolean parseShowArea() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_AREA, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowPointLabel() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOW_POINT_LABEL, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6905: public boolean parseShowExtraMark() { teichmann@6906: String show = XMLUtils.xpathString(document, XPATH_SHOWEXTRAMARK, null); teichmann@6906: return parseBoolean(show, false); teichmann@6905: } teichmann@6905: teichmann@6906: public int parseTextSize() { teichmann@6906: return parseTextSize(XPATH_LABEL_FONT_SIZE); teichmann@6906: } teichmann@6906: teichmann@6906: public int parseTextSize(String path) { teichmann@6906: String size = XMLUtils.xpathString(document, path, null); teichmann@6906: if (size == null || size.length() == 0) { teichmann@6906: return 10; teichmann@6906: } teichmann@6906: teichmann@6906: try { teichmann@6906: return Integer.parseInt(size); teichmann@6906: } teichmann@6906: catch (NumberFormatException nfe) { teichmann@6906: } teichmann@6906: return 10; teichmann@6906: } teichmann@6906: teichmann@6906: /** teichmann@6906: * Parse a string like "103, 100, 0" and return a corresping color. teichmann@6906: * @param rgbtext Color as string representation, e.g. "255,0,20". teichmann@6906: * @return Color, null in case of issues. teichmann@6906: */ teichmann@6906: public static Color parseRGB(String rgbtext) { teichmann@6906: if (rgbtext == null) { teichmann@6906: return null; teichmann@6906: } teichmann@6906: String rgb[] = rgbtext.split(","); teichmann@6906: Color c = null; teichmann@6906: try { teichmann@6906: c = new Color( teichmann@6906: Integer.parseInt(rgb[0].trim()), teichmann@6906: Integer.parseInt(rgb[1].trim()), teichmann@6906: Integer.parseInt(rgb[2].trim())); teichmann@6906: } teichmann@6906: catch (NumberFormatException nfe) { teichmann@6906: c = null; teichmann@6906: } teichmann@6906: return c; teichmann@6906: } teichmann@6906: teichmann@6906: public String getLineColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_LINE_COLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** Get show border as string. */ teichmann@6906: public String getShowBorderString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_SHOW_BORDER, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** Get fill color as string. */ teichmann@6906: public String getFillColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_FILL_COLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getBackgroundColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_BACKGROUND_COLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: public String getSymbol() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_SYMBOL, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getTransparencyString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_TRANSPARENCY, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getAreaTransparencyString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_AREA_TRANSPARENCY, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getShowMinimum() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_SHOW_MINIMUM, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getShowMaximum() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_SHOW_MAXIMUM, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** teichmann@6906: * Gets color from color field. teichmann@6906: * @param theme the theme document. teichmann@6906: * @return color. teichmann@6906: */ teichmann@6906: public Color parseFillColorField() { teichmann@6906: return parseRGB(getFillColorString()); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public boolean parseShowBorder() { teichmann@6906: return parseBoolean(getShowBorderString(), false); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public int parseTransparency() { teichmann@6906: return parseInteger(getTransparencyString(), 50); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** teichmann@6906: * Gets color from color field. teichmann@6906: * @param theme the theme document. teichmann@6906: * @return color. teichmann@6906: */ teichmann@6906: public Color parseLineColorField() { teichmann@6906: String lineColorStr = getLineColorString(); teichmann@6906: logger.debug("parseLineColorField: lineColorStr = " + teichmann@6906: (lineColorStr == null ? "null" : lineColorStr)); teichmann@6906: return parseColor(lineColorStr); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public Color parseAreaLineColorField() { teichmann@6906: String lineColorStr = getAreaLineColorString(); teichmann@6906: logger.debug("parseLineColorField: lineColorStr = " + teichmann@6906: (lineColorStr == null ? "null" : lineColorStr)); teichmann@6906: return parseColor(lineColorStr); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: private String getAreaLineColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_AREA_LINE_COLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public boolean parseShowMinimum() { teichmann@6906: return parseBoolean(getShowMinimum(), false); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public boolean parseShowMaximum() { teichmann@6906: return parseBoolean(getShowMaximum(), false); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: /** teichmann@6906: * Creates a MapserverStyle from the given XML theme. teichmann@6906: * This method uses a start- and endcolor to interpolate a teichmann@6906: * given number of color classes for the MapserverStyle. teichmann@6906: * @param theme teichmann@6906: * @return String representation of the MapserverStyle teichmann@6906: */ teichmann@6905: public String createDynamicMapserverStyle( teichmann@6906: float from, float to, float step, CallMeta meta) teichmann@6906: { teichmann@6906: MapserverStyle ms = new MapserverStyle(); teichmann@6906: teichmann@6906: String strStartColor = XMLUtils.xpathString(document, XPATH_WSPLGEN_STARTCOLOR, null); teichmann@6906: Color startColor = strStartColor != null ? parseColor(strStartColor) : new Color(178, 201, 215); teichmann@6906: String strEndColor = XMLUtils.xpathString(document, XPATH_WSPLGEN_ENDCOLOR, null); teichmann@6906: Color endColor = strEndColor != null? parseColor(strEndColor) : new Color(2, 27, 42); teichmann@6906: teichmann@6906: to = to != 0 ? to : 9999; teichmann@6906: step = step != 0 ? step : to; teichmann@6906: teichmann@6906: int numClasses = (int)((to - from) / step); teichmann@6906: teichmann@6906: float rd = (endColor.getRed() - startColor.getRed()) / (float)numClasses; teichmann@6906: float gd = (endColor.getGreen() - startColor.getGreen()) / (float)numClasses; teichmann@6906: float bd = (endColor.getBlue() - startColor.getBlue()) / (float)numClasses; teichmann@6906: teichmann@6906: if (numClasses > 1) { teichmann@6906: // Desktop Flys always added a last "and larger class" teichmann@6906: numClasses += 1; teichmann@6906: } teichmann@6906: teichmann@6906: for (int n = 0; n < numClasses; n++) { teichmann@6906: StringBuilder newColor = new StringBuilder(); teichmann@6906: newColor.append(startColor.getRed() + Math.round(n * rd)); teichmann@6906: newColor.append(' '); teichmann@6906: newColor.append(startColor.getGreen() + Math.round(n * gd)); teichmann@6906: newColor.append(' '); teichmann@6906: newColor.append(startColor.getBlue() + Math.round(n * bd)); teichmann@6906: teichmann@6906: String expr = createWSPLGENClassExpression(from + n * step, step, n + 1, numClasses); teichmann@6906: String name = createWSPLGENClassName(from + n * step, step, n + 1, numClasses, meta); teichmann@6906: teichmann@6906: Clazz c = new Clazz(name); teichmann@6906: Style s = new Style(); teichmann@6906: s.setColor(newColor.toString()); teichmann@6906: s.setSize(5); teichmann@6906: teichmann@6906: c.addItem(new Expression("(" + expr + ")")); teichmann@6906: c.addItem(s); teichmann@6906: teichmann@6906: ms.addClazz(c); teichmann@6906: } teichmann@6906: teichmann@6906: return ms.toString(); teichmann@6905: } teichmann@6905: teichmann@6906: teichmann@6906: protected static String createWSPLGENClassExpression(float val, float step, int idx, int maxIdx) { teichmann@6906: if (idx < maxIdx) { teichmann@6906: return "[DIFF] >= " + val + " AND [DIFF] < " + (val + step); teichmann@6906: } teichmann@6906: else { teichmann@6906: return "[DIFF] >= " + val; teichmann@6906: } teichmann@6906: } teichmann@6906: teichmann@6906: /** teichmann@6906: * Creates a class name for the mapfile style that visualizes a floodmap. teichmann@6906: * The class names are used in the map's legend. teichmann@6906: * teichmann@6906: * @param val Current isobath value. teichmann@6906: * @param step Difference between to class values. teichmann@6906: * @param idx Current class index that is being processed. teichmann@6906: * @param maxIdx Highest class index. teichmann@6906: * @param meta Caller meta object used to determine locale. teichmann@6906: * @return teichmann@6906: */ teichmann@6906: protected static String createWSPLGENClassName(float val, float step, int idx, int maxIdx, CallMeta meta) { teichmann@6906: assert meta != null : "CallMeta instance is null"; teichmann@6906: teichmann@6906: if (idx < maxIdx) { teichmann@6906: return Resources.getMsg(meta, MSG_ISOBATH_CLASS, teichmann@6906: new Object[] {val, val + step}); teichmann@6906: } teichmann@6906: else { teichmann@6906: return Resources.getMsg(meta, MSG_ISOBATH_LASTCLASS, teichmann@6906: new Object[] {val}); teichmann@6906: } teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String createMapserverStyle() { teichmann@6906: String symbol = getSymbol(); teichmann@6906: String backcolor = getLabelBackgroundColorString(); teichmann@6906: String linecolor = getLineColorString(); teichmann@6906: if (linecolor == null || "".equals(linecolor)) { teichmann@6906: logger.warn("createMapserverStyle: linecolor String is empty"); teichmann@6906: linecolor = "0,128,255"; teichmann@6906: } teichmann@6906: teichmann@6906: int linewidth = parseLineWidth(); teichmann@6906: teichmann@6906: MapserverStyle ms = new MapserverStyle(); teichmann@6906: teichmann@6906: Clazz c = new Clazz(" "); teichmann@6906: teichmann@6906: Style s = new Style(); teichmann@6906: s.setOutlineColor(linecolor.replace(",", " ")); teichmann@6906: teichmann@6906: if (backcolor != null && backcolor.length() > 0) { teichmann@6906: s.setColor(backcolor.replace(",", " ")); teichmann@6906: } teichmann@6906: teichmann@6906: s.setSize(linewidth); teichmann@6906: s.setSymbol(symbol); teichmann@6906: c.addItem(s); teichmann@6906: teichmann@6906: String textcolor = getTextColorString(); teichmann@6906: int textsize = parseTextSize(); teichmann@6906: teichmann@6906: if (textcolor != null && textcolor.length() > 0 && textsize > 0) { teichmann@6906: Label l = new Label(); teichmann@6906: l.setColor(textcolor.replace(",", " ")); teichmann@6906: l.setSize(textsize); teichmann@6906: c.addItem(l); teichmann@6906: } teichmann@6906: teichmann@6906: ms.addClazz(c); teichmann@6906: teichmann@6906: return ms.toString(); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: public String getAreaBackgroundColorString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_AREA_BACKGROUND_COLOR, null); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6905: public Color parseAreaBackgroundColor() { teichmann@6906: return parseColor(getAreaBackgroundColorString()); teichmann@6905: } teichmann@6905: teichmann@6906: teichmann@6906: public int parseAreaTransparency() { teichmann@6906: return parseInteger(getAreaTransparencyString(), 50); teichmann@6905: } teichmann@6905: teichmann@6906: teichmann@6906: public boolean parseAreaShowBorder() { teichmann@6906: return parseBoolean(getAreaShowBorderString(), false); teichmann@6906: } teichmann@6906: teichmann@6906: teichmann@6906: private String getAreaShowBorderString() { teichmann@6906: return XMLUtils.xpathString(document, XPATH_AREA_SHOW_BORDER, null); teichmann@6906: } teichmann@6905: } teichmann@6905: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :