diff --git a/lib/OpenLayers/Control/KeyboardDefaults.js b/lib/OpenLayers/Control/KeyboardDefaults.js index 45efc6cb41..7a421944c3 100644 --- a/lib/OpenLayers/Control/KeyboardDefaults.js +++ b/lib/OpenLayers/Control/KeyboardDefaults.js @@ -47,18 +47,26 @@ OpenLayers.Control.KeyboardDefaults = OpenLayers.Class(OpenLayers.Control, { */ draw: function() { this.handler = new OpenLayers.Handler.Keyboard( this, { - "keypress": this.defaultKeyPress }); + "keydown": this.defaultKeyPress }); this.activate(); }, /** * Method: defaultKeyPress + * When handling the key event, we only use evt.keyCode. This holds + * some drawbacks, though we get around them below. When interpretting + * the keycodes below (including the comments associated with them), + * consult the URL below. For instance, the Safari browser returns + * "IE keycodes", and so is supported by any keycode labeled "IE". + * + * Very informative URL: + * http://unixpapa.com/js/key.html * * Parameters: * code - {Integer} */ - defaultKeyPress: function (code) { - switch(code) { + defaultKeyPress: function (evt) { + switch(evt.keyCode) { case OpenLayers.Event.KEY_LEFT: this.map.pan(-this.slideFactor, 0); break; @@ -72,35 +80,35 @@ OpenLayers.Control.KeyboardDefaults = OpenLayers.Class(OpenLayers.Control, { this.map.pan(0, this.slideFactor); break; - case 33: // Page Up + case 33: // Page Up. Same in all browsers. var size = this.map.getSize(); this.map.pan(0, -0.75*size.h); break; - case 34: // Page Down + case 34: // Page Down. Same in all browsers. var size = this.map.getSize(); this.map.pan(0, 0.75*size.h); break; - case 35: // End + case 35: // End. Same in all browsers. var size = this.map.getSize(); this.map.pan(0.75*size.w, 0); break; - case 36: // Pos1 + case 36: // Home. Same in all browsers. var size = this.map.getSize(); this.map.pan(-0.75*size.w, 0); break; - case 43: // + + case 43: // +/= (ASCII), keypad + (ASCII, Opera) + case 61: // +/= (Mozilla, Opera, some ASCII) + case 187: // +/= (IE) + case 107: // keypad + (IE, Mozilla) this.map.zoomIn(); break; - case 45: // - + case 45: // -/_ (ASCII, Opera), keypad - (ASCII, Opera) + case 109: // -/_ (Mozilla), keypad - (Mozilla, IE) + case 189: // -/_ (IE) + case 95: // -/_ (some ASCII) this.map.zoomOut(); break; - case 107: // + (IE only) - this.map.zoomIn(); - break; - case 109: // - (IE only) - this.map.zoomOut(); - break; } }, diff --git a/lib/OpenLayers/Control/ModifyFeature.js b/lib/OpenLayers/Control/ModifyFeature.js index bb9cb9f10f..35282aa893 100644 --- a/lib/OpenLayers/Control/ModifyFeature.js +++ b/lib/OpenLayers/Control/ModifyFeature.js @@ -93,7 +93,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * {Array(Integer)} Keycodes for deleting verticies. Set to null to disable * vertex deltion by keypress. If non-null, keypresses with codes * in this array will delete vertices under the mouse. Default - * is 46 and 100, the 'delete' and lowercase 'd' keys. + * is 46 and 68, the 'delete' and lowercase 'd' keys. */ deleteCodes: null, @@ -183,7 +183,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { this.layer.style || this.layer.styleMap.createSymbolizer()); this.virtualStyle.fillOpacity = 0.3; this.virtualStyle.strokeOpacity = 0.3; - this.deleteCodes = [46, 100]; + this.deleteCodes = [46, 68]; this.mode = OpenLayers.Control.ModifyFeature.RESHAPE; OpenLayers.Control.prototype.initialize.apply(this, [options]); if(!(this.deleteCodes instanceof Array)) { @@ -227,7 +227,7 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { // configure the keyboard handler var keyboardOptions = { - keypress: this.handleKeypress + keydown: this.handleKeypress }; this.handlers = { keyboard: new OpenLayers.Handler.Keyboard(this, keyboardOptions) @@ -517,7 +517,9 @@ OpenLayers.Control.ModifyFeature = OpenLayers.Class(OpenLayers.Control, { * Parameters: * {Integer} Key code corresponding to the keypress event. */ - handleKeypress: function(code) { + handleKeypress: function(evt) { + var code = evt.keyCode; + // check for delete key if(this.feature && OpenLayers.Util.indexOf(this.deleteCodes, code) != -1) { diff --git a/lib/OpenLayers/Handler/Keyboard.js b/lib/OpenLayers/Handler/Keyboard.js index 9d108888d7..34ca4a3595 100644 --- a/lib/OpenLayers/Handler/Keyboard.js +++ b/lib/OpenLayers/Handler/Keyboard.js @@ -24,7 +24,7 @@ OpenLayers.Handler.Keyboard = OpenLayers.Class(OpenLayers.Handler, { * Constant: KEY_EVENTS * keydown, keypress, keyup */ - KEY_EVENTS: ["keydown", "keypress", "keyup"], + KEY_EVENTS: ["keydown", "keyup"], /** * Property: eventListener @@ -72,7 +72,7 @@ OpenLayers.Handler.Keyboard = OpenLayers.Class(OpenLayers.Handler, { if (OpenLayers.Handler.prototype.activate.apply(this, arguments)) { for (var i=0, len=this.KEY_EVENTS.length; i centerLL.lat, "key up works correctly" ); + + // Start new test. evt.keyCode = OpenLayers.Event.KEY_DOWN; - control.defaultKeyDown(evt); + control.defaultKeyPress(evt); }, - 1, function() { + 2, function() { t.ok( map.getCenter().lat == centerLL.lat, "key down works correctly" ); + + // Start new test. evt.keyCode = 33; //page up - control.defaultKeyDown(evt); + control.defaultKeyPress(evt); }, - 1, function() { + 2, function() { t.ok( map.getCenter().lat > centerLL.lat, "key page up works correctly" ); + + // Start new test. evt.keyCode = 34; //page down - control.defaultKeyDown(evt); + control.defaultKeyPress(evt); }, - 1, function() { + 2, function() { t.ok( map.getCenter().lat == centerLL.lat, "key page down works correctly" ); + + // Start new test. evt.keyCode = 35; //end - control.defaultKeyDown(evt); + control.defaultKeyPress(evt); }, - 1, function() { + 2, function() { t.ok( map.getCenter().lon > centerLL.lon, "key end works correctly" ); - evt.keyCode = 36; //pos1 - control.defaultKeyDown(evt); + + // Start new test. + evt.keyCode = 36; //home + control.defaultKeyPress(evt); }, - 1, function() { - t.ok( map.getCenter().lon == centerLL.lon, "key pos1 works correctly" ); - evt.charCode = 43; //+ - control.defaultKeyDown(evt); - }, - 1, function() { - t.eq( map.getZoom(), 5, "key + works correctly" ); + 2, function() { + t.ok( map.getCenter().lon == centerLL.lon, "key home works correctly"); + + // Start new test. + evt.keyCode = 43; //+ + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 1, "key code 43 works correctly: +/= key (ASCII), keypad + (ASCII, Opera)" ); + + // Start new test. + evt.keyCode = 61; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 2, "key code 61 works correctly: +/= key (Mozilla, Opera, some ASCII)"); + + // Start new test. + evt.keyCode = 187; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 3, "key code 187 works correctly: +/= key (IE)"); + + // Start new test. + evt.keyCode = 107; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 4, "key code 107 works correctly: keypad + (IE, Mozilla)"); + + // Start new test. // set zoomanimation flag manually, // reason: loadend event in layers.js will not achieved in unittests map.zoomanimationActive = false; - evt.charCode = 45; //- - control.defaultKeyDown(evt); - }, - 1, function() { - t.eq( map.getZoom(), 4, "key - works correctly" ); + evt.keyCode = 45; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 3, "key code 45 works correctly: -/_ key (ASCII, Opera), keypad - (ASCII, Opera)"); + + // Start new test. + // set zoomanimation flag manually, + // reason: loadend event in layers.js will not achieved in unittests + map.zoomanimationActive = false; + evt.keyCode = 109; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 2, "key code 109 works correctly: -/_ key (Mozilla), keypad - (Mozilla, IE)"); + + // Start new test. + // set zoomanimation flag manually, + // reason: loadend event in layers.js will not achieved in unittests + map.zoomanimationActive = false; + evt.keyCode = 189; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL + 1, "key code 189 works correctly: -/_ key (IE)"); + + // Start new test. + // set zoomanimation flag manually, + // reason: loadend event in layers.js will not achieved in unittests + map.zoomanimationActive = false; + evt.keyCode = 95; + control.defaultKeyPress(evt); + t.eq( map.getZoom(), STARTING_ZOOM_LEVEL, "key code 95 works correctly: -/_ key (some ASCII)"); } ); } diff --git a/tests/Control/ModifyFeature.html b/tests/Control/ModifyFeature.html index cc0d3735f0..7c3b2f4679 100644 --- a/tests/Control/ModifyFeature.html +++ b/tests/Control/ModifyFeature.html @@ -67,7 +67,7 @@ t.eq(control.deleteCodes[0], 46, "Delete code properly turned into an array."); var control = new OpenLayers.Control.ModifyFeature(layer); t.eq(control.deleteCodes[0], 46, "Default deleteCodes include delete"); - t.eq(control.deleteCodes[1], 100, "Default deleteCodes include 'd'"); + t.eq(control.deleteCodes[1], 68, "Default deleteCodes include 'd'"); control.destroy(); layer.destroy(); @@ -123,12 +123,12 @@ "vertex deletion: onModification called with the proper feature"); }; // run the above four tests twice - control.handleKeypress(delKey); - control.handleKeypress(dKey); + control.handleKeypress({keyCode:delKey}); + control.handleKeypress({keyCode:dKey}); // now make sure nothing happens if the vertex is mid-drag control.dragControl.handlers.drag.dragging = true; - control.handleKeypress(delKey); + control.handleKeypress({keyCode:delKey}); // clean up control.destroy(); @@ -428,7 +428,7 @@ }; point.geometry.parent = poly.geometry; control.dragControl.feature = point; - control.handleKeypress(46); + control.handleKeypress({keyCode:46}); layer.drawFeature = oldDraw; map.destroy(); diff --git a/tests/list-tests.html b/tests/list-tests.html index dfa1758765..ddeeaed9e7 100644 --- a/tests/list-tests.html +++ b/tests/list-tests.html @@ -14,6 +14,7 @@
  • Control/DragFeature.html
  • Control/DragPan.html
  • Control/DrawFeature.html
  • +
  • Control/KeyboardDefaults.html
  • Control/LayerSwitcher.html
  • Control/ModifyFeature.html
  • Control/MousePosition.html