Index: imce_crop.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/imce_crop/imce_crop.js,v
retrieving revision 1.5
diff -u -r1.5 imce_crop.js
--- imce_crop.js	14 Aug 2010 20:05:30 -0000	1.5
+++ imce_crop.js	5 Sep 2010 22:55:06 -0000
@@ -50,16 +50,81 @@
   imce.cropperXextra = parseInt(imce.cropper.css('borderLeftWidth')) || 0;
   imce.cropperYextra = parseInt(imce.cropper.css('borderTopWidth')) || 0;
 
+  //move and resize cropper on arrow keys.
+  $('#op-content-crop input:text').keydown(function(e) {
+    var code = (e.keyCode ? e.keyCode : e.which);
+
+    var ea = jQuery.Event("keydown");
+    ea.keyCode = code;
+    ea.shiftKey = e.shiftKey;
+    ea.ctrlKey = e.ctrlKey;
+    if (e.ctrlKey && this.id != 'edit-crop-y') {
+      if (this.id == 'edit-crop-x' && (code == 37 || code == 39)) {
+        code = (code == 37) ? 40 : 38;
+      }
+      else {
+        if (code == 37 || code == 39) {
+          $("#edit-crop-x").trigger(ea);
+        }
+        else if (code == 38 || code == 40) {
+          $("#edit-crop-y").trigger(ea);
+        }
+        return;
+      }
+    }
+    else if (e.shiftKey && this.id != 'edit-crop-height') {
+      if (this.id == 'edit-crop-width' && (code == 37 || code == 39)) {
+        code = (code == 37) ? 40 : 38;
+      }
+      else {
+        if (code == 37 || code == 39) {
+          $("#edit-crop-width").trigger(ea);
+        }
+        else if (code == 38 || code == 40) {
+          $("#edit-crop-height").trigger(ea);
+        }
+        return;
+      }
+    }
+
+    num = this.value;
+    if (num == '') num = 0;
+    num = parseInt(num);
+
+    if (code == 40) { //DOWN key
+      if (this.id == 'edit-crop-height' || this.id == 'edit-crop-y') {
+        this.value = num + 1;
+      }
+      else {
+        this.value = num > 0 ? num - 1 : 0;
+      }
+    }
+    else if (code == 38) { //UP key
+      if (this.id == 'edit-crop-height' || this.id == 'edit-crop-y') {
+        this.value = num > 0 ? num - 1 : 0;
+      }
+      else {
+        this.value = num + 1;
+      }
+    }
+    update_cropper(this);
+  });
+
   //update cropper dimension&position on input value change.
   $('#op-content-crop input:text').keyup(function(e) {
-    var opt = ['width', this.value];
-    switch (this.id.substr(10)) {
+    update_cropper(this);
+  });
+
+  function update_cropper(element) {
+    // Update cropper dimensions instantly
+    var opt = ['width', element.value];
+    switch (element.id.substr(10)) {
       case 'x': opt = ['left', opt[1] - imce.cropperXextra]; break;
       case 'y': opt = ['top', opt[1] - imce.cropperXextra]; break;
       case 'height': opt[0] = 'height'; break;
     }
     imce.cropper.css(opt[0], opt[1] +'px');
-  });
+  }
 
   //alter preview function
   imce.cropPreview = imce.setPreview;
Index: imce_crop.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/imce_crop/imce_crop.module,v
retrieving revision 1.5
diff -u -r1.5 imce_crop.module
--- imce_crop.module	30 Aug 2010 04:09:09 -0000	1.5
+++ imce_crop.module	5 Sep 2010 22:55:57 -0000
@@ -72,6 +72,8 @@
     '#type' => 'checkbox',
     '#title' => t('Create a new image'),
     '#default_value' => 1,
+    '#suffix' => '<div class="description" style="font-size:0.8em;">'.
+      t('Use CTRL + arrow keys to adjust cropper position.<br/>Use SHIFT + arrow keys to adjust cropper size.') .'</div>',
   );
   $path = drupal_get_path('module', 'imce_crop');
   $form['#attached'] = array(

