module.exports = function ( graph ){
/** variable defs **/
var Class_dragger = {};
Class_dragger.nodeId = 10001;
Class_dragger.parent = undefined;
Class_dragger.x = 0;
Class_dragger.y = 0;
Class_dragger.rootElement = undefined;
Class_dragger.rootNodeLayer = undefined;
Class_dragger.pathLayer = undefined;
Class_dragger.mouseEnteredVar = false;
Class_dragger.mouseButtonPressed = false;
Class_dragger.nodeElement = undefined;
Class_dragger.draggerObject = undefined;
Class_dragger.pathElement = undefined;
Class_dragger.typus = "Class_dragger";
Class_dragger.type = function (){
return Class_dragger.typus;
};
Class_dragger.parentNode = function (){
return Class_dragger.parent;
};
Class_dragger.hideClass_dragger = function ( val ){
Class_dragger.pathElement.classed("hidden", val);
Class_dragger.nodeElement.classed("hidden", val);
Class_dragger.draggerObject.classed("hidden", val);
};
Class_dragger.setParentNode = function ( parentNode ){
Class_dragger.parent = parentNode;
if ( Class_dragger.mouseButtonPressed === false ) {
if ( Class_dragger.parent.actualRadius && Class_dragger.parent.actualRadius() ) {
Class_dragger.x = Class_dragger.parent.x + 10 + Class_dragger.parent.actualRadius();
Class_dragger.y = Class_dragger.parent.y + 10 + Class_dragger.parent.actualRadius();
} else {
Class_dragger.x = Class_dragger.parent.x + 60;
Class_dragger.y = Class_dragger.parent.y + 60;
}
}
Class_dragger.updateElement();
};
Class_dragger.hideDragger = function ( val ){
if ( Class_dragger.pathElement ) Class_dragger.pathElement.classed("hidden", val);
if ( Class_dragger.nodeElement ) Class_dragger.nodeElement.classed("hidden", val);
if ( Class_dragger.draggerObject ) Class_dragger.draggerObject.classed("hidden", val);
};
/** BASE HANDLING FUNCTIONS ------------------------------------------------- **/
Class_dragger.id = function ( index ){
if ( !arguments.length ) {
return Class_dragger.nodeId;
}
Class_dragger.nodeId = index;
};
Class_dragger.svgPathLayer = function ( layer ){
Class_dragger.pathLayer = layer.append('g');
};
Class_dragger.svgRoot = function ( root ){
if ( !arguments.length )
return Class_dragger.rootElement;
Class_dragger.rootElement = root;
Class_dragger.rootNodeLayer = Class_dragger.rootElement.append('g');
Class_dragger.addMouseEvents();
};
/** DRAWING FUNCTIONS ------------------------------------------------- **/
Class_dragger.drawNode = function (){
Class_dragger.pathElement = Class_dragger.pathLayer.append('line')
.classed("classNodeDragPath", true);
Class_dragger.pathElement.attr("x1", 0)
.attr("y1", 0)
.attr("x2", 0)
.attr("y2", 0);
// var lineData = [
// {"x": 0, "y": 0},
// {"x": 0, "y": 40},
// {"x": -40, "y": 0},
// {"x": 0, "y": -40},
// {"x": 0, "y": 0}
// ];
var lineData = [
{ "x": -40, "y": 0 }, // start
{ "x": -20, "y": -10 },
{ "x": 20, "y": -50 },
{ "x": -10, "y": 0 }, // center
{ "x": 20, "y": 50 },
{ "x": -20, "y": 10 },
{ "x": -40, "y": 0 }
];
var lineFunction = d3.svg.line()
.x(function ( d ){
return d.x;
})
.y(function ( d ){
return d.y;
})
.interpolate("basis-closed");
var pathData = "M 20,40 C 0,15 0,-15 20,-40 L -40,0 Z";
// var pathData="M 20,40 C 0,15 0,-15 20,-40 20,-40 -35.22907,-23.905556 -45.113897,0.06313453 -35.22907,20.095453 20,40 20,40 Z";
// var pathData="M 39.107144,51.25 C 0,17.362169 0,-13.75 39.285715,-49.821429 c 0,0 -69.58321,34.511175 -100.714286,50.35714329 C -22.96643,20.324376 39.107144,51.25 39.107144,51.25 Z";
Class_dragger.nodeElement = Class_dragger.rootNodeLayer.append('path').attr("d", pathData);
Class_dragger.nodeElement.classed("classDraggerNode", true);
Class_dragger.draggerObject = Class_dragger.rootNodeLayer.append("circle");
if ( graph.options().useAccuracyHelper() ) {
Class_dragger.draggerObject.attr("r", 40)
.attr("cx", 0)
.attr("cy", 0)
.classed("superHiddenElement", true);
Class_dragger.draggerObject.classed("superOpacityElement", !graph.options().showDraggerObject());
}
};
Class_dragger.updateElement = function (){
// Class_dragger.pathLayer.attr("transform", "translate(" + Class_dragger.x + "," + Class_dragger.y + ")");
// Class_dragger.rootElement.attr("transform", "translate(" + Class_dragger.x + "," + Class_dragger.y + ")");
if ( Class_dragger.pathElement ) {
// compute start point ;
var sX = Class_dragger.parent.x,
sY = Class_dragger.parent.y,
eX = Class_dragger.x,
eY = Class_dragger.y;
// this is used only when you dont have a proper layout ordering;
var dirX = eX - sX;
var dirY = eY - sY;
var len = Math.sqrt((dirX * dirX) + (dirY * dirY));
var nX = dirX / len;
var nY = dirY / len;
var ppX = sX + nX * Class_dragger.parent.actualRadius();
var ppY = sY + nY * Class_dragger.parent.actualRadius();
var ncx = nX * 15;
var ncy = nY * 15;
Class_dragger.draggerObject.attr("cx", ncx)
.attr("cy", ncy);
Class_dragger.pathElement.attr("x1", ppX)
.attr("y1", ppY)
.attr("x2", eX)
.attr("y2", eY);
}
var angle = Math.atan2(Class_dragger.parent.y - Class_dragger.y, Class_dragger.parent.x - Class_dragger.x) * 180 / Math.PI;
Class_dragger.nodeElement.attr("transform", "translate(" + Class_dragger.x + "," + Class_dragger.y + ")" + "rotate(" + angle + ")");
Class_dragger.draggerObject.attr("transform", "translate(" + Class_dragger.x + "," + Class_dragger.y + ")");
// console.log("update Elmenent root element"+Class_dragger.x + "," + Class_dragger.y );
//
// Class_dragger.nodeElement.attr("transform", function (d) {
// return "rotate(" + angle + ")";
// });
};
/** MOUSE HANDLING FUNCTIONS ------------------------------------------------- **/
Class_dragger.addMouseEvents = function (){
// console.log("adding mouse events");
Class_dragger.rootNodeLayer.selectAll("*").on("mouseover", Class_dragger.onMouseOver)
.on("mouseout", Class_dragger.onMouseOut)
.on("click", function (){
})
.on("dblclick", function (){
})
.on("mousedown", Class_dragger.mouseDown)
.on("mouseup", Class_dragger.mouseUp);
};
Class_dragger.mouseDown = function (){
Class_dragger.nodeElement.style("cursor", "move");
Class_dragger.nodeElement.classed("classDraggerNodeHovered", true);
Class_dragger.mouseButtonPressed = true;
console.log("Mouse DOWN from Dragger");
};
Class_dragger.mouseUp = function (){
Class_dragger.nodeElement.style("cursor", "auto");
Class_dragger.mouseButtonPressed = false;
console.log("Mouse UP from Dragger");
};
Class_dragger.mouseEntered = function ( p ){
if ( !arguments.length ) return Class_dragger.mouseEnteredVar;
Class_dragger.mouseEnteredVar = p;
return Class_dragger;
};
Class_dragger.selectedViaTouch = function ( val ){
Class_dragger.nodeElement.classed("classDraggerNode", !val);
Class_dragger.nodeElement.classed("classDraggerNodeHovered", val);
};
Class_dragger.onMouseOver = function (){
if ( Class_dragger.mouseEntered() ) {
return;
}
Class_dragger.nodeElement.classed("classDraggerNode", false);
Class_dragger.nodeElement.classed("classDraggerNodeHovered", true);
var selectedNode = Class_dragger.rootElement.node(),
nodeContainer = selectedNode.parentNode;
nodeContainer.appendChild(selectedNode);
Class_dragger.mouseEntered(true);
};
Class_dragger.onMouseOut = function (){
if ( Class_dragger.mouseButtonPressed === true )
return;
Class_dragger.nodeElement.classed("classDraggerNodeHovered", false);
Class_dragger.nodeElement.classed("classDraggerNode", true);
Class_dragger.mouseEntered(false);
};
Class_dragger.setPosition = function ( x, y ){
Class_dragger.x = x;
Class_dragger.y = y;
Class_dragger.updateElement();
};
Class_dragger.setAdditionalClassForClass_dragger = function ( name, val ){
// console.log("Class_dragger should sett the class here")
// Class_dragger.nodeElement.classed(name,val);
};
return Class_dragger;
};