Index: /applications/editors/josm/plugins/piclayer/build.xml
===================================================================
--- /applications/editors/josm/plugins/piclayer/build.xml	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/build.xml	(revision 27191)
@@ -22,5 +22,5 @@
 -->
 <project name="PicLayer" default="dist" basedir=".">
-    <property name="commit.message" value="PicLayer - now markers are visible only when they are needed - active Layer and transform/add marker mapmode"/>
+    <property name="commit.message" value="PicLayer - 1. now all toolbar operations are done relatively to screen center. 2. If user tries to close layer without saving - confirmation is needed. 3. Other small fixes"/>
     <property name="plugin.main.version" value="4549"/>
     <!--
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java	(revision 27191)
@@ -30,4 +30,6 @@
 
 import javax.swing.JMenu;
+import javax.swing.JOptionPane;
+import javax.swing.UIManager;
 
 import org.openstreetmap.josm.Main;
@@ -39,4 +41,5 @@
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.plugins.piclayer.actions.SavePictureCalibrationAction;
 import org.openstreetmap.josm.plugins.piclayer.actions.newlayer.NewLayerFromClipboardAction;
 import org.openstreetmap.josm.plugins.piclayer.actions.newlayer.NewLayerFromFileAction;
@@ -154,4 +157,11 @@
     @Override
     public void layerRemoved(Layer arg0) {
+        if (arg0 instanceof PicLayerAbstract && ((PicLayerAbstract) arg0).getTransformer().isModified()) {
+            if (JOptionPane.showConfirmDialog(Main.parent, tr("Do you want to save current calibration of layer {0}?",
+                    ((PicLayerAbstract)arg0).getPicLayerName()),
+                    UIManager.getString("OptionPane.titleText"),
+                    JOptionPane.YES_NO_OPTION) == 0)
+                new SavePictureCalibrationAction((PicLayerAbstract) arg0).actionPerformed(null);
+        }
         boolean enable = Main.map.mapView.getAllLayers().size() != 0;
         menu.setEnabled(enable);
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/LoadPictureCalibrationAction.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/LoadPictureCalibrationAction.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/LoadPictureCalibrationAction.java	(revision 27191)
@@ -37,5 +37,5 @@
 /**
  * Action to load the calibration file.
- * 
+ *
  */
 @SuppressWarnings("serial")
@@ -44,5 +44,5 @@
     // Owner layer of the action
     PicLayerAbstract m_owner = null;
-    
+
     // Persistent FileChooser instance to remember last directory
     JFileChooser m_filechooser = null;
@@ -60,8 +60,9 @@
      * Action handler
      */
+    @Override
     public void actionPerformed(ActionEvent arg0) {
         // Save dialog
         JFileChooser fc = new JFileChooser();
-        fc.setAcceptAllFileFilterUsed( false );
+        fc.setAcceptAllFileFilterUsed( true );
         fc.setFileFilter( new CalibrationFileFilter() );
         fc.setSelectedFile( new File(m_owner.getPicLayerName() + CalibrationFileFilter.EXTENSION));
@@ -69,6 +70,6 @@
 
         if ( result == JFileChooser.APPROVE_OPTION ) {
-                    
-            // Load 
+
+            // Load
             try {
                 m_owner.loadCalibration(new FileInputStream(fc.getSelectedFile()));
@@ -80,4 +81,4 @@
         }
     }
-    
+
 }
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/SavePictureCalibrationAction.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/SavePictureCalibrationAction.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/SavePictureCalibrationAction.java	(revision 27191)
@@ -63,5 +63,5 @@
         // Save dialog
         final JFileChooser fc = new JFileChooser();
-        fc.setAcceptAllFileFilterUsed( false );
+        fc.setAcceptAllFileFilterUsed( true );
         fc.setFileFilter( new CalibrationFileFilter() );
         fc.setSelectedFile( new File(m_owner.getPicLayerName() + CalibrationFileFilter.EXTENSION));
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java	(revision 27191)
@@ -107,8 +107,7 @@
         // Choose a file
         JFileChooser fc = new JFileChooser(Main.pref.get(m_lastdirprefname));
-        fc.setAcceptAllFileFilterUsed( false );
-        //fc.setFileFilter( new ImageFileFilter() );
-        fc.addChoosableFileFilter(new ImageFileFilter());
-        fc.addChoosableFileFilter(new AllFilesFilter());
+        fc.setAcceptAllFileFilterUsed( true );
+        fc.setFileFilter( new ImageFileFilter() );
+
         fc.setMultiSelectionEnabled(true);
         int result = fc.showOpenDialog( Main.parent );
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java	(revision 27191)
@@ -368,4 +368,6 @@
         props.put(POSITION_Y, Double.toString(imagePosition.getY()));
         props.put(INITIAL_SCALE, Double.toString(initialImageScale));
+
+        transformer.resetModified();
     }
 
