Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 4802)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 4803)
@@ -22,4 +22,5 @@
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
 import java.awt.geom.GeneralPath;
 import java.util.ArrayList;
@@ -39,5 +40,5 @@
 import javax.swing.JOptionPane;
 
-import javax.swing.SwingUtilities;
+import javax.swing.JPopupMenu;
 import javax.swing.Timer;
 import org.openstreetmap.josm.Main;
@@ -63,4 +64,5 @@
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Pair;
@@ -157,5 +159,5 @@
 
         });
-        
+       Main.map.statusLine.getAnglePanel().addMouseListener(snapHelper.anglePopupListener);
         backspaceShortcut = Shortcut.registerShortcut("mapmode:backspace", tr("Backspace in Add mode"), KeyEvent.VK_BACK_SPACE, Shortcut.GROUP_EDIT);
         Main.registerActionShortcut(new BackSpaceAction(), backspaceShortcut);
@@ -183,4 +185,5 @@
         snapHelper.unsetFixedMode();
         snapCheckboxMenuItem.getAction().setEnabled(false);
+        Main.map.statusLine.getAnglePanel().removeMouseListener(snapHelper.anglePopupListener);
         
         removeHighlighting();
@@ -717,7 +720,5 @@
         mouseOnExistingWays = new HashSet<Way>();
 
-        Main.map.statusLine.setAngle(-1);
-        Main.map.statusLine.setHeading(-1);
-        Main.map.statusLine.setDist(-1);
+        showStausInfo(-1, -1, -1);
 
         if (!ctrl && mousePos != null) {
@@ -750,7 +751,4 @@
             return; // Don't create zero length way segments.
 
-        // find out the distance, in metres, between the base point and the mouse cursor
-        LatLon mouseLatLon = mv.getProjection().eastNorth2latlon(currentMouseEastNorth);
-        distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon);
 
         double hdg = Math.toDegrees(currentBaseNode.getEastNorth()
@@ -761,15 +759,23 @@
             angle += angle < 0 ? 360 : 0;
         }
-        
+
         snapHelper.checkAngleSnapping(currentMouseEastNorth,angle);
