001 // License: GPL. For details, see LICENSE file. 002 package org.openstreetmap.josm.gui.mappaint; 003 004 import static org.openstreetmap.josm.tools.I18n.trn; 005 006 import java.awt.Color; 007 import java.io.File; 008 import java.io.IOException; 009 import java.io.InputStream; 010 import java.util.ArrayList; 011 import java.util.Collection; 012 import java.util.Collections; 013 import java.util.List; 014 015 import javax.swing.ImageIcon; 016 017 import org.openstreetmap.josm.data.osm.OsmPrimitive; 018 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference; 019 import org.openstreetmap.josm.gui.preferences.SourceEntry; 020 import org.openstreetmap.josm.tools.ImageProvider; 021 022 abstract public class StyleSource extends SourceEntry { 023 024 private List<Throwable> errors = new ArrayList<Throwable>(); 025 public File zipIcons; 026 027 private ImageIcon imageIcon; 028 private long lastMTime = 0l; 029 030 /****** 031 * The following fields is additional information found in the header 032 * of the source file. 033 */ 034 035 public String icon; 036 037 public StyleSource(String url, String name, String title) { 038 super(url, name, title, true); 039 } 040 041 public StyleSource(SourceEntry entry) { 042 super(entry.url, entry.name, entry.title, entry.active); 043 } 044 045 abstract public void apply(MultiCascade mc, OsmPrimitive osm, double scale, OsmPrimitive multipolyOuterWay, boolean pretendWayIsClosed); 046 047 abstract public void loadStyleSource(); 048 049 abstract public InputStream getSourceInputStream() throws IOException; 050 051 public void logError(Throwable e) { 052 errors.add(e); 053 } 054 055 public Collection<Throwable> getErrors() { 056 return Collections.unmodifiableCollection(errors); 057 } 058 059 protected void init() { 060 errors.clear(); 061 imageIcon = null; 062 icon = null; 063 } 064 065 private static ImageIcon defaultIcon; 066 067 private static ImageIcon getDefaultIcon() { 068 if (defaultIcon == null) { 069 defaultIcon = ImageProvider.get("dialogs/mappaint", "pencil"); 070 } 071 return defaultIcon; 072 } 073 074 protected ImageIcon getSourceIcon() { 075 if (imageIcon == null) { 076 if (icon != null) { 077 imageIcon = MapPaintStyles.getIcon(new IconReference(icon, this), -1, -1); 078 } 079 if (imageIcon == null) { 080 imageIcon = getDefaultIcon(); 081 } 082 } 083 return imageIcon; 084 } 085 086 final public ImageIcon getIcon() { 087 if (getErrors().isEmpty()) 088 return getSourceIcon(); 089 else 090 return ImageProvider.overlay(getSourceIcon(), 091 ImageProvider.get("dialogs/mappaint/error_small"), 092 ImageProvider.OverlayPosition.SOUTHEAST); 093 } 094 095 public String getToolTipText() { 096 if (errors.isEmpty()) 097 return null; 098 else 099 return trn("There was an error when loading this style. Select ''Info'' from the right click menu for details.", 100 "There were {0} errors when loading this style. Select ''Info'' from the right click menu for details.", 101 errors.size(), errors.size()); 102 } 103 104 public Color getBackgroundColorOverride() { 105 return null; 106 } 107 108 public long getLastMTime() { 109 return lastMTime; 110 } 111 112 public void setLastMTime(long lastMTime) { 113 this.lastMTime = lastMTime; 114 } 115 116 117 }