@@ -497,16 +499,36 @@
     public void movePictureBy(double x, double y) {
         imagePosition = imagePosition.add(x, y);
-    }
+        transformer.setModified();
+    }
+
 
     public void rotatePictureBy(double angle) {
-        transformer.concatenateTransform(AffineTransform.getRotateInstance(angle));
+        try {
+            Point2D trans = transformPoint(new Point(Main.map.mapView.getWidth()/2, Main.map.mapView.getHeight()/2));
+
+            transformer.concatenateTransformPoint(AffineTransform.getRotateInstance(angle), trans);
+        } catch (NoninvertibleTransformException e) {
+            e.printStackTrace();
+        }
     }
 
     public void scalePictureBy(double scalex, double scaley) {
-        transformer.concatenateTransform(AffineTransform.getScaleInstance(scalex, scaley));
+        try {
+            Point2D trans = transformPoint(new Point(Main.map.mapView.getWidth()/2, Main.map.mapView.getHeight()/2));
+
+            transformer.concatenateTransformPoint(AffineTransform.getScaleInstance(scalex, scaley), trans);
+        } catch (NoninvertibleTransformException e) {
+            e.printStackTrace();
+        }
     }
 
     public void shearPictureBy(double shx, double shy) {
-        transformer.concatenateTransform(AffineTransform.getShearInstance(shx, shy));
+        try {
+            Point2D trans = transformPoint(new Point(Main.map.mapView.getWidth()/2, Main.map.mapView.getHeight()/2));
+
+            transformer.concatenateTransformPoint(AffineTransform.getShearInstance(shx, shy), trans);
+        } catch (NoninvertibleTransformException e) {
+            e.printStackTrace();
+        }
     }
 
Index: /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java
===================================================================
--- /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java	(revision 27190)
+++ /applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java	(revision 27191)
@@ -9,8 +9,9 @@
 
 	private AffineTransform cachedTransform;
-	
+	private boolean modified = false;
+
 	private List<Point2D> originPoints;
 	private List<Point2D> desiredPoints;
-	
+
 	public PictureTransform() {
 		cachedTransform = new AffineTransform();
@@ -18,17 +19,17 @@
 		desiredPoints = new ArrayList<Point2D>(3);
 	}
-	
+
 	public AffineTransform getTransform() {
 		return cachedTransform;
 	}
-	
+
 	public List<? extends Point2D> getOriginPoints() {
 		return originPoints;
 	}
-	
+
 	public List<? extends Point2D> getDesiredPoints() {
 		return desiredPoints;
 	}
-	
+
 	public void addDesiredPoint(Point2D picturePoint) {
 		if (desiredPoints.size() < 3)
@@ -36,10 +37,10 @@
 		trySolve();
 	}
-	
+
 	private AffineTransform solveEquation() throws NoSolutionException {
 		Matrix3D X = new Matrix3D(originPoints);
 		Matrix3D Y = new Matrix3D(desiredPoints);
 		Matrix3D result = Y.multiply(X.inverse());
-		
+
 		return result.toAffineTransform();
 	}
@@ -50,8 +51,9 @@
 		trySolve();
 	}
-	
+
 	public void resetCalibration() {
 		originPoints.clear();
 		desiredPoints.clear();
+		modified = false;
 		cachedTransform = new AffineTransform();
 	}
@@ -61,4 +63,5 @@
 			try {
 				cachedTransform.concatenate(solveEquation());
+				modified = true;
 				desiredPoints.clear();
 			} catch (NoSolutionException e) {
@@ -68,9 +71,9 @@
 	}
 
-	/** 
+	/**
 	 * updates pair of points (suppose that other pairs are (origin=>origin) points are the same),
-	 * solves equation, 
+	 * solves equation,
 	 * applies transform matrix to the existing cachedTransform
-	 * 
+	 *
 	 * @param originPoint - should be one of origin points, otherwise - no transform applied
 	 * @param desiredPoint - new place for the point
@@ -79,10 +82,10 @@
 		if (originPoints.size() < 3) // not enough information for creating transform - 3 points needed
 			return;
-		
-		if (originPoint == null) 
+
+		if (originPoint == null)
 			return;
-		
+
 		desiredPoints.clear();
-		
+
 		for (Point2D origin : originPoints) {
 			if (origin.equals(originPoint))
@@ -95,20 +98,40 @@
 
 	public void replaceOriginPoint(Point2D originPoint, Point2D newOriginPoint) {
-		if (originPoint == null || newOriginPoint == null) 
+		if (originPoint == null || newOriginPoint == null)
 			return;
-		
+
 		int index = originPoints.indexOf(originPoint);
-		if (index < 0) 
+		if (index < 0)
 			return;
-		
+
 		originPoints.set(index, newOriginPoint);
 	}
-	
-	public void concatenateTransform(AffineTransform transform) {
-		cachedTransform.concatenate(transform);
+
+	public void concatenateTransformPoint(AffineTransform transform, Point2D trans) {
+
+        AffineTransform centered = AffineTransform.getTranslateInstance(trans.getX(), trans.getY());
+        centered.concatenate(transform);
+        centered.translate(-trans.getX(), -trans.getY());
+        cachedTransform.concatenate(centered);
+
+
 		for (int i = 0; i < originPoints.size(); i++) {
 			Point2D point = originPoints.get(i);
 			transform.transform(point, point);
 		}
+		modified = true;
 	}
+
+	public boolean isModified() {
+	    return modified;
+	}
+
+    public void setModified() {
+        modified = true;
+
+    }
+
+    public void resetModified() {
+        modified = false;
+    }
 }
