From cef710deeff108c7d68e0e9befb7ae8cb349cab5 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 3 Jan 2018 14:19:10 -0500
Subject: [PATCH 01/22] 90 initial commit

---
 buildings_tools/src/buildings_tools/Building.java  | 76 +++++++++++++++++++++-
 .../src/buildings_tools/BuildingSizeDialog.java    | 22 ++++++-
 .../src/buildings_tools/DrawBuildingAction.java    | 63 +++++++++++++-----
 .../src/buildings_tools/ToolSettings.java          | 14 ++++
 4 files changed, 157 insertions(+), 18 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 939db54..ba8918d 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -16,6 +16,7 @@ import java.util.Map.Entry;
 import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.CreateCircleAction;
 import org.openstreetmap.josm.command.AddCommand;
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
@@ -70,7 +71,8 @@ class Building {
     }
 
     public boolean isRectDrawing() {
-        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0;
+        return drawingAngle != null && ToolSettings.getWidth() == 0 && ToolSettings.getLenStep() == 0
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
     public Double getDrawingAngle() {
@@ -265,6 +267,78 @@ class Building {
         return nodes.get(0);
     }
 
+    public Way createCircle() {
+        if (len == 0)
+            return null;
+        final boolean[] created = new boolean[2];
+        final Node[] nodes = new Node[2];
+        for (int i = 0; i < 2; i++) {
+
+            Node n = findNode(en[i]);
+            if (n == null) {
+                nodes[i] = new Node(eastNorth2latlon(en[i]));
+                created[i] = true;
+            } else {
+                nodes[i] = n;
+                created[i] = false;
+            }
+            if (nodes[i].getCoor().isOutSideWorld()) {
+                JOptionPane.showMessageDialog(Main.parent,
+                        tr("Cannot place building outside of the world."));
+                return null;
+            }
+        }
+        Way w = new Way();
+        w.addNode(nodes[0]);
+        w.addNode(nodes[1]);
+
+
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
+        Collection<Command> cmds = new LinkedList<>();
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                ds.addPrimitive(nodes[i]);
+                ds.addSelected(nodes[i]);
+            }
+            // cmds.add(new AddCommand(ds, nodes[i]));
+        }
+        cmds.add(new AddCommand(ds, w));
+        // ds.addPrimitive(w);
+
+        if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
+            Node addrNode = getAddressNode();
+            if (addrNode != null) {
+                for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
+                    w.put(entry.getKey(), entry.getValue());
+                }
+                for (OsmPrimitive p : addrNode.getReferrers()) {
+                    Relation r = (Relation) p;
+                    Relation rnew = new Relation(r);
+                    for (int i = 0; i < r.getMembersCount(); i++) {
+                        RelationMember member = r.getMember(i);
+                        if (addrNode.equals(member.getMember())) {
+                            rnew.removeMember(i);
+                            rnew.addMember(i, new RelationMember(member.getRole(), w));
+                        }
+                    }
+                    cmds.add(new ChangeCommand(r, rnew));
+                }
+                cmds.add(new DeleteCommand(addrNode));
+            }
+        }
+
+        Command c = new SequenceCommand(tr("Create building"), cmds);
+        CreateCircleAction action = new CreateCircleAction();
+        action.setEnabled(true);
+        action.actionPerformed(null);
+        ds.clearSelection();
+        // ds.removePrimitive(w);
+        w = ds.getWays().iterator().next();
+        Main.main.undoRedo.add(c); // this may not undo changes to ds
+
+        return w;
+    }
+
     public Way create() {
         if (len == 0)
             return null;
diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 9d70038..66d929b 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -8,9 +8,11 @@ import java.awt.event.ActionListener;
 import java.text.NumberFormat;
 import java.text.ParseException;
 
+import javax.swing.ButtonGroup;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JFormattedTextField;
+import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.tools.GBC;
 
@@ -21,9 +23,22 @@ public class BuildingSizeDialog extends MyDialog {
     private final JCheckBox caddr = new JCheckBox(tr("Use Address dialog"));
     private final JCheckBox cAutoSelect = new JCheckBox(tr("Auto-select building"));
     private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
+    private final JRadioButton circleRadio = new JRadioButton("Circle");
+    private final JRadioButton rectangleRadio = new JRadioButton("Rectangle");
 
     public BuildingSizeDialog() {
-        super(tr("Set buildings size"));
+        super(tr("Set buildings size and shape"));
+
+        ButtonGroup shapeGroup = new ButtonGroup();
+        shapeGroup.add(circleRadio);
+        shapeGroup.add(rectangleRadio);
+        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            circleRadio.setSelected(true);
+        } else if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            rectangleRadio.setSelected(true);
+        }
+        panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
+        panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
 
         addLabelled(tr("Buildings width:"), twidth);
         addLabelled(tr("Length step:"), tlenstep);
@@ -74,6 +89,11 @@ public class BuildingSizeDialog extends MyDialog {
     }
 
     public final void saveSettings() {
+        if (circleRadio.isSelected()) {
+            ToolSettings.setShape(ToolSettings.Shape.CIRCLE);
+        } else if (rectangleRadio.isSelected()) {
+            ToolSettings.setShape(ToolSettings.Shape.RECTANGLE);
+        }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
         ToolSettings.setAutoSelect(cAutoSelect.isSelected());
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 31ba318..d48628b 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -17,6 +17,7 @@ import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
 import java.awt.geom.GeneralPath;
 import java.awt.image.BufferedImage;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Map.Entry;
@@ -216,15 +217,27 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
     private Mode modeDrawing() {
         EastNorth p = getEastNorth();
-        if (isRectDrawing()) {
-            building.setPlaceRect(p);
-            return shift ? Mode.DrawingAngFix : Mode.None;
-        } else {
-            building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
-            MainApplication.getMap().statusLine.setDist(building.getLength());
-            this.nextMode = ToolSettings.getWidth() == 0 ? Mode.DrawingWidth : Mode.None;
-            return this.nextMode;
-        }
+        // if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            if (isRectDrawing()) {
+                building.setPlaceRect(p);
+                return shift ? Mode.DrawingAngFix : Mode.None;
+            } else {
+                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+                MainApplication.getMap().statusLine.setDist(building.getLength());
+                this.nextMode = ToolSettings.getWidth() == 0 ? Mode.DrawingWidth : Mode.None;
+                return this.nextMode;
+            }
+        // } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()))
+        // {
+        // // Node n1 = new Node();
+        // // Node n2 = new Node();
+        // //
+        // // Way w = new Way(); // Way is Clockwize
+        // // w.setNodes(Arrays.asList(new Node[] { n1, n2 }));
+        // // getLayerManager().getEditDataSet().addPrimitive(w);
+        // }
+
+        // return Mode.None;
     }
 
     private Mode modeDrawingWidth() {
@@ -279,13 +292,27 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
         drawStartPos = mousePos;
 
         Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
-        if (n == null) {
-            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            if (n == null) {
+                building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+            } else {
+                building.setBase(n);
+            }
+            mode = Mode.Drawing;
+            updateStatusLine();
         } else {
-            building.setBase(n);
+            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+            mode = Mode.Drawing;
+            updateStatusLine();
+
+            // Node n1 = new Node();
+            // Node n2 = new Node();
+            //
+            // Way w = new Way(); // Way is Clockwize
+            // w.setNodes(Arrays.asList(new Node[] { n1, n2 }));
+            // getLayerManager().getEditDataSet().addPrimitive(w);
         }
-        mode = Mode.Drawing;
-        updateStatusLine();
     }
 
     private void drawingAdvance(MouseEvent e) {
@@ -300,7 +327,12 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
     private void drawingFinish() {
         if (building.getLength() != 0) {
-            Way w = building.create();
+            Way w;
+            if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+                w = building.create();
+            } else {
+                w = building.createCircle();
+            }
             if (w != null) {
                 if (!alt || ToolSettings.isUsingAddr())
                     for (Entry<String, String> kv : ToolSettings.getTags().entrySet()) {
@@ -421,7 +453,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
                     break;
                 }
             }
-
             building.addAngleSnap(nodes.toArray(new Node[0]));
             for (Way w : ways) {
                 building.addAngleSnap(w);
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index 2e14b4b..8e75862 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -21,12 +21,26 @@ public final class ToolSettings {
     }
 
     public static final BooleanProperty PROP_USE_ADDR_NODE = new BooleanProperty("buildings_tools.addrNode", false);
+
+    public enum Shape {
+            CIRCLE, RECTANGLE
+    }
+
+    private static Shape shape = Shape.RECTANGLE;
     private static double width = 0;
     private static double lenstep = 0;
     private static boolean useAddr;
     private static final Map<String, String> TAGS = new HashMap<>();
     private static boolean autoSelect;
 
+    public static Shape getShape() {
+        return shape;
+    }
+
+    public static void setShape(Shape shape) {
+        ToolSettings.shape = shape;
+    }
+
     public static void setAddrDialog(boolean _useAddr) {
         useAddr = _useAddr;
     }
-- 
2.7.4


From 18d89bfe3c06182e92a7c46db637d2473fc6809b Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 3 Jan 2018 15:37:25 -0500
Subject: [PATCH 02/22] 90 remove nodes used to create circle

---
 buildings_tools/src/buildings_tools/Building.java | 28 +++++++++++++----------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index ba8918d..13e105b 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -8,6 +8,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.geom.GeneralPath;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
@@ -300,10 +301,19 @@ class Building {
                 ds.addPrimitive(nodes[i]);
                 ds.addSelected(nodes[i]);
             }
-            // cmds.add(new AddCommand(ds, nodes[i]));
         }
-        cmds.add(new AddCommand(ds, w));
-        // ds.addPrimitive(w);
+
+        CreateCircleAction action = new CreateCircleAction();
+        action.setEnabled(true);
+        action.actionPerformed(null);
+
+        for (int i = 0; i < 2; i++) {
+            ds.removePrimitive(ds.getSelectedNodes().iterator().next());
+        }
+
+        int lastWayIndex = ds.getWays().size() - 1;
+        List<Object> ways = Arrays.asList(ds.getWays().toArray());
+        w = (Way) ways.get(lastWayIndex);
 
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
             Node addrNode = getAddressNode();
@@ -325,16 +335,10 @@ class Building {
                 }
                 cmds.add(new DeleteCommand(addrNode));
             }
-        }
+            Command c = new SequenceCommand(tr("Create building"), cmds);
 
-        Command c = new SequenceCommand(tr("Create building"), cmds);
-        CreateCircleAction action = new CreateCircleAction();
-        action.setEnabled(true);
-        action.actionPerformed(null);
-        ds.clearSelection();
-        // ds.removePrimitive(w);
-        w = ds.getWays().iterator().next();
-        Main.main.undoRedo.add(c); // this may not undo changes to ds
+            Main.main.undoRedo.add(c);
+        }
 
         return w;
     }
