# Source: src/ol/interaction/keyboardpaninteraction.js

    // FIXME works for View2D only

    goog.provide('ol.interaction.KeyboardPan');

    goog.require('goog.asserts');
    goog.require('goog.events.KeyCodes');
    goog.require('goog.events.KeyHandler.EventType');
    goog.require('goog.functions');
    goog.require('ol');
    goog.require('ol.View2D');
    goog.require('ol.coordinate');
    goog.require('ol.events.ConditionType');
    goog.require('ol.events.condition');
    goog.require('ol.interaction.Interaction');

    /**
     * @classdesc
     * Allows the user to pan the map using keyboard arrows.
     * Note that, although this interaction is by default included in maps,
     * the keys can only be used when browser focus is on the element to which
     * the keyboard events are attached. By default, this is the map div,
     * though you can change this with the `keyboardEventTarget` in
     * {@link ol.Map}. `document` never loses focus but, for any other element,
     * focus will have to be on, and returned to, this element if the keys are to
     * function.
     * See also {@link ol.interaction.KeyboardZoom}.
     *
     * @constructor
     * @extends {ol.interaction.Interaction}
     * @param {olx.interaction.KeyboardPanOptions=} opt_options Options.
     * @todo api
     */
    ol.interaction.KeyboardPan = function(opt_options) {

      goog.base(this);

      var options = goog.isDef(opt_options) ? opt_options : {};

      /**
       * @private
       * @type {ol.events.ConditionType}
       */
      this.condition_ = goog.isDef(options.condition) ? options.condition :
          goog.functions.and(ol.events.condition.noModifierKeys,
              ol.events.condition.targetNotEditable);

      /**
       * @private
       * @type {number}
       */
      this.pixelDelta_ = goog.isDef(options.pixelDelta) ? options.pixelDelta : 128;

    };
    goog.inherits(ol.interaction.KeyboardPan, ol.interaction.Interaction);

    /**
     * @inheritDoc
     */
    ol.interaction.KeyboardPan.prototype.handleMapBrowserEvent =
        function(mapBrowserEvent) {
      var stopEvent = false;
      if (mapBrowserEvent.type == goog.events.KeyHandler.EventType.KEY) {
        var keyEvent = /** @type {goog.events.KeyEvent} */
            (mapBrowserEvent.browserEvent);
        var keyCode = keyEvent.keyCode;
        if (this.condition_(mapBrowserEvent) &&
            (keyCode == goog.events.KeyCodes.DOWN ||
            keyCode == goog.events.KeyCodes.LEFT ||
            keyCode == goog.events.KeyCodes.RIGHT ||
            keyCode == goog.events.KeyCodes.UP)) {
          var map = mapBrowserEvent.map;
          // FIXME works for View2D only
          var view = map.getView();
          goog.asserts.assertInstanceof(view, ol.View2D);
          var view2DState = view.getView2DState();
          var mapUnitsDelta = view2DState.resolution * this.pixelDelta_;
          var deltaX = 0, deltaY = 0;
          if (keyCode == goog.events.KeyCodes.DOWN) {
            deltaY = -mapUnitsDelta;
          } else if (keyCode == goog.events.KeyCodes.LEFT) {
            deltaX = -mapUnitsDelta;
          } else if (keyCode == goog.events.KeyCodes.RIGHT) {
            deltaX = mapUnitsDelta;
          } else {
            deltaY = mapUnitsDelta;
          }
          var delta = [deltaX, deltaY];
          ol.coordinate.rotate(delta, view2DState.rotation);
          ol.interaction.Interaction.pan(
              map, view, delta, ol.KEYBOARD_PAN_DURATION);
          mapBrowserEvent.preventDefault();
          stopEvent = true;
        }
      }
      return !stopEvent;
    };