Ticket #20363: 20363.patch

File 20363.patch, 8.5 KB (added by taylor.smock, 5 years ago)

Initial implementation

  • src/org/openstreetmap/josm/data/IQuadBucketType.java

     
     1// License: GPL. For details, see LICENSE file.
     2package org.openstreetmap.josm.data;
     3
     4import org.openstreetmap.josm.data.osm.BBox;
     5import org.openstreetmap.josm.data.osm.QuadBuckets;
     6
     7/**
     8 * The minimum necessary interface to use {@link QuadBuckets}.
     9 * @author Taylor Smock
     10 * @since xxx
     11 */
     12public interface IQuadBucketType {
     13    /**
     14     * Fetches the bounding box of the primitive.
     15     * @return Bounding box of the object
     16     */
     17    BBox getBBox();
     18}
  • src/org/openstreetmap/josm/data/ImageData.java

     
    1111
    1212import org.openstreetmap.josm.data.coor.LatLon;
    1313import org.openstreetmap.josm.data.gpx.GpxImageEntry;
     14import org.openstreetmap.josm.data.osm.QuadBuckets;
    1415import org.openstreetmap.josm.gui.layer.geoimage.ImageEntry;
    1516import org.openstreetmap.josm.tools.ListenerList;
    1617
     
    4142    private final List<Integer> selectedImagesIndex = new ArrayList<>();
    4243
    4344    private final ListenerList<ImageDataUpdateListener> listeners = ListenerList.create();
     45    QuadBuckets<ImageEntry> geoImages = new QuadBuckets<>();
    4446
    4547    /**
    4648     * Construct a new image container without images
     
    6062        } else {
    6163            this.data = new ArrayList<>();
    6264        }
     65        this.geoImages.addAll(data);
    6366        selectedImagesIndex.add(-1);
    6467    }
    6568
     
    8588     */
    8689    public void mergeFrom(ImageData otherData) {
    8790        data.addAll(otherData.getImages());
     91        this.geoImages.addAll(otherData.getImages());
    8892        Collections.sort(data);
    8993
    9094        final ImageEntry selected = otherData.getSelectedImage();
     
    153157    }
    154158
    155159    /**
     160     * Search for images in a bounds
     161     * @param bounds The bounds to search
     162     * @return images in the bounds
     163     */
     164    public Collection<ImageEntry> searchImages(Bounds bounds) {
     165        return this.geoImages.search(bounds.toBBox());
     166    }
     167
     168    /**
    156169     * Select the next image of the sequence
    157170     */
    158171    public void selectNextImage() {
     
    265278        }
    266279        for (ImageEntry img: getSelectedImages()) {
    267280            data.remove(img);
     281            this.geoImages.remove(img);
    268282        }
    269283        if (selectedImagesIndex.get(0) >= data.size()) {
    270284            setSelectedImageIndex(data.size() - 1);
     
    290304     */
    291305    public void removeImage(ImageEntry img) {
    292306        data.remove(img);
     307        this.geoImages.remove(img);
    293308        notifyImageUpdate();
    294309    }
    295310
     
    300315     */
    301316    public void updateImagePosition(ImageEntry img, LatLon newPos) {
    302317        img.setPos(newPos);
     318        this.geoImages.remove(img);
     319        this.geoImages.add(img);
    303320        afterImageUpdated(img);
    304321    }
    305322
  • src/org/openstreetmap/josm/data/gpx/GpxImageEntry.java

     
    88import java.util.Objects;
    99import java.util.function.Consumer;
    1010
     11import org.openstreetmap.josm.data.IQuadBucketType;
    1112import org.openstreetmap.josm.data.coor.CachedLatLon;
    1213import org.openstreetmap.josm.data.coor.LatLon;
     14import org.openstreetmap.josm.data.osm.BBox;
    1315import org.openstreetmap.josm.tools.ExifReader;
    1416import org.openstreetmap.josm.tools.JosmRuntimeException;
    1517import org.openstreetmap.josm.tools.Logging;
     
    2830 * Stores info about each image
    2931 * @since 14205 (extracted from gui.layer.geoimage.ImageEntry)
    3032 */
    31 public class GpxImageEntry implements Comparable<GpxImageEntry> {
     33public class GpxImageEntry implements Comparable<GpxImageEntry>, IQuadBucketType {
    3234    private File file;
    3335    private Integer exifOrientation;
    3436    private LatLon exifCoor;
     
    539541        isNewGpsData = true;
    540542   }
    541543
     544    @Override
     545    public BBox getBBox() {
     546        // new BBox(LatLon) is null safe.
     547        return new BBox(this.getExifCoor());
     548    }
     549
    542550    /**
    543551     * Remove the flag that indicates new GPS data.
    544552     * The flag is cleared by a new GPS data consumer.
  • src/org/openstreetmap/josm/data/osm/IPrimitive.java

     
    55import java.util.List;
    66import java.util.Map;
    77
     8import org.openstreetmap.josm.data.IQuadBucketType;
    89import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
    910import org.openstreetmap.josm.tools.LanguageInfo;
    1011
     
    1213 * IPrimitive captures the common functions of {@link OsmPrimitive} and {@link PrimitiveData}.
    1314 * @since 4098
    1415 */
    15 public interface IPrimitive extends Tagged, PrimitiveId, Stylable, Comparable<IPrimitive> {
     16public interface IPrimitive extends IQuadBucketType, Tagged, PrimitiveId, Stylable, Comparable<IPrimitive> {
    1617
    1718    /**
    1819     * Replies <code>true</code> if the object has been modified since it was loaded from
     
    445446     * @return Bounding box of the object
    446447     * @since 13764
    447448     */
     449    @Override
    448450    BBox getBBox();
    449451
    450452    /**
  • src/org/openstreetmap/josm/data/osm/QuadBuckets.java

     
    1010import java.util.NoSuchElementException;
    1111import java.util.stream.IntStream;
    1212
     13import org.openstreetmap.josm.data.IQuadBucketType;
    1314import org.openstreetmap.josm.data.coor.LatLon;
    1415import org.openstreetmap.josm.data.coor.QuadTiling;
    1516import org.openstreetmap.josm.tools.Logging;
     
    1920 * be removed and re-added.
    2021 *
    2122 * This class is (no longer) thread safe.
    22  * @param <T> type of primitives
    23  * @since 2165
     23 * @param <T> type of object extending {@link IQuadBucketType}.
     24 * @since 2165 ({@link IPrimitive} only), xxx for {@link IQuadBucketType}
    2425 */
    25 public class QuadBuckets<T extends IPrimitive> implements Collection<T> {
     26public class QuadBuckets<T extends IQuadBucketType> implements Collection<T> {
    2627    private static final boolean CONSISTENCY_TESTING = false;
    2728    private static final byte NW_INDEX = 1;
    2829    private static final byte NE_INDEX = 3;
     
    3536
    3637    private static final int MAX_OBJECTS_PER_NODE = 48;
    3738
    38     static class QBLevel<T extends IPrimitive> extends BBox {
     39    static class QBLevel<T extends IQuadBucketType> extends BBox {
    3940        private final byte level;
    4041        private final byte index;
    4142        private final long quad;
  • src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java

     
    3737
    3838import org.openstreetmap.josm.actions.AutoScaleAction;
    3939import org.openstreetmap.josm.actions.RenameLayerAction;
    40 import org.openstreetmap.josm.actions.mapmode.SelectLassoAction;
    4140import org.openstreetmap.josm.actions.mapmode.MapMode;
    4241import org.openstreetmap.josm.actions.mapmode.SelectAction;
     42import org.openstreetmap.josm.actions.mapmode.SelectLassoAction;
    4343import org.openstreetmap.josm.data.Bounds;
    4444import org.openstreetmap.josm.data.Data;
    4545import org.openstreetmap.josm.data.ImageData;
     
    561561                tempG.fillRect(0, 0, width, height);
    562562                tempG.setComposite(saveComp);
    563563
    564                 for (ImageEntry e : data.getImages()) {
     564                for (ImageEntry e : data.searchImages(bounds)) {
    565565                    paintImage(e, mv, clip, tempG);
    566566                }
    567567                for (ImageEntry img: this.data.getSelectedImages()) {
     
    572572            }
    573573            g.drawImage(offscreenBuffer, 0, 0, null);
    574574        } else {
    575             for (ImageEntry e : data.getImages()) {
     575            for (ImageEntry e : data.searchImages(bounds)) {
    576576                if (e.getPos() == null) {
    577577                    continue;
    578578                }