Ticket #7182: 7182_v4.patch

File 7182_v4.patch, 10.8 KB (added by simon04, 14 years ago)
  • data/maps.xsd

    diff --git a/data/maps.xsd b/data/maps.xsd
    index 59fa397..b847c02 100644
    a b  
    623623                                                <xs:element name="terms-of-use-url" minOccurs="0" maxOccurs="1" type="xs:string" />
    624624                                                <!-- The ISO 3166 country code -->
    625625                                                <xs:element name="country-code" minOccurs="0" maxOccurs="1" type="tns:iso3166" />
     626                                                <!-- A base64-encoded image that is displayed as menu/toolbar icon -->
     627                                                <xs:element name="icon" minOccurs="0" maxOccurs="1" type="xs:string" />
    626628                                        </xs:all>
    627629                                </xs:complexType>
    628630                        </xs:element>
  • src/org/openstreetmap/josm/actions/AddImageryLayerAction.java

    diff --git a/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java b/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
    index 95cccca..32e73bd 100644
    a b package org.openstreetmap.josm.actions;  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Dimension;
    67import java.awt.event.ActionEvent;
    7 
     8import java.util.Collection;
     9import javax.swing.Action;
     10import javax.swing.ImageIcon;
    811import javax.swing.JOptionPane;
    9 
    1012import org.openstreetmap.josm.Main;
    1113import org.openstreetmap.josm.data.imagery.ImageryInfo;
    1214import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
    1315import org.openstreetmap.josm.gui.layer.ImageryLayer;
     16import org.openstreetmap.josm.tools.ImageProvider;
    1417
    1518public class AddImageryLayerAction extends JosmAction implements AdaptableAction {
    1619
     20    private static final int MAX_ICON_SIZE = 24;
    1721    private final ImageryInfo info;
    1822
    1923    public AddImageryLayerAction(ImageryInfo info) {
    public class AddImageryLayerAction extends JosmAction implements AdaptableAction  
    2125        putValue("toolbar", "imagery_" + info.getToolbarName());
    2226        this.info = info;
    2327        installAdapters();
     28
     29        // change toolbar icon from if specified
     30        try {
     31            if (info.getIcon() != null) {
     32                ImageIcon i = ImageProvider.getIfAvailable(
     33                        (Collection<String>) null, null, "", info.getIcon(), null, null,
     34                        new Dimension(MAX_ICON_SIZE, MAX_ICON_SIZE), false);
     35                putValue(Action.SMALL_ICON, i);
     36            }
     37        } catch (Exception ex) {
     38            throw new RuntimeException(ex.getMessage(), ex);
     39        }
    2440    }
    2541
    2642    @Override
    public class AddImageryLayerAction extends JosmAction implements AdaptableAction  
    5268            setEnabled(false);
    5369        }
    5470    }
    55 }
     71}
     72 No newline at end of file
  • src/org/openstreetmap/josm/data/imagery/ImageryInfo.java

    diff --git a/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java b/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
    index 955d94e..538eda4 100644
    a b public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    8484    private String termsOfUseText;
    8585    private String termsOfUseURL;
    8686    private String countryCode = "";
     87    private String icon;
    8788
    8889    /** auxiliary class to save an ImageryInfo object in the preferences */
    8990    public static class ImageryPreferenceEntry {
    public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    105106        @pref String bounds;
    106107        @pref String shapes;
    107108        @pref String projections;
     109        @pref String icon;
    108110
    109111        public ImageryPreferenceEntry() {
    110112        }
    public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    125127            max_zoom = i.defaultMaxZoom;
    126128            min_zoom = i.defaultMinZoom;
    127129            cookies = i.cookies;
     130            icon = i.icon;
    128131            if (i.bounds != null) {
    129132                bounds = i.bounds.encodeAsString(",");
    130133                String shapesString = "";
    public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    218221        termsOfUseText = e.terms_of_use_text;
    219222        termsOfUseURL = e.terms_of_use_url;
    220223        countryCode = e.country_code;
     224        icon = e.icon;
    221225    }
    222226
    223227    public ImageryInfo(Collection<String> list) {
    public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    284288        this.termsOfUseText = i.termsOfUseText;
    285289        this.termsOfUseURL = i.termsOfUseURL;
    286290        this.serverProjections = i.serverProjections;
     291        this.icon = i.icon;
    287292    }
    288293
    289294    @Override
    public class ImageryInfo implements Comparable<ImageryInfo>, Attributed {  
    514519        this.countryCode = countryCode;
    515520    }
    516521
     522    public String getIcon() {
     523        return icon;
     524    }
     525
     526    public void setIcon(String icon) {
     527        this.icon = icon;
     528    }
     529
    517530    /**
    518531     * Get the projections supported by the server. Only relevant for
    519532     * WMS-type ImageryInfo at the moment.
  • src/org/openstreetmap/josm/io/imagery/ImageryReader.java

    diff --git a/src/org/openstreetmap/josm/io/imagery/ImageryReader.java b/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
    index acdec59..10f8ab3 100644
    a b package org.openstreetmap.josm.io.imagery;  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55import static org.openstreetmap.josm.tools.Utils.equal;
    66
    7 import java.io.BufferedReader;
    87import java.io.IOException;
    98import java.io.InputStream;
    10 import java.io.InputStreamReader;
    11 import java.io.UnsupportedEncodingException;
    129import java.util.ArrayList;
    1310import java.util.Arrays;
    1411import java.util.List;
    import java.util.Stack;  
    1714import javax.xml.parsers.ParserConfigurationException;
    1815import javax.xml.parsers.SAXParserFactory;
    1916
    20 import org.openstreetmap.josm.Main;
    2117import org.openstreetmap.josm.data.imagery.ImageryInfo;
    2218import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryBounds;
    2319import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
    2420import org.openstreetmap.josm.data.imagery.Shape;
    2521import org.openstreetmap.josm.io.MirroredInputStream;
    2622import org.openstreetmap.josm.io.UTFInputStreamReader;
    27 import org.openstreetmap.josm.tools.Utils;
    2823import org.xml.sax.Attributes;
    2924import org.xml.sax.InputSource;
    3025import org.xml.sax.SAXException;
    public class ImageryReader {  
    129124                        "terms-of-use-text",
    130125                        "terms-of-use-url",
    131126                        "country-code",
     127                        "icon",
    132128                    }).contains(qName)) {
    133129                        newState = State.ENTRY_ATTRIBUTE;
    134130                    } else if (qName.equals("bounds")) {
    public class ImageryReader {  
    259255                        entry.setTermsOfUseURL(accumulator.toString());
    260256                    } else if (qName.equals("country-code")) {
    261257                        entry.setCountryCode(accumulator.toString());
     258                    } else if (qName.equals("icon")) {
     259                        entry.setIcon(accumulator.toString());
    262260                    } else {
    263261                    }
    264262                    break;
  • src/org/openstreetmap/josm/tools/ImageProvider.java

    diff --git a/src/org/openstreetmap/josm/tools/ImageProvider.java b/src/org/openstreetmap/josm/tools/ImageProvider.java
    index 373717d..7530575 100644
    a b import java.io.ByteArrayInputStream;  
    2020import java.io.File;
    2121import java.io.IOException;
    2222import java.io.InputStream;
     23import java.io.UnsupportedEncodingException;
    2324import java.net.MalformedURLException;
    2425import java.net.URI;
    2526import java.net.URL;
     27import java.net.URLDecoder;
    2628import java.util.Arrays;
    2729import java.util.Collection;
    2830import java.util.HashMap;
    2931import java.util.Map;
     32import java.util.regex.Matcher;
     33import java.util.regex.Pattern;
    3034import java.util.zip.ZipEntry;
    3135import java.util.zip.ZipFile;
    3236import javax.swing.Icon;
    3337import javax.swing.ImageIcon;
    34 
     38import org.apache.commons.codec.binary.Base64;
    3539import org.openstreetmap.josm.Main;
    3640import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    3741import org.openstreetmap.josm.io.MirroredInputStream;
    3842import org.openstreetmap.josm.plugins.PluginHandler;
    39 import org.openstreetmap.josm.tools.Utils;
    4043import org.xml.sax.Attributes;
    4144import org.xml.sax.EntityResolver;
    4245import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;  
    4447import org.xml.sax.XMLReader;
    4548import org.xml.sax.helpers.DefaultHandler;
    4649import org.xml.sax.helpers.XMLReaderFactory;
    47 
    4850import com.kitfox.svg.SVGDiagram;
    4951import com.kitfox.svg.SVGException;
    5052import com.kitfox.svg.SVGUniverse;
     53import java.io.StringReader;
    5154
    5255/**
    5356 * Helper class to support the application with images.
    public class ImageProvider {  
    7477     * The icon cache
    7578     */
    7679    private static Map<String, ImageResource> cache = new HashMap<String, ImageResource>();
    77 
     80   
    7881    /**
    7982     * Return an image from the specified location. Throws a RuntimeException if
    8083     * the image cannot be located.
    public class ImageProvider {  
    166169            return ir.getImageIcon(dim == null ? ImageResource.DEFAULT_DIMENSION : dim, sanitize);
    167170    }
    168171
     172    /**
     173     * {@code data:[<mediatype>][;base64],<data>}
     174     * @see RFC2397
     175     */
     176    private static final Pattern dataUrlPattern = Pattern.compile(
     177            "^data:([a-zA-Z]+/[a-zA-Z+]+)?(;base64)?,(.+)$");
     178
    169179    static ImageResource getIfAvailableImpl(Collection<String> dirs, String id, String subdir, String name, File archive) {
    170180        if (name == null)
    171181            return null;
    172182        ImageType type = name.toLowerCase().endsWith(".svg") ? ImageType.SVG : ImageType.OTHER;
    173183
     184        try {
     185            if (name.startsWith("data:")) {
     186                Matcher m = dataUrlPattern.matcher(name);
     187                if (m.matches()) {
     188                    String mediatype = m.group(1);
     189                    String base64 = m.group(2);
     190                    String data = m.group(3);
     191                    byte[] bytes = ";base64".equals(base64)
     192                            ? Base64.decodeBase64(data)
     193                            : URLDecoder.decode(data, "utf-8").getBytes();
     194                    if (mediatype != null && mediatype.contains("svg")) {
     195                        URI uri = getSvgUniverse().loadSVG(new StringReader(new String(bytes)), name);
     196                        SVGDiagram svg = getSvgUniverse().getDiagram(uri);
     197                        return new ImageResource(svg);
     198                    } else {
     199                        return new ImageResource(new ImageIcon(bytes).getImage(), true);
     200                    }
     201                }
     202            }
     203        } catch (UnsupportedEncodingException ex) {
     204            throw new RuntimeException(ex.getMessage(), ex);
     205        } catch (IOException ex) {
     206            throw new RuntimeException(ex.getMessage(), ex);
     207        }
     208
    174209        if (name.startsWith("http://")) {
    175210            String url = name;
    176211            ImageResource ir = cache.get(url);