Ticket #7182: 7182_v2.patch

File 7182_v2.patch, 11.7 KB (added by simon04, 14 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/gui/jmapviewer/AttributionSupport.java

    diff --git a/src/org/openstreetmap/gui/jmapviewer/AttributionSupport.java b/src/org/openstreetmap/gui/jmapviewer/AttributionSupport.java
    index cb7c034..cc26148 100644
    a b public class AttributionSupport {  
    2424    private Image attrImage;
    2525    private String attrTermsText;
    2626    private String attrTermsUrl;
     27    private static final int MAX_IMAGE_SIZE = 80;
    2728    public static final Font ATTR_FONT = new Font("Arial", Font.PLAIN, 10);
    2829    public static final Font ATTR_LINK_FONT;
    2930   
    public class AttributionSupport {  
    4243        boolean requireAttr = source.requiresAttribution();
    4344        if (requireAttr) {
    4445            attrImage = source.getAttributionImage();
     46            if(attrImage!=null)
     47                System.out.println(attrImage.getWidth(null));
     48            if (attrImage != null
     49                    && (attrImage.getWidth(null) > MAX_IMAGE_SIZE
     50                    || attrImage.getHeight(null) > MAX_IMAGE_SIZE)) {
     51                attrImage = attrImage.getScaledInstance(MAX_IMAGE_SIZE, MAX_IMAGE_SIZE, Image.SCALE_SMOOTH);
     52            }
    4553            attrTermsText = source.getTermsOfUseText();
    4654            attrTermsUrl = source.getTermsOfUseURL();
    4755            if (attrTermsUrl != null && attrTermsText == null) {
  • 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..4fdfd57 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;
     16import sun.misc.BASE64Decoder;
    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) {
    20         super(info.getMenuName(), /* ICON */"imagery_menu", tr("Add imagery layer {0}",info.getName()), null, false, false);
     24        super(info.getMenuName(),
     25                /* ICON */ "imagery_menu",
     26                tr("Add imagery layer {0}", info.getName()),
     27                null, false, false);
    2128        putValue("toolbar", "imagery_" + info.getToolbarName());
    2229        this.info = info;
    2330        installAdapters();
     31
     32        /* add toolbar icon from attribution image */
     33        try {
     34            ImageIcon i = null;
     35            if (info.getIcon() != null) {
     36                i = ImageProvider.getIfAvailable(info.getIcon());
     37                //i = new ImageIcon(new BASE64Decoder().decodeBuffer(info.getIcon()));
     38                if (i.getIconHeight() > MAX_ICON_SIZE || i.getIconWidth() > MAX_ICON_SIZE) {
     39                    i = new ImageIcon(i.getImage().getScaledInstance(MAX_ICON_SIZE, MAX_ICON_SIZE, Image.SCALE_SMOOTH));
     40                }
     41                putValue(Action.SMALL_ICON, i);
     42            } else if (info.getAttributionImage() != null) {
     43                i = new ImageIcon(info.getAttributionImage());
     44            }
     45            if (i != null) {
     46                if (i.getIconHeight() > MAX_ICON_SIZE || i.getIconWidth() > MAX_ICON_SIZE) {
     47                    i = new ImageIcon(i.getImage().getScaledInstance(MAX_ICON_SIZE, MAX_ICON_SIZE, Image.SCALE_SMOOTH));
     48                }
     49                putValue(Action.SMALL_ICON, i);
     50            }
     51        } catch (Exception ex) {
     52            throw new RuntimeException(ex.getMessage(), ex);
     53        }
    2454    }
    2555
    2656    @Override
    public class AddImageryLayerAction extends JosmAction implements AdaptableAction  
    5282            setEnabled(false);
    5383        }
    5484    }
    55 }
     85}
     86 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..30fcbb7 100644
    a b  
    11// License: GPL. Copyright 2007 by Immanuel Scholz and others
    22package org.openstreetmap.josm.tools;
    33
     4import java.util.regex.Matcher;
    45import static org.openstreetmap.josm.tools.I18n.tr;
    56
    67import java.awt.Component;
    import org.xml.sax.helpers.XMLReaderFactory;  
    4849import com.kitfox.svg.SVGDiagram;
    4950import com.kitfox.svg.SVGException;
    5051import com.kitfox.svg.SVGUniverse;
     52import java.io.UnsupportedEncodingException;
     53import java.net.URLDecoder;
     54import java.util.regex.Pattern;
     55import javax.xml.bind.DatatypeConverter;
    5156
    5257/**
    5358 * Helper class to support the application with images.
    public class ImageProvider {  
    153158        return ir.getImageIcon(dim == null ? ImageResource.DEFAULT_DIMENSION : dim, sanitize);
    154159    }
    155160
     161    /**
     162     * {@code data:[<mediatype>][;base64],<data>}
     163     * @see RFC2397
     164     */
     165    private static final Pattern dataUrlPattern = Pattern.compile(
     166            "^data:([a-zA-Z]+/[a-zA-Z]+)?(;base64)?,(.+)$");
     167
    156168    private static ImageResource getIfAvailableImpl(Collection<String> dirs, String id, String subdir, String name, File archive) {
    157169        if (name == null)
    158170            return null;
    159171        ImageType type = name.toLowerCase().endsWith(".svg") ? ImageType.SVG : ImageType.OTHER;
    160172
     173        try {
     174            if (name.startsWith("data:")) {
     175                Matcher m = dataUrlPattern.matcher(name);
     176                if (m.matches()) {
     177                    String mediatype = m.group(1);
     178                    String base64 = m.group(2);
     179                    String data = m.group(3);
     180                    System.out.println(mediatype);
     181                    System.out.println(base64);
     182                    System.out.println(data);
     183                    byte[] bytes = ";base64".equals(base64)
     184                            ? DatatypeConverter.parseBase64Binary(data)
     185                            : URLDecoder.decode(data, "utf-8").getBytes();
     186                    return new ImageResource(new ImageIcon(bytes).getImage(), true);
     187                }
     188            }
     189        } catch (UnsupportedEncodingException ex) {
     190            ex.printStackTrace();
     191        }
     192
    161193        if (name.startsWith("http://")) {
    162194            String url = name;
    163195            ImageResource ir = cache.get(url);