@ -16,203 +16,94 @@ var manipulationMixin = {
} ,
/ * *
* main function , creates the main toolbar . Removes functions bound to the select event . Binds all the buttons of the toolbar .
*
* @ private
* /
_createManipulatorBar : function ( ) {
// remove bound functions
this . off ( 'select' , this . boundFunction ) ;
_restoreOverloadedFunctions : function ( ) {
for ( var functionName in this . cachedFunctions ) {
if ( this . cachedFunctions . hasOwnProperty ( functionName ) ) {
this [ functionName ] = this . cachedFunctions [ functionName ] ;
}
}
} ,
// reset global variables
this . blockConnectingEdgeSelection = false ;
this . forceAppendSelection = false
while ( this . manipulationDiv . hasChildNodes ( ) ) {
this . manipulationDiv . removeChild ( this . manipulationDiv . firstChild ) ;
_toggleEditMode : function ( ) {
this . editMode = ! this . editMode ;
var toolbar = document . getElementById ( "graph-manipulationDiv" )
if ( this . editMode == true ) {
toolbar . style . display = "block" ;
}
// add the icons to the manipulator div
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI add' id='manipulate-addNode'><span class='manipulationLabel'>Add Node</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI edit' id='manipulate-editNode'><span class='manipulationLabel'>Edit Selected</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI connect' id='manipulate-connectNode'><span class='manipulationLabel'>Connect Node</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI delete' id='manipulate-delete'><span class='manipulationLabel'>Delete selected</span></span>" ;
// bind the icons
var addButton = document . getElementById ( "manipulate-addNode" ) ;
addButton . onclick = this . _createAddToolbar . bind ( this ) ;
var editButton = document . getElementById ( "manipulate-editNode" ) ;
editButton . onclick = this . _createEditToolbar . bind ( this ) ;
var connectButton = document . getElementById ( "manipulate-connectNode" ) ;
connectButton . onclick = this . _createConnectToolbar . bind ( this ) ;
var deleteButton = document . getElementById ( "manipulate-delete" ) ;
deleteButton . onclick = this . _createDeletionToolbar . bind ( this ) ;
else {
toolbar . style . display = "none" ;
}
this . _createManipulatorBar ( )
} ,
/ * *
* Create the toolbar for adding Nodes
* main function , creates the main toolbar . Removes functions bound to the select event . Binds all the buttons of the toolbar .
*
* @ private
* /
_createAddToolbar : function ( ) {
// clear the toolbar
this . _clearManipulatorBar ( ) ;
_createManipulatorBar : function ( ) {
// remove bound functions
this . off ( 'select' , this . boundFunction ) ;
// create the toolbar contents
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Back</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none' id='manipulate-back'><span class='manipulationLabel'>Click in an empty space to place a new node</span></span>" ;
// bind the icon
var backButton = document . getElementById ( "manipulate-back" ) ;
backButton . onclick = this . _createManipulatorBar . bind ( this ) ;
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _addNode . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
} ,
// restore overloaded functions
this . _restoreOverloadedFunctions ( ) ;
// resume calculation
this . freezeSimulation = false ;
/ * *
* Create the toolbar to edit nodes or edges .
* TODO : edges not implemented yet , unsure what to edit .
*
* @ private
* /
_createEditToolbar : function ( ) {
// clear the toolbar
// reset global variables
this . blockConnectingEdgeSelection = false ;
this . _clearManipulatorBar ( ) ;
this . off ( 'select' , this . boundFunction ) ;
this . forceAppendSelection = false
var message = "" ;
if ( this . _selectionIsEmpty ( ) ) {
message = "Select a node or edge to edit." ;
}
else {
if ( this . _getSelectedObjectCount ( ) > 1 ) {
message = "Select a single node or edge to edit."
this . _unselectAll ( true ) ;
if ( this . editMode == true ) {
while ( this . manipulationDiv . hasChildNodes ( ) ) {
this . manipulationDiv . removeChild ( this . manipulationDiv . firstChild ) ;
}
else {
if ( this . _clusterInSelection ( ) ) {
message = "You cannot edit a cluster."
this . _unselectAll ( true ) ;
}
else {
if ( this . _getSelectedNodeCount ( ) > 0 ) { // the selected item is a node
this . _createEditNodeToolbar ( ) ;
}
else { // the selected item is an edge
this . _createEditEdgeToolbar ( ) ;
}
}
}
}
if ( message != "" ) {
this . blockConnectingEdgeSelection = true ;
// create the toolbar contents
// add the icons to the manipulator div
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Back </span></span>" +
"<span class='manipulationUI add' id='manipulate-addNode'><span class='manipulationLabel'>Add Node</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none' id='manipulate-back'><span class='manipulationLabel'>" + message + "</span></span>" ;
"<span class='manipulationUI connect' id='manipulate-connectNode'><span class='manipulationLabel'>Add Link</span></span>" ;
if ( this . _getSelectedNodeCount ( ) == 1 && this . triggerFunctions . edit ) {
this . manipulationDiv . innerHTML += "" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI edit' id='manipulate-editNode'><span class='manipulationLabel'>Edit Node</span></span>" ;
}
if ( this . _selectionIsEmpty ( ) == false ) {
this . manipulationDiv . innerHTML += "" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI delete' id='manipulate-delete'><span class='manipulationLabel'>Delete selected</span></span>" ;
}
// bind the icon
var backButton = document . getElementById ( "manipulate-back" ) ;
backButton . onclick = this . _createManipulatorBar . bind ( this ) ;
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _createEditToolbar . bind ( this ) ;
// bind the icons
var addNodeButton = document . getElementById ( "manipulate-addNode" ) ;
addNodeButton . onclick = this . _createAddNodeToolbar . bind ( this ) ;
var addEdgeButton = document . getElementById ( "manipulate-connectNode" ) ;
addEdgeButton . onclick = this . _createAddEdgeToolbar . bind ( this ) ;
if ( this . _getSelectedNodeCount ( ) == 1 && this . triggerFunctions . edit ) {
var editButton = document . getElementById ( "manipulate-editNode" ) ;
editButton . onclick = this . _editNode . bind ( this ) ;
}
if ( this . _selectionIsEmpty ( ) == false ) {
var deleteButton = document . getElementById ( "manipulate-delete" ) ;
deleteButton . onclick = this . _deleteSelected . bind ( this ) ;
}
this . boundFunction = this . _createManipulatorBar . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
}
} ,
/ * *
* Create the toolbar to edit the selected node . The label and the color can be changed . Other colors are derived from the chosen color .
* TODO : change shape or group ?
*
* @ private
* /
_createEditNodeToolbar : function ( ) {
// clear the toolbar
this . blockConnectingEdgeSelection = false ;
this . _clearManipulatorBar ( ) ;
this . off ( 'select' , this . boundFunction ) ;
var editObject = this . _getEditObject ( ) ;
// create the toolbar contents
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Cancel</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none'>label: <input type='text' class='manipulatorInput' value='" + editObject . label + "' id='manipulator-obj-label' /></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none'>color: <input type='text' class='manipulatorInput' value='" + editObject . color . background + "' id='manipulator-obj-color' /></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none'><input type='button' class='manipulatorInput' value='save' id='manipulator-obj-save' /></span>"
// bind the icon
var backButton = document . getElementById ( "manipulate-back" ) ;
backButton . onclick = this . _createManipulatorBar . bind ( this ) ;
var saveButton = document . getElementById ( "manipulator-obj-save" ) ;
saveButton . onclick = this . _saveNodeData . bind ( this ) ;
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _createManipulatorBar . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
} ,
/ * *
* save the changes in the node data
*
* @ private
* /
_saveNodeData : function ( ) {
var editObjectId = this . _getEditObject ( ) . id ;
var label = document . getElementById ( 'manipulator-obj-label' ) . value ;
var definedColor = document . getElementById ( 'manipulator-obj-color' ) . value ;
var hsv = util . hexToHSV ( definedColor ) ;
var lighterColorHSV = { h : hsv . h , s : hsv . s * 0.45 , v : Math . min ( 1 , hsv . v * 1.05 ) } ;
var darkerColorHSV = { h : hsv . h , s : Math . min ( 1 , hsv . v * 1.25 ) , v : hsv . v * 0.6 } ;
var darkerColorHex = util . HSVToHex ( darkerColorHSV . h , darkerColorHSV . h , darkerColorHSV . v ) ;
var lighterColorHex = util . HSVToHex ( lighterColorHSV . h , lighterColorHSV . s , lighterColorHSV . v ) ;
var updatedSettings = { id : editObjectId ,
label : label ,
color : {
background : definedColor ,
border : darkerColorHex ,
highlight : {
background : lighterColorHex ,
border : darkerColorHex
}
} } ;
this . nodesData . update ( updatedSettings ) ;
this . _createManipulatorBar ( ) ;
} ,
/ * *
* creating the toolbar to edit edges .
* Create the toolbar for adding Nodes
*
* @ private
* /
_createEditEdg eToolbar : function ( ) {
_createAddNodeToolbar : function ( ) {
// clear the toolbar
this . blockConnectingEdgeSelection = false ;
this . _clearManipulatorBar ( ) ;
this . off ( 'select' , this . boundFunction ) ;
@ -220,14 +111,14 @@ var manipulationMixin = {
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Back</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none' id='manipulate-back'><span class='manipulationLabel'>Currently only nodes can be edited. </span></span>" ;
"<span class='manipulationUI none' id='manipulate-back'><span class='manipulationLabel'>Click in an empty space to place a new node </span></span>" ;
// bind the icon
var backButton = document . getElementById ( "manipulate-back" ) ;
backButton . onclick = this . _createManipulatorBar . bind ( this ) ;
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _createManipulatorBar . bind ( this ) ;
this . boundFunction = this . _addNode . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
} ,
@ -237,9 +128,12 @@ var manipulationMixin = {
*
* @ private
* /
_createConnect Toolbar : function ( ) {
_createAddEdge Toolbar : function ( ) {
// clear the toolbar
this . _clearManipulatorBar ( ) ;
this . _unselectAll ( true ) ;
this . freezeSimulation = true ;
this . off ( 'select' , this . boundFunction ) ;
this . _unselectAll ( ) ;
@ -249,7 +143,7 @@ var manipulationMixin = {
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Back</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none' id='manipulate-back'><span id='manipulatorLabel' class='manipulationLabel'>Select the node you want to connect to other nodes .</span></span>" ;
"<span class='manipulationUI none' id='manipulate-back'><span id='manipulatorLabel' class='manipulationLabel'>Click on a node and drag the edge to another node .</span></span>" ;
// bind the icon
var backButton = document . getElementById ( "manipulate-back" ) ;
@ -258,43 +152,16 @@ var manipulationMixin = {
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _handleConnect . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
} ,
// temporarily overload functions
this . cachedFunctions [ "_handleTouch" ] = this . _handleTouch ;
this . cachedFunctions [ "_handleOnRelease" ] = this . _handleOnRelease ;
this . _handleTouch = this . _handleConnect ;
this . _handleOnRelease = this . _finishConnect ;
/ * *
* create the toolbar for deleting selected objects . User has to be sure .
*
* @ private
* /
_createDeletionToolbar : function ( ) {
// clear the toolbar
this . _clearManipulatorBar ( ) ;
this . off ( 'select' , this . boundFunction ) ;
// redraw to show the unselect
this . _redraw ( ) ;
if ( this . _selectionIsEmpty ( ) ) {
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI none notification' id='manipulate-back'><span id='manipulatorLabel' class='manipulationLabel'>Cannot delete an empty selection.</span></span>" ;
var graph = this ;
window . setTimeout ( function ( ) { graph . _createManipulatorBar ( ) } , 1500 ) ;
}
else {
this . manipulationDiv . innerHTML = "" +
"<span class='manipulationUI back' id='manipulate-back'><span class='manipulationLabel'>Back</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI none' id='manipulate-back'><span id='manipulatorLabel' class='manipulationLabel'>Are you sure? This cannot be undone.</span></span>" +
"<div class='seperatorLine'></div>" +
"<span class='manipulationUI acceptDelete' id='manipulate-acceptDelete'><span class='manipulationLabel'>Yes.</span></span>" ;
// bind the buttons
var backButton = document . getElementById ( "manipulate-back" ) ;
backButton . onclick = this . _createManipulatorBar . bind ( this ) ;
var acceptDeleteButton = document . getElementById ( "manipulate-acceptDelete" ) ;
acceptDeleteButton . onclick = this . _deleteSelected . bind ( this ) ;
// we use the boundFunction so we can reference it when we unbind it from the "select" event.
this . boundFunction = this . _createManipulatorBar . bind ( this ) ;
this . on ( 'select' , this . boundFunction ) ;
}
} ,
@ -304,162 +171,226 @@ var manipulationMixin = {
*
* @ private
* /
_handleConnect : function ( ) {
this . forceAppendSelection = false ;
if ( this . _clusterInSelection ( ) ) {
this . _unselectClusters ( true ) ;
if ( ! this . _selectionIsEmpty ( ) ) {
this . _setManipulationMessage ( "You cannot connect a node to a cluster." ) ;
this . forceAppendSelection = true ;
}
else {
this . _setManipulationMessage ( "You cannot connect anything to a cluster." ) ;
}
}
else if ( ! this . _selectionIsEmpty ( ) ) {
if ( this . _getSelectedNodeCount ( ) == 2 ) {
this . _connectNodes ( ) ;
this . _restoreSourceNode ( ) ;
this . _setManipulationMessage ( "Click on another node you want to connect this node to or go back." ) ;
}
else {
this . _setManipulationMessage ( "Click on the node you want to connect this node." ) ;
this . _setSourceNode ( ) ;
this . forceAppendSelection = true ;
_handleConnect : function ( pointer ) {
if ( this . _getSelectedNodeCount ( ) == 0 ) {
var node = this . _getNodeAt ( pointer ) ;
if ( node != null ) {
if ( node . clusterSize > 1 ) {
alert ( "Cannot create edges to a cluster." )
}
else {
this . _selectObject ( node , false ) ;
// create a node the temporary line can look at
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] = new Node ( { id : 'targetNode' } , { } , { } , this . constants ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] . x = node . x ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] . y = node . y ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] = new Node ( { id : 'targetViaNode' } , { } , { } , this . constants ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] . x = node . x ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] . y = node . y ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] . parentEdgeId = "connectionEdge" ;
// create a temporary edge
this . edges [ 'connectionEdge' ] = new Edge ( { id : "connectionEdge" , from : node . id , to : this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] . id } , this , this . constants ) ;
this . edges [ 'connectionEdge' ] . from = node ;
this . edges [ 'connectionEdge' ] . connected = true ;
this . edges [ 'connectionEdge' ] . smooth = true ;
this . edges [ 'connectionEdge' ] . selected = true ;
this . edges [ 'connectionEdge' ] . to = this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] ;
this . edges [ 'connectionEdge' ] . via = this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] ;
this . cachedFunctions [ "_handleOnDrag" ] = this . _handleOnDrag ;
this . _handleOnDrag = function ( event ) {
var pointer = this . _getPointer ( event . gesture . touches [ 0 ] ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] . x = this . _canvasToX ( pointer . x ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] . y = this . _canvasToY ( pointer . y ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] . x = 0.5 * ( this . _canvasToX ( pointer . x ) + this . edges [ 'connectionEdge' ] . from . x ) ;
this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] . y = this . _canvasToY ( pointer . y ) ;
} ;
this . moving = true ;
this . start ( ) ;
}
}
}
else {
this . _setManipulationMessage ( "Select the node you want to connect to other nodes." ) ;
}
} ,
_finishConnect : function ( pointer ) {
if ( this . _getSelectedNodeCount ( ) == 1 ) {
/ * *
* returns the object that is selected
*
* @ returns { * }
* @ private
* /
_getEditObject : function ( ) {
for ( var objectId in this . selectionObj ) {
if ( this . selectionObj . hasOwnProperty ( objectId ) ) {
return this . selectionObj [ objectId ] ;
}
}
return null ;
} ,
// restore the drag function
this . _handleOnDrag = this . cachedFunctions [ "_handleOnDrag" ] ;
delete this . cachedFunctions [ "_handleOnDrag" ] ;
// remember the edge id
var connectFromId = this . edges [ 'connectionEdge' ] . fromId ;
/ * *
* stores the first selected node for the connecting process as the source node . This allows us to remember the direction
*
* @ private
* /
_setSourceNode : function ( ) {
for ( var objectId in this . selectionObj ) {
if ( this . selectionObj . hasOwnProperty ( objectId ) ) {
if ( this . selectionObj [ objectId ] instanceof Node ) {
this . manipulationSourceNode = this . selectionObj [ objectId ] ;
// remove the temporary nodes and edge
delete this . edges [ 'connectionEdge' ]
delete this . sectors [ 'support' ] [ 'nodes' ] [ 'targetNode' ] ;
delete this . sectors [ 'support' ] [ 'nodes' ] [ 'targetViaNode' ] ;
var node = this . _getNodeAt ( pointer ) ;
if ( node != null ) {
if ( node . clusterSize > 1 ) {
alert ( "Cannot create edges to a cluster." )
}
else {
this . _createEdge ( connectFromId , node . id ) ;
this . _createManipulatorBar ( ) ;
}
}
this . _unselectAll ( ) ;
}
} ,
/ * *
* gets the node the source connects to .
* Adds a node on the specified location
*
* @ returns { * }
* @ private
* @ param { Object } pointer
* /
_getTargetNode : function ( ) {
for ( var objectId in this . selectionObj ) {
if ( this . selectionObj . hasOwnProperty ( objectId ) ) {
if ( this . selectionObj [ objectId ] instanceof Node ) {
if ( this . manipulationSourceNode . id != this . selectionObj [ objectId ] . id ) {
return this . selectionObj [ objectId ] ;
}
_addNode : function ( ) {
if ( this . _selectionIsEmpty ( ) && this . editMode == true ) {
var positionObject = this . _pointerToPositionObject ( this . pointerPosition ) ;
var defaultData = { id : util . randomUUID ( ) , x : positionObject . left , y : positionObject . top , label : "new" , fixed : false } ;
if ( this . triggerFunctions . add ) {
if ( this . triggerFunctions . add . length == 2 ) {
var me = this ;
this . triggerFunctions . add ( defaultData , function ( finalizedData ) {
me . createNodeOnClick = true ;
me . nodesData . add ( finalizedData ) ;
me . createNodeOnClick = false ;
me . _createManipulatorBar ( ) ;
me . moving = true ;
me . start ( ) ;
} ) ;
}
else {
alert ( "The function for add does not support two arguments (data,callback)." ) ;
this . _createManipulatorBar ( ) ;
this . moving = true ;
this . start ( ) ;
}
}
else {
console . log ( "didnt use funciton" )
this . createNodeOnClick = true ;
this . nodesData . add ( defaultData ) ;
this . createNodeOnClick = false ;
this . _createManipulatorBar ( ) ;
this . moving = true ;
this . start ( ) ;
}
}
return null ;
} ,
/ * *
* restore the selection back to only the sourcenode
*
* @ private
* /
_restoreSourceNode : function ( ) {
this . _unselectAll ( true ) ;
this . _selectObject ( this . manipulationSourceNode ) ;
} ,
/ * *
* change the description message on the toolbar
* connect two nodes with a new edge .
*
* @ param message
* @ private
* /
_setManipulationMessage : function ( message ) {
var messageSpan = document . getElementById ( 'manipulatorLabel' ) ;
messageSpan . innerHTML = message ;
} ,
/ * *
* Adds a node on the specified location
*
* @ param { Object } pointer
* /
_addNode : function ( ) {
if ( this . _selectionIsEmpty ( ) ) {
var positionObject = this . _pointerToPositionObject ( this . pointerPosition ) ;
this . createNodeOnClick = true ;
this . nodesData . add ( { id : util . randomUUID ( ) , x : positionObject . left , y : positionObject . top , label : "new" , fixed : false } ) ;
this . createNodeOnClick = false ;
this . moving = true ;
this . start ( ) ;
_createEdge : function ( sourceNodeId , targetNodeId ) {
if ( this . editMode == true ) {
var defaultData = { from : sourceNodeId , to : targetNodeId } ;
if ( this . triggerFunctions . connect ) {
if ( this . triggerFunctions . connect . length == 2 ) {
var me = this ;
this . triggerFunctions . connect ( defaultData , function ( finalizedData ) {
me . edgesData . add ( finalizedData )
me . moving = true ;
me . start ( ) ;
} ) ;
}
else {
alert ( "The function for connect does not support two arguments (data,callback)." ) ;
this . moving = true ;
this . start ( ) ;
}
}
else {
this . edgesData . add ( defaultData )
this . moving = true ;
this . start ( ) ;
}
}
} ,
/ * *
* connect two nodes with a new edge .
* Create the toolbar to edit the selected node . The label and the color can be changed . Other colors are derived from the chosen color .
*
* @ private
* /
_connectNodes : function ( ) {
var targetNode = this . _getTargetNode ( ) ;
var sourceNode = this . manipulationSourceNode ;
this . edgesData . add ( { from : sourceNode . id , to : targetNode . id } )
this . moving = true ;
this . start ( ) ;
_editNode : function ( ) {
if ( this . triggerFunctions . edit && this . editMode == true ) {
var node = this . _getSelectedNode ( ) ;
var data = { id : node . id ,
label : node . label ,
group : node . group ,
shape : node . shape ,
color : {
background : node . color . background ,
border : node . color . border ,
highlight : {
background : node . color . highlight . background ,
border : node . color . highlight . border
}
} } ;
if ( this . triggerFunctions . edit . length == 2 ) {
var me = this ;
this . triggerFunctions . edit ( data , function ( finalizedData ) {
me . nodesData . update ( finalizedData ) ;
me . _createManipulatorBar ( ) ;
me . moving = true ;
me . start ( ) ;
} ) ;
}
else {
alert ( "The function for edit does not support two arguments (data, callback)." )
}
}
else {
alert ( "No edit function has been bound to this button." )
}
} ,
/ * *
* delete everything in the selection
* TODO : place the alert in the gui .
*
*
* @ private
* /
_deleteSelected : function ( ) {
if ( ! this . _clusterInSelection ( ) ) {
var selectedNodes = this . getSelectedNodes ( ) ;
var selectedEdges = this . getSelectedEdges ( ) ;
this . _removeEdges ( selectedEdges ) ;
this . _removeNodes ( selectedNodes ) ;
this . moving = true ;
this . start ( ) ;
}
else {
alert ( "Clusters cannot be deleted." )
if ( ! this . _selectionIsEmpty ( ) && this . editMode == true ) {
if ( ! this . _clusterInSelection ( ) ) {
var selectedNodes = this . getSelectedNodes ( ) ;
var selectedEdges = this . getSelectedEdges ( ) ;
if ( this . triggerFunctions . delete ) {
var me = this ;
var data = { nodes : selectedNodes , edges : selectedEdges } ;
if ( this . triggerFunctions . delete . length = 2 ) {
this . triggerFunctions . delete ( data , function ( finalizedData ) {
me . edgesData . remove ( finalizedData . edges ) ;
me . nodesData . remove ( finalizedData . nodes ) ;
me . moving = true ;
me . start ( ) ;
} ) ;
}
else {
alert ( "The function for edit does not support two arguments (data, callback)." )
}
}
else {
this . edgesData . remove ( selectedEdges ) ;
this . nodesData . remove ( selectedNodes ) ;
this . moving = true ;
this . start ( ) ;
}
}
else {
alert ( "Clusters cannot be deleted." ) ;
}
}
}
} ;