module.exports = function ( graph ){ /** variable defs **/ var Domain_dragger = {}; Domain_dragger.nodeId = 10002; Domain_dragger.parent = undefined; Domain_dragger.x = 0; Domain_dragger.y = 0; Domain_dragger.rootElement = undefined; Domain_dragger.rootNodeLayer = undefined; Domain_dragger.pathLayer = undefined; Domain_dragger.mouseEnteredVar = false; Domain_dragger.mouseButtonPressed = false; Domain_dragger.nodeElement = undefined; Domain_dragger.draggerObject = undefined; Domain_dragger.pathElement = undefined; Domain_dragger.typus = "Domain_dragger"; Domain_dragger.type = function (){ return Domain_dragger.typus; }; // TODO: We need the endPoint of the Link here! Domain_dragger.parentNode = function (){ return Domain_dragger.parent; }; Domain_dragger.hide_dragger = function ( val ){ Domain_dragger.pathElement.classed("hidden", val); Domain_dragger.nodeElement.classed("hidden", val); Domain_dragger.draggerObject.classed("hidden", val); }; Domain_dragger.reDrawEverthing = function (){ Domain_dragger.setParentProperty(Domain_dragger.parent); }; Domain_dragger.updateDomain = function ( newDomain ){ if ( graph.genericPropertySanityCheck(Domain_dragger.parent.range(), newDomain, Domain_dragger.parent.type(), "Could not update domain", "Restoring previous domain") === false ) { Domain_dragger.updateElement(); return; } if ( graph.propertyCheckExistenceChecker(Domain_dragger.parent, newDomain, Domain_dragger.parent.range()) === false ) return; if ( Domain_dragger.parent.labelElement() === undefined ) { Domain_dragger.updateElement(); return; } if ( Domain_dragger.parent.labelElement().attr("transform") === "translate(0,15)" || Domain_dragger.parent.labelElement().attr("transform") === "translate(0,-15)" ) { var prop = Domain_dragger.parent; Domain_dragger.parent.inverse().inverse(null); Domain_dragger.parent.inverse(null); console.log("SPLITTING ITEMS!"); prop.domain(newDomain); } else { Domain_dragger.parent.domain(newDomain); } // update the position of the new range var rX = Domain_dragger.parent.range().x; var rY = Domain_dragger.parent.range().y; var dX = newDomain.x; var dY = newDomain.y; // center var cX = 0.49 * (dX + rX); var cY = 0.49 * (dY + rY); // put position there; Domain_dragger.parent.labelObject().x = cX; Domain_dragger.parent.labelObject().px = cX; Domain_dragger.parent.labelObject().y = cY; Domain_dragger.parent.labelObject().py = cY; Domain_dragger.updateElement(); }; Domain_dragger.setParentProperty = function ( parentProperty, inverted ){ Domain_dragger.invertedProperty = inverted; var renElem; var iP; Domain_dragger.isLoopProperty = false; if ( parentProperty.domain() === parentProperty.range() ) Domain_dragger.isLoopProperty = true; Domain_dragger.parent = parentProperty; renElem = parentProperty.labelObject(); if ( inverted === true ) { // this is the lower element if ( parentProperty.labelElement() && parentProperty.labelElement().attr("transform") === "translate(0,15)" ) { // console.log("This is the lower element!"); iP = renElem.linkRangeIntersection; if ( renElem.linkRangeIntersection ) { Domain_dragger.x = iP.x; Domain_dragger.y = iP.y; } } else { // console.log("This is the upper element"); iP = renElem.linkDomainIntersection; if ( renElem.linkDomainIntersection ) { Domain_dragger.x = iP.x; Domain_dragger.y = iP.y; } } } else { // console.log("This is single element"); iP = renElem.linkDomainIntersection; if ( renElem.linkDomainIntersection ) { Domain_dragger.x = iP.x; Domain_dragger.y = iP.y; } } Domain_dragger.updateElement(); }; Domain_dragger.hideDragger = function ( val ){ if ( Domain_dragger.pathElement ) Domain_dragger.pathElement.classed("hidden", val); if ( Domain_dragger.nodeElement ) Domain_dragger.nodeElement.classed("hidden", val); if ( Domain_dragger.draggerObject ) Domain_dragger.draggerObject.classed("hidden", val); }; /** BASE HANDLING FUNCTIONS ------------------------------------------------- **/ Domain_dragger.id = function ( index ){ if ( !arguments.length ) { return Domain_dragger.nodeId; } Domain_dragger.nodeId = index; }; Domain_dragger.svgPathLayer = function ( layer ){ Domain_dragger.pathLayer = layer.append('g'); }; Domain_dragger.svgRoot = function ( root ){ if ( !arguments.length ) return Domain_dragger.rootElement; Domain_dragger.rootElement = root; Domain_dragger.rootNodeLayer = Domain_dragger.rootElement.append('g'); Domain_dragger.addMouseEvents(); }; /** DRAWING FUNCTIONS ------------------------------------------------- **/ Domain_dragger.drawNode = function (){ Domain_dragger.pathElement = Domain_dragger.pathLayer.append('line') .classed("classNodeDragPath", true); Domain_dragger.pathElement.attr("x1", 0) .attr("y1", 0) .attr("x2", 0) .attr("y2", 0); var pathData = "M 10,40 C -10,15 -10,-15 10,-40 -8.8233455,-13.641384 -36.711107,-5.1228436 -50,0 -36.696429,4.9079017 -8.6403157,13.745728 10,40 Z"; Domain_dragger.nodeElement = Domain_dragger.rootNodeLayer.append('path').attr("d", pathData); Domain_dragger.nodeElement.classed("classDraggerNode", true); if ( graph.options().useAccuracyHelper() ) { Domain_dragger.draggerObject = Domain_dragger.rootNodeLayer.append("circle"); Domain_dragger.draggerObject.attr("r", 40) .attr("cx", 0) .attr("cy", 0) .classed("superHiddenElement", true); Domain_dragger.draggerObject.classed("superOpacityElement", !graph.options().showDraggerObject()); } }; Domain_dragger.updateElementViaRangeDragger = function ( x, y ){ var range_x = x; var range_y = y; var dex = Domain_dragger.parent.domain().x; var dey = Domain_dragger.parent.domain().y; var dir_X = x - dex; var dir_Y = y - dey; var len = Math.sqrt(dir_X * dir_X + dir_Y * dir_Y); var nX = dir_X / len; var nY = dir_Y / len; var ep_range_x = dex + nX * Domain_dragger.parent.domain().actualRadius(); var ep_range_y = dey + nY * Domain_dragger.parent.domain().actualRadius(); var angle = Math.atan2(ep_range_y - range_y, ep_range_x - range_x) * 180 / Math.PI; Domain_dragger.nodeElement.attr("transform", "translate(" + ep_range_x + "," + ep_range_y + ")" + "rotate(" + angle + ")"); var dox = ep_range_x + nX * 20; var doy = ep_range_y + nY * 20; Domain_dragger.draggerObject.attr("transform", "translate(" + dox + "," + doy + ")"); }; Domain_dragger.updateElement = function (){ if ( Domain_dragger.mouseButtonPressed === true || Domain_dragger.parent === undefined ) return; var domain = Domain_dragger.parent.domain(); var iP = Domain_dragger.parent.labelObject().linkDomainIntersection; if ( Domain_dragger.parent.labelElement() === undefined ) return; if ( Domain_dragger.parent.labelElement().attr("transform") === "translate(0,15)" ) { Domain_dragger.parent.inverse().domain(); iP = Domain_dragger.parent.labelObject().linkRangeIntersection; } var range_x = domain.x; var range_y = domain.y; if ( iP === undefined ) return; var ep_range_x = iP.x; var ep_range_y = iP.y; var dx = range_x - ep_range_x; var dy = range_y - ep_range_y; var len = Math.sqrt(dx * dx + dy * dy); var nX = dx / len; var nY = dy / len; var dox = ep_range_x - nX * 20; var doy = ep_range_y - nY * 20; var angle = Math.atan2(ep_range_y - range_y, ep_range_x - range_x) * 180 / Math.PI + 180; Domain_dragger.nodeElement.attr("transform", "translate(" + ep_range_x + "," + ep_range_y + ")" + "rotate(" + angle + ")"); Domain_dragger.draggerObject.attr("transform", "translate(" + dox + "," + doy + ")"); }; /** MOUSE HANDLING FUNCTIONS ------------------------------------------------- **/ Domain_dragger.addMouseEvents = function (){ var rootLayer = Domain_dragger.rootNodeLayer.selectAll("*"); rootLayer.on("mouseover", Domain_dragger.onMouseOver) .on("mouseout", Domain_dragger.onMouseOut) .on("click", function (){ }) .on("dblclick", function (){ }) .on("mousedown", Domain_dragger.mouseDown) .on("mouseup", Domain_dragger.mouseUp); }; Domain_dragger.mouseDown = function (){ Domain_dragger.nodeElement.style("cursor", "move"); Domain_dragger.nodeElement.classed("classDraggerNodeHovered", true); Domain_dragger.mouseButtonPressed = true; }; Domain_dragger.mouseUp = function (){ Domain_dragger.nodeElement.style("cursor", "auto"); Domain_dragger.nodeElement.classed("classDraggerNodeHovered", false); Domain_dragger.mouseButtonPressed = false; }; Domain_dragger.mouseEntered = function ( p ){ if ( !arguments.length ) return Domain_dragger.mouseEnteredVar; Domain_dragger.mouseEnteredVar = p; return Domain_dragger; }; Domain_dragger.selectedViaTouch = function ( val ){ Domain_dragger.nodeElement.classed("classDraggerNode", !val); Domain_dragger.nodeElement.classed("classDraggerNodeHovered", val); }; Domain_dragger.onMouseOver = function (){ if ( Domain_dragger.mouseEntered() ) { return; } Domain_dragger.nodeElement.classed("classDraggerNode", false); Domain_dragger.nodeElement.classed("classDraggerNodeHovered", true); var selectedNode = Domain_dragger.rootElement.node(), nodeContainer = selectedNode.parentNode; nodeContainer.appendChild(selectedNode); Domain_dragger.mouseEntered(true); }; Domain_dragger.onMouseOut = function (){ if ( Domain_dragger.mouseButtonPressed === true ) return; Domain_dragger.nodeElement.classed("classDraggerNodeHovered", false); Domain_dragger.nodeElement.classed("classDraggerNode", true); Domain_dragger.mouseEntered(false); }; Domain_dragger.setPosition = function ( x, y ){ var range_x = Domain_dragger.parent.range().x; var range_y = Domain_dragger.parent.range().y; // var position of the rangeEndPoint var ep_range_x = x; var ep_range_y = y; // offset for dragger object var dx = range_x - ep_range_x; var dy = range_y - ep_range_y; var len = Math.sqrt(dx * dx + dy * dy); var nX = dx / len; var nY = dy / len; var dox = ep_range_x + nX * 20; var doy = ep_range_y + nY * 20; var angle = Math.atan2(range_y - ep_range_y, range_x - ep_range_x) * 180 / Math.PI + 180; Domain_dragger.nodeElement.attr("transform", "translate(" + ep_range_x + "," + ep_range_y + ")" + "rotate(" + angle + ")"); Domain_dragger.draggerObject.attr("transform", "translate(" + dox + "," + doy + ")"); Domain_dragger.x = x; Domain_dragger.y = y; }; Domain_dragger.setAdditionalClassForClass_dragger = function ( name, val ){ // console.log("Class_dragger should sett the class here") // Class_dragger.nodeElement.classed(name,val); }; return Domain_dragger; };