Ticket #13172: patch-mapview-extract-imagery-preferences.patch

File patch-mapview-extract-imagery-preferences.patch, 21.9 KB (added by michael2402, 8 years ago)
  • src/org/openstreetmap/josm/actions/ImageryAdjustAction.java

    diff --git a/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java b/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
    index a35cac3..09a6e35 100644
    a b import org.openstreetmap.josm.actions.mapmode.MapMode;  
    2727import org.openstreetmap.josm.data.coor.EastNorth;
    2828import org.openstreetmap.josm.data.imagery.OffsetBookmark;
    2929import org.openstreetmap.josm.gui.ExtendedDialog;
    30 import org.openstreetmap.josm.gui.layer.ImageryLayer;
     30import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
     31import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
    3132import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
    3233import org.openstreetmap.josm.gui.widgets.JosmTextField;
    3334import org.openstreetmap.josm.tools.GBC;
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    4142    private static volatile ImageryOffsetDialog offsetDialog;
    4243    private static Cursor cursor = ImageProvider.getCursor("normal", "move");
    4344
    44     private double oldDx, oldDy;
     45    private EastNorth old;
    4546    private EastNorth prevEastNorth;
    46     private transient ImageryLayer layer;
     47    private transient AbstractTileSourceLayer<?> layer;
    4748    private MapMode oldMapMode;
    4849
    4950    /**
    5051     * Constructs a new {@code ImageryAdjustAction} for the given layer.
    5152     * @param layer The imagery layer
    5253     */
    53     public ImageryAdjustAction(ImageryLayer layer) {
     54    public ImageryAdjustAction(AbstractTileSourceLayer<?> layer) {
    5455        super(tr("New offset"), "adjustimg",
    5556                tr("Adjust the position of this imagery layer"), Main.map,
    5657                cursor);
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    6667        if (!layer.isVisible()) {
    6768            layer.setVisible(true);
    6869        }
    69         oldDx = layer.getDx();
    70         oldDy = layer.getDy();
     70        old = layer.getDisplaySettings().getDisplacement();
    7171        addListeners();
    7272        offsetDialog = new ImageryOffsetDialog();
    7373        offsetDialog.setVisible(true);
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    8888        super.exitMode();
    8989        if (offsetDialog != null) {
    9090            if (layer != null) {
    91                 layer.setOffset(oldDx, oldDy);
     91                layer.getDisplaySettings().setDisplacement(old);
    9292            }
    9393            offsetDialog.setVisible(false);
    9494            offsetDialog = null;
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    154154    @Override
    155155    public void mouseDragged(MouseEvent e) {
    156156        if (layer == null || prevEastNorth == null) return;
    157         EastNorth eastNorth =
    158             Main.map.mapView.getEastNorth(e.getX(), e.getY());
    159         double dx = layer.getDx()+eastNorth.east()-prevEastNorth.east();
    160         double dy = layer.getDy()+eastNorth.north()-prevEastNorth.north();
    161         layer.setOffset(dx, dy);
     157        EastNorth eastNorth = Main.map.mapView.getEastNorth(e.getX(), e.getY());
     158        EastNorth d = layer.getDisplaySettings().getDisplacement().add(eastNorth).subtract(prevEastNorth);
     159        layer.getDisplaySettings().setDisplacement(d);
    162160        if (offsetDialog != null) {
    163161            offsetDialog.updateOffset();
    164162        }
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    233231                    String northing = ostr.substring(semicolon + 1).trim().replace(',', '.');
    234232                    double dx = Double.parseDouble(easting);
    235233                    double dy = Double.parseDouble(northing);
    236                     layer.setOffset(dx, dy);
     234                    layer.getDisplaySettings().setDisplacement(new EastNorth(dx, dy));
    237235                } catch (NumberFormatException nfe) {
    238236                    // we repaint offset numbers in any case
    239237                    if (Main.isTraceEnabled()) {
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    258256            int precision = Main.getProjection().getDefaultZoomInPPD() >= 1.0 ? 2 : 7;
    259257            // US locale to force decimal separator to be '.'
    260258            try (Formatter us = new Formatter(Locale.US)) {
     259                TileSourceDisplaySettings ds = layer.getDisplaySettings();
    261260                tOffset.setText(us.format(new StringBuilder()
    262261                    .append("%1.").append(precision).append("f; %1.").append(precision).append('f').toString(),
    263                     layer.getDx(), layer.getDy()).toString());
     262                    ds.getDx(), ds.getDy()).toString());
    264263            }
    265264        }
    266265
    public class ImageryAdjustAction extends MapMode implements AWTEventListener {  
    297296            offsetDialog = null;
    298297            if (layer != null) {
    299298                if (getValue() != 1) {
    300                     layer.setOffset(oldDx, oldDy);
     299                    layer.getDisplaySettings().setDisplacement(old);
    301300                } else if (tBookmarkName.getText() != null && !tBookmarkName.getText().isEmpty()) {
    302301                    OffsetBookmark.bookmarkOffset(tBookmarkName.getText(), layer);
    303302                }
  • src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java b/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java
    index 188eee6..9da2f7a 100644
    a b import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;  
    6363import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
    6464import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
    6565import org.openstreetmap.josm.Main;
     66import org.openstreetmap.josm.actions.ImageryAdjustAction;
    6667import org.openstreetmap.josm.actions.RenameLayerAction;
    6768import org.openstreetmap.josm.actions.SaveActionBase;
    6869import org.openstreetmap.josm.data.Bounds;
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    164165
    165166    private final TileSourceDisplaySettings displaySettings = createDisplaySettings();
    166167
     168    private final ImageryAdjustAction adjustAction = new ImageryAdjustAction(this);
     169
    167170    /**
    168171     * Creates Tile Source based Imagery Layer based on Imagery Info
    169172     * @param info imagery info
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    285288        if (isVisible()) Main.map.repaint();
    286289    }
    287290
     291
     292    @Override
     293    public double getDx() {
     294        return getDisplaySettings().getDx();
     295    }
     296
     297    @Override
     298    public double getDy() {
     299        return getDisplaySettings().getDy();
     300    }
     301
     302    @Override
     303    public void displace(double dx, double dy) {
     304        getDisplaySettings().addDisplacement(new EastNorth(dx, dy));
     305    }
     306
    288307    /**
    289308     * Marks layer as needing redraw on offset change
    290309     */
    291310    @Override
    292311    public void setOffset(double dx, double dy) {
    293         super.setOffset(dx, dy);
    294         needRedraw = true;
     312        getDisplaySettings().setDisplacement(new EastNorth(dx, dy));
     313    }
     314
     315    @Override
     316    public Object getInfoComponent() {
     317        JPanel panel = (JPanel) super.getInfoComponent();
     318        EastNorth offset = getDisplaySettings().getDisplacement();
     319        if (offset.distanceSq(0, 0) > 1e-10) {
     320            panel.add(new JLabel(tr("Offset: ") + offset.east() + ';' + offset.north()), GBC.eol().insets(0, 5, 10, 0));
     321        }
     322        return panel;
    295323    }
    296324
     325    @Override
     326    protected Action getAdjustAction() {
     327        return adjustAction;
     328    }
    297329
    298330    /**
    299331     * Returns average number of screen pixels per tile pixel for current mapview
    implements ImageObserver, TileLoaderListener, ZoomChangeListener, FilterChangeLi  
    18811913    public File createAndOpenSaveFileChooser() {
    18821914        return SaveActionBase.createAndOpenSaveFileChooser(tr("Save WMS file"), WMSLayerImporter.FILE_FILTER);
    18831915    }
     1916
     1917    @Override
     1918    public void destroy() {
     1919        super.destroy();
     1920        adjustAction.destroy();
     1921    }
    18841922}
  • src/org/openstreetmap/josm/gui/layer/ImageryLayer.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java b/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
    index 8ff9166..6c539cc 100644
    a b import java.util.ArrayList;  
    1515import java.util.List;
    1616
    1717import javax.swing.AbstractAction;
     18import javax.swing.Action;
    1819import javax.swing.Icon;
    1920import javax.swing.JCheckBoxMenuItem;
    2021import javax.swing.JComponent;
    import javax.swing.JPopupMenu;  
    2627import javax.swing.JSeparator;
    2728
    2829import org.openstreetmap.josm.Main;
    29 import org.openstreetmap.josm.actions.ImageryAdjustAction;
    3030import org.openstreetmap.josm.data.ProjectionBounds;
    3131import org.openstreetmap.josm.data.imagery.ImageryInfo;
    3232import org.openstreetmap.josm.data.imagery.OffsetBookmark;
    import org.openstreetmap.josm.data.preferences.ColorProperty;  
    3434import org.openstreetmap.josm.data.preferences.IntegerProperty;
    3535import org.openstreetmap.josm.gui.MenuScroller;
    3636import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
     37import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
    3738import org.openstreetmap.josm.gui.widgets.UrlLabel;
    3839import org.openstreetmap.josm.tools.GBC;
    3940import org.openstreetmap.josm.tools.ImageProvider;
    public abstract class ImageryLayer extends Layer {  
    6162
    6263    protected Icon icon;
    6364
    64     protected double dx;
    65     protected double dy;
    66 
    67     private final ImageryAdjustAction adjustAction = new ImageryAdjustAction(this);
    68 
    6965    private final ImageryFilterSettings filterSettings = new ImageryFilterSettings();
    7066
    7167    /**
    public abstract class ImageryLayer extends Layer {  
    9591        return Main.map.mapView.getWidth() / (bounds.maxEast - bounds.minEast);
    9692    }
    9793
     94    /**
     95     * Gets the x displacement of this layer.
     96     * To be removed end of 2016
     97     * @return The x displacement.
     98     * @deprecated Use {@link TileSourceDisplaySettings#getDx()}
     99     */
     100    @Deprecated
    98101    public double getDx() {
    99         return dx;
     102        // moved to AbstractTileSourceLayer/TileSourceDisplaySettings. Remains until all actions migrate.
     103        return 0;
    100104    }
    101105
     106    /**
     107     * Gets the y displacement of this layer.
     108     * To be removed end of 2016
     109     * @return The y displacement.
     110     * @deprecated Use {@link TileSourceDisplaySettings#getDy()}
     111     */
     112    @Deprecated
    102113    public double getDy() {
    103         return dy;
     114        // moved to AbstractTileSourceLayer/TileSourceDisplaySettings. Remains until all actions migrate.
     115        return 0;
    104116    }
    105117
    106118    /**
    107119     * Sets the displacement offset of this layer. The layer is automatically invalidated.
     120     * To be removed end of 2016
    108121     * @param dx The x offset
    109122     * @param dy The y offset
     123     * @deprecated Use {@link TileSourceDisplaySettings}
    110124     */
     125    @Deprecated
    111126    public void setOffset(double dx, double dy) {
    112         this.dx = dx;
    113         this.dy = dy;
    114         invalidate();
     127        // moved to AbstractTileSourceLayer/TileSourceDisplaySettings. Remains until all actions migrate.
    115128    }
    116129
     130    /**
     131     * To be removed end of 2016
     132     * @param dx
     133     * @param dy
     134     * @deprecated Use {@link TileSourceDisplaySettings}
     135     */
     136    @Deprecated
    117137    public void displace(double dx, double dy) {
    118         this.dx += dx;
    119         this.dy += dy;
    120         setOffset(this.dx, this.dy);
     138        // moved to AbstractTileSourceLayer/TileSourceDisplaySettings. Remains until all actions migrate.
    121139    }
    122140
    123141    /**
    public abstract class ImageryLayer extends Layer {  
    152170                panel.add(new JLabel(tr("URL: ")), GBC.std().insets(0, 5, 2, 0));
    153171                panel.add(new UrlLabel(url), GBC.eol().insets(2, 5, 10, 0));
    154172            }
    155             if (dx != 0 || dy != 0) {
    156                 panel.add(new JLabel(tr("Offset: ") + dx + ';' + dy), GBC.eol().insets(0, 5, 10, 0));
    157             }
    158173        }
    159174        return panel;
    160175    }
    public abstract class ImageryLayer extends Layer {  
    215230    }
    216231
    217232    public JComponent getOffsetMenuItem(JComponent subMenu) {
    218         JMenuItem adjustMenuItem = new JMenuItem(adjustAction);
     233        JMenuItem adjustMenuItem = new JMenuItem(getAdjustAction());
    219234        if (OffsetBookmark.allBookmarks.isEmpty()) return adjustMenuItem;
    220235
    221236        subMenu.add(adjustMenuItem);
    public abstract class ImageryLayer extends Layer {  
    227242                continue;
    228243            }
    229244            JCheckBoxMenuItem item = new JCheckBoxMenuItem(new ApplyOffsetAction(b));
    230             if (Utils.equalsEpsilon(b.dx, dx) && Utils.equalsEpsilon(b.dy, dy)) {
     245            if (Utils.equalsEpsilon(b.dx, getDx()) && Utils.equalsEpsilon(b.dy, getDy())) {
    231246                item.setSelected(true);
    232247            }
    233248            subMenu.add(item);
    public abstract class ImageryLayer extends Layer {  
    244259        return hasBookmarks ? subMenu : adjustMenuItem;
    245260    }
    246261
     262    protected abstract Action getAdjustAction();
     263
    247264    /**
    248265     * Gets the settings for the filter that is applied to this layer.
    249266     * @return The filter settings.
    public abstract class ImageryLayer extends Layer {  
    313330        }
    314331        return img;
    315332    }
    316 
    317     @Override
    318     public void destroy() {
    319         super.destroy();
    320         adjustAction.destroy();
    321     }
    322333}
  • src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java

    diff --git a/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java b/src/org/openstreetmap/josm/gui/layer/imagery/TileSourceDisplaySettings.java
    index 196fbac..d534b36 100644
    a b import java.util.concurrent.CopyOnWriteArrayList;  
    66
    77import org.openstreetmap.gui.jmapviewer.interfaces.TileSource;
    88import org.openstreetmap.josm.Main;
     9import org.openstreetmap.josm.data.coor.EastNorth;
    910import org.openstreetmap.josm.data.preferences.BooleanProperty;
    1011import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
     12import org.openstreetmap.josm.tools.CheckParameterUtil;
     13import org.openstreetmap.josm.tools.bugreport.BugReport;
    1114
    1215/**
    1316 * This are the preferences of how to display a {@link TileSource}.
    public class TileSourceDisplaySettings {  
    3538     */
    3639    private static final String SHOW_ERRORS = "show-errors";
    3740
     41    private static final String DISPLACEMENT = "displacement";
     42
    3843    private static final String PREFERENCE_PREFIX = "imagery.generic";
    3944
    4045    /**
    public class TileSourceDisplaySettings {  
    4752     */
    4853    public static final BooleanProperty PROP_AUTO_ZOOM = new BooleanProperty(PREFERENCE_PREFIX + ".default_autozoom", true);
    4954
     55
    5056    /** if layers changes automatically, when user zooms in */
    5157    private boolean autoZoom;
    5258    /** if layer automatically loads new tiles */
    public class TileSourceDisplaySettings {  
    5460    /** if layer should show errors on tiles */
    5561    private boolean showErrors;
    5662
     63    /**
     64     * The displacement
     65     */
     66    private EastNorth displacement = new EastNorth(0, 0);
     67
    5768    private final CopyOnWriteArrayList<DisplaySettingsChangeListener> listeners = new CopyOnWriteArrayList<>();
    5869
    5970    /**
    public class TileSourceDisplaySettings {  
    149160    }
    150161
    151162    /**
     163     * Gets the displacement in x (east) direction
     164     * @return The displacement.
     165     * @since xxx
     166     */
     167    public double getDx() {
     168        return displacement.east();
     169    }
     170
     171    /**
     172     * Gets the displacement in y (north) direction
     173     * @return The displacement.
     174     * @since xxx
     175     */
     176    public double getDy() {
     177        return displacement.north();
     178    }
     179
     180    /**
     181     * Gets the displacement of the image
     182     * @return The displacement.
     183     * @since xxx
     184     */
     185    public EastNorth getDisplacement() {
     186        return displacement;
     187    }
     188
     189    /**
     190     * Set the displacement
     191     * @param displacement The new displacement
     192     * @since xxx
     193     */
     194    public void setDisplacement(EastNorth displacement) {
     195        CheckParameterUtil.ensureValidCoordinates(displacement, "displacement");
     196        this.displacement = displacement;
     197        fireSettingsChange(DISPLACEMENT);
     198    }
     199
     200    /**
     201     * Adds the given value to the displacement.
     202     * @param displacement The value to add.
     203     * @since xxx
     204     */
     205    public void addDisplacement(EastNorth displacement) {
     206        CheckParameterUtil.ensureValidCoordinates(displacement, "displacement");
     207        setDisplacement(this.displacement.add(displacement));
     208    }
     209
     210    /**
    152211     * Notifies all listeners that the paint settings have changed
    153212     * @param changedSetting The setting name
     213     * @since xxx
    154214     */
    155215    private void fireSettingsChange(String changedSetting) {
    156216        DisplaySettingsChangeEvent e = new DisplaySettingsChangeEvent(changedSetting);
    public class TileSourceDisplaySettings {  
    184244        data.put(AUTO_LOAD, Boolean.toString(autoLoad));
    185245        data.put(AUTO_ZOOM, Boolean.toString(autoZoom));
    186246        data.put(SHOW_ERRORS, Boolean.toString(showErrors));
     247        data.put("dx", String.valueOf(getDx()));
     248        data.put("dy", String.valueOf(getDy()));
    187249    }
    188250
    189251    /**
    public class TileSourceDisplaySettings {  
    192254     * @see #storeTo(Map)
    193255     */
    194256    public void loadFrom(Map<String, String> data) {
    195         String doAutoLoad = data.get(AUTO_LOAD);
    196         if (doAutoLoad != null) {
    197             setAutoLoad(Boolean.parseBoolean(doAutoLoad));
    198         }
     257        try {
     258            String doAutoLoad = data.get(AUTO_LOAD);
     259            if (doAutoLoad != null) {
     260                setAutoLoad(Boolean.parseBoolean(doAutoLoad));
     261            }
    199262
    200         String doAutoZoom = data.get(AUTO_ZOOM);
    201         if (doAutoZoom != null) {
    202             setAutoZoom(Boolean.parseBoolean(doAutoZoom));
    203         }
     263            String doAutoZoom = data.get(AUTO_ZOOM);
     264            if (doAutoZoom != null) {
     265                setAutoZoom(Boolean.parseBoolean(doAutoZoom));
     266            }
     267
     268            String doShowErrors = data.get(SHOW_ERRORS);
     269            if (doShowErrors != null) {
     270                setShowErrors(Boolean.parseBoolean(doShowErrors));
     271            }
    204272
    205         String doShowErrors = data.get(SHOW_ERRORS);
    206         if (doShowErrors != null) {
    207             setShowErrors(Boolean.parseBoolean(doShowErrors));
     273            String dx = data.get("dx");
     274            String dy = data.get("dy");
     275            if (dx != null && dy != null) {
     276                setDisplacement(new EastNorth(Double.parseDouble(dx), Double.parseDouble(dy)));
     277            }
     278        } catch (RuntimeException e) {
     279            throw BugReport.intercept(e).put("data", data);
    208280        }
    209281    }
    210282
  • src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java

    diff --git a/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java b/src/org/openstreetmap/josm/io/session/ImagerySessionImporter.java
    index 2b68c71..df5f135 100644
    a b public class ImagerySessionImporter implements SessionLayerImporter {  
    5353            AbstractTileSourceLayer<?> tsLayer = (AbstractTileSourceLayer<?>) layer;
    5454            tsLayer.getDisplaySettings().loadFrom(attributes);
    5555        }
    56         if (attributes.containsKey("dx") && attributes.containsKey("dy")) {
    57             layer.setOffset(Double.parseDouble(attributes.get("dx")), Double.parseDouble(attributes.get("dy")));
    58         }
    5956        return layer;
    6057    }
    6158}
  • test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java

    diff --git a/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java b/test/unit/org/openstreetmap/josm/io/session/SessionReaderTest.java
    index d2216ef..87bf617 100644
    a b import org.junit.Test;  
    1414import org.openstreetmap.josm.JOSMFixture;
    1515import org.openstreetmap.josm.Main;
    1616import org.openstreetmap.josm.TestUtils;
     17import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
    1718import org.openstreetmap.josm.gui.layer.GpxLayer;
    1819import org.openstreetmap.josm.gui.layer.ImageryLayer;
    1920import org.openstreetmap.josm.gui.layer.Layer;
    public class SessionReaderTest {  
    124125        final List<Layer> layers = testRead("bing.jos");
    125126        assertEquals(layers.size(), 1);
    126127        assertTrue(layers.get(0) instanceof ImageryLayer);
    127         final ImageryLayer image = (ImageryLayer) layers.get(0);
     128        final AbstractTileSourceLayer<?> image = (AbstractTileSourceLayer<?>) layers.get(0);
    128129        assertEquals("Bing aerial imagery", image.getName());
    129         assertEquals(image.getDx(), 12.34, 1e-9);
    130         assertEquals(image.getDy(), -56.78, 1e-9);
     130        assertEquals(image.getDisplaySettings().getDx(), 12.34, 1e-9);
     131        assertEquals(image.getDisplaySettings().getDy(), -56.78, 1e-9);
    131132    }
    132133
    133134    /**
  • test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java

    diff --git a/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java b/test/unit/org/openstreetmap/josm/io/session/SessionWriterTest.java
    index 3cb237c..f1c922a 100644
    a b import java.util.Map;  
    1414import org.junit.BeforeClass;
    1515import org.junit.Test;
    1616import org.openstreetmap.josm.JOSMFixture;
     17import org.openstreetmap.josm.data.coor.EastNorth;
    1718import org.openstreetmap.josm.data.coor.LatLon;
    1819import org.openstreetmap.josm.data.gpx.GpxData;
    1920import org.openstreetmap.josm.data.gpx.WayPoint;
    public class SessionWriterTest {  
    135136    }
    136137
    137138    private ImageryLayer createImageryLayer() {
    138         ImageryLayer layer = new TMSLayer(new ImageryInfo("the name", "http://www.url.com/"));
    139         layer.setOffset(12, 34);
     139        TMSLayer layer = new TMSLayer(new ImageryInfo("the name", "http://www.url.com/"));
     140        layer.getDisplaySettings().setDisplacement(new EastNorth(12, 34));
    140141        return layer;
    141142    }
    142143