Index: /applications/editors/josm/plugins/imageryadjust/build.xml
===================================================================
--- /applications/editors/josm/plugins/imageryadjust/build.xml	(revision 29260)
+++ /applications/editors/josm/plugins/imageryadjust/build.xml	(revision 29261)
@@ -1,242 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!--
-** This is a template build file for a JOSM  plugin.
-**
-** Maintaining versions
-** ====================
-** see README.template
-**
-** Usage
-** =====
-** To build it run
-**
-**    > ant  dist
-**
-** To install the generated plugin locally (in you default plugin directory) run
-**
-**    > ant  install
-**
-** The generated plugin jar is not automatically available in JOSMs plugin configuration
-** dialog. You have to check it in first.
-**
-** Use the ant target 'publish' to check in the plugin and make it available to other
-** JOSM users:
-**    set the properties commit.message and plugin.main.version
-** and run
-**    > ant  publish
-**
-**
--->
 <project name="imageryadjust" default="dist" basedir=".">
-    <!-- enter the SVN commit message -->
-    <property name="commit.message" value="ImageryAdjust: Adjust while holding Y"/>
-    <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
+    <property name="commit.message" value="ImageryAdjust: Adjust while holding shortcut key"/>
     <property name="plugin.main.version" value="4980"/>
-    <!--
-      ************************************************
-      ** should not be necessary to change the following properties
-     -->
-    <property name="josm" location="../../core/dist/josm-custom.jar"/>
-    <property name="plugin.build.dir" value="build"/>
-    <property name="plugin.src.dir" value="src"/>
-    <!-- this is the directory where the plugin jar is copied to -->
-    <property name="plugin.dist.dir" value="../../dist"/>
-    <property name="ant.build.javac.target" value="1.5"/>
-    <property name="plugin.dist.dir" value="../../dist"/>
-    <property name="plugin.jar" value="${plugin.dist.dir}/${ant.project.name}.jar"/>
-    <!--
-    **********************************************************
-    ** init - initializes the build
-    **********************************************************
-    -->
-    <target name="init">
-        <mkdir dir="${plugin.build.dir}"/>
-    </target>
-    <!--
-    **********************************************************
-    ** compile - complies the source tree
-    **********************************************************
-    -->
-    <target name="compile" depends="init">
-        <echo message="compiling sources for  ${plugin.jar} ... "/>
-        <javac srcdir="src" classpath="${josm}" debug="true" destdir="${plugin.build.dir}">
-            <compilerarg value="-Xlint:deprecation"/>
-            <compilerarg value="-Xlint:unchecked"/>
-        </javac>
-    </target>
-    <!--
-    **********************************************************
-    ** dist - creates the plugin jar
-    **********************************************************
-    -->
-    <target name="dist" depends="compile,revision">
-        <echo message="creating ${ant.project.name}.jar ... "/>
-        <copy todir="${plugin.build.dir}/resources">
-            <fileset dir="resources"/>
-        </copy>
-        <copy todir="${plugin.build.dir}/images">
-            <fileset dir="images"/>
-        </copy>
-        <copy todir="${plugin.build.dir}/data">
-            <fileset dir="data"/>
-        </copy>
-        <copy todir="${plugin.build.dir}">
-            <fileset dir=".">
-                <include name="README"/>
-                <include name="LICENSE"/>
-            </fileset>
-        </copy>
-        <jar destfile="${plugin.jar}" basedir="${plugin.build.dir}">
-            <!--
-        ************************************************
-        ** configure these properties. Most of them will be copied to the plugins
-        ** manifest file. Property values will also show up in the list available
-        ** plugins: http://josm.openstreetmap.de/wiki/Plugins.
-        **
-        ************************************************
-    -->
-            <manifest>
-                <attribute name="Author" value="Upliner"/>
-                <attribute name="Plugin-Class" value="imageryadjust.ImageryAdjustPlugin"/>
-                <attribute name="Plugin-Date" value="${version.entry.commit.date}"/>
-                <attribute name="Plugin-Description" value="WMSPlugin-style imagery adjustment mapmode"/>
-                <attribute name="Plugin-Icon" value="images/mapmode/adjustimg.png"/>
-                <attribute name="Plugin-Mainversion" value="${plugin.main.version}"/>
-                <attribute name="Plugin-Version" value="${version.entry.commit.revision}"/>
-            </manifest>
-        </jar>
-    </target>
-    <!--
-    **********************************************************
-    ** revision - extracts the current revision number for the
-    **    file build.number and stores it in the XML property
-    **    version.*
-    **********************************************************
-    -->
-    <target name="revision">
-        <exec append="false" output="REVISION" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="info"/>
-            <arg value="--xml"/>
-            <arg value="."/>
-        </exec>
-        <xmlproperty file="REVISION" prefix="version" keepRoot="false" collapseAttributes="true"/>
-        <delete file="REVISION"/>
-    </target>
-    <!--
-    **********************************************************
-    ** clean - clean up the build environment
-    **********************************************************
-    -->
-    <target name="clean">
-        <delete dir="${plugin.build.dir}"/>
-        <delete file="${plugin.jar}"/>
-    </target>
-    <!--
-    **********************************************************
-    ** install - install the plugin in your local JOSM installation
-    **********************************************************
-    -->
-    <target name="install" depends="dist">
-        <property environment="env"/>
-        <condition property="josm.plugins.dir" value="${env.APPDATA}/JOSM/plugins" else="${user.home}/.josm/plugins">
-            <and>
-                <os family="windows"/>
-            </and>
-        </condition>
-        <copy file="${plugin.jar}" todir="${josm.plugins.dir}"/>
-    </target>
-    <!--
-    ************************** Publishing the plugin *********************************** 
-    -->
-    <!--
-        ** extracts the JOSM release for the JOSM version in ../core and saves it in the 
-        ** property ${coreversion.info.entry.revision}
-        **
-        -->
-    <target name="core-info">
-        <exec append="false" output="core.info.xml" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="info"/>
-            <arg value="--xml"/>
-            <arg value="../../core"/>
-        </exec>
-        <xmlproperty file="core.info.xml" prefix="coreversion" keepRoot="true" collapseAttributes="true"/>
-        <echo>Building against core revision ${coreversion.info.entry.revision}.</echo>
-        <echo>Plugin-Mainversion is set to ${plugin.main.version}.</echo>
-        <delete file="core.info.xml"/>
-    </target>
-    <!--
-        ** commits the source tree for this plugin
-        -->
-    <target name="commit-current">
-        <echo>Commiting the plugin source with message '${commit.message}' ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="commit"/>
-            <arg value="-m '${commit.message}'"/>
-            <arg value="."/>
-        </exec>
-    </target>
-    <!--
-        ** updates (svn up) the source tree for this plugin
-        -->
-    <target name="update-current">
-        <echo>Updating plugin source ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="up"/>
-            <arg value="."/>
-        </exec>
-        <echo>Updating ${plugin.jar} ...</echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="up"/>
-            <arg value="../dist/${plugin.jar}"/>
-        </exec>
-    </target>
-    <!--
-        ** commits the plugin.jar 
-        -->
-    <target name="commit-dist">
-        <echo>
-    ***** Properties of published ${plugin.jar} *****
-    Commit message    : '${commit.message}'                    
-    Plugin-Mainversion: ${plugin.main.version}
-    JOSM build version: ${coreversion.info.entry.revision}
-    Plugin-Version    : ${version.entry.commit.revision}
-    ***** / Properties of published ${plugin.jar} *****                    
-                        
-    Now commiting ${plugin.jar} ...
-    </echo>
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false">
-            <env key="LANG" value="C"/>
-            <arg value="-m '${commit.message}'"/>
-            <arg value="commit"/>
-            <arg value="${plugin.jar}"/>
-        </exec>
-    </target>
-    <!-- ** make sure svn is present as a command line tool ** -->
-    <target name="ensure-svn-present">
-        <exec append="true" output="svn.log" executable="svn" failifexecutionfails="false" failonerror="false" resultproperty="svn.exit.code">
-            <env key="LANG" value="C"/>
-            <arg value="--version"/>
-        </exec>
-        <fail message="Fatal: command 'svn --version' failed. Please make sure svn is installed on your system.">
-            <!-- return code not set at all? Most likely svn isn't installed -->
-            <condition>
-                <not>
-                    <isset property="svn.exit.code"/>
-                </not>
-            </condition>
-        </fail>
-        <fail message="Fatal: command 'svn --version' failed. Please make sure a working copy of svn is installed on your system.">
-            <!-- error code from SVN? Most likely svn is not what we are looking on this system -->
-            <condition>
-                <isfailure code="${svn.exit.code}"/>
-            </condition>
-        </fail>
-    </target>
-    <target name="publish" depends="ensure-svn-present,core-info,commit-current,update-current,clean,dist,commit-dist">
-    </target>
+
+    <property name="plugin.author" value="Upliner"/>
+    <property name="plugin.class" value="imageryadjust.ImageryAdjustPlugin"/>
+    <property name="plugin.description" value="WMSPlugin-style imagery adjustment mapmode"/>
+    <property name="plugin.icon" value="images/mapmode/adjustimg.png"/>
+    <property name="plugin.link" value="http://wiki.openstreetmap.org/wiki/JOSM/Plugins/ImageryAdjust"/>
+
+    <!-- ** include targets that all plugins have in common ** -->
+    <import file="../build-common.xml"/>
 </project>
