view gwt-client/src/main/java/org/dive4elements/river/client/shared/model/VegetationZoneServerClientXChange.java @ 9416:05405292a7ca

Navigationtheme panel now shows themes of dWt and WQ charts grayed out, if the current station is outside the valid range of the theme.
author gernotbelger
date Thu, 16 Aug 2018 16:28:03 +0200
parents e2da9c8a7c57
children 853f2dafc16e
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.client.shared.model;

import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;

/**
 * @author Domenico Nardi Tironi
 *
 */
public class VegetationZoneServerClientXChange implements Comparable<VegetationZoneServerClientXChange> {

    // IMMER ABGLEICHEN MIT VegetationZoneServerClientXChange.class IM SERVER
    public static final boolean HAS_COLORS_EDITABLE = false;

    private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
    private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
    private final String zoneName;
    private final int min_day_overflow;
    private final int max_day_overflow;
    private final String hexColor;

    public static List<VegetationZoneServerClientXChange> parse(final String zonesRaw) {
        final List<VegetationZoneServerClientXChange> resultList = new ArrayList<VegetationZoneServerClientXChange>();

        final List<String[]> results = new ArrayList<String[]>();
        if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
            final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
            for (final String row : rows) {
                if (row.contains(TABLE_CELL_SEPARATOR)) {
                    final String[] result = row.split(TABLE_CELL_SEPARATOR);
                    results.add(result);
                }
            }
        }
        for (final String[] zone : results) {

            final VegetationZoneServerClientXChange helper = new VegetationZoneServerClientXChange(zone[0], Integer.valueOf(zone[1]), Integer.valueOf(zone[2]), zone[3]);
            resultList.add(helper);
        }

        return resultList;
    }

    public static VegetationZoneServerClientXChange createFromTableEntry(final String zone, final String min_day_overflow, final String max_day_overflow, final String hexColor) {
        return new VegetationZoneServerClientXChange(zone, Integer.valueOf(min_day_overflow), Integer.valueOf(max_day_overflow), hexColor); // Error-Handling?
    }

    private VegetationZoneServerClientXChange(final String zone, final Integer min_day_overflow, final Integer max_day_overflow, final String hexColor) {
        this.zoneName = zone;
        this.min_day_overflow = min_day_overflow;
        this.max_day_overflow = max_day_overflow;
        this.hexColor = hexColor;
    }

    public int getMax_day_overflow() {
        return this.max_day_overflow;
    }

    public String getZoneName() {
        if (this.zoneName == null || this.zoneName.equals("")) {
            return "---";
        }
        return this.zoneName;
    }

    public String getHexColor() {
        try {
            final int test = Integer.decode(this.hexColor);
            return this.hexColor;
        }
        catch (final NumberFormatException e) {
            return "#ffffff";
        }
    }

    public int getMin_day_overflow() {
        return this.min_day_overflow;
    }

    public static final List<VegetationZoneServerClientXChange> getStandardList() {

        final List<VegetationZoneServerClientXChange> list = new ArrayList<VegetationZoneServerClientXChange>();
        list.add(new VegetationZoneServerClientXChange("Zonaler Wald", 0, 5, "#336600"));
        list.add(new VegetationZoneServerClientXChange("Hartholzaue, trocken", 6, 40, "#00cc00"));
        list.add(new VegetationZoneServerClientXChange("Hartholzaue, feucht", 41, 80, "#66ff33"));
        list.add(new VegetationZoneServerClientXChange("Silberweidenwald", 81, 140, "#008080"));
        list.add(new VegetationZoneServerClientXChange("Weidengebüsch", 141, 200, "#33cccc"));
        list.add(new VegetationZoneServerClientXChange("Uferröhricht", 201, 260, "#ffa8ff"));
        list.add(new VegetationZoneServerClientXChange("Uferpioniere", 261, 320, "#ff0000"));
        list.add(new VegetationZoneServerClientXChange("Vegetationslos", 321, 364, "#b2b2b2"));
        list.add(new VegetationZoneServerClientXChange("Wasserfläche", 365, 365, "#0066ff"));

        return list;
    }

    public static final String parseListToDataString(final List<VegetationZoneServerClientXChange> list) {

        java.util.Collections.sort(list);
        final StringBuilder builder = new StringBuilder();
        for (final VegetationZoneServerClientXChange zone : list) {
            builder.append(zone.getZoneName());
            builder.append(TABLE_CELL_SEPARATOR);
            builder.append(zone.getMin_day_overflow());
            builder.append(TABLE_CELL_SEPARATOR);
            builder.append(zone.getMax_day_overflow());
            builder.append(TABLE_CELL_SEPARATOR);
            builder.append(zone.getHexColor());
            builder.append(TABLE_ROW_SEPARATOR);
        }
        return builder.toString();

    }

    @Override
    public int compareTo(final VegetationZoneServerClientXChange o) {
        final int basicCompare = Integer.valueOf(this.getMin_day_overflow()).compareTo(o.getMin_day_overflow());
        if (basicCompare == 0)
            return Integer.valueOf(this.getMax_day_overflow()).compareTo(o.getMax_day_overflow()); // wenn min==min && max==max, alphabetisch sortieren?

        if (basicCompare == 0) {
            return 1; // for treeSet
        }

        return basicCompare;
    }

    public static final boolean zonesAreOverlapping(final List<VegetationZoneServerClientXChange> list) {
        for (final VegetationZoneServerClientXChange zone : list) {
            for (final VegetationZoneServerClientXChange zoneOther : list) {
                if (zone != zoneOther) {
                    final boolean overlaps = zone.overlaps(zoneOther);
                    if (overlaps) {
                        return overlaps; // cancel. only one zone has to overlap
                    }
                }
            }
        }

        return false;
    }

    public static final boolean hasGaps(final List<VegetationZoneServerClientXChange> list, final int lower, final int upper) {

        if ((upper - lower) == 0)
            return true;

        final TreeSet<VegetationZoneServerClientXChange> treeList = new TreeSet<VegetationZoneServerClientXChange>();
        treeList.addAll(list);
        int lowerCompare = lower;
        for (final VegetationZoneServerClientXChange zone : treeList) {
            if (zone.getLowerFromTo() > (lowerCompare + 1)) { // nicht inklusiv
                return true;
            }
            lowerCompare = zone.getUpperFromTo();
        }
        if ((lowerCompare) < upper)
            return true; // am Ende nicht geschlossen

        return false;
    }

    private boolean overlaps(final VegetationZoneServerClientXChange otherZone) {
        final int otherLower = otherZone.getLowerFromTo();
        final int otherUpper = otherZone.getUpperFromTo();

        final int upper = getUpperFromTo();
        final int lower = getLowerFromTo();
        final int otherSchwerpunkt = (otherLower + otherUpper) / 2;
        if ((otherUpper <= upper && otherUpper >= lower)) {
            return true;
        } else if (otherLower >= lower && otherLower <= upper) {
            return true;
        } else if (otherSchwerpunkt >= (lower) && otherSchwerpunkt <= (upper)) {
            return true;
        }
        return false;
    }

    public Integer getLowerFromTo() {
        return this.min_day_overflow < this.max_day_overflow ? this.min_day_overflow : this.max_day_overflow; // Math. is forbidden :-(
    }

    public Integer getUpperFromTo() {
        return this.min_day_overflow > this.max_day_overflow ? this.min_day_overflow : this.max_day_overflow;// Math. is forbidden :-(
    }

}

http://dive4elements.wald.intevation.org