Changeset 4432 in josm for trunk


Ignore:
Timestamp:
2011-09-17T12:20:34+02:00 (13 years ago)
Author:
stoecker
Message:

hopefully fix #6662 - selected layer color wrong

Location:
trunk/src/org/openstreetmap/josm
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java

    r4430 r4432  
    7070    private ImageryType imageryType = ImageryType.WMS;
    7171    private double pixelPerDegree = 0.0;
    72     private int maxZoom = 0;
    7372    private int defaultMaxZoom = 0;
    7473    private int defaultMinZoom = 0;
     
    120119        if(imageryType == ImageryType.WMS || imageryType == ImageryType.HTML) {
    121120            res.add(pixelPerDegree != 0.0 ? String.valueOf(pixelPerDegree) : null);
    122         } else {
    123             res.add(maxZoom != 0 ? String.valueOf(maxZoom) : null);
    124121        }
    125122        res.add(bounds != null ? bounds.encodeAsString(",") : null);
     
    163160            if (imageryType == ImageryType.WMS || imageryType == ImageryType.HTML) {
    164161                this.pixelPerDegree=Double.valueOf(array.get(3));
    165             } else {
    166                 this.maxZoom=Integer.valueOf(array.get(3));
    167162            }
    168163        }
     
    206201        this.imageryType=i.imageryType;
    207202        this.defaultMinZoom=i.defaultMinZoom;
    208         this.maxZoom=i.maxZoom;
    209203        this.defaultMaxZoom=i.defaultMaxZoom;
    210204        this.pixelPerDegree=i.pixelPerDegree;
     
    251245    }
    252246   
    253     public void setMaxZoom(int maxZoom) {
    254         this.maxZoom = maxZoom;
    255     }
    256 
    257247    public void setBounds(ImageryBounds b) {
    258248        this.bounds = b;
     
    282272        CheckParameterUtil.ensureParameterNotNull(url);
    283273       
     274        // Default imagery type is WMS
     275        this.url = url;
     276        this.imageryType = ImageryType.WMS;
     277
    284278        defaultMaxZoom = 0;
    285279        defaultMinZoom = 0;
     
    291285                if(m.group(2) != null) {
    292286                    defaultMaxZoom = Integer.valueOf(m.group(2));
    293                     maxZoom = defaultMaxZoom;
    294287                }
    295288                if(m.group(1) != null) {
    296289                    defaultMinZoom = Integer.valueOf(m.group(1));
    297290                }
    298                 return;
    299             }
    300         }
    301 
    302         // Default imagery type is WMS
    303         this.url = url;
    304         this.imageryType = ImageryType.WMS;
     291                break;
     292            }
     293        }
     294
     295        if(url.contains("{") && url.contains("}")) {
     296            if(serverProjections == null || serverProjections.isEmpty()) {
     297                try {
     298                    serverProjections = new ArrayList<String>();
     299                    Matcher m = Pattern.compile(".*\\{PROJ\\(([^)}]+)\\)\\}.*").matcher(url.toUpperCase());
     300                    if(m.matches()) {
     301                        for(String p : m.group(1).split(","))
     302                            serverProjections.add(p);
     303                    }
     304                } catch(Exception e) {
     305                }
     306            }
     307        // FIXME: Remove else case in March 2012 - convert old style WMS/TMS
     308        } else {
     309            url = this.url;
     310            if(imageryType == ImageryType.WMS) {
     311                if(!url.endsWith("&") && !url.endsWith("?")) {
     312                    url = url + (url.contains("?") ? "&" : "?");
     313                }
     314                try {
     315                    Matcher m = Pattern.compile(".*SRS=([a-z0-9:]+).*", Pattern.CASE_INSENSITIVE).matcher(url.toUpperCase());
     316                    if(m.matches()) {
     317                        String newProj = m.group(1);
     318                        if(serverProjections == null || serverProjections.isEmpty())
     319                            serverProjections = Collections.singletonList(newProj);
     320                        url = url.replaceAll("([sS][rR][sS]=)[a-zA-Z0-9:]+","SRS={proj("+newProj+")}");
     321                    } else
     322                        url += "SRS={proj}&";
     323                } catch(Exception e) {
     324                }
     325                url += "WIDTH={width}&height={HEIGHT}&BBOX={bbox}";
     326            }
     327            else if(imageryType == ImageryType.TMS) {
     328                if(!url.endsWith("/"))
     329                    url += "/";
     330                url += "{zoom}/{x}/{y}.png";
     331            }
     332            if(!url.equals(this.url)) {
     333                Main.warn("Changed Imagery URL '"+this.url+"' to '"+url+"'");
     334                this.url = url;
     335            }
     336        }
    305337    }
    306338
     
    338370
    339371    public int getMaxZoom() {
    340         return this.maxZoom;
     372        return this.defaultMaxZoom;
    341373    }
    342374
     
    368400     */
    369401    public List<String> getServerProjections() {
    370         if (serverProjections == null) return null;
     402        if (serverProjections == null)
     403            return Collections.emptyList();
    371404        return Collections.unmodifiableList(serverProjections);
    372405    }
     
    395428        if(pixelPerDegree != 0.0) {
    396429            res += " ("+pixelPerDegree+")";
    397         } else if(maxZoom != 0 && maxZoom != defaultMaxZoom) {
    398             res += " (z"+maxZoom+")";
    399430        }
    400431        return res;
     
    447478    public void setImageryType(ImageryType imageryType) {
    448479        this.imageryType = imageryType;
    449     }
    450 
    451     public static boolean isUrlWithPatterns(String url) {
    452         return url != null && url.contains("{") && url.contains("}");
    453480    }
    454481
  • trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java

    r4356 r4432  
    905905                    }
    906906                }
    907                 /* Setting foreground properly handles null as default! */
     907                if(c == null)
     908                    c = Main.pref.getUIColor(isSelected ? "Table.selectionForeground" : "Table.foreground");
    908909                label.setForeground(c);
    909910            }
  • trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java

    r4417 r4432  
    236236    public static TileSource getTileSource(ImageryInfo info) {
    237237        if (info.getImageryType() == ImageryType.TMS) {
    238             if(ImageryInfo.isUrlWithPatterns(info.getUrl())) {
    239                 TMSTileSource t = new TemplatedTMSTileSource(info.getName(), info.getUrl(), info.getMinZoom(), info.getMaxZoom());
    240                 info.setAttribution(t);
    241                 return t;
    242             } else {
    243                 TMSTileSource t = new TMSTileSource(info.getName(),info.getUrl(), info.getMinZoom(), info.getMaxZoom());
    244                 info.setAttribution(t);
    245                 return t;
    246             }
     238            TMSTileSource t = new TemplatedTMSTileSource(info.getName(), info.getUrl(), info.getMinZoom(), info.getMaxZoom());
     239            info.setAttribution(t);
     240            return t;
    247241        } else if (info.getImageryType() == ImageryType.BING)
    248242            return new BingAerialTileSource();
  • trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java

    r4430 r4432  
    109109    private int workingThreadCount;
    110110    private boolean canceled;
    111     private List<String> serverProjections = null;
    112111
    113112    /** set to true if this layer uses an invalid base url */
     
    122121    public WMSLayer(ImageryInfo info) {
    123122        super(info);
    124         serverProjections = info.getServerProjections();
    125123        mv = Main.map.mapView;
    126124        setBackgroundLayer(true); /* set global background variable */
     
    144142        resolution = mv.getDist100PixelText();
    145143
    146         if(info.getUrl() != null) {
    147             if (serverProjections == null) {
    148                 serverProjections = WMSGrabber.getServerProjections(info.getUrl(), true);
    149             }
     144        if(info.getUrl() != null)
    150145            startGrabberThreads();
    151             if(info.getImageryType() == ImageryType.WMS && !ImageryInfo.isUrlWithPatterns(info.getUrl())) {
    152                 if (!(info.getUrl().endsWith("&") || info.getUrl().endsWith("?"))) {
    153                     if (!confirmMalformedUrl(info.getUrl())) {
    154                         System.out.println(tr("Warning: WMS layer deactivated because of malformed base url ''{0}''", info.getUrl()));
    155                         usesInvalidUrl = true;
    156                         setName(getName() + tr("(deactivated)"));
    157                         return;
    158                     } else {
    159                         isInvalidUrlConfirmed = true;
    160                     }
    161                 }
    162             }
    163         }
    164146
    165147        Main.pref.addPreferenceChangeListener(this);
     
    247229        } else {
    248230            downloadAndPaintVisible(g, mv, false);
    249         }
    250     }
    251 
    252     protected boolean confirmMalformedUrl(String url) {
    253         if (isInvalidUrlConfirmed)
    254             return true;
    255         String msg  = tr("<html>The base URL<br>"
    256                 + "''{0}''<br>"
    257                 + "for this WMS layer does neither end with a ''&'' nor with a ''?''.<br>"
    258                 + "This is likely to lead to invalid WMS request. You should check your<br>"
    259                 + "preference settings.<br>"
    260                 + "Do you want to fetch WMS tiles anyway?</html>",
    261                 url);
    262         String [] options = new String[] {
    263                 tr("Yes, fetch images"),
    264                 tr("No, abort")
    265         };
    266         int ret = JOptionPane.showOptionDialog(
    267                 Main.parent,
    268                 msg,
    269                 tr("Invalid URL?"),
    270                 JOptionPane.YES_NO_OPTION,
    271                 JOptionPane.WARNING_MESSAGE,
    272                 null,
    273                 options, options[1]
    274         );
    275         switch(ret) {
    276         case JOptionPane.YES_OPTION: return true;
    277         default: return false;
    278231        }
    279232    }
     
    918871    }
    919872
    920     /**
    921      * Get the list of projections supported by the WMS server corresponding to this layer.
    922      * @return The list of projections, if known. An empty list otherwise.
    923      */
    924     public List<String> getServerProjections() {
    925         if (serverProjections == null)
    926             return Collections.emptyList();
    927         else
    928             return Collections.unmodifiableList(serverProjections);
    929     }
    930    
    931873    @Override
    932874    public boolean isProjectionSupported(Projection proj) {
    933         return serverProjections == null || serverProjections.contains(proj.toCode().toUpperCase())
     875        List<String> serverProjections = info.getServerProjections();
     876        return serverProjections.contains(proj.toCode().toUpperCase())
    934877        || (proj instanceof Mercator && serverProjections.contains("EPSG:4326"));
    935878    }
     
    938881    public String nameSupportedProjections() {
    939882        String res = "";
    940         for(String p : serverProjections) {
     883        for(String p : info.getServerProjections()) {
    941884            if(!res.isEmpty())
    942885                res += ", ";
  • trunk/src/org/openstreetmap/josm/gui/preferences/ImageryPreference.java

    r4427 r4432  
    449449
    450450            mod = listActive.getColumnModel();
    451             mod.getColumn(2).setPreferredWidth(50);
    452451            mod.getColumn(1).setPreferredWidth(800);
    453452            mod.getColumn(0).setPreferredWidth(200);
     
    722721        class ImageryLayerTableModel extends DefaultTableModel {
    723722            public ImageryLayerTableModel() {
    724                 setColumnIdentifiers(new String[] { tr("Menu Name"), tr("Imagery URL"), trc("layer", "Zoom") });
     723                setColumnIdentifiers(new String[] { tr("Menu Name"), tr("Imagery URL")});
    725724            }
    726725
     
    754753                case 1:
    755754                    return info.getExtendedUrl();
    756                 case 2:
    757                     return (info.getImageryType() == ImageryType.WMS || info.getImageryType() == ImageryType.HTML) ?
    758                             (info.getPixelPerDegree() == 0.0 ? "" : info.getPixelPerDegree()) :
    759                                 (info.getMaxZoom() == 0 ? "" : info.getMaxZoom());
    760755                default:
    761756                    throw new ArrayIndexOutOfBoundsException();
     
    772767                case 1:
    773768                    info.setExtendedUrl((String)o);
    774                     break;
    775                 case 2:
    776                     info.setPixelPerDegree(0);
    777                     info.setMaxZoom(0);
    778                     try {
    779                         if(info.getImageryType() == ImageryType.WMS || info.getImageryType() == ImageryType.HTML) {
    780                             info.setPixelPerDegree(Double.parseDouble((String) o));
    781                         } else {
    782                             info.setMaxZoom(Integer.parseInt((String) o));
    783                         }
    784                     } catch (NumberFormatException e) {
    785                     }
    786769                    break;
    787770                default:
  • trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java

    r4430 r4432  
    244244                            } else {
    245245                                entry.setDefaultMaxZoom(val);
    246                                 entry.setMaxZoom(val);
    247246                            }
    248247                        }
  • trunk/src/org/openstreetmap/josm/io/imagery/WMSGrabber.java

    r4430 r4432  
    4747
    4848    protected String baseURL;
    49     private final boolean urlWithPatterns;
    50     private List<String> serverProjections;
     49    private ImageryInfo info;
    5150    private Map<String, String> props = new HashMap<String, String>();
    5251
    5352    public WMSGrabber(MapView mv, WMSLayer layer) {
    5453        super(mv, layer);
    55         this.baseURL = layer.getInfo().getUrl();
    56         this.serverProjections = layer.getServerProjections();
    57         /* URL containing placeholders? */
    58         urlWithPatterns = ImageryInfo.isUrlWithPatterns(baseURL);
     54        this.info = layer.getInfo();
     55        this.baseURL = info.getUrl();
    5956        if(layer.getInfo().getCookies() != null && !layer.getInfo().getCookies().equals("")) {
    6057            props.put("Cookie", layer.getInfo().getCookies());
     
    9491            int wi, int ht) throws MalformedURLException {
    9592        String myProj = Main.getProjection().toCode();
    96         String srs = "";
    97         boolean useepsg = false;
    98         // FIXME: Non-Pattern format should be dropped in future
    99         try
    100         {
    101             Matcher m = Pattern.compile(".*SRS=([a-z0-9:]+).*", Pattern.CASE_INSENSITIVE).matcher(baseURL.toUpperCase());
    102             if(m.matches())
    103             {
    104                 if(m.group(1).equals("EPSG:4326") && Main.getProjection() instanceof Mercator)
    105                     useepsg = true;
    106             } else if((Main.getProjection() instanceof Mercator) && !serverProjections.contains(myProj)) {
    107                 useepsg = true;
    108                 srs ="&srs=EPSG:4326";
    109             } else {
    110                 srs ="&srs="+myProj;
    111             }
    112         }
    113         catch(Exception ex)
    114         {
    115         }
    116 
    117         if(useepsg) // don't use mercator code directly
    118         {
     93        if((Main.getProjection() instanceof Mercator) && !info.getServerProjections().contains(myProj)) {
    11994            LatLon sw = Main.getProjection().eastNorth2latlon(new EastNorth(w, s));
    12095            LatLon ne = Main.getProjection().eastNorth2latlon(new EastNorth(e, n));
     
    126101        }
    127102
    128         String str = baseURL;
    129         String bbox = latLonFormat.format(w) + ","
    130         + latLonFormat.format(s) + ","
    131         + latLonFormat.format(e) + ","
    132         + latLonFormat.format(n);
    133 
    134         if (urlWithPatterns) {
    135             str = str.replaceAll("\\{proj(\\([^})]+\\))?\\}", myProj)
    136             .replaceAll("\\{bbox\\}", bbox)
     103        return new URL(baseURL.replaceAll("\\{proj(\\([^})]+\\))?\\}", myProj)
     104            .replaceAll("\\{bbox\\}", latLonFormat.format(w) + ","
     105                + latLonFormat.format(s) + ","
     106                + latLonFormat.format(e) + ","
     107                + latLonFormat.format(n))
    137108            .replaceAll("\\{w\\}", latLonFormat.format(w))
    138109            .replaceAll("\\{s\\}", latLonFormat.format(s))
     
    140111            .replaceAll("\\{n\\}", latLonFormat.format(n))
    141112            .replaceAll("\\{width\\}", String.valueOf(wi))
    142             .replaceAll("\\{height\\}", String.valueOf(ht));
    143         } else {
    144             str += "bbox=" + bbox
    145                     + srs
    146                     + "&width=" + wi + "&height=" + ht;
    147             if (!(baseURL.endsWith("&") || baseURL.endsWith("?"))) {
    148                 System.out.println(tr("Warning: The base URL ''{0}'' for a WMS service doesn''t have a trailing ''&'' or a trailing ''?''.", baseURL));
    149                 System.out.println(tr("Warning: Fetching WMS tiles is likely to fail. Please check you preference settings."));
    150                 System.out.println(tr("Warning: The complete URL is ''{0}''.", str));
    151             }
    152         }
    153         return new URL(str.replace(" ", "%20"));
    154     }
    155 
    156     static public ArrayList<String> getServerProjections(String baseURL, Boolean warn)
    157     {
    158         ArrayList<String> serverProjections = new ArrayList<String>();
    159         boolean hasepsg = false;
    160        
    161         // FIXME: Non-Pattern format should be dropped in future
    162         try
    163         {
    164             Matcher m = Pattern.compile(".*\\{PROJ\\(([^)}]+)\\)\\}.*").matcher(baseURL.toUpperCase());
    165             if(m.matches())
    166             {
    167                 for(String p : m.group(1).split(","))
    168                 {
    169                     serverProjections.add(p);
    170                     if(p.equals("EPSG:4326"))
    171                         hasepsg = true;
    172                 }
    173             }
    174             else
    175             {
    176                 m = Pattern.compile(".*SRS=([a-z0-9:]+).*", Pattern.CASE_INSENSITIVE).matcher(baseURL.toUpperCase());
    177                 if(m.matches())
    178                 {
    179                     serverProjections.add(m.group(1));
    180                     if(m.group(1).equals("EPSG:4326"))
    181                         hasepsg = true;
    182                 }
    183                 /* TODO: here should be an "else" code checking server capabilities */
    184             }
    185         }
    186         catch(Exception e)
    187         {
    188         }
    189         if(serverProjections.isEmpty())
    190             return null;
    191         if(warn)
    192         {
    193             String myProj = Main.getProjection().toCode().toUpperCase();
    194             if(!serverProjections.contains(myProj) &&
    195             !(Main.getProjection() instanceof Mercator && serverProjections.contains("EPSG:4326")))
    196             {
    197                 JOptionPane.showMessageDialog(Main.parent,
    198                         tr("The projection ''{0}'' in URL and current projection ''{1}'' mismatch.\n"
    199                                 + "This may lead to wrong coordinates.",
    200                                 serverProjections.get(0), myProj),
    201                                 tr("Warning"),
    202                                 JOptionPane.WARNING_MESSAGE);
    203             }
    204         }
    205         return serverProjections;
     113            .replaceAll("\\{height\\}", String.valueOf(ht))
     114            .replace(" ", "%20"));
    206115    }
    207116
Note: See TracChangeset for help on using the changeset viewer.