+package tim.prune.gui.map;
+
+import java.util.ArrayList;
+
+import tim.prune.config.Config;
+
+/**
+ * Class to hold a library for all the map sources
+ * and provide access to each one
+ */
+public abstract class MapSourceLibrary
+{
+ /** list of map sources */
+ private static ArrayList<MapSource> _sourceList = null;
+ /** Number of fixed sources */
+ private static int _numFixedSources = 0;
+
+ // Static block to initialise source list
+ static
+ {
+ _sourceList = new ArrayList<MapSource>();
+ addFixedSources();
+ _numFixedSources = _sourceList.size();
+ addConfigSources();
+ }
+
+ /** Private constructor to block instantiation */
+ private MapSourceLibrary() {}
+
+
+ /** @return number of fixed sources which shouldn't be deleted */
+ public static int getNumFixedSources() {
+ return _numFixedSources;
+ }
+
+ /**
+ * Initialise source list by adding bare minimum
+ */
+ private static void addFixedSources()
+ {
+ _sourceList.add(new OsmMapSource("Mapnik", "https://[abc].tile.openstreetmap.org/"));
+ _sourceList.add(new OsmMapSource("Cycling Trails", "https://[abc].tile.openstreetmap.org/", "png",
+ "https://tile.waymarkedtrails.org/cycling/", "png", 18));
+ _sourceList.add(new OsmMapSource("Reitkarte", "http://topo[234].wanderreitkarte.de/topo/"));
+ _sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
+ "http://maps-for-free.com/layer/water/", "gif", 11));
+ _sourceList.add(new OsmMapSource("Hikebikemap", "http://[abc].tiles.wmflabs.org/hikebike/",
+ "http://[abc].tiles.wmflabs.org/hillshading/", 18));
+ _sourceList.add(new OsmMapSource("OpenSeaMap", "http://tile.openstreetmap.org/",
+ "http://tiles.openseamap.org/seamark/", 18));
+ }
+
+ /**
+ * Add custom sources from Config to the library
+ */
+ private static void addConfigSources()
+ {
+ String configString = Config.getConfigString(Config.KEY_MAPSOURCE_LIST);
+ if (configString != null && configString.length() > 10)
+ {
+ // Loop over sources in string, separated by vertical bars
+ int splitPos = configString.indexOf('|');
+ while (splitPos > 0)
+ {
+ String sourceString = configString.substring(0, splitPos);
+ MapSource source = OsmMapSource.fromConfig(sourceString);
+ if (source != null) {
+ _sourceList.add(source);
+ }
+ configString = configString.substring(splitPos+1);
+ splitPos = configString.indexOf('|');
+ }
+ }
+ }
+
+ /**
+ * @return current number of sources
+ */
+ public static int getNumSources() {
+ return _sourceList.size();
+ }
+
+ /**
+ * Add the given MapSource to the list (at the end)
+ * @param inSource MapSource object
+ */
+ public static void addSource(MapSource inSource) {
+ // Check whether source is already there? Check whether valid?
+ _sourceList.add(inSource);
+ }
+
+ /**
+ * Edit the given MapSource object by replacing with a new one
+ * @param inOriginal existing MapSource object
+ * @param inNewSource new MapSource object
+ */
+ public static void editSource(MapSource inOriginal, MapSource inNewSource)
+ {
+ // Check whether original source is still there
+ int origPos = _sourceList.indexOf(inOriginal);
+ if (origPos < 0) {
+ addSource(inNewSource);
+ }
+ else {
+ _sourceList.set(origPos, inNewSource);
+ }
+ }
+
+ /**
+ * @param inIndex source index number
+ * @return corresponding map source object
+ */
+ public static MapSource getSource(int inIndex)
+ {
+ // Check whether within range
+ if (inIndex < 0 || inIndex >= _sourceList.size()) {return null;}
+ return _sourceList.get(inIndex);
+ }
+
+ /**
+ * Delete the specified source
+ * @param inIndex index of source to delete
+ */
+ public static void deleteSource(int inIndex)
+ {
+ if (inIndex >= _numFixedSources) {
+ _sourceList.remove(inIndex);
+ }
+ }
+
+ /**
+ * Check whether the given name already exists in the library (case-insensitive)
+ * @param inName name to check
+ * @return true if already exists, false otherwise
+ */
+ public static boolean hasSourceName(String inName)
+ {
+ if (inName == null) {return false;}
+ String checkName = inName.toLowerCase().trim();
+ for (int i=0; i<getNumSources(); i++)
+ {
+ String name = getSource(i).getName().toLowerCase();
+ if (name.equals(checkName)) {return true;}
+ }
+ return false;
+ }
+
+ /**
+ * @return String containing all custom-added sources as a |-separated list
+ */
+ public static String getConfigString()
+ {
+ StringBuilder builder = new StringBuilder();
+ for (int i=getNumFixedSources(); i<getNumSources(); i++) {
+ builder.append(getSource(i).getConfigString()).append('|');
+ }
+ return builder.toString();
+ }
+}