Index: /applications/editors/josm/plugins/FastDraw/build.xml
===================================================================
--- /applications/editors/josm/plugins/FastDraw/build.xml	(revision 26467)
+++ /applications/editors/josm/plugins/FastDraw/build.xml	(revision 26468)
@@ -30,5 +30,5 @@
 <project name="FastDraw" default="dist" basedir=".">
     <!-- enter the SVN commit message -->
-    <property name="commit.message" value="FastDraw: fix NPE and relation bugs after editing"/>
+    <property name="commit.message" value="FastDraw: more settings, autosave"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
     <property name="plugin.main.version" value="4201"/>
Index: /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java
===================================================================
--- /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java	(revision 26467)
+++ /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java	(revision 26468)
@@ -342,5 +342,5 @@
                 //p1 = getPoint(pp1);
                 pp2 = it2.next();
-                //p2 = getPoint(pp2);
+                //p2 =sa getPoint(pp2);
                 lens[i]=pp1.greatCircleDistance(pp2);
             }
Index: /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java
===================================================================
--- /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java	(revision 26467)
+++ /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java	(revision 26468)
@@ -24,4 +24,13 @@
     public int pkmBlockSize;
     public boolean drawLastSegment;
+    // snap to nodes
+    public boolean snapNodes; 
+    // add fixed foints on mouse click
+    public boolean fixedClick; 
+    // add fixed foints on spacebar
+    public boolean fixedSpacebar;
+    // option for simplifiction: 0="Autosimplify and wait",
+    //1="Simplify and wait", 2="Save as is"
+    public int simplifyMode;
     
     public void loadPrefs() {
@@ -39,4 +48,8 @@
         pkmBlockSize = Main.pref.getInteger("fastdraw.pkmblocksize", 10);
         drawLastSegment = Main.pref.getBoolean("fastdraw.drawlastsegment", true);
+        snapNodes = Main.pref.getBoolean("fastdraw.snapnodes", true);
+        fixedClick = Main.pref.getBoolean("fastdraw.fixedclick", false);
+        fixedSpacebar = Main.pref.getBoolean("fastdraw.fixedspacebar", false);
+        simplifyMode = Main.pref.getInteger("fastdraw.simplifymode", 0);
     }
 
@@ -55,8 +68,11 @@
          Main.pref.putInteger("fastdraw.pkmblocksize",pkmBlockSize);
          Main.pref.put("fastdraw.drawlastsegment",drawLastSegment);
+         Main.pref.put("fastdraw.snapnodes", snapNodes);
+         Main.pref.put("fastdraw.fixedclick", fixedClick);
+         Main.pref.put("fastdraw.fixedspacebar", fixedSpacebar);
+         Main.pref.putInteger("fastdraw.simplifymode", simplifyMode);
          try {Main.pref.save();} catch (IOException e) {
              System.err.println(tr("Can not save preferences"));
          }
-    
     }
 }
Index: /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawConfigDialog.java
===================================================================
--- /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawConfigDialog.java	(revision 26467)
+++ /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawConfigDialog.java	(revision 26468)
@@ -5,4 +5,6 @@
 package org.openstreetmap.josm.plugins.fastdraw;
 
+import org.openstreetmap.josm.tools.GBC;
+import java.awt.GridBagLayout;
 import javax.swing.JOptionPane;
 import java.text.NumberFormat;
@@ -10,9 +12,9 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import javax.swing.GroupLayout;
+import javax.swing.JCheckBox;
+import javax.swing.JComboBox;
 import javax.swing.JFormattedTextField;
 import javax.swing.JPanel;
 import javax.swing.JLabel;
-import javax.swing.JTextField;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -22,44 +24,43 @@
         super(Main.parent,tr("FastDraw configuration"),new String[] {tr("Ok"), tr("Cancel")});
         JPanel all = new JPanel();
-        GroupLayout layout = new GroupLayout(all);
+        GridBagLayout layout = new GridBagLayout();
         all.setLayout(layout);
-        layout.setAutoCreateGaps(true);
-        layout.setAutoCreateContainerGaps(true);
         
         JLabel label1=new JLabel(tr("Epsilon multiplier"));
         JLabel label2=new JLabel(tr("Starting Epsilon"));
         JLabel label3=new JLabel(tr("Max points count per 1 km"));
+        JLabel label4=new JLabel(tr("Enter key mode"));
         JFormattedTextField text1=new JFormattedTextField(NumberFormat.getInstance());
         JFormattedTextField text2=new  JFormattedTextField(NumberFormat.getInstance());
         JFormattedTextField text3=new  JFormattedTextField(NumberFormat.getInstance());