Index: /applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java
===================================================================
--- /applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java	(revision 29260)
+++ /applications/editors/josm/plugins/imageryadjust/src/imageryadjust/ImageryAdjustMapMode.java	(revision 29261)
@@ -21,7 +21,8 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
-
-
-public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener, AWTEventListener, MapFrame.MapModeChangeListener{
+import utils.TimedKeyReleaseListener;
+
+
+public class ImageryAdjustMapMode extends MapMode implements MouseListener, MouseMotionListener, MapFrame.MapModeChangeListener{
     boolean mouseDown;
     EastNorth prevEastNorth;
@@ -29,7 +30,4 @@
     private MapMode oldMapMode;
 
-    private final TreeSet<Integer> set = new TreeSet<Integer>();
-    private Timer timer;
-    private KeyEvent releaseEvent;
     
     public ImageryAdjustMapMode(MapFrame mapFrame) {
@@ -58,5 +56,6 @@
     
     
-    
+    TimedKeyReleaseListener listener;
+            
     @Override public void enterMode() {
         super.enterMode();
@@ -76,24 +75,15 @@
             adjustingLayer.setVisible(true);
         }
-       Main.map.mapView.addMouseListener(this);
+        Main.map.mapView.addMouseListener(this);
         Main.map.mapView.addMouseMotionListener(this);
-        timer = new Timer(0, new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent ae) {
-                 timer.stop();
-                 if (set.remove(releaseEvent.getKeyCode())) {
-                  doKeyReleaseEvent(releaseEvent);
-                 }
+        listener = new TimedKeyReleaseListener() {
+                @Override
+                protected void doKeyReleaseEvent(KeyEvent evt) {
+                    if (releaseEvent.getKeyCode() == getShortcut().getKeyStroke().getKeyCode()) {
+                    if (oldMapMode!=null && !(oldMapMode instanceof ImageryAdjustMapMode))
+                    Main.map.selectMapMode(oldMapMode);
+                }
             }
-
-        });
-        
-        try {
-            Toolkit.getDefaultToolkit().addAWTEventListener(this,
-                    AWTEvent.KEY_EVENT_MASK);
-        } catch (SecurityException ex) {
-        }
-        
-        
+        };
     }
 
@@ -103,8 +93,5 @@
         Main.map.mapView.removeMouseMotionListener(this);
         adjustingLayer = null;
-        try {
-            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
-        } catch (SecurityException ex) {
-        }
+        listener.stop();
     }
 
