More trip planner testing with colors
[busui.git] / labs / openlayers / lib / OpenLayers / Control / DragFeature.js
blob:a/labs/openlayers/lib/OpenLayers/Control/DragFeature.js -> blob:b/labs/openlayers/lib/OpenLayers/Control/DragFeature.js
  /* Copyright (c) 2006-2010 by OpenLayers Contributors (see authors.txt for
  * full list of contributors). Published under the Clear BSD license.
  * See http://svn.openlayers.org/trunk/openlayers/license.txt for the
  * full text of the license. */
   
   
  /**
  * @requires OpenLayers/Control.js
  * @requires OpenLayers/Handler/Drag.js
  * @requires OpenLayers/Handler/Feature.js
  */
   
  /**
  * Class: OpenLayers.Control.DragFeature
  * The DragFeature control moves a feature with a drag of the mouse. Create a
  * new control with the <OpenLayers.Control.DragFeature> constructor.
  *
  * Inherits From:
  * - <OpenLayers.Control>
  */
  OpenLayers.Control.DragFeature = OpenLayers.Class(OpenLayers.Control, {
   
  /**
  * APIProperty: geometryTypes
  * {Array(String)} To restrict dragging to a limited set of geometry types,
  * send a list of strings corresponding to the geometry class names.
  */
  geometryTypes: null,
   
  /**
  * APIProperty: onStart
  * {Function} Define this function if you want to know when a drag starts.
  * The function should expect to receive two arguments: the feature
  * that is about to be dragged and the pixel location of the mouse.
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>} The feature that is about to be
  * dragged.
  * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
  */
  onStart: function(feature, pixel) {},
   
  /**
  * APIProperty: onDrag
  * {Function} Define this function if you want to know about each move of a
  * feature. The function should expect to receive two arguments: the
  * feature that is being dragged and the pixel location of the mouse.
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>} The feature that was dragged.
  * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
  */
  onDrag: function(feature, pixel) {},
   
  /**
  * APIProperty: onComplete
  * {Function} Define this function if you want to know when a feature is
  * done dragging. The function should expect to receive two arguments:
  * the feature that is being dragged and the pixel location of the
  * mouse.
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>} The feature that was dragged.
  * pixel - {<OpenLayers.Pixel>} The pixel location of the mouse.
  */
  onComplete: function(feature, pixel) {},
   
  /**
  * APIProperty: documentDrag
  * {Boolean} If set to true, mouse dragging will continue even if the
  * mouse cursor leaves the map viewport. Default is false.
  */
  documentDrag: false,
   
  /**
  * Property: layer
  * {<OpenLayers.Layer.Vector>}
  */
  layer: null,
   
  /**
  * Property: feature
  * {<OpenLayers.Feature.Vector>}
  */
  feature: null,
   
  /**
  * Property: dragCallbacks
  * {Object} The functions that are sent to the drag handler for callback.
  */
  dragCallbacks: {},
   
  /**
  * Property: featureCallbacks
  * {Object} The functions that are sent to the feature handler for callback.
  */
  featureCallbacks: {},
   
  /**
  * Property: lastPixel
  * {<OpenLayers.Pixel>}
  */
  lastPixel: null,
   
  /**
  * Constructor: OpenLayers.Control.DragFeature
  * Create a new control to drag features.
  *
  * Parameters:
  * layer - {<OpenLayers.Layer.Vector>} The layer containing features to be
  * dragged.
  * options - {Object} Optional object whose properties will be set on the
  * control.
  */
  initialize: function(layer, options) {
  OpenLayers.Control.prototype.initialize.apply(this, [options]);
  this.layer = layer;
  this.handlers = {
  drag: new OpenLayers.Handler.Drag(
  this, OpenLayers.Util.extend({
  down: this.downFeature,
  move: this.moveFeature,
  up: this.upFeature,
  out: this.cancel,
  done: this.doneDragging
  }, this.dragCallbacks), {
  documentDrag: this.documentDrag
  }
  ),
  feature: new OpenLayers.Handler.Feature(
  this, this.layer, OpenLayers.Util.extend({
  over: this.overFeature,
  out: this.outFeature
  }, this.featureCallbacks),
  {geometryTypes: this.geometryTypes}
  )
  };
  },
   
  /**
  * APIMethod: destroy
  * Take care of things that are not handled in superclass
  */
  destroy: function() {
  this.layer = null;
  OpenLayers.Control.prototype.destroy.apply(this, []);
  },
   
  /**
  * APIMethod: activate
  * Activate the control and the feature handler.
  *
  * Returns:
  * {Boolean} Successfully activated the control and feature handler.
  */
  activate: function() {
  return (this.handlers.feature.activate() &&
  OpenLayers.Control.prototype.activate.apply(this, arguments));
  },
   
  /**
  * APIMethod: deactivate
  * Deactivate the control and all handlers.
  *
  * Returns:
  * {Boolean} Successfully deactivated the control.
  */
  deactivate: function() {
  // the return from the handlers is unimportant in this case
  this.handlers.drag.deactivate();
  this.handlers.feature.deactivate();
  this.feature = null;
  this.dragging = false;
  this.lastPixel = null;
  OpenLayers.Element.removeClass(
  this.map.viewPortDiv, this.displayClass + "Over"
  );
  return OpenLayers.Control.prototype.deactivate.apply(this, arguments);
  },
   
  /**
  * Method: overFeature
  * Called when the feature handler detects a mouse-over on a feature.
  * This activates the drag handler.
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>} The selected feature.
  */
  overFeature: function(feature) {
  if(!this.handlers.drag.dragging) {
  this.feature = feature;
  this.handlers.drag.activate();
  this.over = true;
  OpenLayers.Element.addClass(this.map.viewPortDiv, this.displayClass + "Over");
  } else {
  if(this.feature.id == feature.id) {
  this.over = true;
  } else {
  this.over = false;
  }
  }
  },
   
  /**
  * Method: downFeature
  * Called when the drag handler detects a mouse-down.
  *
  * Parameters:
  * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
  */
  downFeature: function(pixel) {
  this.lastPixel = pixel;
  this.onStart(this.feature, pixel);
  },
   
  /**
  * Method: moveFeature
  * Called when the drag handler detects a mouse-move. Also calls the
  * optional onDrag method.
  *
  * Parameters:
  * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
  */
  moveFeature: function(pixel) {
  var res = this.map.getResolution();
  this.feature.geometry.move(res * (pixel.x - this.lastPixel.x),
  res * (this.lastPixel.y - pixel.y));
  this.layer.drawFeature(this.feature);
  this.lastPixel = pixel;
  this.onDrag(this.feature, pixel);
  },
   
  /**
  * Method: upFeature
  * Called when the drag handler detects a mouse-up.
  *
  * Parameters:
  * pixel - {<OpenLayers.Pixel>} Location of the mouse event.
  */
  upFeature: function(pixel) {
  if(!this.over) {
  this.handlers.drag.deactivate();
  }
  },
   
  /**
  * Method: doneDragging
  * Called when the drag handler is done dragging.
  *
  * Parameters:
  * pixel - {<OpenLayers.Pixel>} The last event pixel location. If this event
  * came from a mouseout, this may not be in the map viewport.
  */
  doneDragging: function(pixel) {
  this.onComplete(this.feature, pixel);
  },
   
  /**
  * Method: outFeature
  * Called when the feature handler detects a mouse-out on a feature.
  *
  * Parameters:
  * feature - {<OpenLayers.Feature.Vector>} The feature that the mouse left.
  */
  outFeature: function(feature) {
  if(!this.handlers.drag.dragging) {
  this.over = false;
  this.handlers.drag.deactivate();
  OpenLayers.Element.removeClass(
  this.map.viewPortDiv, this.displayClass + "Over"
  );
  this.feature = null;
  } else {
  if(this.feature.id == feature.id) {
  this.over = false;
  }
  }
  },
   
  /**
  * Method: cancel
  * Called when the drag handler detects a mouse-out (from the map viewport).
  */
  cancel: function() {
  this.handlers.drag.deactivate();
  this.over = false;
  },
   
  /**
  * Method: setMap
  * Set the map property for the control and all handlers.
  *
  * Parameters:
  * map - {<OpenLayers.Map>} The control's map.
  */
  setMap: function(map) {
  this.handlers.drag.setMap(map);
  this.handlers.feature.setMap(map);
  OpenLayers.Control.prototype.setMap.apply(this, arguments);
  },
   
  CLASS_NAME: "OpenLayers.Control.DragFeature"
  });