Ticket #21207: 21207.patch

File 21207.patch, 11.4 KB (added by gaben, 3 weeks ago)
  • src/org/openstreetmap/josm/gui/preferences/SourceEditor.java

    diff --git a/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java b/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
    index 9c83d9c1f3..e8d05084ad 100644
    a b public abstract class SourceEditor extends JPanel {  
    13361336                        sourceEntry.active ? SOURCE_ENTRY_ACTIVE_BACKGROUND_COLOR.get() : SOURCE_ENTRY_INACTIVE_BACKGROUND_COLOR.get());
    13371337                }
    13381338                final ImageSizes size = ImageSizes.TABLE;
    1339                 setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getImageIconBounded(size.getImageDimension()));
     1339                setIcon(value.icon == null ? ImageProvider.getEmpty(size) : value.icon.getPaddedIcon(size.getImageDimension()));
    13401340            }
    13411341            return this;
    13421342        }
  • src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java

    diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
    index fac625b775..651f30e17c 100644
    a b public class TaggingPreset extends AbstractAction implements ActiveLayerChangeLi  
    290290            .thenAcceptAsync(result -> {
    291291                if (result != null) {
    292292                    // Pre-render off EDT to avoid flooding the event queue with expensive SVG rendering
    293                     ImageIcon small = result.getImageIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
    294                     ImageIcon large = result.getImageIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
     293                    ImageIcon small = result.getPaddedIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension());
     294                    ImageIcon large = result.getPaddedIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension());
    295295                    GuiHelper.runInEDT(() -> {
    296296                        try {
    297297                            putValue(Action.SMALL_ICON, small);
  • src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java

    diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java b/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
    index 737e2fd449..cc03e36299 100644
    a b package org.openstreetmap.josm.gui.tagging.presets;  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55import static org.openstreetmap.josm.tools.I18n.trc;
    66
     7import java.awt.Dimension;
    78import java.io.File;
    89import java.util.Arrays;
    910import java.util.Collection;
    … … import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;  
    2829import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
    2930import org.openstreetmap.josm.gui.util.LruCache;
    3031import org.openstreetmap.josm.tools.ImageProvider;
     32import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
     33import org.openstreetmap.josm.tools.ImageResource;
    3134import org.openstreetmap.josm.tools.Logging;
    3235import org.openstreetmap.josm.tools.Utils;
    3336import org.xml.sax.SAXException;
    … … public abstract class TaggingPresetItem {  
    150153     * Loads a tagging preset icon
    151154     * @param iconName the icon name
    152155     * @param zipIcons zip file where the image is located
    153      * @param maxSize maximum image size (or null)
    154      * @return the requested image or null if the request failed
     156     * @param maxSize maximum image size (or null for the default small icon size)
     157     * @return the requested image, centered in a square of {@code maxSize}, or null if the request failed
    155158     */
    156159    public static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
    157160        final Collection<String> s = TaggingPresets.ICON_SOURCES.get();
    158         ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
    159         if (maxSize != null && maxSize > 0) {
    160             imgProv.setMaxSize(maxSize);
    161         }
    162         return imgProv.get();
     161        final int size = maxSize != null && maxSize > 0 ? maxSize : ImageSizes.SMALLICON.getVirtualWidth();
     162        ImageResource resource = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true)
     163                .getResource();
     164        return resource == null ? null : resource.getPaddedIcon(new Dimension(size, size));
    163165    }
    164166
    165167    /**
  • src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java

    diff --git a/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java b/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
    index 541fb26114..5d43e2f7cc 100644
    a b import static org.openstreetmap.josm.tools.I18n.tr;  
    55
    66import java.awt.Component;
    77import java.awt.Font;
     8import java.awt.image.BufferedImage;
    89import java.lang.reflect.Method;
    910import java.lang.reflect.Modifier;
    1011import java.util.ArrayList;
    … … import java.util.Collection;  
    1314import java.util.Collections;
    1415import java.util.List;
    1516import java.util.Map;
     17import java.util.Objects;
    1618import java.util.TreeMap;
    1719import java.util.stream.Collectors;
    1820
     21import javax.swing.Icon;
     22import javax.swing.ImageIcon;
    1923import javax.swing.JLabel;
    2024import javax.swing.JList;
    2125import javax.swing.JPanel;
    … … public abstract class ComboMultiSelect extends KeyedItem {  
    142146            if (value.getCount() > 0) {
    143147                l.setFont(l.getFont().deriveFont(Font.ITALIC + Font.BOLD));
    144148            }
    145             l.setIcon(value.getIcon());
     149            Icon icon = value.getIcon();
     150            if (icon == null && value.cms != null) {
     151                // use a blank icon if other entries have one, so that all texts line up
     152                icon = value.cms.presetListEntries.stream().map(PresetListEntry::getIcon).filter(Objects::nonNull).findFirst()
     153                        .map(i -> new ImageIcon(new BufferedImage(i.getIconWidth(), i.getIconHeight(), BufferedImage.TYPE_INT_ARGB)))
     154                        .orElse(null);
     155            }
     156            l.setIcon(icon);
    146157            l.setToolTipText(value.getToolTipText(key));
    147158            return l;
    148159        }
  • src/org/openstreetmap/josm/tools/ImageResizeMode.java

    diff --git a/src/org/openstreetmap/josm/tools/ImageResizeMode.java b/src/org/openstreetmap/josm/tools/ImageResizeMode.java
    index 638c70f157..58036e555d 100644
    a b enum ImageResizeMode {  
    9494            prepareGraphics(icon, bufferedImage, g);
    9595            renderer.accept(g);
    9696        } else if (sourceIcon != null) {
    97             sourceIcon = sourceIcon.getScaledInstance(real.width, real.height, Image.SCALE_SMOOTH);
    98             g.drawImage(sourceIcon, 0, 0, null);
     97            final Dimension scaled = this == PADDED ? AUTO.computeDimension(real, icon) : real;
     98            sourceIcon = sourceIcon.getScaledInstance(scaled.width, scaled.height, Image.SCALE_SMOOTH);
     99            g.drawImage(sourceIcon, (real.width - scaled.width) / 2, (real.height - scaled.height) / 2, null);
    99100        } else {
    100101            throw new IllegalArgumentException("renderer or sourceIcon");
    101102        }
  • test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java

    diff --git a/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java b/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java
    index 408adc4605..c0084ad860 100644
    a b import static org.junit.jupiter.api.Assertions.assertTrue;  
    66
    77import java.awt.Color;
    88
     9import javax.swing.JLabel;
     10import javax.swing.JList;
    911import javax.swing.JPanel;
    1012
    1113import org.junit.jupiter.api.Test;
    … … import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemTest;  
    1618import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
    1719import org.openstreetmap.josm.testutils.annotations.I18n;
    1820import org.openstreetmap.josm.testutils.annotations.Main;
     21import org.openstreetmap.josm.tools.ImageProvider.ImageSizes;
    1922
    2023/**
    2124 * Unit tests of {@link Combo} class.
    … … class ComboTest implements TaggingPresetItemTest {  
    123126        KeyedItem.LAST_VALUES.clear();
    124127    }
    125128
     129    /**
     130     * Entry icons are centered in a square and entries without an icon get a blank one, so that the texts line up.
     131     */
     132    @Test
     133    void testIconAlignment() {
     134        final Combo combo = getInstance();
     135        combo.key = "highway";
     136        PresetListEntry trunk = new PresetListEntry("trunk", combo);
     137        trunk.icon = "presets/transport/way/way_trunk.svg";
     138        combo.addListEntry(trunk);
     139        combo.addListEntry(new PresetListEntry("busway", combo));
     140        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false));
     141        JList<PresetListEntry> list = new JList<>();
     142        for (PresetListEntry entry : combo.presetListEntries) {
     143            JLabel label = (JLabel) combo.combobox.getRenderer().getListCellRendererComponent(list, entry, 0, false, false);
     144            assertEquals(ImageSizes.SMALLICON.getAdjustedWidth(), label.getIcon().getIconWidth(), entry.value);
     145            assertEquals(ImageSizes.SMALLICON.getAdjustedHeight(), label.getIcon().getIconHeight(), entry.value);
     146        }
     147    }
     148
    126149    @Test
    127150    void testColor() {
    128151        final Combo combo = getInstance();
  • test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java

    diff --git a/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java b/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
    index d67c040339..eb049e2938 100644
    a b import static org.junit.jupiter.api.Assertions.assertEquals;  
    66import static org.junit.jupiter.api.Assertions.assertThrows;
    77
    88import java.awt.Dimension;
     9import java.awt.image.BufferedImage;
    910
    1011import org.junit.jupiter.api.Test;
    1112import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
    … … class ImageResizeModeTest {  
    6768        assertEquals(new Dimension(24, 32), ImageResizeMode.PADDED.computeDimension(new Dimension(24, 32), image));
    6869    }
    6970
     71    /**
     72     * Test method for {@link ImageResizeMode#createBufferedImage} using {@link ImageResizeMode#PADDED} on a raster image
     73     */
     74    @Test
     75    void testCreateBufferedImagePaddedRaster() {
     76        BufferedImage source = new BufferedImage(16, 4, BufferedImage.TYPE_INT_RGB); // opaque black
     77        BufferedImage padded = ImageResizeMode.PADDED.createBufferedImage(new Dimension(32, 32), new Dimension(16, 4), null, source);
     78        assertEquals(32, padded.getWidth());
     79        assertEquals(32, padded.getHeight());
     80        // aspect ratio is kept: a 32x8 bar centered vertically
     81        assertEquals(0, padded.getRGB(16, 11) >>> 24);
     82        assertEquals(0xff, padded.getRGB(16, 12) >>> 24);
     83        assertEquals(0xff, padded.getRGB(16, 19) >>> 24);
     84        assertEquals(0, padded.getRGB(16, 20) >>> 24);
     85    }
     86
    7087    /**
    7188     * Test method for {@link ImageResizeMode#cacheKey}
    7289     */