-- 
2.7.4


From aee390012dfa08b83742262195d6cfb86cf6b89b Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 4 Jan 2018 11:38:31 -0500
Subject: [PATCH 03/22] 90 load shape for building tool from preferences

---
 .../src/buildings_tools/BuildingSizeDialog.java            |  2 ++
 buildings_tools/src/buildings_tools/ToolSettings.java      | 14 ++++++++++++++
 2 files changed, 16 insertions(+)

diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 66d929b..3c5cf7c 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -91,8 +91,10 @@ public class BuildingSizeDialog extends MyDialog {
     public final void saveSettings() {
         if (circleRadio.isSelected()) {
             ToolSettings.setShape(ToolSettings.Shape.CIRCLE);
+            ToolSettings.saveShape("CIRCLE");
         } else if (rectangleRadio.isSelected()) {
             ToolSettings.setShape(ToolSettings.Shape.RECTANGLE);
+            ToolSettings.saveShape("RECTANGLE");
         }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index 8e75862..49bd3e5 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -34,6 +34,7 @@ public final class ToolSettings {
     private static boolean autoSelect;
 
     public static Shape getShape() {
+        loadShape();
         return shape;
     }
 
@@ -91,6 +92,19 @@ public final class ToolSettings {
         }
     }
 
+    public static void saveShape(String shape) {
+        Main.pref.put("buildings_tool.shape", shape);
+    }
+
+    private static void loadShape() {
+        String shape = Main.pref.get("buildings_tool.shape");
+        if ("CIRCLE".equals(shape)) {
+            setShape(Shape.CIRCLE);
+        } else if ("RECTANGLE".equals(shape)) {
+            setShape(Shape.RECTANGLE);
+        }
+    }
+
     public static void setBBMode(boolean bbmode) {
         Main.pref.putBoolean("buildings_tools.bbmode", bbmode);
     }
-- 
2.7.4


From 77a5a283951de990f0013f2e7c32d4be064ad035 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 4 Jan 2018 12:27:26 -0500
Subject: [PATCH 04/22] 90 get rid of third click for circle tool. default to
 rectangle if no pref

---
 .../src/buildings_tools/BuildingSizeDialog.java    |  2 +-
 .../src/buildings_tools/DrawBuildingAction.java    | 41 ++++++++--------------
 2 files changed, 15 insertions(+), 28 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 3c5cf7c..a990694 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -34,7 +34,7 @@ public class BuildingSizeDialog extends MyDialog {
         shapeGroup.add(rectangleRadio);
         if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
             circleRadio.setSelected(true);
-        } else if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+        } else {
             rectangleRadio.setSelected(true);
         }
         panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index d48628b..6cfc3c4 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -212,32 +212,26 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     }
 
     private boolean isRectDrawing() {
-        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode());
+        return building.isRectDrawing() && (!shift || ToolSettings.isBBMode())
+                && ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape());
     }
 
     private Mode modeDrawing() {
         EastNorth p = getEastNorth();
-        // if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
-            if (isRectDrawing()) {
+        if (isRectDrawing()) {
                 building.setPlaceRect(p);
                 return shift ? Mode.DrawingAngFix : Mode.None;
-            } else {
-                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
-                MainApplication.getMap().statusLine.setDist(building.getLength());
-                this.nextMode = ToolSettings.getWidth() == 0 ? Mode.DrawingWidth : Mode.None;
-                return this.nextMode;
-            }
-        // } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()))
-        // {
-        // // Node n1 = new Node();
-        // // Node n2 = new Node();
-        // //
-        // // Way w = new Way(); // Way is Clockwize
-        // // w.setNodes(Arrays.asList(new Node[] { n1, n2 }));
-        // // getLayerManager().getEditDataSet().addPrimitive(w);
-        // }
-
-        // return Mode.None;
+        } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            MainApplication.getMap().statusLine.setDist(building.getLength());
+            this.nextMode = Mode.None;
+            return this.nextMode;
+        } else {
+            building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            MainApplication.getMap().statusLine.setDist(building.getLength());
+            this.nextMode = ToolSettings.getWidth() == 0 ? Mode.DrawingWidth : Mode.None;
+            return this.nextMode;
+        }
     }
 
     private Mode modeDrawingWidth() {
@@ -305,13 +299,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
             mode = Mode.Drawing;
             updateStatusLine();
-
-            // Node n1 = new Node();
-            // Node n2 = new Node();
-            //
-            // Way w = new Way(); // Way is Clockwize
-            // w.setNodes(Arrays.asList(new Node[] { n1, n2 }));
-            // getLayerManager().getEditDataSet().addPrimitive(w);
         }
     }
 