-        layout.setHorizontalGroup(
-            layout.createSequentialGroup()
-                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
-                    .addComponent(label1)
-                    .addComponent(label2)
-                    .addComponent(label3))
-                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
-                    .addComponent(text1)
-                    .addComponent(text2)
-                    .addComponent(text3)
-                )
-                );
-        layout.setVerticalGroup(
-            layout.createSequentialGroup()
-                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
-                    .addComponent(label1)
-                    .addComponent(text1))
-                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
-                    .addComponent(label2)
-                    .addComponent(text2))
-                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
-                    .addComponent(label3)
-                    .addComponent(text3))
-                );
+//        JComboBox combo1=new JComboBox(new String[]{tr("Autosimplify and wait"),
+//            tr("Autosimplify and save"),tr("Simplify and wait"),tr("Simplify and save"),
+//            tr("Save as is")});
+        JComboBox combo1=new JComboBox(new String[]{tr("Autosimplify"),
+            tr("Simplify with initial epsilon"),tr("Save as is")});
+        JCheckBox snapCb=new JCheckBox(tr("Snap to nodes"));
+        JCheckBox fixedClickCb = new JCheckBox(tr("Add fixed points on click"));
+        JCheckBox fixedSpaceCb = new JCheckBox(tr("Add fixed points on spacebar"));
+        all.add(label1,GBC.std().insets(10,0,0,0));
+        all.add(text1, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+        all.add(label2,GBC.std().insets(10,0,0,0));
+        all.add(text2, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+        all.add(label3,GBC.std().insets(10,0,0,0));
+        all.add(text3, GBC.eol().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+        all.add(label4,GBC.std().insets(10,0,0,0));
+        all.add(combo1, GBC.eop().fill(GBC.HORIZONTAL).insets(5,0,0,5));
+        
+        all.add(snapCb,GBC.eop().insets(20,0,0,0));
+        all.add(fixedClickCb,GBC.eop().insets(20,0,0,0));
+        all.add(fixedSpaceCb,GBC.eop().insets(20,0,0,0));
         
         text1.setValue(settings.epsilonMult);
         text2.setValue(settings.startingEps);
         text3.setValue(settings.maxPointsPerKm);
-        
+        snapCb.setSelected(settings.snapNodes);
+        fixedClickCb.setSelected(settings.fixedClick);
+        fixedSpaceCb.setSelected(settings.fixedSpacebar);
+        combo1.setSelectedIndex(settings.simplifyMode);
+
         ExtendedDialog dialog = new ExtendedDialog(Main.parent,
                 tr("FastDraw settings"),
@@ -80,4 +81,8 @@
             settings.startingEps=NumberFormat.getInstance().parse(text2.getText()).doubleValue();
             settings.maxPointsPerKm=NumberFormat.getInstance().parse(text3.getText()).doubleValue();
+            settings.snapNodes=snapCb.isSelected();
+            settings.fixedClick=fixedClickCb.isSelected();
+            settings.fixedSpacebar=fixedSpaceCb.isSelected();
+            settings.simplifyMode=combo1.getSelectedIndex();
             settings.savePrefs();
             } catch (ParseException e) {
Index: /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java
===================================================================
--- /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java	(revision 26467)
+++ /applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java	(revision 26468)
@@ -87,4 +87,6 @@
   
     private KeyEvent releaseEvent;
+    private boolean lineWasSaved;
+    private boolean deltaChanged;
 
     FastDrawingMode(MapFrame mapFrame) {
@@ -113,4 +115,5 @@
         if (!isEnabled()) return;
         super.enterMode();
+        lineWasSaved=false;
         settings=new FDSettings();
         settings.loadPrefs();
@@ -157,4 +160,5 @@
     public void exitMode() {
         super.exitMode();
+        if (line.wasSimplified() && !lineWasSaved) saveAsWay(false);
 
         Main.map.mapView.removeMouseListener(this);
@@ -242,5 +246,5 @@
                 }
             }
-            if (settings.drawLastSegment && !drawing && !shift && !line.wasSimplified()) {
+            if (settings.drawLastSegment && !drawing && !shift && nearestIdx<0 && !line.wasSimplified()) {
                 // draw line to current point
                 g.setColor(lineColor);
@@ -248,4 +252,10 @@
                 Point mp=Main.map.mapView.getMousePosition();
                 if (lp!=null && mp!=null) g.drawLine(lp.x,lp.y,mp.x,mp.y);
+            }
+            if (deltaChanged) {
+                g.setColor(lineColor);
+                Point lp=line.getLastPoint();
+                int r=(int) settings.minPixelsBetweenPoints;
+                if (lp!=null) g.drawOval(lp.x-r,lp.y-r,2*r,2*r);
             }
         }
@@ -315,24 +325,33 @@
             return;
         }
-        startDrawing(e.getPoint());
-    }
-
-    private void startDrawing(Point point) {
+        startDrawing(e.getPoint(),settings.fixedClick);
+    }
+
+    private void startDrawing(Point point, boolean fixFlag) {
         //if (line.isClosed()) { setStatusLine(tr(SIMPLIFYMODE_MESSAGE));return;  }
         drawing = true;
+        if (line.wasSimplified()) { 
+            // new line started after simplification
+            // we need to save old line
+            saveAsWay(false);
+            newDrawing();
+            //line.clearSimplifiedVersion();
+        }
+
 
         LatLon p = mv.getLatLon(point.x, point.y);
-        Node nd1 = getNearestNode(point, settings.maxDist);
-        if (nd1!=null) {
-            // found node, make it fixed point of the line
-            //System.out.println("node "+nd1);
-            p=nd1.getCoor();
-            line.fixPoint(p);
+        if (settings.snapNodes) { // find existing node near point and use it
+            Node nd1 = getNearestNode(point, settings.maxDist);
+            if (nd1!=null) {
+                // found node, make it fixed point of the line
+                //System.out.println("node "+nd1);
+                p=nd1.getCoor();
+                line.fixPoint(p);
+            }
         }
 
         line.addLast(p);
-        if (ctrl) line.fixPoint(p);
-        line.clearSimplifiedVersion();
-
+        if (ctrl || fixFlag) line.fixPoint(p);
+        
         setStatusLine(tr("Please move the mouse to draw new way"));
         repaint();
@@ -363,4 +382,5 @@
     public void mouseMoved(MouseEvent e) {
         if (!isEnabled()) return;
+        deltaChanged=false;
         Node nd1 = getNearestNode(e.getPoint(), settings.maxDist);
         boolean nearpoint2=nd1!=null;
@@ -422,4 +442,5 @@
         case KeyEvent.VK_BACK_SPACE:
             if (line.wasSimplified()) {
+                // return to line editing
                 line.clearSimplifiedVersion();
                 repaint();
@@ -429,12 +450,25 @@
         break;
         case KeyEvent.VK_ENTER:
+            e.consume();
             // first Enter = simplify, second = save the way
             if (!line.wasSimplified()) {
                 //line.simplify(eps);
-                eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, 
+                switch(settings.simplifyMode) {
+                    case 0: //case 1:
+                        eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, 
                         settings.pkmBlockSize, settings.maxPointsPerKm);
-                repaint();
-                showSimplifyHint();
-            } else saveAsWay();
+                        break;
+                    case 1: //case 2: case 3:
+                        line.simplify(eps);
+                        break;
+                }
+                if (settings.simplifyMode==2) {
+                    // autosave
+                    saveAsWay(true);
+                } else {
+                    repaint();
+                    showSimplifyHint();
+                }
+            } else {saveAsWay(true);}
         break;
         case KeyEvent.VK_DOWN:
@@ -461,5 +495,8 @@
                 Toolkit.getDefaultToolkit().removeAWTEventListener(this);
                 new FastDrawConfigDialog(settings);
+                if (line.wasSimplified()) {
                 eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, settings.pkmBlockSize,settings.maxPointsPerKm);
+                showSimplifyHint();
+                }
                 //System.out.println("final eps="+eps);
                 Toolkit.getDefaultToolkit().addAWTEventListener(this,
@@ -471,5 +508,5 @@
             if (!drawing) {
                 Point p = Main.map.mapView.getMousePosition();
-                if (p!=null) startDrawing(p);
+                if (p!=null) startDrawing(p,settings.fixedSpacebar);
             }
         break;
@@ -504,5 +541,5 @@
         line.clear();
     }
-    private void saveAsWay() {
+    private void saveAsWay(boolean autoExit) {
         List<LatLon> pts=line.getPoints();
         int n = pts.size();
@@ -561,10 +598,15 @@
         Command c = new SequenceCommand(tr("Draw the way by mouse"), cmds);
         Main.main.undoRedo.add(c);
+        lineWasSaved = true;
         newDrawing(); // stop drawing
-        // Select this way and switch drawing mode off
-        exitMode();
-        getCurrentDataSet().setSelected(w);
-        Main.map.selectSelectTool(false);
-    }
+        if (autoExit) {
+            // Select this way and switch drawing mode off
+            exitMode();
+            getCurrentDataSet().setSelected(w);
+            Main.map.selectSelectTool(false);
+        }
+    }
+
+  
 
     private void repaint() {
@@ -588,6 +630,7 @@
     void changeDelta(double k) {
         settings.minPixelsBetweenPoints*=k;
+        deltaChanged=true;
         setStatusLine(tr("min distance={0} pixes",(int)settings.minPixelsBetweenPoints));
-        
+        repaint();
     }
 
