]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/map/MapSourceLibrary.java
Version 14, October 2012
[GpsPrune.git] / tim / prune / gui / map / MapSourceLibrary.java
1 package tim.prune.gui.map;
2
3 import java.util.ArrayList;
4
5 import tim.prune.config.Config;
6
7 /**
8  * Class to hold a library for all the map sources
9  * and provide access to each one
10  */
11 public abstract class MapSourceLibrary
12 {
13         /** list of map sources */
14         private static ArrayList<MapSource> _sourceList = null;
15         /** Number of fixed sources */
16         private static int _numFixedSources = 0;
17
18         // Static block to initialise source list
19         static
20         {
21                 _sourceList = new ArrayList<MapSource>();
22                 addFixedSources();
23                 _numFixedSources = _sourceList.size();
24                 addConfigSources();
25         }
26
27         /** Private constructor to block instantiation */
28         private MapSourceLibrary() {}
29
30
31         /** @return number of fixed sources which shouldn't be deleted */
32         public static int getNumFixedSources() {
33                 return _numFixedSources;
34         }
35
36         /**
37          * Initialise source list by adding bare minimum
38          */
39         private static void addFixedSources()
40         {
41                 _sourceList.add(new OsmMapSource("Mapnik", "http://[abc].tile.openstreetmap.org/"));
42                 _sourceList.add(new OsmMapSource("Cyclemap", "http://[abc].tile.opencyclemap.org/cycle/"));
43                 _sourceList.add(new OsmMapSource("Reitkarte", "http://wanderreitkarte.de/hills/",
44                         "http://topo2.wanderreitkarte.de/topo/", 18));
45                 _sourceList.add(new MffMapSource("Mapsforfree", "http://maps-for-free.com/layer/relief/", "jpg",
46                         "http://maps-for-free.com/layer/water/", "gif", 11));
47                 _sourceList.add(new OsmMapSource("Hikebikemap", "http://toolserver.org/tiles/hikebike/",
48                         "http://toolserver.org/~cmarqu/hill/", 18));
49                 _sourceList.add(new OsmMapSource("Openseamap", "http://tile.openstreetmap.org/",
50                         "http://tiles.openseamap.org/seamark/", 18));
51                 _sourceList.add(new CloudmadeMapSource("Pale Dawn", "998", 18));
52         }
53
54         /**
55          * Add custom sources from Config to the library
56          */
57         private static void addConfigSources()
58         {
59                 String configString = Config.getConfigString(Config.KEY_MAPSOURCE_LIST);
60                 if (configString != null && configString.length() > 10)
61                 {
62                         // Loop over sources in string, separated by vertical bars
63                         int splitPos = configString.indexOf('|');
64                         while (splitPos > 0)
65                         {
66                                 String sourceString = configString.substring(0, splitPos);
67                                 MapSource source = OsmMapSource.fromConfig(sourceString);
68                                 if (source == null) {source = CloudmadeMapSource.fromConfig(sourceString);}
69                                 if (source != null) {
70                                         _sourceList.add(source);
71                                 }
72                                 configString = configString.substring(splitPos+1);
73                                 splitPos = configString.indexOf('|');
74                         }
75                 }
76         }
77
78         /**
79          * @return current number of sources
80          */
81         public static int getNumSources() {
82                 return _sourceList.size();
83         }
84
85         /**
86          * Add the given MapSource to the list (at the end)
87          * @param inSource MapSource object
88          */
89         public static void addSource(MapSource inSource) {
90                 // Check whether source is already there?  Check whether valid?
91                 _sourceList.add(inSource);
92         }
93
94         /**
95          * Edit the given MapSource object by replacing with a new one
96          * @param inOriginal existing MapSource object
97          * @param inNewSource new MapSource object
98          */
99         public static void editSource(MapSource inOriginal, MapSource inNewSource)
100         {
101                 // Check whether original source is still there
102                 int origPos = _sourceList.indexOf(inOriginal);
103                 if (origPos < 0) {
104                         addSource(inNewSource);
105                 }
106                 else {
107                         _sourceList.set(origPos, inNewSource);
108                 }
109         }
110
111         /**
112          * @param inIndex source index number
113          * @return corresponding map source object
114          */
115         public static MapSource getSource(int inIndex)
116         {
117                 // Check whether within range
118                 if (inIndex < 0 || inIndex >= _sourceList.size()) {return null;}
119                 return _sourceList.get(inIndex);
120         }
121
122         /**
123          * Delete the specified source
124          * @param inIndex index of source to delete
125          */
126         public static void deleteSource(int inIndex)
127         {
128                 if (inIndex >= _numFixedSources) {
129                         _sourceList.remove(inIndex);
130                 }
131         }
132
133         /**
134          * Check whether the given name already exists in the library (case-insensitive)
135          * @param inName name to check
136          * @return true if already exists, false otherwise
137          */
138         public static boolean hasSourceName(String inName)
139         {
140                 if (inName == null) {return false;}
141                 String checkName = inName.toLowerCase().trim();
142                 for (int i=0; i<getNumSources(); i++)
143                 {
144                         String name = getSource(i).getName().toLowerCase();
145                         if (name.equals(checkName)) {return true;}
146                 }
147                 return false;
148         }
149
150         /**
151          * @return String containing all custom-added sources as a |-separated list
152          */
153         public static String getConfigString()
154         {
155                 StringBuilder builder = new StringBuilder();
156                 for (int i=getNumFixedSources(); i<getNumSources(); i++) {
157                         builder.append(getSource(i).getConfigString()).append('|');
158                 }
159                 return builder.toString();
160         }
161 }