;(function(undefined) {
|
|
'use strict';
|
|
|
|
if (typeof sigma === 'undefined')
|
|
throw 'sigma is not declared';
|
|
|
|
// Initialize packages:
|
|
sigma.utils.pkg('sigma.misc');
|
|
|
|
/**
|
|
* This helper will bind any DOM renderer (for instance svg)
|
|
* to its captors, to properly dispatch the good events to the sigma instance
|
|
* to manage clicking, hovering etc...
|
|
*
|
|
* It has to be called in the scope of the related renderer.
|
|
*/
|
|
sigma.misc.bindDOMEvents = function(container) {
|
|
var self = this,
|
|
graph = this.graph;
|
|
|
|
// DOMElement abstraction
|
|
function Element(domElement) {
|
|
|
|
// Helpers
|
|
this.attr = function(attrName) {
|
|
return domElement.getAttributeNS(null, attrName);
|
|
};
|
|
|
|
// Properties
|
|
this.tag = domElement.tagName;
|
|
this.class = this.attr('class');
|
|
this.id = this.attr('id');
|
|
|
|
// Methods
|
|
this.isNode = function() {
|
|
return !!~this.class.indexOf(self.settings('classPrefix') + '-node');
|
|
};
|
|
|
|
this.isEdge = function() {
|
|
return !!~this.class.indexOf(self.settings('classPrefix') + '-edge');
|
|
};
|
|
|
|
this.isHover = function() {
|
|
return !!~this.class.indexOf(self.settings('classPrefix') + '-hover');
|
|
};
|
|
}
|
|
|
|
// Click
|
|
function click(e) {
|
|
if (!self.settings('eventsEnabled'))
|
|
return;
|
|
|
|
// Generic event
|
|
self.dispatchEvent('click', e);
|
|
|
|
// Are we on a node?
|
|
var element = new Element(e.target);
|
|
|
|
if (element.isNode())
|
|
self.dispatchEvent('clickNode', {
|
|
node: graph.nodes(element.attr('data-node-id'))
|
|
});
|
|
else
|
|
self.dispatchEvent('clickStage');
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
|
|
// Double click
|
|
function doubleClick(e) {
|
|
if (!self.settings('eventsEnabled'))
|
|
return;
|
|
|
|
// Generic event
|
|
self.dispatchEvent('doubleClick', e);
|
|
|
|
// Are we on a node?
|
|
var element = new Element(e.target);
|
|
|
|
if (element.isNode())
|
|
self.dispatchEvent('doubleClickNode', {
|
|
node: graph.nodes(element.attr('data-node-id'))
|
|
});
|
|
else
|
|
self.dispatchEvent('doubleClickStage');
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
|
|
// On over
|
|
function onOver(e) {
|
|
var target = e.toElement || e.target;
|
|
|
|
if (!self.settings('eventsEnabled') || !target)
|
|
return;
|
|
|
|
var el = new Element(target);
|
|
|
|
if (el.isNode()) {
|
|
self.dispatchEvent('overNode', {
|
|
node: graph.nodes(el.attr('data-node-id'))
|
|
});
|
|
}
|
|
else if (el.isEdge()) {
|
|
var edge = graph.edges(el.attr('data-edge-id'));
|
|
self.dispatchEvent('overEdge', {
|
|
edge: edge,
|
|
source: graph.nodes(edge.source),
|
|
target: graph.nodes(edge.target)
|
|
});
|
|
}
|
|
}
|
|
|
|
// On out
|
|
function onOut(e) {
|
|
var target = e.fromElement || e.originalTarget;
|
|
|
|
if (!self.settings('eventsEnabled'))
|
|
return;
|
|
|
|
var el = new Element(target);
|
|
|
|
if (el.isNode()) {
|
|
self.dispatchEvent('outNode', {
|
|
node: graph.nodes(el.attr('data-node-id'))
|
|
});
|
|
}
|
|
else if (el.isEdge()) {
|
|
var edge = graph.edges(el.attr('data-edge-id'));
|
|
self.dispatchEvent('outEdge', {
|
|
edge: edge,
|
|
source: graph.nodes(edge.source),
|
|
target: graph.nodes(edge.target)
|
|
});
|
|
}
|
|
}
|
|
|
|
// Registering Events:
|
|
|
|
// Click
|
|
container.addEventListener('click', click, false);
|
|
sigma.utils.doubleClick(container, 'click', doubleClick);
|
|
|
|
// Touch counterparts
|
|
container.addEventListener('touchstart', click, false);
|
|
sigma.utils.doubleClick(container, 'touchstart', doubleClick);
|
|
|
|
// Mouseover
|
|
container.addEventListener('mouseover', onOver, true);
|
|
|
|
// Mouseout
|
|
container.addEventListener('mouseout', onOut, true);
|
|
};
|
|
}).call(this);
|