var BaseElement = require("../BaseElement"); var forceLayoutNodeFunctions = require("../forceLayoutNodeFunctions")(); module.exports = (function (){ var Base = function ( graph ){ BaseElement.apply(this, arguments); var that = this, // Basic attributes complement, disjointUnion, disjointWith, individuals = [], intersection, union, links, rendertype = "round", // Additional attributes maxIndividualCount, fobj, // foreigner object for editing ignoreLocalHoverEvents = false, backupFullIri, // Element containers nodeElement; // array to store my properties; // we will need this also later for semantic zooming stuff var assignedProperties = []; that.editingTextElement = false; this.isPropertyAssignedToThisElement = function ( property ){ // this goes via IRIS console.log("Element IRI :" + property.iri()); if ( property.type() === "rdfs:subClassOf" ) for ( var i = 0; i < assignedProperties.length; i++ ) { var iriEl = assignedProperties[i].iri(); if ( property.iri() === iriEl ) { return true; } if ( property.type() === "rdfs:subClassOf" && assignedProperties[i].type() === "rdfs:subClassOf" ) return true; if ( property.type() === "owl:disjointWith" && assignedProperties[i].type() === "owl:disjointWith" ) return true; } return false; }; this.existingPropertyIRI = function ( url ){ // this goes via IRIS for ( var i = 0; i < assignedProperties.length; i++ ) { var iriEl = assignedProperties[i].iri(); if ( iriEl === url ) { return true; } } return false; }; this.addProperty = function ( property ){ if ( assignedProperties.indexOf(property) === -1 ) { assignedProperties.push(property); } }; this.removePropertyElement = function ( property ){ // console.log("Calling removing old property!"+ property.iri()); if ( assignedProperties.indexOf(property) !== -1 ) { // console.log("Found it!"); assignedProperties.splice(assignedProperties.indexOf(property), 1); } }; this.getMyProperties = function (){ return assignedProperties; }; this.copyOtherProperties = function ( otherProperties ){ assignedProperties = otherProperties; }; this.copyInformation = function ( other ){ console.log(other.labelForCurrentLanguage()); if ( other.type() !== "owl:Thing" ) that.label(other.label()); that.complement(other.complement()); that.iri(other.iri()); that.copyOtherProperties(other.getMyProperties()); that.baseIri(other.baseIri()); if ( other.type() === "owl:Class" ) { that.backupLabel(other.label()); // console.log("copied backup label"+that.backupLabel()); } if ( other.backupLabel() !== undefined ) { that.backupLabel(other.backupLabel()); } }; this.enableEditing = function ( autoEditing ){ if ( autoEditing === false ) return; that.raiseDoubleClickEdit(true); }; this.raiseDoubleClickEdit = function ( forceIRISync ){ d3.selectAll(".foreignelements").remove(); if ( nodeElement === undefined || this.type() === "owl:Thing" || this.type() === "rdfs:Literal" ) { console.log("No Container found"); return; } if ( fobj !== undefined ) { nodeElement.selectAll(".foreignelements").remove(); } backupFullIri = undefined; graph.options().focuserModule().handle(undefined); graph.options().focuserModule().handle(that); // add again the editing elements to that one if ( graph.isTouchDevice() === true ) { graph.activateHoverElements(true, that, true); } that.editingTextElement = true; ignoreLocalHoverEvents = true; that.nodeElement().selectAll("circle").classed("hoveredForEditing", true); graph.killDelayedTimer(); graph.ignoreOtherHoverEvents(false); fobj = nodeElement.append("foreignObject") .attr("x", -0.5 * (that.textWidth() - 2)) .attr("y", -12) .attr("height", 30) .attr("class", "foreignelements") .on("dragstart", function (){ return false; }) // remove drag operations of text element) .attr("width", that.textWidth() - 2); var editText = fobj.append("xhtml:input") .attr("class", "nodeEditSpan") .attr("id", that.id()) .attr("align", "center") .attr("contentEditable", "true") .on("dragstart", function (){ return false; }); // remove drag operations of text element) var bgColor = '#f00'; var txtWidth = that.textWidth() - 2; editText.style({ 'align': 'center', 'color': 'black', 'width': txtWidth + "px", 'height': '15px', 'background-color': bgColor, 'border-bottom': '2px solid black' }); var txtNode = editText.node(); txtNode.value = that.labelForCurrentLanguage(); txtNode.focus(); txtNode.select(); that.frozen(true); // << releases the not after selection that.locked(true); d3.event.stopPropagation(); // ignoreNodeHoverEvent=true; // // add some events that relate to this object editText.on("click", function (){ d3.event.stopPropagation(); }); // // remove hover Events for now; editText.on("mouseout", function (){ d3.event.stopPropagation(); }); editText.on("mousedown", function (){ d3.event.stopPropagation(); }) .on("keydown", function (){ d3.event.stopPropagation(); if ( d3.event.keyCode === 13 ) { this.blur(); that.frozen(false); // << releases the not after selection that.locked(false); } }) .on("keyup", function (){ if ( forceIRISync ) { var labelName = editText.node().value; var resourceName = labelName.replaceAll(" ", "_"); var syncedIRI = that.baseIri() + resourceName; backupFullIri = syncedIRI; d3.select("#element_iriEditor").node().title = syncedIRI; d3.select("#element_iriEditor").node().value = graph.options().prefixModule().getPrefixRepresentationForFullURI(syncedIRI); } d3.select("#element_labelEditor").node().value = editText.node().value; }) .on("blur", function (){ that.editingTextElement = false; ignoreLocalHoverEvents = false; that.nodeElement().selectAll("circle").classed("hoveredForEditing", false); var newLabel = editText.node().value; nodeElement.selectAll(".foreignelements").remove(); // that.setLabelForCurrentLanguage(classNameConvention(editText.node().value)); that.label(newLabel); that.backupLabel(newLabel); that.redrawLabelText(); that.frozen(graph.paused()); that.locked(graph.paused()); graph.ignoreOtherHoverEvents(false); // console.log("Calling blur on Node!"); if ( backupFullIri ) { var sanityCheckResult = graph.checkIfIriClassAlreadyExist(backupFullIri); if ( sanityCheckResult === false ) { that.iri(backupFullIri); } else { // throw warnign graph.options().warningModule().showWarning("Already seen this class", "Input IRI: " + backupFullIri + " for element: " + that.labelForCurrentLanguage() + " already been set", "Restoring previous IRI for Element : " + that.iri(), 2, false, sanityCheckResult); } } if ( graph.isADraggerActive() === false ) { graph.options().focuserModule().handle(undefined); graph.options().focuserModule().handle(that); } }); // add a foreiner element to this thing; }; this.renderType = function ( t ){ if ( !arguments.length ) return rendertype; rendertype = t; return this; }; // Properties this.complement = function ( p ){ if ( !arguments.length ) return complement; complement = p; return this; }; this.disjointUnion = function ( p ){ if ( !arguments.length ) return disjointUnion; disjointUnion = p; return this; }; this.disjointWith = function ( p ){ if ( !arguments.length ) return disjointWith; disjointWith = p; return this; }; this.individuals = function ( p ){ if ( !arguments.length ) return individuals; individuals = p || []; return this; }; this.intersection = function ( p ){ if ( !arguments.length ) return intersection; intersection = p; return this; }; this.links = function ( p ){ if ( !arguments.length ) return links; links = p; return this; }; this.maxIndividualCount = function ( p ){ if ( !arguments.length ) return maxIndividualCount; maxIndividualCount = p; return this; }; this.nodeElement = function ( p ){ if ( !arguments.length ) return nodeElement; nodeElement = p; return this; }; this.union = function ( p ){ if ( !arguments.length ) return union; union = p; return this; }; /** * Returns css classes generated from the data of this object. * @returns {Array} */ that.collectCssClasses = function (){ var cssClasses = []; if ( typeof that.styleClass() === "string" ) { cssClasses.push(that.styleClass()); } cssClasses = cssClasses.concat(that.visualAttributes()); return cssClasses; }; // Reused functions TODO refactor this.addMouseListeners = function (){ // Empty node if ( !that.nodeElement() ) { console.warn(this); return; } that.nodeElement().selectAll("*") .on("mouseover", onMouseOver) .on("mouseout", onMouseOut); }; this.animationProcess = function (){ var animRuns = false; if ( that.getHalos() ) { var haloGr = that.getHalos(); var haloEls = haloGr.selectAll(".searchResultA"); animRuns = haloGr.attr("animationRunning"); if ( typeof animRuns !== "boolean" ) { // parse this to a boolean value animRuns = (animRuns === 'true'); } if ( animRuns === false ) { haloEls.classed("searchResultA", false); haloEls.classed("searchResultB", true); } } return animRuns; }; this.foreground = function (){ var selectedNode = that.nodeElement().node(), nodeContainer = selectedNode.parentNode; // check if the halo is present and an animation is running if ( that.animationProcess() === false ) { // Append hovered element as last child to the container list. nodeContainer.appendChild(selectedNode); } }; function onMouseOver(){ if ( that.mouseEntered() || ignoreLocalHoverEvents === true ) { return; } var selectedNode = that.nodeElement().node(), nodeContainer = selectedNode.parentNode; // Append hovered element as last child to the container list. if ( that.animationProcess() === false ) { nodeContainer.appendChild(selectedNode); } if ( graph.isTouchDevice() === false ) { that.setHoverHighlighting(true); that.mouseEntered(true); if ( graph.editorMode() === true && graph.ignoreOtherHoverEvents() === false ) { graph.activateHoverElements(true, that); } } else { if ( graph.editorMode() === true && graph.ignoreOtherHoverEvents() === false ) { graph.activateHoverElements(true, that, true); } } } function onMouseOut(){ that.setHoverHighlighting(false); that.mouseEntered(false); if ( graph.editorMode() === true && graph.ignoreOtherHoverEvents() === false ) { graph.activateHoverElements(false); } } forceLayoutNodeFunctions.addTo(this); }; Base.prototype = Object.create(BaseElement.prototype); Base.prototype.constructor = Base; return Base; }());