-- 
2.7.4


From c5f134559b9732e7331dd6bf8cdde2cd525e7ddc Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 4 Jan 2018 14:50:09 -0500
Subject: [PATCH 05/22] 90 add circle tool diameter and length step

---
 buildings_tools/src/buildings_tools/Building.java           | 11 +++++++++++
 buildings_tools/src/buildings_tools/BuildingSizeDialog.java |  2 +-
 buildings_tools/src/buildings_tools/DrawBuildingAction.java |  6 +++++-
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 13e105b..7b6fb1d 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -175,6 +175,17 @@ class Building {
         }
     }
 
+    public void setPlaceCircle(EastNorth p2, double width, boolean ignoreConstraints) {
+        if (en[0] == null)
+            throw new IllegalStateException("setPlace() called without the base point");
+        this.heading = en[0].heading(p2);
+        if (!ignoreConstraints)
+            this.heading = angleSnap.snapAngle(this.heading);
+        this.len = width;
+
+        updatePos();
+    }
+
     public void setPlaceRect(EastNorth p2) {
         if (en[0] == null)
             throw new IllegalStateException("SetPlaceRect() called without the base point");
diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index a990694..4af02ef 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -40,7 +40,7 @@ public class BuildingSizeDialog extends MyDialog {
         panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
 
-        addLabelled(tr("Buildings width:"), twidth);
+        addLabelled(tr("Buildings width/diameter:"), twidth);
         addLabelled(tr("Length step:"), tlenstep);
         panel.add(caddr, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(cAutoSelect, GBC.eol().fill(GBC.HORIZONTAL));
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 6cfc3c4..ba03177 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -222,7 +222,11 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
                 building.setPlaceRect(p);
                 return shift ? Mode.DrawingAngFix : Mode.None;
         } else if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
-            building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            if (ToolSettings.getWidth() != 0) {
+                building.setPlaceCircle(p, ToolSettings.getWidth(), shift);
+            } else {
+                building.setPlace(p, ToolSettings.getWidth(), ToolSettings.getLenStep(), shift);
+            }
             MainApplication.getMap().statusLine.setDist(building.getLength());
             this.nextMode = Mode.None;
             return this.nextMode;
-- 
2.7.4


From 24b96b37be177551f6b6216e2fa9b9168c7f221e Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 4 Jan 2018 16:32:10 -0500
Subject: [PATCH 06/22] 90  add keyboard shortcuts to switch between rectangle
 and circle buildings

---
 buildings_tools/src/buildings_tools/BuildingSizeDialog.java | 7 +++++--
 buildings_tools/src/buildings_tools/DrawBuildingAction.java | 7 ++++++-
 buildings_tools/src/buildings_tools/ToolSettings.java       | 4 ++--
 3 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 4af02ef..1a1d776 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -29,6 +29,9 @@ public class BuildingSizeDialog extends MyDialog {
     public BuildingSizeDialog() {
         super(tr("Set buildings size and shape"));
 
+        circleRadio.setToolTipText("Press 'O' when creating building");
+        rectangleRadio.setToolTipText("Press 'Q' when creating building");
+
         ButtonGroup shapeGroup = new ButtonGroup();
         shapeGroup.add(circleRadio);
         shapeGroup.add(rectangleRadio);
@@ -91,10 +94,10 @@ public class BuildingSizeDialog extends MyDialog {
     public final void saveSettings() {
         if (circleRadio.isSelected()) {
             ToolSettings.setShape(ToolSettings.Shape.CIRCLE);
-            ToolSettings.saveShape("CIRCLE");
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE.name());
         } else if (rectangleRadio.isSelected()) {
             ToolSettings.setShape(ToolSettings.Shape.RECTANGLE);
-            ToolSettings.saveShape("RECTANGLE");
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE.name());
         }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index ba03177..263a404 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -191,6 +191,12 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
             cancelDrawing();
         }
+        if (e.getKeyCode() == KeyEvent.VK_O) {
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE.name());
+        }
+        if (e.getKeyCode() == KeyEvent.VK_Q) {
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE.name());
+        }
     }
 
     @Override
@@ -258,7 +264,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             nextMode = Mode.None;
             return;
         }
