Index: applications/editors/josm/plugins/print/README
===================================================================
--- applications/editors/josm/plugins/print/README	(revision 27270)
+++ applications/editors/josm/plugins/print/README	(revision 27282)
@@ -25,4 +25,8 @@
 ===========
 
+print.map-scale (integer):
+The map scale x as in 1:x.
+Default: 25.000
+
 print.attribution (string): 
 The attribution text which will be printed on the page.
@@ -45,8 +49,2 @@
 Not really user preferences, but a mechanism to reliable backup and 
 restore mappaint preferences which are temporary modified for printing.
-
-KNOWN LIMITATIONS
-=================
-
- * No option to select a more usual scale
- 
Index: applications/editors/josm/plugins/print/build.xml
===================================================================
--- applications/editors/josm/plugins/print/build.xml	(revision 27270)
+++ applications/editors/josm/plugins/print/build.xml	(revision 27282)
@@ -30,5 +30,5 @@
 <project name="print" default="dist" basedir=".">
     <!-- enter the SVN commit message -->
-    <property name="commit.message" value="Added a print settings and preview dialog."/>
+    <property name="commit.message" value="Added a field to specify the map scale."/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
     <property name="plugin.main.version" value="4549"/>
Index: applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintDialog.java
===================================================================
--- applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintDialog.java	(revision 27270)
+++ applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintDialog.java	(revision 27282)
@@ -92,7 +92,17 @@
     
     /**
+     * The map scale
+     */
+    protected SpinnerNumberModel scaleModel;
+    
+    /**
      * The page preview
      */
     protected PrintPreview printPreview;
+    
+    /**
+     * The map view for preview an printing
+     */
+    protected PrintableMapView mapView;
     
     /**
@@ -113,6 +123,8 @@
     public PrintDialog(Component parent) {
         super(JOptionPane.getFrameForComponent(parent), tr("Print the Map"), ModalityType.DOCUMENT_MODAL);
+        mapView = new PrintableMapView();
         job = PrinterJob.getPrinterJob();
         job.setJobName("JOSM Map");
+        job.setPrintable(mapView);
         build();
         updateFields();
@@ -165,5 +177,5 @@
         
         int row = 0;
-        caption = new JLabel(tr("Printer:"));
+        caption = new JLabel(tr("Printer")+":");
         add(caption, std.grid(2, row));
         printerField = new JTextField();
@@ -172,5 +184,5 @@
 
         row++;
-        caption = new JLabel(tr("Paper:"));
+        caption = new JLabel(tr("Media")+":");
         add(caption, std.grid(2, row));
         paperField = new JTextField();
@@ -179,5 +191,5 @@
 
         row++;
-        caption = new JLabel(tr("Orientation:"));
+        caption = new JLabel(tr("Orientation")+":");
         add(caption, std.grid(2, row));
         orientationField = new JTextField();
@@ -186,5 +198,5 @@
 
         row++;
-        JButton printerButton = new JButton(tr("Printer settings..."));
+        JButton printerButton = new JButton(tr("Printer settings")+"...");
         printerButton.setActionCommand("printer-dialog");
         printerButton.addActionListener(this);
@@ -195,5 +207,31 @@
         
         row++;
-        caption = new JLabel(tr("Resolution (dpi):"));
+        caption = new JLabel(tr("Scale")+":   1 : ");
+        add(caption, std.grid(2, row));
+        int mapScale = (int)Main.pref.getInteger("print.map-scale", PrintPlugin.DEF_MAP_SCALE);
+        mapView.setFixedMapScale(mapScale);
+        scaleModel = new SpinnerNumberModel(mapScale, 500, 5000000, 500);
+        final JSpinner scaleField = new JSpinner(scaleModel);
+        scaleField.addChangeListener(new ChangeListener() {
+            public void stateChanged(ChangeEvent evt) {
+                SwingUtilities.invokeLater(new Runnable() {
+                    public void run() {
+                        try {
+                            scaleField.commitEdit();
+                            Main.pref.put("print.map-scale",scaleModel.getNumber().toString());
+                            mapView.setFixedMapScale(scaleModel.getNumber().intValue());
+                            printPreview.repaint();
+                        }
+                        catch (ParseException pe) {
+                            ; // NOP
+                        }
+                    }
+                });
+            }
+        });
+        add(scaleField, std.grid(3, row));
+
+        row++;
+        caption = new JLabel(tr("Resolution")+":   (dpi)");
         add(caption, std.grid(2, row));
         resolutionModel = new SpinnerNumberModel(
@@ -218,7 +256,7 @@
         });
         add(resolutionField, std.grid(3, row));
-
-        row++;
-        caption = new JLabel(tr("Attribution:"));
+        
+        row++;
+        caption = new JLabel(tr("Attribution")+":");
         add(caption, std.grid(2, row));
 
@@ -280,5 +318,5 @@
         printPreview = new PrintPreview();
         if (previewCheckBox.isSelected()) {
-            printPreview.setPrintable(new PrintableMapView());
+            printPreview.setPrintable(mapView);
         }
         JScrollPane previewPane = new JScrollPane(printPreview, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
@@ -355,5 +393,5 @@
             Main.pref.put("print.preview.enabled", previewCheckBox.isSelected());
             if (previewCheckBox.isSelected() == true) {
-                printPreview.setPrintable(new PrintableMapView());
+                printPreview.setPrintable(mapView);
             }
             else {
@@ -375,5 +413,4 @@
         else if (cmd.equals("print")) {
             try {
-                job.setPrintable(new PrintableMapView());
                 job.print(attrs);
             }
Index: applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintPlugin.java
===================================================================
--- applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintPlugin.java	(revision 27270)
+++ applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintPlugin.java	(revision 27282)
@@ -47,4 +47,9 @@
 
     /**
+     * The default map scale
+     */
+    public static final int DEF_MAP_SCALE = 25000;
+
+    /**
      * The default resolution
      */