@@ -137,14 +124,4 @@
     }
     
-    private void doKeyEvent(KeyEvent keyEvent) {
-    }
-
-    private void doKeyReleaseEvent(KeyEvent releaseEvent) {
-        if (releaseEvent.getKeyCode() == getShortcut().getKeyStroke().getKeyCode()) {
-            if (oldMapMode!=null && !(oldMapMode instanceof ImageryAdjustMapMode))
-            Main.map.selectMapMode(oldMapMode);
-        }
-    }
-
     @Override public boolean layerIsSupported(Layer l) {
         //return hasImageryLayersToAdjust();
@@ -153,32 +130,7 @@
 
     @Override
-    public void eventDispatched(AWTEvent event) {
-        if (event instanceof KeyEvent) {
-        KeyEvent e=(KeyEvent) event;
-        
-        if (event.getID() == KeyEvent.KEY_PRESSED) {
-             if (timer.isRunning()) {
-                  timer.stop();
-                } else {
-                  if (set.add((e.getKeyCode()))) doKeyEvent((KeyEvent) event);
-                }
-        }
-        if (event.getID() == KeyEvent.KEY_RELEASED) {
-            if (timer.isRunning()) {
-              timer.stop();
-               if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
-            } else {
-              releaseEvent = e;
-              timer.restart();
-            }
-        }
-        }
-    }
-
-    @Override
     public void mapModeChange(MapMode oldMapMode, MapMode newMapMode) {
         this.oldMapMode = oldMapMode;
     }
-
 
     /**
Index: /applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java
===================================================================
--- /applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java	(revision 29261)
+++ /applications/editors/josm/plugins/imageryadjust/src/utils/TimedKeyReleaseListener.java	(revision 29261)
@@ -0,0 +1,72 @@
+// Thanks to http://www.arco.in-berlin.de/keyevent.html
+// (code simplified here)
+package utils;
+
+import java.awt.AWTEvent;
+import java.awt.Toolkit;
+import java.awt.event.AWTEventListener;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.util.TreeSet;
+import javax.swing.Timer;
+
+public class TimedKeyReleaseListener implements AWTEventListener {
+    private final TreeSet<Integer> set = new TreeSet<Integer>();
+    private Timer timer;
+    protected KeyEvent releaseEvent;
+    
+    public TimedKeyReleaseListener() {
+        timer = new Timer(0, new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent ae) {
+                 timer.stop();
+                 if (set.remove(releaseEvent.getKeyCode())) {
+                  doKeyReleaseEvent(releaseEvent);
+                 }
+            }
+        });
+        
+        try {
+            Toolkit.getDefaultToolkit().addAWTEventListener(this,
+                    AWTEvent.KEY_EVENT_MASK);
+        } catch (SecurityException ex) {
+        }
+    }
+    @Override
+    public void eventDispatched(AWTEvent event) {
+        if (!(event instanceof KeyEvent)) return;
+        KeyEvent e = (KeyEvent) event;
+        if (event.getID() == KeyEvent.KEY_PRESSED) {
+            if (timer.isRunning()) {
+                timer.stop();
+            } else {
+                if (set.add((e.getKeyCode()))) doKeyPressEvent((KeyEvent) event);
+            }
+        }
+        if (event.getID() == KeyEvent.KEY_RELEASED) {
+            if (timer.isRunning()) {
+                timer.stop();
+                if (set.remove(e.getKeyCode())) doKeyReleaseEvent(e);
+            } else {
+                releaseEvent = e;
+                timer.restart();
+            }
+        }
+    }
+    
+
+    public void stop() {
+        try {
+            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
+        } catch (SecurityException ex) {
+        }
+    }
+
+    
+    protected void doKeyReleaseEvent(KeyEvent evt) {
+    }
+
+    protected void doKeyPressEvent(KeyEvent evt) {
+    }
+}
