Index: /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 9440)
+++ /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 9441)
@@ -14,4 +14,6 @@
 import javax.swing.JPanel;
 
+import org.openstreetmap.gui.jmapviewer.JMapViewer;
+import org.openstreetmap.gui.jmapviewer.MapMarkerDot;
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -21,4 +23,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.Pair;
 
 /**
@@ -28,7 +31,4 @@
  */
 public class CoordinateInfoViewer extends JPanel {
-
-    /** background color used when the coordinates are different */
-    public static final Color BGCOLOR_DIFFERENCE = new Color(255, 197, 197);
 
     /** the model */
@@ -44,4 +44,6 @@
     /** the info panel for distance between the two coordinates */
     private DistanceViewer distanceViewer;
+    /** the map panel showing the old+new coordinate */
+    private MapViewer mapViewer;
 
     protected void build() {
@@ -76,6 +78,6 @@
         gc.gridy = 1;
         gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
+        gc.weighty = 0.0;
+        gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.NORTHWEST;
         add(referenceLatLonViewer = new LatLonViewer(model, PointInTimeType.REFERENCE_POINT_IN_TIME), gc);
@@ -84,6 +86,6 @@
         gc.gridy = 1;
         gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
+        gc.weighty = 0.0;
+        gc.fill = GridBagConstraints.HORIZONTAL;
         gc.anchor = GridBagConstraints.NORTHWEST;
         add(currentLatLonViewer = new LatLonViewer(model, PointInTimeType.CURRENT_POINT_IN_TIME), gc);
@@ -98,4 +100,15 @@
         gc.weighty = 0.0;
         add(distanceViewer = new DistanceViewer(model), gc);
+
+        // the map panel
+        gc.gridx = 0;
+        gc.gridy = 3;
+        gc.gridwidth = 2;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.weightx = 1.0;
+        gc.weighty = 1.0;
+        gc.insets = new Insets(5, 5, 5, 5);
+        add(mapViewer = new MapViewer(model), gc);
+        mapViewer.setZoomContolsVisible(false);
     }
 
@@ -128,4 +141,7 @@
             model.deleteObserver(distanceViewer);
         }
+        if (mapViewer != null) {
+            model.deleteObserver(mapViewer);
+        }
     }
 
@@ -145,4 +161,7 @@
         if (distanceViewer != null) {
             model.addObserver(distanceViewer);
+        }
+        if (mapViewer != null) {
+            model.addObserver(mapViewer);
         }
     }
@@ -163,4 +182,38 @@
     }
 
+    private static class Updater {
+        private final transient HistoryBrowserModel model;
+        private final PointInTimeType role;
+
+        public Updater(HistoryBrowserModel model, PointInTimeType role) {
+            this.model = model;
+            this.role = role;
+        }
+
+        protected HistoryOsmPrimitive getPrimitive() {
+            if (model == null || role == null)
+                return null;
+            return model.getPointInTime(role);
+        }
+
+        protected HistoryOsmPrimitive getOppositePrimitive() {
+            if (model == null || role == null)
+                return null;
+            return model.getPointInTime(role.opposite());
+        }
+
+        protected final Pair<LatLon, LatLon> getCoordinates() {
+            HistoryOsmPrimitive p = getPrimitive();
+            HistoryOsmPrimitive opposite = getOppositePrimitive();
+            if (!(p instanceof HistoryNode)) return null;
+            if (!(opposite instanceof HistoryNode)) return null;
+            HistoryNode node = (HistoryNode) p;
+            HistoryNode oppositeNode = (HistoryNode) opposite;
+
+            return Pair.create(node.getCoords(), oppositeNode.getCoords());
+        }
+
+    }
+
     /**
      * A UI widgets which displays the Lan/Lon-coordinates of a
@@ -172,21 +225,6 @@
         private JLabel lblLat;
         private JLabel lblLon;
-        private final transient HistoryBrowserModel model;
-        private final PointInTimeType role;
-
-        protected LatLon coord;
-        protected LatLon oppositeCoord;
-
-        protected HistoryOsmPrimitive getPrimitive() {
-            if (model == null || role == null)
-                return null;
-            return model.getPointInTime(role);
-        }
-
-        protected HistoryOsmPrimitive getOppositePrimitive() {
-            if (model == null || role == null)
-                return null;
-            return model.getPointInTime(role.opposite());
-        }
+        private final Updater updater;
+        private final Color modifiedColor;
 
         protected void build() {
@@ -231,13 +269,4 @@
             lblLon.setOpaque(true);
             lblLon.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
-
-            // fill the remaining space
-            gc.gridx = 0;
-            gc.gridy = 2;
-            gc.gridwidth = 2;
-            gc.fill = GridBagConstraints.BOTH;
-            gc.weightx = 1.0;
-            gc.weighty = 1.0;
-            add(new JPanel(), gc);
         }
 
@@ -248,24 +277,16 @@
          */
         LatLonViewer(HistoryBrowserModel model, PointInTimeType role) {
+            this.updater = new Updater(model, role);
+            this.modifiedColor = PointInTimeType.CURRENT_POINT_IN_TIME.equals(role)
+                    ? TwoColumnDiff.Item.DiffItemType.INSERTED.getColor()
+                    : TwoColumnDiff.Item.DiffItemType.DELETED.getColor();
             build();
-            this.model = model;
-            this.role = role;
-        }
-
-        protected final boolean prepareRefresh() {
-            HistoryOsmPrimitive p = getPrimitive();
-            HistoryOsmPrimitive  opposite = getOppositePrimitive();
-            if (!(p instanceof HistoryNode)) return false;
-            if (!(opposite instanceof HistoryNode)) return false;
-            HistoryNode node = (HistoryNode) p;
-            HistoryNode oppositeNode = (HistoryNode) opposite;
-
-            coord = node.getCoords();
-            oppositeCoord = oppositeNode.getCoords();
-            return true;
         }
 
         protected void refresh() {
-            if (!prepareRefresh()) return;
+            final Pair<LatLon, LatLon> coordinates = updater.getCoordinates();
+            if (coordinates == null) return;
+            final LatLon coord = coordinates.a;
+            final LatLon oppositeCoord = coordinates.b;
 
             // display the coordinates
@@ -278,5 +299,5 @@
                 GuiHelper.setBackgroundReadable(lblLat, Color.WHITE);
             } else {
-                GuiHelper.setBackgroundReadable(lblLat, BGCOLOR_DIFFERENCE);
+                GuiHelper.setBackgroundReadable(lblLat, modifiedColor);
             }
             if (coord == oppositeCoord ||
@@ -284,5 +305,5 @@
                 GuiHelper.setBackgroundReadable(lblLon, Color.WHITE);
             } else {
-                GuiHelper.setBackgroundReadable(lblLon, BGCOLOR_DIFFERENCE);
+                GuiHelper.setBackgroundReadable(lblLon, modifiedColor);
             }
         }
