Ticket #7182: 7182_v3.patch

File 7182_v3.patch, 10.3 KB (added by simon04, 13 years ago)
  • data/maps.xsd

    diff --git a/data/maps.xsd b/data/maps.xsd
    index 59fa397..98195bb 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..80cfa4d 100644
    a b package org.openstreetmap.josm.actions;  
    33
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Image;
    67import java.awt.event.ActionEvent;
    7 
     8import javax.swing.Action;
     9import javax.swing.ImageIcon;
    810import javax.swing.JOptionPane;
    9 
    1011import org.openstreetmap.josm.Main;
    1112import org.openstreetmap.josm.data.imagery.ImageryInfo;
    1213import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
    1314import org.openstreetmap.josm.gui.layer.ImageryLayer;
     15import org.openstreetmap.josm.tools.ImageProvider;
    1416
    1517public class AddImageryLayerAction extends JosmAction implements AdaptableAction {
    1618
     19    private static final int MAX_ICON_SIZE = 24;
    1720    private final ImageryInfo info;
    1821
    1922    public AddImageryLayerAction(ImageryInfo info) {
    20         super(info.getMenuName(), /* ICON */"imagery_menu", tr("Add imagery layer {0}",info.getName()), null, false, false);
     23        super(info.getMenuName(),
     24                /* ICON */ "imagery_menu",
     25                tr("Add imagery layer {0}", info.getName()),
     26                null, false, false);
    2127        putValue("toolbar", "imagery_" + info.getToolbarName());
    2228        this.info = info;
    2329        installAdapters();
     30
     31        // change toolbar icon from if specified
     32        try {
     33            if (info.getIcon() != null) {
     34                ImageIcon i = ImageProvider.getIfAvailable(info.getIcon());
     35                if (i.getIconHeight() > MAX_ICON_SIZE || i.getIconWidth() > MAX_ICON_SIZE) {
     36                    i = new ImageIcon(i.getImage().getScaledInstance(MAX_ICON_SIZE, MAX_ICON_SIZE, Image.SCALE_SMOOTH));
     37                }
     38                putValue(Action.SMALL_ICON, i);
     39            }
     40        } catch (Exception ex) {
     41            throw new RuntimeException(ex.getMessage(), ex);
     42        }
    2443    }
    2544
    2645    @Override
    public class AddImageryLayerAction extends JosmAction implements AdaptableAction  
    5271            setEnabled(false);
    5372        }
    5473    }
    55 }
     74}
     75 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 39678d6..06ee30c 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;
    public class ImageProvider {  
    153155        return ir.getImageIcon(dim == null ? ImageResource.DEFAULT_DIMENSION : dim, sanitize);
    154156    }
    155157
     158    /**
     159     * {@code data:[<mediatype>][;base64],<data>}
     160     * @see RFC2397
     161     */
     162    private static final Pattern dataUrlPattern = Pattern.compile(
     163            "^data:([a-zA-Z]+/[a-zA-Z]+)?(;base64)?,(.+)$");
     164
    156165    private static ImageResource getIfAvailableImpl(Collection<String> dirs, String id, String subdir, String name, File archive) {
    157166        if (name == null)
    158167            return null;
    159168        ImageType type = name.toLowerCase().endsWith(".svg") ? ImageType.SVG : ImageType.OTHER;
    160169
     170        try {
     171            if (name.startsWith("data:")) {
     172                Matcher m = dataUrlPattern.matcher(name);
     173                if (m.matches()) {
     174                    String mediatype = m.group(1);
     175                    String base64 = m.group(2);
     176                    String data = m.group(3);
     177                    byte[] bytes = ";base64".equals(base64)
     178                            ? Base64.decodeBase64(data)
     179                            : URLDecoder.decode(data, "utf-8").getBytes();
     180                    return new ImageResource(new ImageIcon(bytes).getImage(), true);
     181                }
     182            }
     183        } catch (UnsupportedEncodingException ex) {
     184            throw new RuntimeException(ex.getMessage(), ex);
     185        }
     186
    161187        if (name.startsWith("http://")) {
    162188            String url = name;
    163189            ImageResource ir = cache.get(url);