Ticket #11968: node-icons.patch

File node-icons.patch, 8.7 KB (added by augustus.kling@…, 11 years ago)
  • src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java

    diff --git src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java
    index 48bfb5a..0a021c7 100644
     
    22package org.openstreetmap.josm.gui;
    33
    44import java.awt.Component;
     5import java.awt.Rectangle;
    56
    67import javax.swing.DefaultListCellRenderer;
    78import javax.swing.ImageIcon;
    public class OsmPrimitivRenderer implements ListCellRenderer<OsmPrimitive>, Tabl  
    7273    private Component renderer(Component def, OsmPrimitive value) {
    7374        if (value != null && def instanceof JLabel) {
    7475            ((JLabel) def).setText(getComponentText(value));
    75             ImageIcon icon = ImageProvider.get(value.getDisplayType());
     76            ImageIcon icon = ImageProvider.getPadded(value,
     77                // Height of component no yet known, assume the default 16px.
     78                new Rectangle(16, 16));
    7679            if (icon != null) {
    7780                ((JLabel) def).setIcon(icon);
    7881            } else {
  • src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java

    diff --git src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRenderer.java
    index 6f24fcd..4be80d0 100644
     
    22package org.openstreetmap.josm.gui.dialogs.relation;
    33
    44import java.awt.Component;
     5import java.awt.Rectangle;
    56
    67import javax.swing.JTable;
    78
    import org.openstreetmap.josm.data.osm.OsmPrimitive;  
    910import org.openstreetmap.josm.gui.DefaultNameFormatter;
    1011import org.openstreetmap.josm.tools.ImageProvider;
    1112
     13/**
     14 * "Refers to" column in relation editor's member list.
     15 */
    1216public class MemberTableMemberCellRenderer extends MemberTableCellRenderer {
    1317
    1418    public MemberTableMemberCellRenderer() {
    1519        super();
    1620    }
    1721
    18     protected void renderPrimitive(OsmPrimitive primitive) {
    19         setIcon(ImageProvider.get(primitive.getDisplayType()));
     22    protected void renderPrimitive(OsmPrimitive primitive, Rectangle cellSize) {
     23        // Make icon the full height of the table cell. Icon background is square.
     24        setIcon(ImageProvider.getPadded(primitive, cellSize));
    2025        setText(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
    2126        setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(primitive));
    2227    }
    public class MemberTableMemberCellRenderer extends MemberTableCellRenderer {  
    2934        if (value == null)
    3035            return this;
    3136
     37        Rectangle cellSize = table.getCellRect(row, column, false);
     38
    3239        renderForeground(isSelected);
    3340        OsmPrimitive primitive = (OsmPrimitive) value;
    3441        renderBackground(getModel(table), primitive, isSelected);
    35         renderPrimitive(primitive);
     42        renderPrimitive(primitive, cellSize);
    3643        return this;
    3744    }
    3845}
  • src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java

    diff --git src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java src/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRenderer.java
    index a336c33..d0aa431 100644
    package org.openstreetmap.josm.gui.dialogs.relation;  
    33
    44import java.awt.Color;
    55import java.awt.Component;
     6import java.awt.Rectangle;
    67
    78import javax.swing.JLabel;
    89import javax.swing.JTable;
    public class SelectionTableCellRenderer extends JLabel implements TableCellRende  
    5758        setBackground(bgc);
    5859    }
    5960
    60     protected void renderPrimitive(OsmPrimitive primitive) {
    61         setIcon(ImageProvider.get(primitive.getDisplayType()));
     61    protected void renderPrimitive(OsmPrimitive primitive, Rectangle cellSize) {
     62        setIcon(ImageProvider.getPadded(primitive, cellSize));
    6263        setText(primitive.getDisplayName(DefaultNameFormatter.getInstance()));
    6364        setToolTipText(DefaultNameFormatter.getInstance().buildDefaultToolTip(primitive));
    6465    }
    public class SelectionTableCellRenderer extends JLabel implements TableCellRende  
    7172        if (value == null)
    7273            return this;
    7374
     75        Rectangle cellSize = table.getCellRect(row, column, false);
     76
    7477        renderBackground((OsmPrimitive) value);
    75         renderPrimitive((OsmPrimitive) value);
     78        renderPrimitive((OsmPrimitive) value, cellSize);
    7679        return this;
    7780    }
    7881
  • src/org/openstreetmap/josm/tools/ImageProvider.java

    diff --git src/org/openstreetmap/josm/tools/ImageProvider.java src/org/openstreetmap/josm/tools/ImageProvider.java
    index 66d0d6c..f968798 100644
    import java.awt.Graphics2D;  
    1111import java.awt.GraphicsEnvironment;
    1212import java.awt.Image;
    1313import java.awt.Point;
     14import java.awt.Rectangle;
    1415import java.awt.RenderingHints;
    1516import java.awt.Toolkit;
    1617import java.awt.Transparency;
    import javax.swing.ImageIcon;  
    5556import javax.xml.bind.DatatypeConverter;
    5657
    5758import org.openstreetmap.josm.Main;
     59import org.openstreetmap.josm.data.osm.OsmPrimitive;
    5860import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     61import org.openstreetmap.josm.gui.mappaint.ElemStyle;
     62import org.openstreetmap.josm.gui.mappaint.MapImage;
     63import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
     64import org.openstreetmap.josm.gui.mappaint.NodeElemStyle;
     65import org.openstreetmap.josm.gui.mappaint.Range;
     66import org.openstreetmap.josm.gui.mappaint.StyleCache.StyleList;
    5967import org.openstreetmap.josm.io.CachedFile;
    6068import org.openstreetmap.josm.plugins.PluginHandler;
    6169import org.w3c.dom.Element;
    public class ImageProvider {  
    12681276    }
    12691277
    12701278    /**
     1279     * @param primitive Object for which an icon shall be fetched. The icon is chosen based on tags.
     1280     * @param iconSize Target size of icon. Icon is padded if required.
     1281     * @return Icon for {@code primitive} that fits in cell.
     1282     */
     1283    public static ImageIcon getPadded(OsmPrimitive primitive, Rectangle iconSize) {
     1284        // Check if the current styles have special icon for tagged nodes.
     1285        if (primitive instanceof org.openstreetmap.josm.data.osm.Node) {
     1286            Pair<StyleList, Range> nodeStyles = MapPaintStyles.getStyles().generateStyles(primitive, 100, false);
     1287            for (ElemStyle style : nodeStyles.a) {
     1288                if (style instanceof NodeElemStyle) {
     1289                    NodeElemStyle nodeStyle = (NodeElemStyle) style;
     1290                    MapImage icon = nodeStyle.mapImage;
     1291                    if (icon != null) {
     1292                        int backgroundWidth = iconSize.height;
     1293                        int backgroundHeight = iconSize.height;
     1294                        int iconWidth = icon.getWidth();
     1295                        int iconHeight = icon.getHeight();
     1296                        BufferedImage image = new BufferedImage(backgroundWidth, backgroundHeight,
     1297                                BufferedImage.TYPE_INT_ARGB);
     1298                        double scaleFactor = Math.min(backgroundWidth / (double) iconWidth, backgroundHeight
     1299                                / (double) iconHeight);
     1300                        BufferedImage iconImage = icon.getImage(false);
     1301                        Image scaledIcon;
     1302                        final int scaledWidth;
     1303                        final int scaledHeight;
     1304                        if (scaleFactor < 1) {
     1305                            // Scale icon such that it fits on background.
     1306                            scaledWidth = (int) (iconWidth * scaleFactor);
     1307                            scaledHeight = (int) (iconHeight * scaleFactor);
     1308                            scaledIcon = iconImage.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH);
     1309                        } else {
     1310                            // Use original size, don't upscale.
     1311                            scaledWidth = iconWidth;
     1312                            scaledHeight = iconHeight;
     1313                            scaledIcon = iconImage;
     1314                        }
     1315                        image.getGraphics().drawImage(scaledIcon, (backgroundWidth - scaledWidth) / 2,
     1316                                (backgroundHeight - scaledHeight) / 2, null);
     1317
     1318                        return new ImageIcon(image);
     1319                    }
     1320                }
     1321            }
     1322        }
     1323
     1324        // Use generic default icon.
     1325        return ImageProvider.get(primitive.getDisplayType());
     1326    }
     1327
     1328    /**
    12711329     * Constructs an image from the given SVG data.
    12721330     * @param svg the SVG data
    12731331     * @param dim the desired image dimension