Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 5136)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 5137)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.actions.mapmode;
 
+import java.awt.*;
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.marktr;
@@ -7,12 +8,4 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
-import java.awt.AWTEvent;
-import java.awt.BasicStroke;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Graphics2D;
-import java.awt.Point;
-import java.awt.Stroke;
-import java.awt.Toolkit;
 import java.awt.event.AWTEventListener;
 import java.awt.event.ActionEvent;
@@ -36,10 +29,5 @@
 import java.util.TreeSet;
 
-import javax.swing.AbstractAction;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
-import javax.swing.Timer;
+import javax.swing.*;
 
 import org.openstreetmap.josm.Main;
@@ -238,5 +226,7 @@
         snapHelper.unsetFixedMode();
         snapCheckboxMenuItem.getAction().setEnabled(false);
+        
         Main.map.statusLine.getAnglePanel().removeMouseListener(snapHelper.anglePopupListener);
+        Main.map.statusLine.activateAnglePanel(false);
 
         removeHighlighting();
@@ -262,5 +252,10 @@
             return;
         if (event instanceof KeyEvent) {
-            processKeyEvent((KeyEvent) event);
+            KeyEvent e = (KeyEvent) event;
+            if (snappingShortcut.isEvent(e) || getShortcut().isEvent(e)) {
+                Component focused = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
+                if (SwingUtilities.getWindowAncestor(focused) instanceof JFrame)
+                    processKeyEvent(e);
+            }
         } //  toggle angle snapping
         updateKeyModifiers((InputEvent) event);
@@ -275,7 +270,7 @@
     private Timer timer;
     void processKeyEvent(KeyEvent e) {
-        if (!snappingShortcut.isEvent(e))
-            return;
-
+        if (!snappingShortcut.isEvent(e) && !getShortcut().isEvent(e)) 
+            return;
+        
         if (e.getID() == KeyEvent.KEY_PRESSED) {
             if (timer.isRunning()) {
@@ -764,5 +759,5 @@
         mouseOnExistingWays = new HashSet<Way>();
 
-        showStatusInfo(-1, -1, -1);
+        showStatusInfo(-1, -1, -1, snapHelper.isSnapOn());
 
         if (!ctrl && mousePos != null) {
@@ -809,6 +804,7 @@
     }
 
-    private void showStatusInfo(double angle, double hdg, double distance) {
+    private void showStatusInfo(double angle, double hdg, double distance, boolean activeFlag) {
         Main.map.statusLine.setAngle(angle);
+        Main.map.statusLine.activateAnglePanel(activeFlag);
         Main.map.statusLine.setHeading(hdg);
         Main.map.statusLine.setDist(distance);
@@ -1420,5 +1416,5 @@
                 if (angle > 360) angle=0;
             }
-            showStatusInfo(angle, hdg, distance);
+            showStatusInfo(angle, hdg, distance, isSnapOn());
         }
 
@@ -1465,12 +1461,25 @@
                 if (selectedWays.size()==1) {
                     Way w = selectedWays.iterator().next();
-                    for (Node n: w.getNodes()) {
-                        EastNorth en=n.getEastNorth();
+                    Collection <EastNorth> pointsToProject = new ArrayList<EastNorth>();
+                    if (w.getNodesCount()<1000) for (Node n: w.getNodes()) {
+                        pointsToProject.add(n.getEastNorth());
+                    }
+                    if (customBaseHeading >=0 ) {
+                        pointsToProject.add(segmentPoint1);
+                        pointsToProject.add(segmentPoint2);
+                    }
+                    EastNorth enOpt=null;
+                    double dOpt=1e5;
+                    for (EastNorth en: pointsToProject) { // searching for besht projection
                         double l1 = (en.east()-e0)*pe+(en.north()-n0)*pn;
-                        if (Math.abs(l1-l) < delta) {
+                        double d1 = Math.abs(l1-l);
+                        if (d1 < delta && d1 < dOpt) {
                             l=l1;
-                            projectionSource =  en;
-                            break;
+                            enOpt = en;
+                            dOpt = d1;
                         }
+                    }
+                    if (enOpt!=null) {
+                        projectionSource =  enOpt;
                     }
                 }
Index: /trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 5136)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 5137)
@@ -76,4 +76,7 @@
      */
     static class ImageLabel extends JPanel {
+        static Color backColor = Color.decode("#b8cfe5");
+        static Color backColorActive = Color.decode("#aaff5e");
+            
         private JLabel tf;
         private int chars;
@@ -81,5 +84,5 @@
             super();
             setLayout(new GridBagLayout());
-            setBackground(Color.decode("#b8cfe5"));
+            setBackground(backColor);
             add(new JLabel(ImageProvider.get("statusline/"+img+".png")), GBC.std().anchor(GBC.WEST).insets(0,1,1,0));
             add(tf = new JLabel(), GBC.std().fill(GBC.BOTH).anchor(GBC.WEST).insets(2,1,1,0));
@@ -788,3 +791,6 @@
         distText.setText(dist < 0 ? "--" : NavigatableComponent.getDistText(dist));
     }
+    public void activateAnglePanel(boolean activeFlag) {
+        angleText.setBackground(activeFlag ? ImageLabel.backColorActive : ImageLabel.backColor);
+    }
 }