@@ -294,13 +315,42 @@
     }
 
-    private static class DistanceViewer extends LatLonViewer {
+    private static class MapViewer extends JMapViewer implements Observer {
+
+        private final Updater updater;
+
+        public MapViewer(HistoryBrowserModel model) {
+            this.updater = new Updater(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+            setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
+        }
+
+        @Override
+        public void update(Observable o, Object arg) {
+            final Pair<LatLon, LatLon> coordinates = updater.getCoordinates();
+            if (coordinates == null) {
+                return;
+            }
+
+            final MapMarkerDot oldMarker = new MapMarkerDot(coordinates.a.lat(), coordinates.a.lon());
+            final MapMarkerDot newMarker = new MapMarkerDot(coordinates.b.lat(), coordinates.b.lon());
+            oldMarker.setBackColor(TwoColumnDiff.Item.DiffItemType.DELETED.getColor());
+            newMarker.setBackColor(TwoColumnDiff.Item.DiffItemType.INSERTED.getColor());
+
+            removeAllMapMarkers();
+            addMapMarker(oldMarker);
+            addMapMarker(newMarker);
+            setDisplayToFitMapMarkers();
+        }
+    }
+
+    private static class DistanceViewer extends JPanel implements Observer {
 
         private JLabel lblDistance;
+        private final Updater updater;
 
         DistanceViewer(HistoryBrowserModel model) {
-            super(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
-        }
-
-        @Override
+            this.updater = new Updater(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+            build();
+        }
+
         protected void build() {
             setLayout(new GridBagLayout());
@@ -328,7 +378,9 @@
         }
 
-        @Override
         protected void refresh() {
-            if (!prepareRefresh()) return;
+            final Pair<LatLon, LatLon> coordinates = updater.getCoordinates();
+            if (coordinates == null) return;
+            final LatLon coord = coordinates.a;
+            final LatLon oppositeCoord = coordinates.b;
 
             // update distance
@@ -336,11 +388,20 @@
             if (coord != null && oppositeCoord != null) {
                 double distance = coord.greatCircleDistance(oppositeCoord);
-                GuiHelper.setBackgroundReadable(lblDistance, distance > 0 ? BGCOLOR_DIFFERENCE : Color.WHITE);
+                GuiHelper.setBackgroundReadable(lblDistance, distance > 0
+                        ? TwoColumnDiff.Item.DiffItemType.CHANGED.getColor()
+                        : Color.WHITE);
                 lblDistance.setText(NavigatableComponent.getDistText(distance));
             } else {
-                GuiHelper.setBackgroundReadable(lblDistance, coord != oppositeCoord ? BGCOLOR_DIFFERENCE : Color.WHITE);
+                GuiHelper.setBackgroundReadable(lblDistance, coord != oppositeCoord
+                        ? TwoColumnDiff.Item.DiffItemType.CHANGED.getColor()
+                        : Color.WHITE);
                 lblDistance.setText(tr("(none)"));
             }
         }
+
+        @Override
+        public void update(Observable o, Object arg) {
+            refresh();
+        }
     }
 }
