var BaseNode = require("./BaseNode"); var CenteringTextElement = require("../../util/CenteringTextElement"); var drawTools = require("../drawTools")(); var rectangularElementTools = require("../rectangularElementTools")(); module.exports = (function (){ var o = function ( graph ){ BaseNode.apply(this, arguments); var that = this, height = 20, width = 60, pinGroupElement, haloGroupElement, labelWidth = 80, myWidth = 80, defaultWidth = 80, shapeElement, textBlock, smallestRadius = height / 2; that.renderType("rect"); // Properties this.height = function ( p ){ if ( !arguments.length ) return height; height = p; return this; }; this.width = function ( p ){ if ( !arguments.length ) return width; width = p; return this; }; this.getHalos = function (){ return haloGroupElement; }; // Functions // for compatibility reasons // TODO resolve this.actualRadius = function (){ return smallestRadius; }; this.distanceToBorder = function ( dx, dy ){ return rectangularElementTools.distanceToBorder(that, dx, dy); }; this.setHoverHighlighting = function ( enable ){ that.nodeElement().selectAll("rect").classed("hovered", enable); var haloGroup = that.getHalos(); if ( haloGroup ) { var test = haloGroup.selectAll(".searchResultA"); test.classed("searchResultA", false); test.classed("searchResultB", true); } }; // overwrite the labelWith; this.textWidth = function (){ return labelWidth; }; this.width = function (){ return labelWidth; }; this.getMyWidth = function (){ // use a simple heuristic var text = that.labelForCurrentLanguage(); myWidth = measureTextWidth(text, "text") + 20; // check for sub names; var indicatorText = that.indicationString(); var indicatorWidth = measureTextWidth(indicatorText, "subtext") + 20; if ( indicatorWidth > myWidth ) myWidth = indicatorWidth; return myWidth; }; this.textWidth = function (){ return that.width(); }; function measureTextWidth( text, textStyle ){ // Set a default value if ( !textStyle ) { textStyle = "text"; } var d = d3.select("body") .append("div") .attr("class", textStyle) .attr("id", "width-test") // tag this element to identify it .attr("style", "position:absolute; float:left; white-space:nowrap; visibility:hidden;") .text(text), w = document.getElementById("width-test").offsetWidth; d.remove(); return w; } this.toggleFocus = function (){ that.focused(!that.focused()); that.nodeElement().select("rect").classed("focused", that.focused()); graph.resetSearchHighlight(); graph.options().searchMenu().clearText(); }; /** * Draws the rectangular node. * @param parentElement the element to which this node will be appended * @param [additionalCssClasses] additional css classes */ this.draw = function ( parentElement, additionalCssClasses ){ var cssClasses = that.collectCssClasses(); that.nodeElement(parentElement); if ( additionalCssClasses instanceof Array ) { cssClasses = cssClasses.concat(additionalCssClasses); } // set the value for that.width() // update labelWidth Value; if ( graph.options().dynamicLabelWidth() === true ) labelWidth = Math.min(that.getMyWidth(), graph.options().maxLabelWidth()); else labelWidth = defaultWidth; width = labelWidth; shapeElement = drawTools.appendRectangularClass(parentElement, that.width(), that.height(), cssClasses, that.labelForCurrentLanguage(), that.backgroundColor()); textBlock = new CenteringTextElement(parentElement, that.backgroundColor()); textBlock.addText(that.labelForCurrentLanguage()); that.addMouseListeners(); if ( that.pinned() ) { that.drawPin(); } if ( that.halo() ) { that.drawHalo(false); } }; this.drawPin = function (){ that.pinned(true); // if (graph.options().dynamicLabelWidth()===true) labelWidth=that.getMyWidth(); // else labelWidth=defaultWidth; // width=labelWidth; // console.log("this element label Width is "+labelWidth); var dx = -0.5 * labelWidth + 5, dy = -1.1 * height; pinGroupElement = drawTools.drawPin(that.nodeElement(), dx, dy, this.removePin, graph.options().showDraggerObject, graph.options().useAccuracyHelper()); }; this.removePin = function (){ that.pinned(false); if ( pinGroupElement ) { pinGroupElement.remove(); } graph.updateStyle(); }; this.removeHalo = function (){ that.halo(false); if ( haloGroupElement ) { haloGroupElement.remove(); haloGroupElement = null; } }; this.drawHalo = function ( pulseAnimation ){ that.halo(true); var offset = 0; haloGroupElement = drawTools.drawRectHalo(that, this.width(), this.height(), offset); if ( pulseAnimation === false ) { var pulseItem = haloGroupElement.selectAll(".searchResultA"); pulseItem.classed("searchResultA", false); pulseItem.classed("searchResultB", true); pulseItem.attr("animationRunning", false); } if ( that.pinned() ) { var selectedNode = pinGroupElement.node(); var nodeContainer = selectedNode.parentNode; nodeContainer.appendChild(selectedNode); } }; this.updateTextElement = function (){ textBlock.updateAllTextElements(); }; this.textBlock = function (){ return textBlock; }; this.redrawLabelText = function (){ textBlock.remove(); textBlock = new CenteringTextElement(that.nodeElement(), that.backgroundColor()); textBlock.addText(that.labelForCurrentLanguage()); that.animateDynamicLabelWidth(graph.options().dynamicLabelWidth()); shapeElement.select("title").text(that.labelForCurrentLanguage()); }; this.animateDynamicLabelWidth = function ( dynamic ){ that.removeHalo(); var height = that.height(); if ( dynamic === true ) { labelWidth = Math.min(that.getMyWidth(), graph.options().maxLabelWidth()); shapeElement.transition().tween("attr", function (){ }) .ease('linear') .duration(100) .attr({ x: -labelWidth / 2, y: -height / 2, width: labelWidth, height: height }) .each("end", function (){ that.updateTextElement(); }); } else { labelWidth = defaultWidth; that.updateTextElement(); shapeElement.transition().tween("attr", function (){ }) .ease('linear') .duration(100) .attr({ x: -labelWidth / 2, y: -height / 2, width: labelWidth, height: height }); } // for the pin we dont need to differ between different widths -- they are already set if ( that.pinned() === true && pinGroupElement ) { var dx = 0.5 * labelWidth - 10, dy = -1.1 * height; pinGroupElement.transition() .tween("attr.translate", function (){ }) .attr("transform", "translate(" + dx + "," + dy + ")") .ease('linear') .duration(100); } }; this.addTextLabelElement = function (){ var parentElement = that.nodeElement(); textBlock = new CenteringTextElement(parentElement, this.backgroundColor()); textBlock.addText(that.labelForCurrentLanguage()); }; }; o.prototype = Object.create(BaseNode.prototype); o.prototype.constructor = o; return o; }());