-
         if (mode == Mode.Drawing) {
             nextMode = modeDrawing();
         } else if (mode == Mode.DrawingWidth) {
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index 49bd3e5..141355f 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -98,9 +98,9 @@ public final class ToolSettings {
 
     private static void loadShape() {
         String shape = Main.pref.get("buildings_tool.shape");
-        if ("CIRCLE".equals(shape)) {
+        if (ToolSettings.Shape.CIRCLE.name().equals(shape)) {
             setShape(Shape.CIRCLE);
-        } else if ("RECTANGLE".equals(shape)) {
+        } else if (ToolSettings.Shape.RECTANGLE.name().equals(shape)) {
             setShape(Shape.RECTANGLE);
         }
     }
-- 
2.7.4


From 0335cda56b42dfcc4ef733fc0e6a71b32ec1927b Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 4 Jan 2018 17:15:01 -0500
Subject: [PATCH 07/22] 90 do not remove original nodes, clear selection
 instead

---
 buildings_tools/src/buildings_tools/Building.java | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 7b6fb1d..0b28089 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -318,9 +318,7 @@ class Building {
         action.setEnabled(true);
         action.actionPerformed(null);
 
-        for (int i = 0; i < 2; i++) {
-            ds.removePrimitive(ds.getSelectedNodes().iterator().next());
-        }
+        ds.clearSelection();
 
         int lastWayIndex = ds.getWays().size() - 1;
         List<Object> ways = Arrays.asList(ds.getWays().toArray());
-- 
2.7.4


From db1d07c056a9ed8cc9cd8296356fcb44a12b5b1c Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 5 Jan 2018 11:13:44 -0500
Subject: [PATCH 08/22] 90  change check in drawingFInish, length might be 0 if
 circle

---
 buildings_tools/src/buildings_tools/DrawBuildingAction.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 263a404..49425a8 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -322,7 +322,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     }
 
     private void drawingFinish() {
-        if (building.getLength() != 0) {
+        if (building.getLength() != 0 || ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
             Way w;
             if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
                 w = building.create();
-- 
2.7.4


From 9b941924df1ca00e2fde2e30965308ec40568363 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 5 Jan 2018 11:41:44 -0500
Subject: [PATCH 09/22] 90 add rectangle conditions where actions NA for
 cirlce.  remove circle check since circles have len too

---
 buildings_tools/src/buildings_tools/Building.java   | 21 ++++++++++++---------
 .../src/buildings_tools/DrawBuildingAction.java     |  2 +-
 2 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 0b28089..1f04e77 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -133,10 +133,12 @@ class Building {
             return;
         final EastNorth p1 = en[0];
         en[1] = new EastNorth(p1.east() + Math.sin(heading) * len * meter, p1.north() + Math.cos(heading) * len * meter);
-        en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
-                p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
-        en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
-                p1.north() - Math.sin(heading) * width * meter);
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            en[2] = new EastNorth(p1.east() + Math.sin(heading) * len * meter + Math.cos(heading) * width * meter,
+                    p1.north() + Math.cos(heading) * len * meter - Math.sin(heading) * width * meter);
+            en[3] = new EastNorth(p1.east() + Math.cos(heading) * width * meter,
+                    p1.north() - Math.sin(heading) * width * meter);
+        }
     }
 
     public void setLengthWidth(double length, double width) {
@@ -212,13 +214,14 @@ class Building {
         GeneralPath b = new GeneralPath();
         Point pp1 = mv.getPoint(eastNorth2latlon(en[0]));
         Point pp2 = mv.getPoint(eastNorth2latlon(en[1]));
-        Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
-        Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
-
         b.moveTo(pp1.x, pp1.y);
         b.lineTo(pp2.x, pp2.y);
-        b.lineTo(pp3.x, pp3.y);
-        b.lineTo(pp4.x, pp4.y);
+        if(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())){
+            Point pp3 = mv.getPoint(eastNorth2latlon(en[2]));
+            Point pp4 = mv.getPoint(eastNorth2latlon(en[3]));
+            b.lineTo(pp3.x, pp3.y);
+            b.lineTo(pp4.x, pp4.y);
+        }
         b.lineTo(pp1.x, pp1.y);
         g.draw(b);
     }
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 49425a8..263a404 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -322,7 +322,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     }
 
     private void drawingFinish() {
-        if (building.getLength() != 0 || ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+        if (building.getLength() != 0) {
             Way w;
             if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
                 w = building.create();
-- 
2.7.4


From f95675f32a2ff9e0acaaa98b1ad2bf2d71c55574 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 5 Jan 2018 13:58:26 -0500
Subject: [PATCH 10/22] 90 group undo of adding nodes

---
 buildings_tools/src/buildings_tools/Building.java | 25 +++++++++++++++++------
 1 file changed, 19 insertions(+), 6 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 1f04e77..66ccb68 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -309,10 +309,22 @@ class Building {
 
 
         DataSet ds = MainApplication.getLayerManager().getEditDataSet();
-        Collection<Command> cmds = new LinkedList<>();
+        Collection<Command> addNodesCmd = new LinkedList<>();
+
+        for (int i = 0; i < 2; i++) {
+            if (created[i]) {
+                AddCommand addNode = new AddCommand(ds, nodes[i]);
+                addNodesCmd.add(addNode);
+            }
+        }
+
+        if (addNodesCmd.size() > 0) {
+            Command addNodes = new SequenceCommand(tr("Add nodes for building"), addNodesCmd);
+            Main.main.undoRedo.add(addNodes);
+        }
+
         for (int i = 0; i < 2; i++) {
             if (created[i]) {
-                ds.addPrimitive(nodes[i]);
                 ds.addSelected(nodes[i]);
             }
         }
@@ -328,6 +340,8 @@ class Building {
         w = (Way) ways.get(lastWayIndex);
 
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
+            Collection<Command> addressCmds = new LinkedList<>();
+
             Node addrNode = getAddressNode();
             if (addrNode != null) {
                 for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
@@ -343,12 +357,11 @@ class Building {
                             rnew.addMember(i, new RelationMember(member.getRole(), w));
                         }
                     }
-                    cmds.add(new ChangeCommand(r, rnew));
+                    addressCmds.add(new ChangeCommand(r, rnew));
                 }
-                cmds.add(new DeleteCommand(addrNode));
+                addressCmds.add(new DeleteCommand(addrNode));
             }
-            Command c = new SequenceCommand(tr("Create building"), cmds);
-
+            Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
             Main.main.undoRedo.add(c);
         }
 
-- 
2.7.4


From 550cdfa62732b34b3f90a174a2589bbecf17eae2 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 5 Jan 2018 14:34:37 -0500
Subject: [PATCH 11/22] 90 add conditional for rectangle in getAddressNode

---
 buildings_tools/src/buildings_tools/Building.java | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 66ccb68..a506faa 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -250,8 +250,10 @@ class Building {
      */
     private Node getAddressNode() {
         BBox bbox = new BBox(eastNorth2latlon(en[0]), eastNorth2latlon(en[1]));
-        bbox.add(eastNorth2latlon(en[2]));
-        bbox.add(eastNorth2latlon(en[3]));
+        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+            bbox.add(eastNorth2latlon(en[2]));
+            bbox.add(eastNorth2latlon(en[3]));
+        }
         List<Node> nodes = new LinkedList<>();
         nodesloop:
         for (Node n : MainApplication.getLayerManager().getEditDataSet().searchNodes(bbox)) {
-- 
2.7.4


From b89c763088b655113f480e9c7779b4b20079e300 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 5 Jan 2018 14:38:49 -0500
Subject: [PATCH 12/22] 90 move where address node commands added

---
 buildings_tools/src/buildings_tools/Building.java | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index a506faa..1f0da89 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -342,10 +342,11 @@ class Building {
         w = (Way) ways.get(lastWayIndex);
 
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
-            Collection<Command> addressCmds = new LinkedList<>();
 
             Node addrNode = getAddressNode();
             if (addrNode != null) {
+                Collection<Command> addressCmds = new LinkedList<>();
+
                 for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
                     w.put(entry.getKey(), entry.getValue());
                 }
@@ -362,9 +363,9 @@ class Building {
                     addressCmds.add(new ChangeCommand(r, rnew));
                 }
                 addressCmds.add(new DeleteCommand(addrNode));
+                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
+                Main.main.undoRedo.add(c);
             }
-            Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
-            Main.main.undoRedo.add(c);
         }
 
         return w;
-- 
2.7.4


From f0d489d5259a60814416bfa1f7b6f3378a88f5ee Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Tue, 9 Jan 2018 13:27:56 -0500
Subject: [PATCH 13/22] 90 clear selected to create circle, keep selected after
 created

---
 buildings_tools/src/buildings_tools/Building.java | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 1f0da89..2d34d91 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -285,6 +285,10 @@ class Building {
     }
 
     public Way createCircle() {
+        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
+        Collection<OsmPrimitive> selectedPrimitives = ds.getAllSelected();
+        ds.clearSelection();
+
         if (len == 0)
             return null;
         final boolean[] created = new boolean[2];
@@ -310,7 +314,6 @@ class Building {
         w.addNode(nodes[1]);
 
 
-        DataSet ds = MainApplication.getLayerManager().getEditDataSet();
         Collection<Command> addNodesCmd = new LinkedList<>();
 
         for (int i = 0; i < 2; i++) {
@@ -336,6 +339,7 @@ class Building {
         action.actionPerformed(null);
 
         ds.clearSelection();
+        ds.addSelected(selectedPrimitives);
 
         int lastWayIndex = ds.getWays().size() - 1;
         List<Object> ways = Arrays.asList(ds.getWays().toArray());
-- 
2.7.4


From 190afccdeded2a041c4e1c213227f32e32879877 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Tue, 9 Jan 2018 15:48:05 -0500
Subject: [PATCH 14/22] 90 add shift to shortcut for shape

---
 buildings_tools/src/buildings_tools/DrawBuildingAction.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 263a404..751dd4c 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -191,10 +191,11 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
             cancelDrawing();
         }
-        if (e.getKeyCode() == KeyEvent.VK_O) {
+
+        if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_C) {
             ToolSettings.saveShape(ToolSettings.Shape.CIRCLE.name());
         }
-        if (e.getKeyCode() == KeyEvent.VK_Q) {
+        if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_R) {
             ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE.name());
         }
     }
-- 
2.7.4


From 9fc8f653f408dd8c291e496ee7cb9756781bbe41 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 10 Jan 2018 12:43:39 -0500
Subject: [PATCH 15/22] 90 sort list of ways so always gets latest after circle
 created

---
 buildings_tools/src/buildings_tools/Building.java | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 2d34d91..f2ff02e 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -8,8 +8,11 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import java.awt.Graphics2D;
 import java.awt.Point;
 import java.awt.geom.GeneralPath;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map.Entry;
@@ -342,8 +345,18 @@ class Building {
         ds.addSelected(selectedPrimitives);
 
         int lastWayIndex = ds.getWays().size() - 1;
-        List<Object> ways = Arrays.asList(ds.getWays().toArray());
-        w = (Way) ways.get(lastWayIndex);
+
+        List<Way> ways = new ArrayList(ds.getWays());
+        Comparator<Way> comparator = new Comparator<Way>() {
+            @Override
+            public int compare(Way left, Way right) {
+                return Long.compare(right.getUniqueId(), left.getUniqueId());
+            }
+        };
+
+        Collections.sort(ways, comparator);
+
+        w = ways.get(lastWayIndex);
 
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
 
-- 
2.7.4


From d0dbc1539de2cfbd57e7f6c0e733225222c46f07 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 10 Jan 2018 13:40:29 -0500
Subject: [PATCH 16/22] 90 break out address logic, rename create

---
 buildings_tools/src/buildings_tools/Building.java  | 54 ++++++++--------------
 .../src/buildings_tools/DrawBuildingAction.java    |  2 +-
 2 files changed, 19 insertions(+), 37 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index f2ff02e..6337337 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -316,7 +316,6 @@ class Building {
         w.addNode(nodes[0]);
         w.addNode(nodes[1]);
 
-
         Collection<Command> addNodesCmd = new LinkedList<>();
 
         for (int i = 0; i < 2; i++) {
@@ -331,6 +330,7 @@ class Building {
             Main.main.undoRedo.add(addNodes);
         }
 
+        // Nodes must be selected for create circle action
         for (int i = 0; i < 2; i++) {
             if (created[i]) {
                 ds.addSelected(nodes[i]);
@@ -345,7 +345,6 @@ class Building {
         ds.addSelected(selectedPrimitives);
 
         int lastWayIndex = ds.getWays().size() - 1;
-
         List<Way> ways = new ArrayList(ds.getWays());
         Comparator<Way> comparator = new Comparator<Way>() {
             @Override
@@ -353,42 +352,15 @@ class Building {
                 return Long.compare(right.getUniqueId(), left.getUniqueId());
             }
         };
-
         Collections.sort(ways, comparator);
-
         w = ways.get(lastWayIndex);
 
-        if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
-
-            Node addrNode = getAddressNode();
-            if (addrNode != null) {
-                Collection<Command> addressCmds = new LinkedList<>();
-
-                for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
-                    w.put(entry.getKey(), entry.getValue());
-                }
-                for (OsmPrimitive p : addrNode.getReferrers()) {
-                    Relation r = (Relation) p;
-                    Relation rnew = new Relation(r);
-                    for (int i = 0; i < r.getMembersCount(); i++) {
-                        RelationMember member = r.getMember(i);
-                        if (addrNode.equals(member.getMember())) {
-                            rnew.removeMember(i);
-                            rnew.addMember(i, new RelationMember(member.getRole(), w));
-                        }
-                    }
-                    addressCmds.add(new ChangeCommand(r, rnew));
-                }
-                addressCmds.add(new DeleteCommand(addrNode));
-                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
-                Main.main.undoRedo.add(c);
-            }
-        }
+        addAddress(w);
 
         return w;
     }
 
-    public Way create() {
+    public Way createRectangle() {
         if (len == 0)
             return null;
         final boolean[] created = new boolean[4];
@@ -429,9 +401,20 @@ class Building {
         }
         cmds.add(new AddCommand(ds, w));
 
+        addAddress(w);
+
+        Command c = new SequenceCommand(tr("Create building"), cmds);
+        Main.main.undoRedo.add(c);
+        return w;
+    }
+
+    private void addAddress(Way w) {
         if (ToolSettings.PROP_USE_ADDR_NODE.get()) {
+
             Node addrNode = getAddressNode();
             if (addrNode != null) {
+                Collection<Command> addressCmds = new LinkedList<>();
+
                 for (Entry<String, String> entry : addrNode.getKeys().entrySet()) {
                     w.put(entry.getKey(), entry.getValue());
                 }
@@ -445,13 +428,12 @@ class Building {
                             rnew.addMember(i, new RelationMember(member.getRole(), w));
                         }
                     }
-                    cmds.add(new ChangeCommand(r, rnew));
+                    addressCmds.add(new ChangeCommand(r, rnew));
                 }
-                cmds.add(new DeleteCommand(addrNode));
+                addressCmds.add(new DeleteCommand(addrNode));
+                Command c = new SequenceCommand(tr("Add address for building"), addressCmds);
+                Main.main.undoRedo.add(c);
             }
         }
-        Command c = new SequenceCommand(tr("Create building"), cmds);
-        Main.main.undoRedo.add(c);
-        return w;
     }
 }
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 751dd4c..ad1788e 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -326,7 +326,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
         if (building.getLength() != 0) {
             Way w;
             if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
-                w = building.create();
+                w = building.createRectangle();
             } else {
                 w = building.createCircle();
             }
-- 
2.7.4


From 78ff8459e1c33fe0960dd2aa0308ed7326554edc Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 10 Jan 2018 14:04:15 -0500
Subject: [PATCH 17/22] 90 update building size dialog tooltip, default to
 rectangle if no pref

---
 buildings_tools/src/buildings_tools/BuildingSizeDialog.java | 12 +++++-------
 buildings_tools/src/buildings_tools/ToolSettings.java       |  2 ++
 2 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 1a1d776..88e506b 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -29,17 +29,15 @@ public class BuildingSizeDialog extends MyDialog {
     public BuildingSizeDialog() {
         super(tr("Set buildings size and shape"));
 
-        circleRadio.setToolTipText("Press 'O' when creating building");
-        rectangleRadio.setToolTipText("Press 'Q' when creating building");
+        circleRadio.setToolTipText("Press SHIFT + 'C' when creating building");
+        rectangleRadio.setToolTipText("Press SHIFT + 'R' when creating building");
 
         ButtonGroup shapeGroup = new ButtonGroup();
         shapeGroup.add(circleRadio);
         shapeGroup.add(rectangleRadio);
-        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
-            circleRadio.setSelected(true);
-        } else {
-            rectangleRadio.setSelected(true);
-        }
+        circleRadio.setSelected(ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape()));
+        rectangleRadio.setSelected(ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape()));
+
         panel.add(rectangleRadio, GBC.eol().fill(GBC.HORIZONTAL));
         panel.add(circleRadio, GBC.eol().fill(GBC.HORIZONTAL));
 
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index 141355f..eacfb9f 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -102,6 +102,8 @@ public final class ToolSettings {
             setShape(Shape.CIRCLE);
         } else if (ToolSettings.Shape.RECTANGLE.name().equals(shape)) {
             setShape(Shape.RECTANGLE);
+        } else {
+            setShape(Shape.RECTANGLE);
         }
     }
 
-- 
2.7.4


From 9dfa9cfd3fc177105bab9d8930ffbf1f8dff3355 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Wed, 10 Jan 2018 14:10:23 -0500
Subject: [PATCH 18/22] 90 change tool tip text to match button

---
 buildings_tools/src/buildings_tools/BuildingSizeDialog.java | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 88e506b..2771394 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -29,8 +29,8 @@ public class BuildingSizeDialog extends MyDialog {
     public BuildingSizeDialog() {
         super(tr("Set buildings size and shape"));
 
-        circleRadio.setToolTipText("Press SHIFT + 'C' when creating building");
-        rectangleRadio.setToolTipText("Press SHIFT + 'R' when creating building");
+        circleRadio.setToolTipText("Press SHIFT + 'C' when drawing building");
+        rectangleRadio.setToolTipText("Press SHIFT + 'R' when drawing building");
 
         ButtonGroup shapeGroup = new ButtonGroup();
         shapeGroup.add(circleRadio);
-- 
2.7.4


From 545b7a11f0ba77f06fdd6ae8329800e65ded4fc1 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 11 Jan 2018 11:36:44 -0500
Subject: [PATCH 19/22] 90 code cleanup

---
 buildings_tools/src/buildings_tools/Building.java  | 13 ++++-------
 .../src/buildings_tools/BuildingSizeDialog.java    |  6 ++---
 .../src/buildings_tools/DrawBuildingAction.java    | 26 +++++++++-------------
 .../src/buildings_tools/ToolSettings.java          | 20 +++++++----------
 4 files changed, 25 insertions(+), 40 deletions(-)

diff --git a/buildings_tools/src/buildings_tools/Building.java b/buildings_tools/src/buildings_tools/Building.java
index 6337337..eff21d1 100644
--- a/buildings_tools/src/buildings_tools/Building.java
+++ b/buildings_tools/src/buildings_tools/Building.java
@@ -344,16 +344,11 @@ class Building {
         ds.clearSelection();
         ds.addSelected(selectedPrimitives);
 
-        int lastWayIndex = ds.getWays().size() - 1;
+        // get the way with the smallest id with the assumption that it is
+        // newest way created by CreateCirclAction
         List<Way> ways = new ArrayList(ds.getWays());
-        Comparator<Way> comparator = new Comparator<Way>() {
-            @Override
-            public int compare(Way left, Way right) {
-                return Long.compare(right.getUniqueId(), left.getUniqueId());
-            }
-        };
-        Collections.sort(ways, comparator);
-        w = ways.get(lastWayIndex);
+        Collections.sort(ways);
+        w = ways.get(0);
 
         addAddress(w);
 
diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index 2771394..cc54304 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -91,11 +91,9 @@ public class BuildingSizeDialog extends MyDialog {
 
     public final void saveSettings() {
         if (circleRadio.isSelected()) {
-            ToolSettings.setShape(ToolSettings.Shape.CIRCLE);
-            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE.name());
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
         } else if (rectangleRadio.isSelected()) {
-            ToolSettings.setShape(ToolSettings.Shape.RECTANGLE);
-            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE.name());
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
         }
         ToolSettings.setSizes(width(), lenstep());
         ToolSettings.setAddrDialog(useAddr());
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index ad1788e..f04514f 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -193,10 +193,10 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
         }
 
         if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_C) {
-            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE.name());
+            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
         }
         if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_R) {
-            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE.name());
+            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
         }
     }
 
@@ -294,22 +294,18 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     private void drawingStart(MouseEvent e) {
         mousePos = e.getPoint();
         drawStartPos = mousePos;
-
-        Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
-
-        if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
+        if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
+        } else {
+            Node n = MainApplication.getMap().mapView.getNearestNode(mousePos, OsmPrimitive::isUsable);
             if (n == null) {
                 building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
             } else {
                 building.setBase(n);
             }
-            mode = Mode.Drawing;
-            updateStatusLine();
-        } else {
-            building.setBase(latlon2eastNorth(MainApplication.getMap().mapView.getLatLon(mousePos.x, mousePos.y)));
-            mode = Mode.Drawing;
-            updateStatusLine();
         }
+        mode = Mode.Drawing;
+        updateStatusLine();
     }
 
     private void drawingAdvance(MouseEvent e) {
@@ -325,10 +321,10 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
     private void drawingFinish() {
         if (building.getLength() != 0) {
             Way w;
-            if (ToolSettings.Shape.RECTANGLE.equals(ToolSettings.getShape())) {
-                w = building.createRectangle();
-            } else {
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
                 w = building.createCircle();
+            } else {
+                w = building.createRectangle();
             }
             if (w != null) {
                 if (!alt || ToolSettings.isUsingAddr())
diff --git a/buildings_tools/src/buildings_tools/ToolSettings.java b/buildings_tools/src/buildings_tools/ToolSettings.java
index eacfb9f..07c461a 100644
--- a/buildings_tools/src/buildings_tools/ToolSettings.java
+++ b/buildings_tools/src/buildings_tools/ToolSettings.java
@@ -26,7 +26,7 @@ public final class ToolSettings {
             CIRCLE, RECTANGLE
     }
 
-    private static Shape shape = Shape.RECTANGLE;
+    private static Shape shape = loadShape();
     private static double width = 0;
     private static double lenstep = 0;
     private static boolean useAddr;
@@ -38,10 +38,6 @@ public final class ToolSettings {
         return shape;
     }
 
-    public static void setShape(Shape shape) {
-        ToolSettings.shape = shape;
-    }
-
     public static void setAddrDialog(boolean _useAddr) {
         useAddr = _useAddr;
     }
@@ -92,18 +88,18 @@ public final class ToolSettings {
         }
     }
 
-    public static void saveShape(String shape) {
-        Main.pref.put("buildings_tool.shape", shape);
+    public static void saveShape(Shape shape) {
+        Main.pref.put("buildings_tool.shape", shape.name());
     }
 
-    private static void loadShape() {
+    private static Shape loadShape() {
         String shape = Main.pref.get("buildings_tool.shape");
         if (ToolSettings.Shape.CIRCLE.name().equals(shape)) {
-            setShape(Shape.CIRCLE);
-        } else if (ToolSettings.Shape.RECTANGLE.name().equals(shape)) {
-            setShape(Shape.RECTANGLE);
+            ToolSettings.shape = Shape.CIRCLE;
+            return Shape.CIRCLE;
         } else {
-            setShape(Shape.RECTANGLE);
+            ToolSettings.shape = Shape.RECTANGLE;
+            return (Shape.RECTANGLE);
         }
     }
 
-- 
2.7.4


From 74d85c7d0a718269f4f57d12afb554cf936245fc Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Thu, 11 Jan 2018 17:22:32 -0500
Subject: [PATCH 20/22] 90 add actions for shortcuts

---
 .../src/buildings_tools/BuildingCircleAction.java  | 27 ++++++++++++++++++++++
 .../buildings_tools/BuildingRectangleAction.java   | 27 ++++++++++++++++++++++
 .../src/buildings_tools/BuildingSizeDialog.java    |  9 ++++----
 .../src/buildings_tools/BuildingsToolsPlugin.java  |  3 +++
 .../src/buildings_tools/DrawBuildingAction.java    |  6 -----
 5 files changed, 61 insertions(+), 11 deletions(-)
 create mode 100644 buildings_tools/src/buildings_tools/BuildingCircleAction.java
 create mode 100644 buildings_tools/src/buildings_tools/BuildingRectangleAction.java

diff --git a/buildings_tools/src/buildings_tools/BuildingCircleAction.java b/buildings_tools/src/buildings_tools/BuildingCircleAction.java
new file mode 100644
index 0000000..52281b4
--- /dev/null
+++ b/buildings_tools/src/buildings_tools/BuildingCircleAction.java
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingCircleAction extends JosmAction {
+
+    public BuildingCircleAction() {
+        super(tr("Set building shape to circle"), "mapmode/building", tr("Set buildings shape to circle"),
+                Shortcut.registerShortcut("buildings_tools:circle",
+                        tr("Data: {0}", tr("Set buildings shape to circle")),
+                        KeyEvent.VK_C, Shortcut.SHIFT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
+    }
+}
diff --git a/buildings_tools/src/buildings_tools/BuildingRectangleAction.java b/buildings_tools/src/buildings_tools/BuildingRectangleAction.java
new file mode 100644
index 0000000..680a47c
--- /dev/null
+++ b/buildings_tools/src/buildings_tools/BuildingRectangleAction.java
@@ -0,0 +1,27 @@
+// License: GPL. For details, see LICENSE file.
+package buildings_tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.tools.Shortcut;
+
+@SuppressWarnings("serial")
+public class BuildingRectangleAction extends JosmAction {
+
+    public BuildingRectangleAction() {
+        super(tr("Set building shape to rectangle"), "mapmode/building", tr("Set buildings shape to rectangle"),
+                Shortcut.registerShortcut("buildings_tools:rectangle",
+                        tr("Data: {0}", tr("Set buildings shape to rectangle")),
+                        KeyEvent.VK_R, Shortcut.SHIFT),
+                true);
+    }
+
+    @Override
+    public void actionPerformed(ActionEvent arg0) {
+        ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
+    }
+}
diff --git a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
index cc54304..b6ddb09 100644
--- a/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
+++ b/buildings_tools/src/buildings_tools/BuildingSizeDialog.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
 import java.text.NumberFormat;
 import java.text.ParseException;
 
@@ -15,6 +16,7 @@ import javax.swing.JFormattedTextField;
 import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Shortcut;
 
 @SuppressWarnings("serial")
 public class BuildingSizeDialog extends MyDialog {
@@ -23,15 +25,12 @@ public class BuildingSizeDialog extends MyDialog {
     private final JCheckBox caddr = new JCheckBox(tr("Use Address dialog"));
     private final JCheckBox cAutoSelect = new JCheckBox(tr("Auto-select building"));
     private final JCheckBox cAddrNode = new JCheckBox(tr("Use address nodes under buildings"));
-    private final JRadioButton circleRadio = new JRadioButton("Circle");
-    private final JRadioButton rectangleRadio = new JRadioButton("Rectangle");
+    private final JRadioButton circleRadio = new JRadioButton(tr("Circle"));
+    private final JRadioButton rectangleRadio = new JRadioButton(tr("Rectangle"));
 
     public BuildingSizeDialog() {
         super(tr("Set buildings size and shape"));
 
-        circleRadio.setToolTipText("Press SHIFT + 'C' when drawing building");
-        rectangleRadio.setToolTipText("Press SHIFT + 'R' when drawing building");
-
         ButtonGroup shapeGroup = new ButtonGroup();
         shapeGroup.add(circleRadio);
         shapeGroup.add(rectangleRadio);
diff --git a/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java b/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
index d74056f..1b62ceb 100644
--- a/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
+++ b/buildings_tools/src/buildings_tools/BuildingsToolsPlugin.java
@@ -29,7 +29,10 @@ public class BuildingsToolsPlugin extends Plugin {
         super(info);
         JMenu dataMenu = MainApplication.getMenu().dataMenu;
         MainMenu.add(dataMenu, new BuildingSizeAction());
+        MainMenu.add(dataMenu, new BuildingCircleAction());
+        MainMenu.add(dataMenu, new BuildingRectangleAction());
         MainMenu.add(dataMenu, new MergeAddrPointsAction());
+
     }
 
     @Override
diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index f04514f..5a48202 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -192,12 +192,6 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             cancelDrawing();
         }
 
-        if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_C) {
-            ToolSettings.saveShape(ToolSettings.Shape.CIRCLE);
-        }
-        if (e.isShiftDown() && e.getKeyCode() == KeyEvent.VK_R) {
-            ToolSettings.saveShape(ToolSettings.Shape.RECTANGLE);
-        }
     }
 
     @Override
-- 
2.7.4


From d7834529e4e8d6711a633d077b84c9d619b1b932 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 12 Jan 2018 12:45:39 -0500
Subject: [PATCH 21/22] 90: cursor changes on shape change

---
 buildings_tools/images/cursor/modifier/silo.png           | Bin 0 -> 594 bytes
 .../src/buildings_tools/DrawBuildingAction.java           |  10 +++++++---
 2 files changed, 7 insertions(+), 3 deletions(-)
 create mode 100644 buildings_tools/images/cursor/modifier/silo.png

diff --git a/buildings_tools/images/cursor/modifier/silo.png b/buildings_tools/images/cursor/modifier/silo.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ac6200e68f75e41e2adf07053e33f500283c158
GIT binary patch
literal 594
zcmV-Y0<HatP)<h;3K|Lk000e1NJLTq000pH000pP1^@s7Olo&*00004XF*Lt006O%
z3;baP00006VoOIv00000008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru
z;sFd1BmsNno>l+=0nbT9K~y-)tyH^?+CUUNGwg0`*=tNl<d_x=6j%xcMe+w!NKm^;
zL%|pD4@CI{A|W~`B5H)_s1iXMDufWiLfX{?K~Uty+%&tZtXW5!$LZ$YbIyItXn-I(
zoz4|P!7R(NIp=|}VHl<mf(*lW1ppiXG);Ta@At2DU4I$wIG@iqLI?tYGXQWL=Q5kk
z9`1cO=L}CmsZ{cZ!{K$MQaSz_zi-#FEL#Y{*XuP!qftMT$=D|(0PuYuoO47X5j^Uo
zs_I^rWk`}ljYh*$6lIUU!Q0VjB#7t$;LS<4-EPxnvmqe_wOTDY=_8#^V>}*vx~}8m
z;=(&25D}Wq<_-WDW9-p!N2AeYu=E2$wOZYW5@cD1ZQIWPAdyI%<9{Fy;6pN*`~=`V
zfaiZAmh1KU7sqj~dcEFmu~>L?i(0Mr8GsxVoCO1>X{IDedR-_KZiEn#!C*kDs$#WT
z9pdqL-ZagW>$+b<H+K6-P%IYF?RL+n(<u~1`BpBMF_}z|%jIq~O~Y^3{vg3Q^7;Ia
zr_3K}LPXeZxAe~@%jMF)JA0mY4E->IH^UhFm`bG#*LBG-4Dvkh7>mUsj4`&`?J%3o
g)<pCU!1p`RPr2N%D=;mnzW@LL07*qoM6N<$g2~(a9{>OV

literal 0
HcmV?d00001

diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 5a48202..958d248 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -78,7 +78,11 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
 
     private static Cursor getCursor() {
         try {
-            return ImageProvider.getCursor("crosshair", "building");
+            if (ToolSettings.Shape.CIRCLE.equals(ToolSettings.getShape())) {
+                return ImageProvider.getCursor("crosshair", "silo");
+            }else{
+                return ImageProvider.getCursor("crosshair", "building");
+            }
         } catch (Exception e) {
             Logging.error(e);
         }
@@ -90,7 +94,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
      *
      * @param c One of the available cursors
      */
-    private void setCursor(final Cursor c) {
+    public void setCursor(final Cursor c) {
         if (currCursor.equals(c))
             return;
         try {
@@ -390,7 +394,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
             if (customCursor != null && (!ctrl || isRectDrawing()))
                 setCursor(customCursor);
             else
-                setCursor(cursorCrosshair);
+                setCursor(getCursor());
         }
 
     }
-- 
2.7.4


From 34f58de95b5b915f338855d7bce04c54904031f7 Mon Sep 17 00:00:00 2001
From: Clarisse Abalos <samantha.abalos@digitalglobe.com>
Date: Fri, 12 Jan 2018 12:46:56 -0500
Subject: [PATCH 22/22] 90 keep setCursor private

---
 buildings_tools/src/buildings_tools/DrawBuildingAction.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/buildings_tools/src/buildings_tools/DrawBuildingAction.java b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
index 958d248..8099276 100644
--- a/buildings_tools/src/buildings_tools/DrawBuildingAction.java
+++ b/buildings_tools/src/buildings_tools/DrawBuildingAction.java
@@ -94,7 +94,7 @@ public class DrawBuildingAction extends MapMode implements MapViewPaintable, Sel
      *
      * @param c One of the available cursors
      */
-    public void setCursor(final Cursor c) {
+    private void setCursor(final Cursor c) {
         if (currCursor.equals(c))
             return;
         try {
-- 
2.7.4