@@ -84,4 +89,6 @@
 
         /* Make this plugin's preferences known */
+        Main.pref.putDefault(
+          "print.map-scale", Integer.toString(DEF_MAP_SCALE));
         Main.pref.putDefault(
           "print.resolution.dpi", Integer.toString(DEF_RESOLUTION_DPI));
Index: applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java
===================================================================
--- applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java	(revision 27270)
+++ applications/editors/josm/plugins/print/src/org/openstreetmap/josm/plugins/print/PrintableMapView.java	(revision 27282)
@@ -60,4 +60,9 @@
     
     /**
+     * A fixed map scale if greater than zero.
+     */
+    protected int fixedMapScale = 0;
+    
+    /**
      * The factor for scaling the printing graphics to the desired
      * resolution
@@ -93,4 +98,38 @@
 
     /**
+     * Set a fixed map scale 1 : "scale"
+     * 
+     * @param scale the fixed map scale
+     */
+    public void setFixedMapScale(int scale) {
+        this.fixedMapScale = scale;
+        rezoomToFixedScale();
+    }
+
+    /**
+     * Unset the fixed map scale
+     * 
+     * The map scaling will be chosen automatically such that the
+     * main windows map view fits on the page format.
+     */
+    public void unsetFixedMapScale() {
+        setFixedMapScale(0);
+        rezoomToFixedScale();
+    }
+
+    /** 
+     * Get the map scale that will be used for rendering
+     */     
+    public int getMapScale() {
+        if (fixedMapScale > 0 || g2dFactor == 0.0) {
+            return fixedMapScale;
+        }
+
+        double dist100px = getDist100Pixel() / g2dFactor;
+        int mapScale = (int) (dist100px * 72.0 / 2.54);
+        return mapScale;
+    }
+
+    /**
      * Initialize the PrintableMapView for a particular combination of
      * main MapView, PageFormat and target resolution
@@ -101,6 +140,4 @@
         int resolution = Main.pref.getInteger("print.resolution.dpi", PrintPlugin.DEF_RESOLUTION_DPI);
         g2dFactor = 72.0/resolution;
-        double widthZoomFactor  = g2dFactor * mapView.getWidth()  / pageFormat.getImageableWidth();
-        double heightZoomFactor = g2dFactor * mapView.getHeight() / pageFormat.getImageableHeight();
         setSize((int)(pageFormat.getImageableWidth()/g2dFactor),(int)(pageFormat.getImageableHeight()/g2dFactor));
     }
@@ -115,4 +152,5 @@
             super.setSize(width, height);
             zoomTo(mapView.getRealBounds());
+            rezoomToFixedScale();
         }
     }
@@ -127,7 +165,19 @@
             super.setSize(newSize);
             zoomTo(mapView.getRealBounds());
-        }
-    }
-            
+            rezoomToFixedScale();
+        }
+    }
+
+    /**
+     * Adjust the zoom as necessary to establish the fixed scale.
+     */
+    protected void rezoomToFixedScale() {
+        if (fixedMapScale > 0) {
+            double dist100px = getDist100Pixel() / g2dFactor;
+            double mapScale = dist100px * 72.0 / 2.54;
+            double mapFactor = fixedMapScale / mapScale;
+            zoomToFactor(mapFactor);
+        }
+    }
 
     /**
@@ -174,4 +224,5 @@
         AffineTransform at = g2d.getTransform();
         g2d.scale(g2dFactor, g2dFactor);
+System.err.println(" used: "+g2dFactor);
         
         Bounds box = getRealBounds();
@@ -271,6 +322,6 @@
         
         /* lexical scale */
-        int mapScale = (int) (dist100px * 72.0 / 2.54);
-        String lexicalScale = tr("Scale 1 : {0}", mapScale);
+        int mapScale = getMapScale();
+        String lexicalScale = tr("Scale") + " 1 : " + mapScale;
 
         Font scaleFront = new Font("Arial", Font.BOLD, FONT_SIZE);
