Changeset 16838 in josm


Ignore:
Timestamp:
2020-08-03T22:06:40+02:00 (15 months ago)
Author:
simon04
Message:

see #19622 - Extract OsmPrimitiveImageProvider

Location:
trunk
Files:
1 added
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java

    r16201 r16838  
    3232import java.util.Collections;
    3333import java.util.Comparator;
    34 import java.util.EnumSet;
    3534import java.util.Iterator;
    3635import java.util.List;
     
    7170import org.openstreetmap.josm.command.SequenceCommand;
    7271import org.openstreetmap.josm.data.UndoRedoHandler;
    73 import org.openstreetmap.josm.data.coor.LatLon;
    7472import org.openstreetmap.josm.data.osm.DataSet;
    75 import org.openstreetmap.josm.data.osm.INode;
    7673import org.openstreetmap.josm.data.osm.OsmDataManager;
    7774import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    10097import org.openstreetmap.josm.tools.ImageProvider;
    10198import org.openstreetmap.josm.tools.Logging;
     99import org.openstreetmap.josm.tools.OsmPrimitiveImageProvider;
    102100import org.openstreetmap.josm.tools.PlatformManager;
    103101import org.openstreetmap.josm.tools.Shortcut;
     
    695693        protected Optional<ImageIcon> findIcon(String key, String value) {
    696694            final Iterator<OsmPrimitive> osmPrimitiveIterator = sel.iterator();
    697             final OsmPrimitive virtual = (osmPrimitiveIterator.hasNext() ? osmPrimitiveIterator.next().getType() : OsmPrimitiveType.NODE)
    698                     .newInstance(0, false);
    699             if (virtual instanceof INode) {
    700                 ((INode) virtual).setCoor(LatLon.ZERO);
    701             }
    702             virtual.put(key, value);
    703             try {
    704                 final ImageIcon padded = ImageProvider.getPadded(virtual, ImageProvider.ImageSizes.LARGEICON.getImageDimension(),
    705                         EnumSet.of(ImageProvider.GetPaddedOptions.NO_DEFAULT, ImageProvider.GetPaddedOptions.NO_DEPRECATED));
    706                 return Optional.ofNullable(padded);
    707             } catch (Exception e) {
    708                 Logging.warn("Failed to find icon for {0} {1}={2}", virtual.getType(), key, value);
    709                 Logging.warn(e);
    710                 return Optional.empty();
    711             }
     695            final OsmPrimitiveType type = osmPrimitiveIterator.hasNext() ? osmPrimitiveIterator.next().getType() : OsmPrimitiveType.NODE;
     696            return OsmPrimitiveImageProvider.getResource(key, value, type)
     697                    .map(resource -> resource.getPaddedIcon(ImageProvider.ImageSizes.LARGEICON.getImageDimension()));
    712698        }
    713699
  • trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java

    r16578 r16838  
    77import java.util.Arrays;
    88import java.util.Collection;
    9 import java.util.EnumSet;
    109import java.util.LinkedList;
    1110import java.util.List;
     
    1413import javax.swing.SwingUtilities;
    1514
    16 import org.openstreetmap.josm.data.coor.LatLon;
    17 import org.openstreetmap.josm.data.osm.DataSet;
    18 import org.openstreetmap.josm.data.osm.Node;
     15import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1916import org.openstreetmap.josm.data.osm.Tag;
    2017import org.openstreetmap.josm.data.preferences.sources.MapPaintPrefHelper;
     
    3027import org.openstreetmap.josm.tools.ListenerList;
    3128import org.openstreetmap.josm.tools.Logging;
     29import org.openstreetmap.josm.tools.OsmPrimitiveImageProvider;
    3230import org.openstreetmap.josm.tools.Stopwatch;
    3331import org.openstreetmap.josm.tools.Utils;
     
    238236     * @param tag The tag to look an icon for
    239237     * @return {@code null} if no icon found
    240      * @deprecated use {@link ImageProvider#getPadded}
     238     * @deprecated use {@link OsmPrimitiveImageProvider#getResource}
    241239     */
    242240    @Deprecated
    243241    public static ImageIcon getNodeIcon(Tag tag) {
    244242        if (tag != null) {
    245             DataSet ds = new DataSet();
    246             Node virtualNode = new Node(LatLon.ZERO);
    247             virtualNode.put(tag.getKey(), tag.getValue());
    248             MapCSSStyleSource.STYLE_SOURCE_LOCK.readLock().lock();
    249             try {
    250                 // Add primitive to dataset to avoid DataIntegrityProblemException when evaluating selectors
    251                 ds.addPrimitive(virtualNode);
    252                 return ImageProvider.getPadded(virtualNode, ImageProvider.ImageSizes.SMALLICON.getImageDimension(),
    253                         EnumSet.of(ImageProvider.GetPaddedOptions.NO_PRESETS, ImageProvider.GetPaddedOptions.NO_DEFAULT));
    254             } finally {
    255                 ds.removePrimitive(virtualNode);
    256                 MapCSSStyleSource.STYLE_SOURCE_LOCK.readLock().unlock();
    257             }
     243            return OsmPrimitiveImageProvider.getResource(tag.getKey(), tag.getValue(), OsmPrimitiveType.NODE)
     244                    .map(resource -> resource.getPaddedIcon(ImageProvider.ImageSizes.SMALLICON.getImageDimension()))
     245                    .orElse(null);
    258246        }
    259247        return null;
  • trunk/src/org/openstreetmap/josm/tools/ImageProvider.java

    r16794 r16838  
    3535import java.util.Base64;
    3636import java.util.Collection;
    37 import java.util.Collections;
    38 import java.util.Comparator;
    3937import java.util.EnumMap;
    4038import java.util.HashMap;
     
    4543import java.util.Map;
    4644import java.util.Objects;
    47 import java.util.Optional;
    4845import java.util.concurrent.CompletableFuture;
    4946import java.util.concurrent.ConcurrentHashMap;
     
    6764
    6865import org.openstreetmap.josm.data.Preferences;
    69 import org.openstreetmap.josm.data.osm.DataSet;
    7066import org.openstreetmap.josm.data.osm.OsmPrimitive;
    7167import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    72 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
    73 import org.openstreetmap.josm.gui.mappaint.Range;
    74 import org.openstreetmap.josm.gui.mappaint.StyleElementList;
    75 import org.openstreetmap.josm.gui.mappaint.styleelement.MapImage;
    76 import org.openstreetmap.josm.gui.mappaint.styleelement.NodeElement;
    77 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
    78 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
    79 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
    8068import org.openstreetmap.josm.io.CachedFile;
    8169import org.openstreetmap.josm.spi.preferences.Config;
     
    15391527
    15401528    /**
    1541      * Options used in {@link #getPadded(OsmPrimitive, Dimension, Collection)}.
    1542      * @since 15889
    1543      */
    1544     public enum GetPaddedOptions {
    1545         /**
    1546          * Exclude icon indicating deprecated tag usage.
    1547          */
    1548         NO_DEPRECATED,
    1549         /**
    1550          * Exclude default icon for {@link OsmPrimitiveType} from {@link #get(OsmPrimitiveType)}
    1551          */
    1552         NO_DEFAULT,
    1553         /**
    1554          * Exclude tagging preset icons.
    1555          */
    1556         NO_PRESETS,
    1557         /**
    1558          * Exclude tagging preset icons for {@linkplain OsmPrimitiveType#WAY ways}.
    1559          */
    1560         NO_WAY_PRESETS;
    1561 
    1562         private static final Collection<GetPaddedOptions> DEFAULT = Collections.singleton(GetPaddedOptions.NO_WAY_PRESETS);
    1563     }
    1564 
    1565     /**
    15661529     * Returns an {@link ImageIcon} for the given OSM object, at the specified size.
    15671530     * This is a slow operation.
     
    15721535     */
    15731536    public static ImageIcon getPadded(OsmPrimitive primitive, Dimension iconSize) {
    1574         return getPadded(primitive, iconSize, GetPaddedOptions.DEFAULT);
    1575     }
    1576 
    1577     /**
    1578      * Returns an {@link ImageIcon} for the given OSM object, at the specified size.
    1579      * This is a slow operation.
    1580      * @param primitive Object for which an icon shall be fetched. The icon is chosen based on tags.
    1581      * @param iconSize Target size of icon. Icon is padded if required.
    1582      * @param options zero or more {@linkplain GetPaddedOptions options}.
    1583      * @return Icon for {@code primitive} that fits in cell or {@code null}.
    1584      * @since 15889
    1585      */
    1586     public static ImageIcon getPadded(OsmPrimitive primitive, Dimension iconSize, Collection<GetPaddedOptions> options) {
    15871537        if (iconSize.width <= 0 || iconSize.height <= 0) {
    15881538            return null;
    15891539        }
    1590 
    1591         // Check if the current styles have special icon for tagged objects.
    1592         if (primitive.isTagged()) {
    1593             ImageIcon icon = getTaggedPadded(primitive, iconSize, options);
    1594             if (icon != null) {
    1595                 return icon;
    1596             }
    1597         }
    1598 
    1599         // Check if the presets have icons for nodes/relations.
    1600         if (primitive.isTagged() && (!options.contains(GetPaddedOptions.NO_WAY_PRESETS) || OsmPrimitiveType.WAY != primitive.getType())) {
    1601             final Optional<ImageIcon> icon = TaggingPresets.getMatchingPresets(primitive).stream()
    1602                     .sorted(Comparator.comparing(p -> (p.iconName != null && p.iconName.contains("multipolygon"))
    1603                             || p.types == null || p.types.isEmpty() ? Integer.MAX_VALUE : p.types.size()))
    1604                     .map(TaggingPreset::getImageResource)
    1605                     .filter(Objects::nonNull)
    1606                     .map(resource -> resource.getPaddedIcon(iconSize))
    1607                     .findFirst();
    1608             if (icon.isPresent()) {
    1609                 return icon.get();
    1610             }
    1611         }
    1612 
    1613         // Use generic default icon.
    1614         return options.contains(GetPaddedOptions.NO_DEFAULT)
    1615                 ? null
    1616                 : new ImageProvider("data", primitive.getDisplayType().getAPIName()).getResource().getPaddedIcon(iconSize);
    1617     }
    1618 
    1619     /**
    1620      * Computes a new padded icon for the given tagged primitive, using map paint styles.
    1621      * This is a slow operation.
    1622      * @param primitive tagged OSM primitive
    1623      * @param iconSize icon size in pixels
    1624      * @param options zero or more {@linkplain GetPaddedOptions options}.
    1625      * @return a new padded icon for the given tagged primitive, or null
    1626      */
    1627     private static ImageIcon getTaggedPadded(OsmPrimitive primitive, Dimension iconSize, Collection<GetPaddedOptions> options) {
    1628         Pair<StyleElementList, Range> nodeStyles;
    1629         DataSet ds = primitive.getDataSet();
    1630         if (ds != null) {
    1631             ds.getReadLock().lock();
    1632         }
    1633         try {
    1634             nodeStyles = MapPaintStyles.getStyles().generateStyles(primitive, 100, false);
    1635         } finally {
    1636             if (ds != null) {
    1637                 ds.getReadLock().unlock();
    1638             }
    1639         }
    1640         for (StyleElement style : nodeStyles.a) {
    1641             if (style instanceof NodeElement) {
    1642                 NodeElement nodeStyle = (NodeElement) style;
    1643                 MapImage icon = nodeStyle.mapImage;
    1644                 if (icon != null && icon.getImageResource() != null &&
    1645                         (icon.name == null || !options.contains(GetPaddedOptions.NO_DEPRECATED) || !icon.name.contains("deprecated"))) {
    1646                     return icon.getImageResource().getPaddedIcon(iconSize);
    1647                 }
    1648             }
    1649         }
    1650         return null;
     1540        ImageResource resource = OsmPrimitiveImageProvider.getResource(primitive, OsmPrimitiveImageProvider.Options.DEFAULT);
     1541        return resource != null ? resource.getPaddedIcon(iconSize) : null;
    16511542    }
    16521543
  • trunk/test/unit/org/openstreetmap/josm/tools/ImageProviderTest.java

    r16810 r16838  
    156156        Node node = new Node(LatLon.ZERO);
    157157        node.put("amenity", "fuel");
    158         assertDoesNotThrow(() -> ImageProvider.getPadded(node, ImageProvider.ImageSizes.MAP.getImageDimension(), Collections.emptyList()));
     158        assertDoesNotThrow(() -> OsmPrimitiveImageProvider.getResource(node, Collections.emptyList()));
    159159    }
    160160
  • trunk/test/unit/org/openstreetmap/josm/tools/OsmPrimitiveImageProviderTest.java

    r16837 r16838  
    1212import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetsTest;
    1313import org.openstreetmap.josm.testutils.JOSMTestRules;
    14 import org.openstreetmap.josm.tools.ImageProvider.GetPaddedOptions;
     14import org.openstreetmap.josm.tools.OsmPrimitiveImageProvider.Options;
    1515
    1616import java.awt.Dimension;
     
    2121
    2222/**
    23  * Unit tests of getPadded method of the {@link ImageProvider} class.
    24  * This unit test is separated because it is the only one that needs a slow initialization.
     23 * Unit tests of {@link OsmPrimitiveImageProvider}
    2524 */
    26 public class ImageProviderGetPaddedTest {
     25public class OsmPrimitiveImageProviderTest {
    2726
    2827    /**
     
    4241
    4342    /**
    44      * Unit test of {@link ImageProvider#getPadded}.
     43     * Unit test of {@link OsmPrimitiveImageProvider#getResource}.
    4544     */
    4645    @Test
    47     public void testGetPadded() {
     46    public void testGetResource() {
    4847        TaggingPresetsTest.waitForIconLoading(TaggingPresets.getTaggingPresets());
    4948
    50         final EnumSet<GetPaddedOptions> noDefault = EnumSet.of(GetPaddedOptions.NO_DEFAULT);
     49        final EnumSet<Options> noDefault = EnumSet.of(Options.NO_DEFAULT);
    5150        final Dimension iconSize = new Dimension(16, 16);
    5251
    5352        assertNull(ImageProvider.getPadded(new Node(), new Dimension(0, 0)));
    5453        assertNotNull(ImageProvider.getPadded(new Node(), iconSize));
    55         assertNull(ImageProvider.getPadded(new Node(), iconSize, noDefault));
    56         assertNotNull(ImageProvider.getPadded(OsmUtils.createPrimitive("node amenity=restaurant"), iconSize, noDefault));
    57         assertNull(ImageProvider.getPadded(OsmUtils.createPrimitive("node barrier=hedge"), iconSize,
    58                 EnumSet.of(GetPaddedOptions.NO_DEFAULT, GetPaddedOptions.NO_DEPRECATED)));
    59         assertNotNull(ImageProvider.getPadded(OsmUtils.createPrimitive("way waterway=stream"), iconSize, noDefault));
    60         assertNotNull(ImageProvider.getPadded(OsmUtils.createPrimitive("relation type=route route=railway"), iconSize, noDefault));
     54        assertNull(OsmPrimitiveImageProvider.getResource(new Node(), noDefault));
     55        assertNotNull(OsmPrimitiveImageProvider.getResource(OsmUtils.createPrimitive("node amenity=restaurant"), noDefault));
     56        assertNull(OsmPrimitiveImageProvider.getResource(OsmUtils.createPrimitive("node barrier=hedge"),
     57                EnumSet.of(Options.NO_DEFAULT, Options.NO_DEPRECATED)));
     58        assertNotNull(OsmPrimitiveImageProvider.getResource(OsmUtils.createPrimitive("way waterway=stream"), noDefault));
     59        assertNotNull(OsmPrimitiveImageProvider.getResource(OsmUtils.createPrimitive("relation type=route route=railway"), noDefault));
    6160    }
    6261}
Note: See TracChangeset for help on using the changeset viewer.