/******************************************************************************* * Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com) * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt ******************************************************************************/ package com.opendoorlogistics.core.gis.map; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import com.opendoorlogistics.core.utils.Numbers; import com.opendoorlogistics.core.utils.strings.StringKeyValue; import com.opendoorlogistics.core.utils.strings.Strings; final public class RenderProperties { private static final TreeMap<StringKeyValue, Long> keyValueMap; public static final long SHOW_TEXT = 1<<0; public static final long SHOW_BACKGROUND = 1<<1; public static final long SHOW_ALL = SHOW_TEXT | SHOW_BACKGROUND; public static final long LEGEND_TOP_LEFT = 1<<2; public static final long LEGEND_TOP_RIGHT = 1<<3; public static final long LEGEND_BOTTOM_LEFT = 1<<4; public static final long LEGEND_BOTTOM_RIGHT = 1<<5; public static final long LEGEND_TOP = 1<<6; public static final long LEGEND_BOTTOM = 1<<7; // public static final long RENDER_FADE = 1<<8; public static final long SKIP_BACKGROUND_COLOUR_RENDERING = 1<<9; public static final long DRAW_OSM_COPYRIGHT = 1<<10; public static final long RENDER_BORDERS_ONLY = 1<<11; public static final long SKIP_BORDER_RENDERING = 1<<12; public static final long THIN_POLYGON_BORDERS= 1<<13; public enum NumericRenderProp{ MIN_SPAN_LONGITUDE("minSpanLongitude"), MIN_SPAN_LATITUDE("minSpanLatitude"), MIN_SPAN_DEGREES("minSpanDegrees"); private NumericRenderProp(String keyword) { this.keyword = keyword; } private final String keyword; public String getKeyword(){ return keyword; } } public RenderProperties(){ } public RenderProperties(RenderProperties r){ flags = r.flags; for(Map.Entry<NumericRenderProp, Double> entry:r.numerics.entrySet()){ numerics.put(entry.getKey(), entry.getValue()); } } public RenderProperties(String keyValueString){ flags =0; List<StringKeyValue> list = StringKeyValue.parseCommaSeparated(keyValueString, true); for(StringKeyValue kv :list ){ boolean found=false; Long value = keyValueMap.get(kv); if(value!=null){ flags |=value; found = true; } if(!found){ for(NumericRenderProp nrp: NumericRenderProp.values()){ if(Strings.equalsStd(nrp.getKeyword(), kv.getKey())){ Double number = Numbers.toDouble(kv.getValue()); if(number==null){ throw new RuntimeException("Unparseable number found for render property: " + nrp.getKeyword()); } numerics.put(nrp, number); found = true; break; } } } if(!found){ throw new RuntimeException("Unknown key-value render property option:" + kv); } } } private long flags = SHOW_ALL; private final HashMap<NumericRenderProp, Double> numerics = new HashMap<>(); public boolean hasFlag(long flag){ return hasFlag(this.flags, flag); } public long getFlags(){ return flags; } public static boolean hasFlag(long flags,long flag){ return (flags & flag) == flag; } public void addFlags(long l){ flags |=l; } public void setFlag(long flag, boolean on){ if(on){ flags |= flag; }else{ flags &= ~flag; } } public void toggleFlag(long flag){ setFlag(flag, !hasFlag(flag)); } static{ // init keyvalue map keyValueMap = new TreeMap<>(); keyValueMap.put(new StringKeyValue("legend", "topleft"), LEGEND_TOP_LEFT); keyValueMap.put(new StringKeyValue("legend", "topright"), LEGEND_TOP_RIGHT); keyValueMap.put(new StringKeyValue("legend", "bottomleft"), LEGEND_BOTTOM_LEFT); keyValueMap.put(new StringKeyValue("legend", "bottomright"), LEGEND_BOTTOM_RIGHT); keyValueMap.put(new StringKeyValue("legend", "top"), LEGEND_TOP); keyValueMap.put(new StringKeyValue("legend", "bottom"), LEGEND_BOTTOM); } public Double getNumericProperty(NumericRenderProp nrp){ return numerics.get(nrp); } }