Merge pull request #725 from timeu/patch-2
[dygraphs.git] / auto_tests / tests / DygraphOps.js
index 3bd3c44..460547b 100644 (file)
@@ -18,6 +18,7 @@
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
 
+import * as utils from '../../src/dygraph-utils';
 
 /** 
  * @fileoverview Utility functions for Dygraphs.
  */
 var DygraphOps = {};
 
-DygraphOps.dispatchDoubleClick = function(g, func) {
-  var evt = document.createEvent('MouseEvents');
-  evt.initMouseEvent( 
-      'dblclick', 
-      true, true, document.defaultView,
-      2, 0, 0, 0, 0,
-      false, false, false, false, 0, null);
-  if (func) {
-    func(evt);
-  }
-  g.canvas_.dispatchEvent(evt);
+DygraphOps.defaultEvent_ = {
+  type : '',
+  canBubble : true,
+  cancelable : true,
+  view : document.defaultView,
+  detail : 0,
+  screenX : 0,
+  screenY : 0,
+  clientX : 0,
+  clientY : 0,
+  ctrlKey : false,
+  altKey : false,
+  shiftKey : false,
+  metaKey : false,
+  button : 0,
+  relatedTarget : null
 };
 
-DygraphOps.dispatchMouseDown = function(g, x, y, func) {
-  var px = Dygraph.findPosX(g.canvas_);
-  var py = Dygraph.findPosY(g.canvas_);
-
-  var pageX = px + g.toDomXCoord(x);
-  var pageY = py + g.toDomYCoord(y);
-
-  var evt = document.createEvent('MouseEvents');
-  evt.initMouseEvent( 
-      'mousedown', 
-      true, true, document.defaultView,
-      1, pageX, pageY, pageX, pageY,
-      false, false, false, false, 0, null);
-  if (func) {
-    func(evt);
+/**
+ * Create an event. Sets default event values except for special ones
+ * overridden by the 'custom' parameter.
+ *
+ * @param command the command to create.
+ * @param custom an associative array of event attributes and their new values.
+ */
+DygraphOps.createEvent = function(command, custom) {
+
+  var copy = function(from, to) {
+    if (from != null) {
+      for (var prop in from) {
+        if(from.hasOwnProperty(prop)) {
+          to[prop] = from[prop];
+        }
+      }
+    }
   }
-  g.canvas_.dispatchEvent(evt);
+
+  var e = {};
+  copy(DygraphOps.defaultEvent_, e);
+  copy(command, e);
+  copy(custom, e);
+
+  var event = document.createEvent('MouseEvents');
+  event.initMouseEvent(
+    e.type,
+    e.canBubble,
+    e.cancelable,
+    e.view, 
+    e.detail,
+    e.screenX,
+    e.screenY,
+    e.clientX,
+    e.clientY,
+    e.ctrlKey,
+    e.altKey,
+    e.shiftKey,
+    e.metaKey,
+    e.button,
+    e.relatedTarget);
+  return event;
 };
 
-DygraphOps.dispatchMouseMove = function(g, x, y, func) {
-  var px = Dygraph.findPosX(g.canvas_);
-  var py = Dygraph.findPosY(g.canvas_);
-
-  var pageX = px + g.toDomXCoord(x);
-  var pageY = py + g.toDomYCoord(y);
-
-  var evt = document.createEvent('MouseEvents');
-  evt.initMouseEvent( 
-      'mousemove', 
-      true, true, document.defaultView,
-      0, pageX, pageY, pageX, pageY,
-      false, false, false, false, 0, null);
-  if (func) {
-    func(evt);
-  }
-  g.canvas_.dispatchEvent(evt);
+/**
+ * Dispatch an event onto the graph's canvas.
+ */
+DygraphOps.dispatchCanvasEvent = function(g, event) {
+  g.canvas_.dispatchEvent(event);
 };
 
-DygraphOps.dispatchMouseUp = function(g, x, y, func) {
-  var px = Dygraph.findPosX(g.canvas_);
-  var py = Dygraph.findPosY(g.canvas_);
-
-  var pageX = px + g.toDomXCoord(x);
-  var pageY = py + g.toDomYCoord(y);
-
-  var evt = document.createEvent('MouseEvents');
-  evt.initMouseEvent( 
-      'mouseup', 
-      true, true, document.defaultView,
-      0, pageX, pageY, pageX, pageY,
-      false, false, false, false, 0, null);
-  if (func) {
-    func(evt);
-  }
-  g.canvas_.dispatchEvent(evt);
+DygraphOps.dispatchDoubleClick = function(g, custom) {
+  var opts = {
+    type : 'dblclick',
+    detail : 2
+  };
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+/*
+ * Create an 'opts' argument which can be passed to createEvent that contains
+ * type, screenX, screenY, clientX, clientY.
+ */
+DygraphOps.createOptsForPoint_ = function(g, type, x, y) {
+  var pos = utils.findPos(g.canvas_);
+  var pageX = pos.x + x;
+  var pageY = pos.y + y;
+
+  return {
+    type : type,
+    screenX : pageX,
+    screenY : pageY,
+    clientX : pageX,
+    clientY : pageY,
+  };
+};
+
+DygraphOps.dispatchMouseDown_Point = function(g, x, y, custom) {
+  var opts = DygraphOps.createOptsForPoint_(g, 'mousedown', x, y);
+  opts.detail = 1;
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+DygraphOps.dispatchMouseMove_Point = function(g, x, y, custom) {
+  var opts = DygraphOps.createOptsForPoint_(g, 'mousemove', x, y);
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+DygraphOps.dispatchMouseUp_Point = function(g, x, y, custom) {
+  var opts = DygraphOps.createOptsForPoint_(g, 'mouseup', x, y);
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+DygraphOps.dispatchMouseOver_Point = function(g, x, y, custom) {
+  var opts = DygraphOps.createOptsForPoint_(g, 'mouseover', x, y);
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+DygraphOps.dispatchMouseOut_Point = function(g, x, y, custom) {
+  var opts = DygraphOps.createOptsForPoint_(g, 'mouseout', x, y);
+  var event = DygraphOps.createEvent(opts, custom);
+  DygraphOps.dispatchCanvasEvent(g, event);
+};
+
+/**
+ * Dispatches a mouse down using the graph's data coordinate system.
+ * (The y value mapped to the first axis.)
+ */
+DygraphOps.dispatchMouseDown = function(g, x, y, custom) {
+  DygraphOps.dispatchMouseDown_Point(
+      g,
+      g.toDomXCoord(x),
+      g.toDomYCoord(y),
+      custom);
+};
+
+/**
+ * Dispatches a mouse move using the graph's data coordinate system.
+ * (The y value mapped to the first axis.)
+ */
+DygraphOps.dispatchMouseMove = function(g, x, y, custom) {
+  DygraphOps.dispatchMouseMove_Point(
+      g,
+      g.toDomXCoord(x),
+      g.toDomYCoord(y),
+      custom);
+};
+
+/**
+ * Dispatches a mouse up using the graph's data coordinate system.
+ * (The y value mapped to the first axis.)
+ */
+DygraphOps.dispatchMouseUp = function(g, x, y, custom) {
+  DygraphOps.dispatchMouseUp_Point(
+      g,
+      g.toDomXCoord(x),
+      g.toDomYCoord(y),
+      custom);
+};
+
+/**
+ * Dispatches a mouse over using the graph's data coordinate system.
+ * (The y value mapped to the first axis.)
+ */
+DygraphOps.dispatchMouseOver = function(g, x, y, custom) {
+  DygraphOps.dispatchMouseOver_Point(
+      g,
+      g.toDomXCoord(x),
+      g.toDomYCoord(y),
+      custom);
 };
+
+/**
+ * Dispatches a mouse out using the graph's data coordinate system.
+ * (The y value mapped to the first axis.)
+ */
+DygraphOps.dispatchMouseOut = function(g, x, y, custom) {
+  DygraphOps.dispatchMouseOut_Point(
+      g,
+      g.toDomXCoord(x),
+      g.toDomYCoord(y),
+      custom);
+};
+
+
+export default DygraphOps;