Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/LocationSelect.java @ 2046:2ae0627f956e
Improved ChartSettings and depending classes to avoid a lot of casting.
flys-artifacts/trunk@3534 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Fri, 23 Dec 2011 08:51:28 +0000 |
parents | 853cd2120d69 |
children | 6e67b5dd8c4c |
line wrap: on
line source
package de.intevation.flys.artifacts.states; import gnu.trove.TDoubleArrayList; import org.apache.log4j.Logger; import org.w3c.dom.Element; import de.intevation.artifacts.Artifact; import de.intevation.artifacts.CallContext; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.artifactdatabase.data.StateData; import de.intevation.flys.artifacts.FLYSArtifact; /** * This state is used to realize the input of multiple locations as string. The * string should be a whitespace separated list of double values where each * double value represents a location. * * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> */ public class LocationSelect extends LocationDistanceSelect { /** The logger used in this class.*/ private static Logger logger = Logger.getLogger(LocationSelect.class); /** The name of the StateData object that stores the location string.*/ public static final String FIELD_LOCATIONS = "ld_locations"; public LocationSelect() { } @Override protected String getUIProvider() { return "location_panel"; } @Override protected Element[] createItems( XMLUtils.ElementCreator cr, Artifact artifact, String name, CallContext context) { double[] minmax = getMinMax(artifact); double minVal = Double.MIN_VALUE; double maxVal = Double.MAX_VALUE; if (minmax != null) { minVal = minmax[0]; maxVal = minmax[1]; } else { logger.warn("Could not read min/max distance values!"); } if (name.equals(FIELD_LOCATIONS)) { Element min = createItem( cr, new String[] {"min", new Double(minVal).toString()}); Element max = createItem( cr, new String[] {"max", new Double(maxVal).toString()}); return new Element[] { min, max }; } return null; } @Override public boolean validate(Artifact artifact) throws IllegalArgumentException { logger.debug("LocationSelect.validate"); FLYSArtifact flys = (FLYSArtifact) artifact; StateData data = getData(flys, FIELD_LOCATIONS); String locationStr = data != null ? (String) data.getValue() : null; if (locationStr == null || locationStr.length() == 0) { logger.error("No locations given."); throw new IllegalArgumentException("error_empty_state"); } double[] minmax = getMinMax(artifact); double[] mm = extractLocations(locationStr); logger.debug("Inserted min location: " + mm[0]); logger.debug("Inserted max location: " + mm[mm.length-1]); return validateBounds(minmax[0], minmax[1], mm[0], mm[mm.length-1], 0d); } /** * This method takes a string that consist of whitespace separated double * values and returns the double values as array. * * @param locationStr The locations inserted in this state. * * @return the locations as array. */ protected double[] extractLocations(String locationStr) { String[] tmp = locationStr.split(" "); TDoubleArrayList locations = new TDoubleArrayList(); for (String l: tmp) { try { locations.add(Double.parseDouble(l)); } catch (NumberFormatException nfe) { logger.warn(nfe, nfe); } } locations.sort(); return locations.toNativeArray(); } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :