001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.preferences.projection;
003    
004    import org.openstreetmap.josm.data.projection.CustomProjection;
005    import org.openstreetmap.josm.data.projection.Projection;
006    import org.openstreetmap.josm.data.projection.Projections;
007    
008    abstract public class AbstractProjectionChoice implements ProjectionChoice {
009        
010        protected String name;
011        protected String id;
012        protected String cacheDir;
013    
014        /**
015         * Constructor.
016         *
017         * @param name short name of the projection choice as shown in the GUI
018         * @param id unique identifier for the projection choice
019         * @param cacheDir a cache directory name
020         */
021        public AbstractProjectionChoice(String name, String id, String cacheDir) {
022            this.name = name;
023            this.id = id;
024            this.cacheDir = cacheDir;
025        }
026    
027        /**
028         * Constructor (without cacheDir argument).
029         *
030         * Only for core projection choices, where chacheDir is the same as
031         * the second part of the id.
032         */
033        public AbstractProjectionChoice(String name, String id) {
034            this(name, id, null);
035            if (!id.startsWith("core:")) throw new IllegalArgumentException();
036            this.cacheDir = id.substring(5);
037        }
038    
039        @Override
040        public String getId() {
041            return id;
042        }
043    
044        public String getCacheDir() {
045            return cacheDir;
046        }
047    
048        @Override
049        public String toString() {
050            return name;
051        }
052    
053        abstract public String getCurrentCode();
054        
055        abstract public String getProjectionName();
056    
057        @Override
058        public Projection getProjection() {
059            String code = getCurrentCode();
060            String pref = Projections.getInit(code);
061            if (pref == null)
062                throw new AssertionError("Error: Unkown projection code");
063            return new CustomProjection(getProjectionName(), code, pref, getCacheDir());
064        }
065    
066    }