-        
+        if (!snapHelper.isActive()) {
+            // find out the distance, in metres, between the base point and the mouse cursor
+            LatLon mouseLatLon = mv.getProjection().eastNorth2latlon(currentMouseEastNorth);
+            distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon);
+            showStausInfo(angle, hdg, distance);
+        } // elsewhere status ar was filled by snapHelper
+        
+        // Now done in redrawIfRequired()
+        //updateStatusLine();
+    }
+
+    private void showStausInfo(double angle, double hdg, double distance) {
         Main.map.statusLine.setAngle(angle);
         Main.map.statusLine.setHeading(hdg);
         Main.map.statusLine.setDist(distance);
-        // Now done in redrawIfRequired()
-        //updateStatusLine();
-    }
-    
-    
+    }
+
     /** 
      * Helper function that sets fields currentBaseNode and previousNode 
@@ -1192,16 +1198,17 @@
                         
             Collection<String> angles = Main.pref.getCollection("draw.anglesnap.angles", 
-                    Arrays.asList("0","30","45","60","90","120","135","150","210","225","240","270","300","315","330"));
+                    Arrays.asList("0","30","45","60","90","120","135","150"));
             
-            snapAngles = new double[angles.size()];
+            snapAngles = new double[2*angles.size()];
             int i=0;
             for (String s: angles) {
                 try {
-                    snapAngles[i] = Double.parseDouble(s);
+                    snapAngles[i] = Double.parseDouble(s); i++;
+                    snapAngles[i] = 360-Double.parseDouble(s); i++;
                 } catch (NumberFormatException e) {
                     System.err.println("Warning: incorrect number in draw.anglesnap.angles preferences: "+s);
-                    snapAngles[i]=0;
+                    snapAngles[i]=0;i++;
+                    snapAngles[i]=0;i++;
                 } 
-                i++;
             }
             snapAngleTolerance = Main.pref.getDouble("draw.anglesnap.tolerance", 5.0);
@@ -1217,4 +1224,8 @@
                          BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f);
 
+        }
+        
+        public void saveAngles(String ... angles) {
+            Main.pref.putCollection("draw.anglesnap.angles", Arrays.asList(angles));
         }
         
@@ -1315,5 +1326,17 @@
                 double scale = 20*Main.map.mapView.getDist100Pixel();
                 dir2 = new EastNorth( e0+scale*pe, n0+scale*pn);
-                getSnapPoint(currentEN); 
+                EastNorth snapPoint = getSnapPoint(currentEN);
+                
+                // find out the distance, in metres, between the base point and projected point
+                LatLon mouseLatLon = Main.map.mapView.getProjection().eastNorth2latlon(snapPoint);
+                double distance = currentBaseNode.getCoor().greatCircleDistance(mouseLatLon);
+                double hdg = Math.toDegrees(p0.heading(snapPoint));
+                if (previousNode != null) {
+                    angle = hdg - Math.toDegrees(previousNode.getEastNorth().heading(p0));
+                    angle += angle < 0 ? 360 : 0;
+                    if (Math.abs(angle-360)<1e-4) angle=0;
+                }
+                
+                showStausInfo(angle, hdg, distance);
            } else {
                 noSnapNow();
@@ -1360,4 +1383,10 @@
         }
         
+        private void enableSnapping() {
+            snapOn = true;
+            checkBox.setState(snapOn);
+            unsetFixedMode();
+        }
+        
         private void toggleSnapping() {
             snapOn = !snapOn;
@@ -1369,5 +1398,5 @@
             if (active) { fixed=true; }
         }
-        
+                
         
         public  void unsetFixedMode() {
@@ -1406,4 +1435,45 @@
             if (absoluteFix) unsetFixedMode(); else toggleSnapping();
         }
+        
+        MouseListener anglePopupListener = new PopupMenuLauncher( new JPopupMenu() {
+            {  
+               add(new JCheckBoxMenuItem(new AbstractAction(tr("Show helper geometry")){
+                    public void actionPerformed(ActionEvent e) {
+                        boolean sel=((JCheckBoxMenuItem) e.getSource()).getState();
+                        Main.pref.put("draw.anglesnap.drawConstructionGeometry", sel);
+                        Main.pref.put("draw.anglesnap.drawProjectedPoint", sel);
+                        Main.pref.put("draw.anglesnap.showAngle", sel);
+                        init(); enableSnapping();
+                    }
+               }));
+               add(new AbstractAction(tr("0,90,...")) {
+                public void actionPerformed(ActionEvent e) {
+                    saveAngles("0","90");
+                    init(); enableSnapping();
+                }
+               });
+               add(new AbstractAction(tr("0,45,90,...")) {
+                public void actionPerformed(ActionEvent e) {
+                    saveAngles("0","45","90","135");
+                    init(); enableSnapping();
+                }
+               });
+               add(new AbstractAction(tr("0,30,45,60,90,...")) {
+                public void actionPerformed(ActionEvent e) {
+                    saveAngles("0","30","45","60","90","120","135","150");
+                    init(); enableSnapping();
+                }
+               });
+        }
+    }) {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                super.mouseClicked(e);
+                if (e.getButton()==MouseEvent.BUTTON1) {
+                    toggleSnapping();
+                    updateStatusLine();
+                }
+            }
+    };
     }
     
Index: /trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 4802)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 4803)
@@ -17,4 +17,5 @@
 import java.awt.Toolkit;
 import java.awt.event.AWTEventListener;
+import java.awt.event.ActionEvent;
 import java.awt.event.InputEvent;
 import java.awt.event.KeyAdapter;
@@ -31,5 +32,7 @@
 import javax.swing.BorderFactory;
 import javax.swing.JLabel;
+import javax.swing.JMenu;
 import javax.swing.JPanel;
+import javax.swing.JPopupMenu;
 import javax.swing.JProgressBar;
 import javax.swing.JScrollPane;
@@ -48,4 +51,5 @@
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog;
+import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -681,5 +685,5 @@
         lonText.addMouseListener(Main.main.menu.jumpToAct);
         latText.addMouseListener(Main.main.menu.jumpToAct);
-
+        
         // Listen for mouse movements and set the position text field
         mv.addMouseMotionListener(new MouseMotionListener(){
@@ -734,4 +738,8 @@
         thread.start();
     }
+    
+    public JPanel getAnglePanel() {
+        return angleText;
+    }
 
     public String helpTopic() {
