mirror of
https://bitbucket.org/wisemapping/wisemapping-open-source.git
synced 2024-12-23 11:53:48 +01:00
Fix several errors removing a node ...
This commit is contained in:
parent
f3a13dfe7a
commit
f3da916965
@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
mindplot.ConnectionLine = new Class({
|
mindplot.ConnectionLine = new Class({
|
||||||
initialize:function(sourceNode, targetNode, lineType) {
|
initialize:function (sourceNode, targetNode, lineType) {
|
||||||
$assert(targetNode, 'parentNode node can not be null');
|
$assert(targetNode, 'parentNode node can not be null');
|
||||||
$assert(sourceNode, 'childNode node can not be null');
|
$assert(sourceNode, 'childNode node can not be null');
|
||||||
$assert(sourceNode != targetNode, 'Cilcular connection');
|
$assert(sourceNode != targetNode, 'Cilcular connection');
|
||||||
@ -48,14 +48,14 @@ mindplot.ConnectionLine = new Class({
|
|||||||
this._line2d = line;
|
this._line2d = line;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getCtrlPoints : function(sourceNode, targetNode) {
|
_getCtrlPoints:function (sourceNode, targetNode) {
|
||||||
var srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
|
var srcPos = sourceNode.workoutOutgoingConnectionPoint(targetNode.getPosition());
|
||||||
var destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
|
var destPos = targetNode.workoutIncomingConnectionPoint(sourceNode.getPosition());
|
||||||
var deltaX = (srcPos.x - destPos.x) / 3;
|
var deltaX = (srcPos.x - destPos.x) / 3;
|
||||||
return [new core.Point(deltaX, 0), new core.Point(-deltaX, 0)];
|
return [new core.Point(deltaX, 0), new core.Point(-deltaX, 0)];
|
||||||
},
|
},
|
||||||
|
|
||||||
_createLine : function(lineType, defaultStyle) {
|
_createLine:function (lineType, defaultStyle) {
|
||||||
if (!$defined(lineType)) {
|
if (!$defined(lineType)) {
|
||||||
lineType = defaultStyle;
|
lineType = defaultStyle;
|
||||||
}
|
}
|
||||||
@ -80,19 +80,19 @@ mindplot.ConnectionLine = new Class({
|
|||||||
return line;
|
return line;
|
||||||
},
|
},
|
||||||
|
|
||||||
setVisibility : function(value) {
|
setVisibility:function (value) {
|
||||||
this._line2d.setVisibility(value);
|
this._line2d.setVisibility(value);
|
||||||
},
|
},
|
||||||
|
|
||||||
isVisible : function() {
|
isVisible:function () {
|
||||||
return this._line2d.isVisible();
|
return this._line2d.isVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
setOpacity : function(opacity) {
|
setOpacity:function (opacity) {
|
||||||
this._line2d.setOpacity(opacity);
|
this._line2d.setOpacity(opacity);
|
||||||
},
|
},
|
||||||
|
|
||||||
redraw : function() {
|
redraw:function () {
|
||||||
var line2d = this._line2d;
|
var line2d = this._line2d;
|
||||||
var sourceTopic = this._sourceTopic;
|
var sourceTopic = this._sourceTopic;
|
||||||
var sourcePosition = sourceTopic.getPosition();
|
var sourcePosition = sourceTopic.getPosition();
|
||||||
@ -100,7 +100,7 @@ mindplot.ConnectionLine = new Class({
|
|||||||
var targetTopic = this._targetTopic;
|
var targetTopic = this._targetTopic;
|
||||||
var targetPosition = targetTopic.getPosition();
|
var targetPosition = targetTopic.getPosition();
|
||||||
|
|
||||||
var sPos,tPos;
|
var sPos, tPos;
|
||||||
sPos = sourceTopic.workoutOutgoingConnectionPoint(targetPosition);
|
sPos = sourceTopic.workoutOutgoingConnectionPoint(targetPosition);
|
||||||
tPos = targetTopic.workoutIncomingConnectionPoint(sourcePosition);
|
tPos = targetTopic.workoutIncomingConnectionPoint(sourcePosition);
|
||||||
|
|
||||||
@ -118,11 +118,11 @@ mindplot.ConnectionLine = new Class({
|
|||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_positionateConnector : function(targetTopic) {
|
_positionateConnector:function (targetTopic) {
|
||||||
var targetPosition = targetTopic.getPosition();
|
var targetPosition = targetTopic.getPosition();
|
||||||
var offset = mindplot.Topic.CONNECTOR_WIDTH / 2;
|
var offset = mindplot.Topic.CONNECTOR_WIDTH / 2;
|
||||||
var targetTopicSize = targetTopic.getSize();
|
var targetTopicSize = targetTopic.getSize();
|
||||||
var y;
|
var y, x;
|
||||||
if (targetTopic.getShapeType() == mindplot.model.TopicShape.LINE) {
|
if (targetTopic.getShapeType() == mindplot.model.TopicShape.LINE) {
|
||||||
y = targetTopicSize.height;
|
y = targetTopicSize.height;
|
||||||
} else {
|
} else {
|
||||||
@ -133,71 +133,74 @@ mindplot.ConnectionLine = new Class({
|
|||||||
var connector = targetTopic.getShrinkConnector();
|
var connector = targetTopic.getShrinkConnector();
|
||||||
if ($defined(connector)) {
|
if ($defined(connector)) {
|
||||||
if (Math.sign(targetPosition.x) > 0) {
|
if (Math.sign(targetPosition.x) > 0) {
|
||||||
var x = targetTopicSize.width;
|
x = targetTopicSize.width;
|
||||||
connector.setPosition(x, y);
|
connector.setPosition(x, y);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
var x = -mindplot.Topic.CONNECTOR_WIDTH;
|
x = -mindplot.Topic.CONNECTOR_WIDTH;
|
||||||
connector.setPosition(x, y);
|
|
||||||
}
|
}
|
||||||
|
console.log("conector:" + x + ", " + y);
|
||||||
|
connector.setPosition(x, y);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
setStroke : function(color, style, opacity) {
|
setStroke:function (color, style, opacity) {
|
||||||
this._line2d.setStroke(null, null, color, opacity);
|
this._line2d.setStroke(null, null, color, opacity);
|
||||||
},
|
},
|
||||||
|
|
||||||
addToWorkspace : function(workspace) {
|
addToWorkspace:function (workspace) {
|
||||||
workspace.appendChild(this._line2d);
|
workspace.appendChild(this._line2d);
|
||||||
this._line2d.moveToBack();
|
this._line2d.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
removeFromWorkspace : function(workspace) {
|
removeFromWorkspace:function (workspace) {
|
||||||
workspace.removeChild(this._line2d);
|
workspace.removeChild(this._line2d);
|
||||||
},
|
},
|
||||||
|
|
||||||
getTargetTopic : function() {
|
getTargetTopic:function () {
|
||||||
return this._targetTopic;
|
return this._targetTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
getSourceTopic : function() {
|
getSourceTopic:function () {
|
||||||
return this._sourceTopic;
|
return this._sourceTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
getLineType : function() {
|
getLineType:function () {
|
||||||
return this._lineType;
|
return this._lineType;
|
||||||
},
|
},
|
||||||
|
|
||||||
getLine : function() {
|
getLine:function () {
|
||||||
return this._line2d;
|
return this._line2d;
|
||||||
},
|
},
|
||||||
|
|
||||||
getModel : function() {
|
getModel:function () {
|
||||||
return this._model;
|
return this._model;
|
||||||
},
|
},
|
||||||
|
|
||||||
setModel : function(model) {
|
setModel:function (model) {
|
||||||
this._model = model;
|
this._model = model;
|
||||||
},
|
},
|
||||||
|
|
||||||
getType : function() {
|
getType:function () {
|
||||||
return "ConnectionLine";
|
return "ConnectionLine";
|
||||||
},
|
},
|
||||||
|
|
||||||
getId : function() {
|
getId:function () {
|
||||||
return this._model.getId();
|
return this._model.getId();
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToBack : function() {
|
moveToBack:function () {
|
||||||
this._line2d.moveToBack();
|
this._line2d.moveToBack();
|
||||||
},
|
},
|
||||||
|
|
||||||
moveToFront : function() {
|
moveToFront:function () {
|
||||||
this._line2d.moveToFront();
|
this._line2d.moveToFront();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
mindplot.ConnectionLine.getStrokeColor = function() {
|
mindplot.ConnectionLine.getStrokeColor = function () {
|
||||||
return '#495879';
|
return '#495879';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -506,7 +506,6 @@ mindplot.Designer = new Class({
|
|||||||
$assert(mindmapModel, "mindmapModel can not be null");
|
$assert(mindmapModel, "mindmapModel can not be null");
|
||||||
this._mindmap = mindmapModel;
|
this._mindmap = mindmapModel;
|
||||||
|
|
||||||
// try {
|
|
||||||
// Init layout manager ...
|
// Init layout manager ...
|
||||||
var size = {width:25, height:25};
|
var size = {width:25, height:25};
|
||||||
var layoutManager = new mindplot.layout.LayoutManager(mindmapModel.getCentralTopic().getId(), size);
|
var layoutManager = new mindplot.layout.LayoutManager(mindmapModel.getCentralTopic().getId(), size);
|
||||||
@ -543,9 +542,6 @@ mindplot.Designer = new Class({
|
|||||||
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout);
|
mindplot.EventBus.instance.fireEvent(mindplot.EventBus.events.DoLayout);
|
||||||
|
|
||||||
this.fireEvent('loadSuccess');
|
this.fireEvent('loadSuccess');
|
||||||
// } catch(e) {
|
|
||||||
// this.fireEvent('loadError', e);
|
|
||||||
// }
|
|
||||||
},
|
},
|
||||||
|
|
||||||
getMindmap:function () {
|
getMindmap:function () {
|
||||||
@ -591,7 +587,7 @@ mindplot.Designer = new Class({
|
|||||||
_relationshipModelToRelationship:function (model) {
|
_relationshipModelToRelationship:function (model) {
|
||||||
$assert(model, "Node model can not be null");
|
$assert(model, "Node model can not be null");
|
||||||
|
|
||||||
var result = this._buildRelationship(model);
|
var result = this._buildRelationshipShape(model);
|
||||||
|
|
||||||
var sourceTopic = result.getSourceTopic();
|
var sourceTopic = result.getSourceTopic();
|
||||||
sourceTopic.addRelationship(result);
|
sourceTopic.addRelationship(result);
|
||||||
@ -602,7 +598,6 @@ mindplot.Designer = new Class({
|
|||||||
result.setVisibility(sourceTopic.isVisible() && targetTopic.isVisible());
|
result.setVisibility(sourceTopic.isVisible() && targetTopic.isVisible());
|
||||||
|
|
||||||
this._workspace.appendChild(result);
|
this._workspace.appendChild(result);
|
||||||
result.redraw();
|
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -623,7 +618,7 @@ mindplot.Designer = new Class({
|
|||||||
this.getModel().removeRelationship(relationship);
|
this.getModel().removeRelationship(relationship);
|
||||||
},
|
},
|
||||||
|
|
||||||
_buildRelationship:function (model) {
|
_buildRelationshipShape:function (model) {
|
||||||
var dmodel = this.getModel();
|
var dmodel = this.getModel();
|
||||||
|
|
||||||
var sourceTopicId = model.getFromNode();
|
var sourceTopicId = model.getFromNode();
|
||||||
@ -674,16 +669,20 @@ mindplot.Designer = new Class({
|
|||||||
// If there are more than one node selected,
|
// If there are more than one node selected,
|
||||||
$notify($msg('ENTITIES_COULD_NOT_BE_DELETED'));
|
$notify($msg('ENTITIES_COULD_NOT_BE_DELETED'));
|
||||||
return;
|
return;
|
||||||
|
} else if (topics.length == 1 && topics[0].getTopicType() == mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) {
|
||||||
|
$notify($msg('CENTRAL_TOPIC_CAN_NOT_BE_DELETED'));
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Filter the lists ...
|
// If the central topic has been selected, I must filter ir
|
||||||
var validateFunc = function (object) {
|
var topicIds = topics.filter(function (topic) {
|
||||||
return object.getType() == mindplot.Relationship.type || object.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE
|
return topic.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE
|
||||||
};
|
}).map(function (topic) {
|
||||||
var validateError = $msg('CENTRAL_TOPIC_CAN_NOT_BE_DELETED');
|
return topic.getId()
|
||||||
var model = this.getModel();
|
});
|
||||||
var topicIds = model.filterTopicsIds(validateFunc, validateError);
|
|
||||||
var relIds = model.filterSelectedRelationships().map(function (rel) {
|
|
||||||
|
var relIds = topics.map(function (rel) {
|
||||||
return rel.getId();
|
return rel.getId();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -42,11 +42,11 @@ mindplot.DesignerKeyboard = new Class({
|
|||||||
var model = designer.getModel();
|
var model = designer.getModel();
|
||||||
var keyboardEvents = {
|
var keyboardEvents = {
|
||||||
'backspace':function (event) {
|
'backspace':function (event) {
|
||||||
designer.deleteSelectedEntities();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.deleteSelectedEntities();
|
||||||
|
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'space':function () {
|
'space':function () {
|
||||||
@ -73,129 +73,123 @@ mindplot.DesignerKeyboard = new Class({
|
|||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'meta+enter':function (event) {
|
'meta+enter':function (event) {
|
||||||
designer.createChildForSelectedNode();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
designer.createChildForSelectedNode();
|
||||||
|
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'ctrl+z':function () {
|
'ctrl+z':function () {
|
||||||
designer.undo();
|
|
||||||
|
|
||||||
event.preventDefault(event);
|
event.preventDefault(event);
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
designer.undo();
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'meta+z':function (event) {
|
'meta+z':function (event) {
|
||||||
designer.undo();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.undo();
|
||||||
|
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'ctrl+z+shift':function (event) {
|
'ctrl+z+shift':function (event) {
|
||||||
designer.redo();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.redo();
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'meta+z+shift':function (event) {
|
'meta+z+shift':function (event) {
|
||||||
designer.redo();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.redo();
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'ctrl+y':function (event) {
|
'ctrl+y':function (event) {
|
||||||
designer.redo();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.redo();
|
||||||
|
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'meta+y':function (event) {
|
'meta+y':function (event) {
|
||||||
designer.redo();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.redo();
|
||||||
|
|
||||||
}.bind(this),
|
}.bind(this),
|
||||||
|
|
||||||
'ctrl+a':function (event) {
|
'ctrl+a':function (event) {
|
||||||
designer.selectAll();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.selectAll();
|
||||||
},
|
},
|
||||||
|
|
||||||
'ctrl+b':function (event) {
|
'ctrl+b':function (event) {
|
||||||
designer.changeFontWeight();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.changeFontWeight();
|
||||||
},
|
},
|
||||||
|
|
||||||
'meta+b':function (event) {
|
'meta+b':function (event) {
|
||||||
designer.changeFontWeight();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.changeFontWeight();
|
||||||
},
|
},
|
||||||
|
|
||||||
'ctrl+s':function (event) {
|
'ctrl+s':function (event) {
|
||||||
event.preventDefault();
|
|
||||||
$('save').fireEvent('click');
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
$('save').fireEvent('click');
|
||||||
},
|
},
|
||||||
|
|
||||||
'meta+s':function (event) {
|
'meta+s':function (event) {
|
||||||
event.preventDefault();
|
|
||||||
$('save').fireEvent('click');
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
$('save').fireEvent('click');
|
||||||
},
|
},
|
||||||
|
|
||||||
'ctrl+i':function (event) {
|
'ctrl+i':function (event) {
|
||||||
designer.changeFontStyle();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.changeFontStyle();
|
||||||
},
|
},
|
||||||
|
|
||||||
'meta+i':function (event) {
|
'meta+i':function (event) {
|
||||||
designer.changeFontStyle();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.changeFontStyle();
|
||||||
},
|
},
|
||||||
|
|
||||||
'meta+shift+a':function (event) {
|
'meta+shift+a':function (event) {
|
||||||
designer.deselectAll();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.deselectAll();
|
||||||
},
|
},
|
||||||
|
|
||||||
'ctrl+shift+a':function (event) {
|
'ctrl+shift+a':function (event) {
|
||||||
designer.deselectAll();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.deselectAll();
|
||||||
},
|
},
|
||||||
|
|
||||||
'meta+a':function (event) {
|
'meta+a':function (event) {
|
||||||
designer.selectAll();
|
|
||||||
|
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
|
designer.selectAll();
|
||||||
},
|
},
|
||||||
|
|
||||||
'right':function () {
|
'right':function () {
|
||||||
|
@ -17,9 +17,15 @@
|
|||||||
*/
|
*/
|
||||||
mindplot.Relationship = new Class({
|
mindplot.Relationship = new Class({
|
||||||
Extends:mindplot.ConnectionLine,
|
Extends:mindplot.ConnectionLine,
|
||||||
|
Static:{
|
||||||
|
getStrokeColor:function () {
|
||||||
|
return '#9b74e6';
|
||||||
|
},
|
||||||
|
type: "Relationship"
|
||||||
|
},
|
||||||
initialize:function (sourceNode, targetNode, model) {
|
initialize:function (sourceNode, targetNode, model) {
|
||||||
$assert(sourceNode,"sourceNode can not be null");
|
$assert(sourceNode, "sourceNode can not be null");
|
||||||
$assert(targetNode,"targetNode can not be null");
|
$assert(targetNode, "targetNode can not be null");
|
||||||
|
|
||||||
this.parent(sourceNode, targetNode, model.getLineType());
|
this.parent(sourceNode, targetNode, model.getLineType());
|
||||||
this.setModel(model);
|
this.setModel(model);
|
||||||
@ -161,6 +167,8 @@ mindplot.Relationship = new Class({
|
|||||||
|
|
||||||
this.parent(workspace);
|
this.parent(workspace);
|
||||||
this._positionArrows();
|
this._positionArrows();
|
||||||
|
this.redraw();
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_initializeControlPointController:function () {
|
_initializeControlPointController:function () {
|
||||||
@ -306,13 +314,7 @@ mindplot.Relationship = new Class({
|
|||||||
this._line2d.setIsDestControlPointCustom(isCustom);
|
this._line2d.setIsDestControlPointCustom(isCustom);
|
||||||
},
|
},
|
||||||
|
|
||||||
getId: function(){
|
getId:function () {
|
||||||
return this._model.getId();
|
return this._model.getId();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
mindplot.Relationship.type = "Relationship";
|
|
||||||
mindplot.Relationship.getStrokeColor = function () {
|
|
||||||
return '#9b74e6';
|
|
||||||
};
|
|
||||||
|
@ -30,10 +30,14 @@ mindplot.commands.DeleteCommand = new Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
execute:function (commandContext) {
|
execute:function (commandContext) {
|
||||||
var topics = commandContext.findTopics(this._topicIds);
|
|
||||||
|
// If a parent has been selected for deletion, the children must be excluded from the delete ...
|
||||||
|
var topics = this._filterChildren(this._topicIds, commandContext);
|
||||||
|
|
||||||
|
|
||||||
if (topics.length > 0) {
|
if (topics.length > 0) {
|
||||||
topics.forEach(
|
topics.forEach(
|
||||||
function (topic, index) {
|
function (topic) {
|
||||||
var model = topic.getModel();
|
var model = topic.getModel();
|
||||||
|
|
||||||
// Delete relationships
|
// Delete relationships
|
||||||
@ -45,9 +49,8 @@ mindplot.commands.DeleteCommand = new Class({
|
|||||||
commandContext.deleteRelationship(relationship);
|
commandContext.deleteRelationship(relationship);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Delete the node itself ...
|
||||||
this._deletedTopicModels.push(model);
|
this._deletedTopicModels.push(model);
|
||||||
|
|
||||||
// Is connected?.
|
|
||||||
var outTopic = topic.getOutgoingConnectedTopic();
|
var outTopic = topic.getOutgoingConnectedTopic();
|
||||||
var outTopicId = null;
|
var outTopicId = null;
|
||||||
if (outTopic != null) {
|
if (outTopic != null) {
|
||||||
@ -72,9 +75,7 @@ mindplot.commands.DeleteCommand = new Class({
|
|||||||
|
|
||||||
undoExecute:function (commandContext) {
|
undoExecute:function (commandContext) {
|
||||||
|
|
||||||
var topics = commandContext.findTopics(this._topicIds);
|
|
||||||
var parent = commandContext.findTopics(this._parentTopicIds);
|
var parent = commandContext.findTopics(this._parentTopicIds);
|
||||||
|
|
||||||
this._deletedTopicModels.forEach(
|
this._deletedTopicModels.forEach(
|
||||||
function (model, index) {
|
function (model, index) {
|
||||||
var topic = commandContext.createTopic(model);
|
var topic = commandContext.createTopic(model);
|
||||||
@ -95,5 +96,28 @@ mindplot.commands.DeleteCommand = new Class({
|
|||||||
this._deletedTopicModels = [];
|
this._deletedTopicModels = [];
|
||||||
this._parentTopicIds = [];
|
this._parentTopicIds = [];
|
||||||
this._deletedRelModel = [];
|
this._deletedRelModel = [];
|
||||||
|
},
|
||||||
|
|
||||||
|
_filterChildren:function (topicIds, commandContext) {
|
||||||
|
var topics = commandContext.findTopics(topicIds);
|
||||||
|
|
||||||
|
var result = [];
|
||||||
|
topics.forEach(function (topic) {
|
||||||
|
var parent = topic.getParent();
|
||||||
|
var found = false;
|
||||||
|
while (parent != null && !found) {
|
||||||
|
found = topicIds.contains(parent.getId());
|
||||||
|
if (found) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
parent = parent.getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
result.push(topic);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
});
|
});
|
@ -16,13 +16,13 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
mindplot.layout.BalancedSorter = new Class({
|
mindplot.layout.BalancedSorter = new Class({
|
||||||
Extends: mindplot.layout.AbstractBasicSorter,
|
Extends:mindplot.layout.AbstractBasicSorter,
|
||||||
|
|
||||||
initialize: function() {
|
initialize:function () {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
predict : function(graph, parent, node, position, free) {
|
predict:function (graph, parent, node, position, free) {
|
||||||
// If its a free node...
|
// If its a free node...
|
||||||
if (free) {
|
if (free) {
|
||||||
$assert($defined(position), "position cannot be null for predict in free positioning");
|
$assert($defined(position), "position cannot be null for predict in free positioning");
|
||||||
@ -31,13 +31,13 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
var rootNode = graph.getRootNode(parent);
|
var rootNode = graph.getRootNode(parent);
|
||||||
var direction = this._getRelativeDirection(rootNode.getPosition(), node.getPosition());
|
var direction = this._getRelativeDirection(rootNode.getPosition(), node.getPosition());
|
||||||
|
|
||||||
var limitXPos = parent.getPosition().x + direction * (parent.getSize().width/2 + node.getSize().width/2 + mindplot.layout.BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
var limitXPos = parent.getPosition().x + direction * (parent.getSize().width / 2 + node.getSize().width / 2 + mindplot.layout.BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
|
|
||||||
var xPos = direction > 0 ?
|
var xPos = direction > 0 ?
|
||||||
(position.x >= limitXPos ? position.x : limitXPos) :
|
(position.x >= limitXPos ? position.x : limitXPos) :
|
||||||
(position.x <= limitXPos ? position.x : limitXPos) ;
|
(position.x <= limitXPos ? position.x : limitXPos);
|
||||||
|
|
||||||
return [0, {x: xPos, y:position.y}];
|
return [0, {x:xPos, y:position.y}];
|
||||||
}
|
}
|
||||||
|
|
||||||
var rootNode = graph.getRootNode(parent);
|
var rootNode = graph.getRootNode(parent);
|
||||||
@ -61,10 +61,10 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
}
|
}
|
||||||
// Filter nodes on one side..
|
// Filter nodes on one side..
|
||||||
var order = position ? (position.x > rootNode.getPosition().x ? 0 : 1) : ((right.length - left.length) > 0 ? 1 : 0);
|
var order = position ? (position.x > rootNode.getPosition().x ? 0 : 1) : ((right.length - left.length) > 0 ? 1 : 0);
|
||||||
var direction = order%2 == 0 ? 1 : -1;
|
var direction = order % 2 == 0 ? 1 : -1;
|
||||||
|
|
||||||
// Exclude the dragged node (if set)
|
// Exclude the dragged node (if set)
|
||||||
var children = this._getChildrenForOrder(parent, graph, order).filter(function(child) {
|
var children = this._getChildrenForOrder(parent, graph, order).filter(function (child) {
|
||||||
return child != node;
|
return child != node;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -76,14 +76,14 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
// Try to fit within ...
|
// Try to fit within ...
|
||||||
var result = null;
|
var result = null;
|
||||||
var last = children.getLast();
|
var last = children.getLast();
|
||||||
position = position || {x: last.getPosition().x, y:last.getPosition().y + 1};
|
position = position || {x:last.getPosition().x, y:last.getPosition().y + 1};
|
||||||
children.each(function(child, index) {
|
children.each(function (child, index) {
|
||||||
var cpos = child.getPosition();
|
var cpos = child.getPosition();
|
||||||
if (position.y > cpos.y) {
|
if (position.y > cpos.y) {
|
||||||
yOffset = child == last ?
|
yOffset = child == last ?
|
||||||
child.getSize().height + mindplot.layout.BalancedSorter.INTERNODE_VERTICAL_PADDING * 2 :
|
child.getSize().height + mindplot.layout.BalancedSorter.INTERNODE_VERTICAL_PADDING * 2 :
|
||||||
(children[index + 1].getPosition().y - child.getPosition().y) / 2;
|
(children[index + 1].getPosition().y - child.getPosition().y) / 2;
|
||||||
result = [child.getOrder() + 2,{x:cpos.x, y:cpos.y + yOffset}];
|
result = [child.getOrder() + 2, {x:cpos.x, y:cpos.y + yOffset}];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
insert: function(treeSet, parent, child, order) {
|
insert:function (treeSet, parent, child, order) {
|
||||||
var children = this._getChildrenForOrder(parent, treeSet, order);
|
var children = this._getChildrenForOrder(parent, treeSet, order);
|
||||||
|
|
||||||
// If no children, return 0 or 1 depending on the side
|
// If no children, return 0 or 1 depending on the side
|
||||||
@ -124,12 +124,12 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
child.setOrder(newOrder);
|
child.setOrder(newOrder);
|
||||||
},
|
},
|
||||||
|
|
||||||
detach:function(treeSet, node) {
|
detach:function (treeSet, node) {
|
||||||
var parent = treeSet.getParent(node);
|
var parent = treeSet.getParent(node);
|
||||||
// Filter nodes on one side..
|
// Filter nodes on one side..
|
||||||
var children = this._getChildrenForOrder(parent, treeSet, node.getOrder());
|
var children = this._getChildrenForOrder(parent, treeSet, node.getOrder());
|
||||||
|
|
||||||
children.each(function(child, index) {
|
children.each(function (child, index) {
|
||||||
if (child.getOrder() > node.getOrder()) {
|
if (child.getOrder() > node.getOrder()) {
|
||||||
child.setOrder(child.getOrder() - 2);
|
child.setOrder(child.getOrder() - 2);
|
||||||
}
|
}
|
||||||
@ -137,7 +137,7 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
node.setOrder(node.getOrder() % 2 == 0 ? 0 : 1);
|
node.setOrder(node.getOrder() % 2 == 0 ? 0 : 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
computeOffsets:function(treeSet, node) {
|
computeOffsets:function (treeSet, node) {
|
||||||
$assert(treeSet, "treeSet can no be null.");
|
$assert(treeSet, "treeSet can no be null.");
|
||||||
$assert(node, "node can no be null.");
|
$assert(node, "node can no be null.");
|
||||||
|
|
||||||
@ -145,8 +145,8 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
|
|
||||||
// Compute heights ...
|
// Compute heights ...
|
||||||
var heights = children.map(
|
var heights = children.map(
|
||||||
function(child) {
|
function (child) {
|
||||||
return {id:child.getId(), order:child.getOrder(), width: child.getSize().width, height:this._computeChildrenHeight(treeSet, child)};
|
return {id:child.getId(), order:child.getOrder(), width:child.getSize().width, height:this._computeChildrenHeight(treeSet, child)};
|
||||||
}, this).reverse();
|
}, this).reverse();
|
||||||
|
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
var totalPHeight = 0;
|
var totalPHeight = 0;
|
||||||
var totalNHeight = 0;
|
var totalNHeight = 0;
|
||||||
|
|
||||||
heights.forEach(function(elem) {
|
heights.forEach(function (elem) {
|
||||||
if (elem.order % 2 == 0) {
|
if (elem.order % 2 == 0) {
|
||||||
totalPHeight += elem.height;
|
totalPHeight += elem.height;
|
||||||
} else {
|
} else {
|
||||||
@ -179,17 +179,17 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
var yOffset = ysum + heights[i].height / 2;
|
var yOffset = ysum + heights[i].height / 2;
|
||||||
var xOffset = direction * (node.getSize().width / 2 + heights[i].width / 2 + + mindplot.layout.BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
var xOffset = direction * (node.getSize().width / 2 + heights[i].width / 2 + +mindplot.layout.BalancedSorter.INTERNODE_HORIZONTAL_PADDING);
|
||||||
|
|
||||||
$assert(!isNaN(xOffset), "xOffset can not be null");
|
$assert(!isNaN(xOffset), "xOffset can not be null");
|
||||||
$assert(!isNaN(yOffset), "yOffset can not be null");
|
$assert(!isNaN(yOffset), "yOffset can not be null");
|
||||||
|
|
||||||
result[heights[i].id] = {x:xOffset,y:yOffset};
|
result[heights[i].id] = {x:xOffset, y:yOffset};
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
verify:function(treeSet, node) {
|
verify:function (treeSet, node) {
|
||||||
// Check that all is consistent ...
|
// Check that all is consistent ...
|
||||||
var children = this._getChildrenForOrder(node, treeSet, node.getOrder());
|
var children = this._getChildrenForOrder(node, treeSet, node.getOrder());
|
||||||
|
|
||||||
@ -198,37 +198,37 @@ mindplot.layout.BalancedSorter = new Class({
|
|||||||
var factor = node.getOrder() % 2 == 0 ? 2 : 1;
|
var factor = node.getOrder() % 2 == 0 ? 2 : 1;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (var i = 0; i < children.length; i++) {
|
||||||
var order = i == 0 && factor == 1 ? 1 : (factor * i);
|
var order = i == 0 && factor == 1 ? 1 : (factor * i);
|
||||||
$assert(children[i].getOrder() == order, "Missing order elements. Missing order: " + (i * factor));
|
$assert(children[i].getOrder() == order, "Missing order elements. Missing order: " + (i * factor) + ". Parent:" + node.getId() + ",Node:" + children[i].getId());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getDirection: function(treeSet, node) {
|
getDirection:function (treeSet, node) {
|
||||||
return node.getOrder() % 2 == 0 ? 1 : -1;
|
return node.getOrder() % 2 == 0 ? 1 : -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
toString:function() {
|
toString:function () {
|
||||||
return "Balanced Sorter";
|
return "Balanced Sorter";
|
||||||
},
|
},
|
||||||
|
|
||||||
_getOrderForPosition: function(rootNode, position) {
|
_getOrderForPosition:function (rootNode, position) {
|
||||||
return position.x > rootNode.getPosition().x ? 0 : 1;
|
return position.x > rootNode.getPosition().x ? 0 : 1;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getChildrenForSide: function(parent, graph, position) {
|
_getChildrenForSide:function (parent, graph, position) {
|
||||||
position = position || {x: parent.getPosition().x + 1, y:parent.getPosition().y + 1};
|
position = position || {x:parent.getPosition().x + 1, y:parent.getPosition().y + 1};
|
||||||
var rootPosition = graph.getRootNode(parent).getPosition();
|
var rootPosition = graph.getRootNode(parent).getPosition();
|
||||||
return graph.getChildren(parent).filter(function(child) {
|
return graph.getChildren(parent).filter(function (child) {
|
||||||
return position.x > rootPosition.x ? child.getPosition().x > rootPosition.x : child.getPosition().x < rootPosition.x;
|
return position.x > rootPosition.x ? child.getPosition().x > rootPosition.x : child.getPosition().x < rootPosition.x;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_getChildrenForOrder: function (parent, graph, order) {
|
_getChildrenForOrder:function (parent, graph, order) {
|
||||||
return this._getSortedChildren(graph, parent).filter(function(child) {
|
return this._getSortedChildren(graph, parent).filter(function (child) {
|
||||||
return child.getOrder() % 2 == order % 2;
|
return child.getOrder() % 2 == order % 2;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_getVerticalPadding: function() {
|
_getVerticalPadding:function () {
|
||||||
return mindplot.layout.BalancedSorter.INTERNODE_VERTICAL_PADDING;
|
return mindplot.layout.BalancedSorter.INTERNODE_VERTICAL_PADDING;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -16,11 +16,11 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
mindplot.layout.OriginalLayout = new Class({
|
mindplot.layout.OriginalLayout = new Class({
|
||||||
initialize: function(treeSet) {
|
initialize:function (treeSet) {
|
||||||
this._treeSet = treeSet;
|
this._treeSet = treeSet;
|
||||||
},
|
},
|
||||||
|
|
||||||
createNode:function(id, size, position, type) {
|
createNode:function (id, size, position, type) {
|
||||||
$assert($defined(id), "id can not be null");
|
$assert($defined(id), "id can not be null");
|
||||||
$assert(size, "size can not be null");
|
$assert(size, "size can not be null");
|
||||||
$assert(position, "position can not be null");
|
$assert(position, "position can not be null");
|
||||||
@ -32,7 +32,7 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
return new mindplot.layout.Node(id, size, position, strategy);
|
return new mindplot.layout.Node(id, size, position, strategy);
|
||||||
},
|
},
|
||||||
|
|
||||||
connectNode: function(parentId, childId, order) {
|
connectNode:function (parentId, childId, order) {
|
||||||
|
|
||||||
var parent = this._treeSet.find(parentId);
|
var parent = this._treeSet.find(parentId);
|
||||||
var child = this._treeSet.find(childId);
|
var child = this._treeSet.find(childId);
|
||||||
@ -48,7 +48,7 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
sorter.verify(this._treeSet, parent);
|
sorter.verify(this._treeSet, parent);
|
||||||
},
|
},
|
||||||
|
|
||||||
disconnectNode: function(nodeId) {
|
disconnectNode:function (nodeId) {
|
||||||
var node = this._treeSet.find(nodeId);
|
var node = this._treeSet.find(nodeId);
|
||||||
var parent = this._treeSet.getParent(node);
|
var parent = this._treeSet.getParent(node);
|
||||||
$assert(parent, "Node already disconnected");
|
$assert(parent, "Node already disconnected");
|
||||||
@ -65,12 +65,12 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
this._treeSet.disconnect(nodeId);
|
this._treeSet.disconnect(nodeId);
|
||||||
|
|
||||||
// Fire a basic validation ...
|
// Fire a basic validation ...
|
||||||
sorter.verify(this._treeSet, node);
|
parent.getSorter().verify(this._treeSet, parent);
|
||||||
},
|
},
|
||||||
|
|
||||||
layout: function() {
|
layout:function () {
|
||||||
var roots = this._treeSet.getTreeRoots();
|
var roots = this._treeSet.getTreeRoots();
|
||||||
roots.forEach(function(node) {
|
roots.forEach(function (node) {
|
||||||
|
|
||||||
// Calculate all node heights ...
|
// Calculate all node heights ...
|
||||||
var sorter = node.getSorter();
|
var sorter = node.getSorter();
|
||||||
@ -83,13 +83,17 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
}, this);
|
}, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
_layoutChildren: function(node, heightById) {
|
_layoutChildren:function (node, heightById) {
|
||||||
|
|
||||||
var nodeId = node.getId();
|
var nodeId = node.getId();
|
||||||
var children = this._treeSet.getChildren(node);
|
var children = this._treeSet.getChildren(node);
|
||||||
var parent = this._treeSet.getParent(node);
|
var parent = this._treeSet.getParent(node);
|
||||||
var childrenOrderMoved = children.some(function(child) { return child.hasOrderChanged(); });
|
var childrenOrderMoved = children.some(function (child) {
|
||||||
var childrenSizeChanged = children.some(function(child) { return child.hasSizeChanged(); });
|
return child.hasOrderChanged();
|
||||||
|
});
|
||||||
|
var childrenSizeChanged = children.some(function (child) {
|
||||||
|
return child.hasSizeChanged();
|
||||||
|
});
|
||||||
|
|
||||||
// If ether any of the nodes has been changed of position or the height of the children is not
|
// If ether any of the nodes has been changed of position or the height of the children is not
|
||||||
// the same, children nodes must be repositioned ....
|
// the same, children nodes must be repositioned ....
|
||||||
@ -104,7 +108,7 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
var offsetById = sorter.computeOffsets(this._treeSet, node);
|
var offsetById = sorter.computeOffsets(this._treeSet, node);
|
||||||
var parentPosition = node.getPosition();
|
var parentPosition = node.getPosition();
|
||||||
|
|
||||||
children.forEach(function(child) {
|
children.forEach(function (child) {
|
||||||
var offset = offsetById[child.getId()];
|
var offset = offsetById[child.getId()];
|
||||||
|
|
||||||
var childFreeDisplacement = child.getFreeDisplacement();
|
var childFreeDisplacement = child.getFreeDisplacement();
|
||||||
@ -112,7 +116,7 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
|
|
||||||
if ((direction > 0 && childFreeDisplacement.x < 0) || (direction < 0 && childFreeDisplacement.x > 0)) {
|
if ((direction > 0 && childFreeDisplacement.x < 0) || (direction < 0 && childFreeDisplacement.x > 0)) {
|
||||||
child.resetFreeDisplacement();
|
child.resetFreeDisplacement();
|
||||||
child.setFreeDisplacement({x: -childFreeDisplacement.x, y:childFreeDisplacement.y});
|
child.setFreeDisplacement({x:-childFreeDisplacement.x, y:childFreeDisplacement.y});
|
||||||
}
|
}
|
||||||
|
|
||||||
offset.x += child.getFreeDisplacement().x;
|
offset.x += child.getFreeDisplacement().x;
|
||||||
@ -129,12 +133,12 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Continue reordering the children nodes ...
|
// Continue reordering the children nodes ...
|
||||||
children.forEach(function(child) {
|
children.forEach(function (child) {
|
||||||
this._layoutChildren(child, heightById);
|
this._layoutChildren(child, heightById);
|
||||||
}, this);
|
}, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
_calculateAlignOffset: function(node, child, heightById) {
|
_calculateAlignOffset:function (node, child, heightById) {
|
||||||
if (child.isFree()) {
|
if (child.isFree()) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -146,15 +150,15 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
|
|
||||||
if (this._treeSet.isStartOfSubBranch(child) && this._branchIsTaller(child, heightById)) {
|
if (this._treeSet.isStartOfSubBranch(child) && this._branchIsTaller(child, heightById)) {
|
||||||
if (this._treeSet.hasSinglePathToSingleLeaf(child)) {
|
if (this._treeSet.hasSinglePathToSingleLeaf(child)) {
|
||||||
offset = heightById[child.getId()]/2 - (childHeight + child.getSorter()._getVerticalPadding()*2)/2;
|
offset = heightById[child.getId()] / 2 - (childHeight + child.getSorter()._getVerticalPadding() * 2) / 2;
|
||||||
} else {
|
} else {
|
||||||
offset = this._treeSet.isLeaf(child) ? 0 : -(childHeight - nodeHeight)/2;
|
offset = this._treeSet.isLeaf(child) ? 0 : -(childHeight - nodeHeight) / 2;
|
||||||
}
|
}
|
||||||
} else if (nodeHeight > childHeight) {
|
} else if (nodeHeight > childHeight) {
|
||||||
if (this._treeSet.getSiblings(child).length > 0) {
|
if (this._treeSet.getSiblings(child).length > 0) {
|
||||||
offset = 0;
|
offset = 0;
|
||||||
} else {
|
} else {
|
||||||
offset = nodeHeight/2 - childHeight/2;
|
offset = nodeHeight / 2 - childHeight / 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (childHeight > nodeHeight) {
|
else if (childHeight > nodeHeight) {
|
||||||
@ -168,29 +172,29 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
return offset;
|
return offset;
|
||||||
},
|
},
|
||||||
|
|
||||||
_branchIsTaller: function(node, heightById) {
|
_branchIsTaller:function (node, heightById) {
|
||||||
return heightById[node.getId()] > (node.getSize().height + node.getSorter()._getVerticalPadding()*2);
|
return heightById[node.getId()] > (node.getSize().height + node.getSorter()._getVerticalPadding() * 2);
|
||||||
},
|
},
|
||||||
|
|
||||||
_fixOverlapping: function(node, heightById) {
|
_fixOverlapping:function (node, heightById) {
|
||||||
var children = this._treeSet.getChildren(node);
|
var children = this._treeSet.getChildren(node);
|
||||||
|
|
||||||
if (node.isFree()) {
|
if (node.isFree()) {
|
||||||
this._shiftBranches(node, heightById);
|
this._shiftBranches(node, heightById);
|
||||||
}
|
}
|
||||||
|
|
||||||
children.forEach(function(child) {
|
children.forEach(function (child) {
|
||||||
this._fixOverlapping(child, heightById);
|
this._fixOverlapping(child, heightById);
|
||||||
}, this);
|
}, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
_shiftBranches: function(node, heightById) {
|
_shiftBranches:function (node, heightById) {
|
||||||
var shiftedBranches = [node];
|
var shiftedBranches = [node];
|
||||||
|
|
||||||
var siblingsToShift = this._treeSet.getSiblingsInVerticalDirection(node, node.getFreeDisplacement().y);
|
var siblingsToShift = this._treeSet.getSiblingsInVerticalDirection(node, node.getFreeDisplacement().y);
|
||||||
var last = node;
|
var last = node;
|
||||||
siblingsToShift.forEach(function(sibling) {
|
siblingsToShift.forEach(function (sibling) {
|
||||||
var overlappingOccurs = shiftedBranches.some(function(shiftedBranch) {
|
var overlappingOccurs = shiftedBranches.some(function (shiftedBranch) {
|
||||||
return this._branchesOverlap(shiftedBranch, sibling, heightById);
|
return this._branchesOverlap(shiftedBranch, sibling, heightById);
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
@ -201,28 +205,28 @@ mindplot.layout.OriginalLayout = new Class({
|
|||||||
}
|
}
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
var branchesToShift = this._treeSet.getBranchesInVerticalDirection(node, node.getFreeDisplacement().y).filter(function(branch) {
|
var branchesToShift = this._treeSet.getBranchesInVerticalDirection(node, node.getFreeDisplacement().y).filter(function (branch) {
|
||||||
return !shiftedBranches.contains(branch);
|
return !shiftedBranches.contains(branch);
|
||||||
});
|
});
|
||||||
|
|
||||||
branchesToShift.forEach(function(branch) {
|
branchesToShift.forEach(function (branch) {
|
||||||
var bAmount = node.getFreeDisplacement().y;
|
var bAmount = node.getFreeDisplacement().y;
|
||||||
this._treeSet.shiftBranchPosition(branch, 0, bAmount);
|
this._treeSet.shiftBranchPosition(branch, 0, bAmount);
|
||||||
shiftedBranches.push(branch);
|
shiftedBranches.push(branch);
|
||||||
last = branch;
|
last = branch;
|
||||||
},this);
|
}, this);
|
||||||
},
|
},
|
||||||
|
|
||||||
_branchesOverlap: function(branchA, branchB, heightById) {
|
_branchesOverlap:function (branchA, branchB, heightById) {
|
||||||
// a branch doesn't really overlap with itself
|
// a branch doesn't really overlap with itself
|
||||||
if (branchA == branchB) {
|
if (branchA == branchB) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var topA = branchA.getPosition().y - heightById[branchA.getId()]/2;
|
var topA = branchA.getPosition().y - heightById[branchA.getId()] / 2;
|
||||||
var bottomA = branchA.getPosition().y + heightById[branchA.getId()]/2;
|
var bottomA = branchA.getPosition().y + heightById[branchA.getId()] / 2;
|
||||||
var topB = branchB.getPosition().y - heightById[branchB.getId()]/2;
|
var topB = branchB.getPosition().y - heightById[branchB.getId()] / 2;
|
||||||
var bottomB = branchB.getPosition().y + heightById[branchB.getId()]/2;
|
var bottomB = branchB.getPosition().y + heightById[branchB.getId()] / 2;
|
||||||
|
|
||||||
return !(topA >= bottomB || bottomA <= topB);
|
return !(topA >= bottomB || bottomA <= topB);
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
mindplot.model.Mindmap = new Class({
|
mindplot.model.Mindmap = new Class({
|
||||||
Extends: mindplot.model.IMindmap,
|
Extends:mindplot.model.IMindmap,
|
||||||
initialize : function(id, version) {
|
initialize:function (id, version) {
|
||||||
$assert(id, "Id can not be null");
|
$assert(id, "Id can not be null");
|
||||||
this._branches = [];
|
this._branches = [];
|
||||||
this._description = null;
|
this._description = null;
|
||||||
@ -26,32 +26,32 @@ mindplot.model.Mindmap = new Class({
|
|||||||
this._id = id;
|
this._id = id;
|
||||||
},
|
},
|
||||||
|
|
||||||
getDescription : function() {
|
getDescription:function () {
|
||||||
return this._description;
|
return this._description;
|
||||||
},
|
},
|
||||||
|
|
||||||
setDescription : function(value) {
|
setDescription:function (value) {
|
||||||
this._description = value;
|
this._description = value;
|
||||||
},
|
},
|
||||||
|
|
||||||
getId : function() {
|
getId:function () {
|
||||||
return this._id;
|
return this._id;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
setId : function(id) {
|
setId:function (id) {
|
||||||
this._id = id;
|
this._id = id;
|
||||||
},
|
},
|
||||||
|
|
||||||
getVersion : function() {
|
getVersion:function () {
|
||||||
return this._version;
|
return this._version;
|
||||||
},
|
},
|
||||||
|
|
||||||
setVersion : function(version) {
|
setVersion:function (version) {
|
||||||
this._version = version;
|
this._version = version;
|
||||||
},
|
},
|
||||||
|
|
||||||
addBranch : function(nodeModel) {
|
addBranch:function (nodeModel) {
|
||||||
$assert(nodeModel && nodeModel.isNodeModel(), 'Add node must be invoked with model objects');
|
$assert(nodeModel && nodeModel.isNodeModel(), 'Add node must be invoked with model objects');
|
||||||
var branches = this.getBranches();
|
var branches = this.getBranches();
|
||||||
if (branches.length == 0) {
|
if (branches.length == 0) {
|
||||||
@ -64,20 +64,20 @@ mindplot.model.Mindmap = new Class({
|
|||||||
this._branches.push(nodeModel);
|
this._branches.push(nodeModel);
|
||||||
},
|
},
|
||||||
|
|
||||||
removeBranch : function(nodeModel) {
|
removeBranch:function (nodeModel) {
|
||||||
$assert(nodeModel && nodeModel.isNodeModel(), 'Remove node must be invoked with model objects');
|
$assert(nodeModel && nodeModel.isNodeModel(), 'Remove node must be invoked with model objects');
|
||||||
return this._branches.erase(nodeModel);
|
return this._branches.erase(nodeModel);
|
||||||
},
|
},
|
||||||
|
|
||||||
getBranches : function() {
|
getBranches:function () {
|
||||||
return this._branches;
|
return this._branches;
|
||||||
},
|
},
|
||||||
|
|
||||||
getRelationships : function() {
|
getRelationships:function () {
|
||||||
return this._relationships;
|
return this._relationships;
|
||||||
},
|
},
|
||||||
|
|
||||||
hasAlreadyAdded : function(node) {
|
hasAlreadyAdded:function (node) {
|
||||||
var result = false;
|
var result = false;
|
||||||
|
|
||||||
// Check in not connected nodes.
|
// Check in not connected nodes.
|
||||||
@ -90,29 +90,40 @@ mindplot.model.Mindmap = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
createNode : function(type, id) {
|
createNode:function (type, id) {
|
||||||
type = !$defined(type) ? mindplot.model.INodeModel.MAIN_TOPIC_TYPE : type;
|
type = !$defined(type) ? mindplot.model.INodeModel.MAIN_TOPIC_TYPE : type;
|
||||||
return new mindplot.model.NodeModel(type, this, id);
|
return new mindplot.model.NodeModel(type, this, id);
|
||||||
},
|
},
|
||||||
|
|
||||||
createRelationship : function(sourceNodeId, targetNodeId) {
|
createRelationship:function (sourceNodeId, targetNodeId) {
|
||||||
$assert($defined(sourceNodeId), 'from node cannot be null');
|
$assert($defined(sourceNodeId), 'from node cannot be null');
|
||||||
$assert($defined(targetNodeId), 'to node cannot be null');
|
$assert($defined(targetNodeId), 'to node cannot be null');
|
||||||
|
|
||||||
return new mindplot.model.RelationshipModel(sourceNodeId, targetNodeId);
|
return new mindplot.model.RelationshipModel(sourceNodeId, targetNodeId);
|
||||||
},
|
},
|
||||||
|
|
||||||
addRelationship : function(relationship) {
|
addRelationship:function (relationship) {
|
||||||
this._relationships.push(relationship);
|
this._relationships.push(relationship);
|
||||||
},
|
},
|
||||||
|
|
||||||
deleteRelationship : function(relationship) {
|
deleteRelationship:function (relationship) {
|
||||||
this._relationships.erase(relationship);
|
this._relationships.erase(relationship);
|
||||||
|
},
|
||||||
|
|
||||||
|
findNodeById:function (id) {
|
||||||
|
var result;
|
||||||
|
for (var i = 0; i < this._branches; i++) {
|
||||||
|
var branch = this._branches[i];
|
||||||
|
result = branch.findNodeById(id)
|
||||||
|
if (result) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
mindplot.model.Mindmap.buildEmpty = function(mapId) {
|
mindplot.model.Mindmap.buildEmpty = function (mapId) {
|
||||||
var result = new mindplot.model.Mindmap(mapId);
|
var result = new mindplot.model.Mindmap(mapId);
|
||||||
var node = result.createNode(mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE, 0);
|
var node = result.createNode(mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE, 0);
|
||||||
result.addBranch(node);
|
result.addBranch(node);
|
||||||
|
@ -184,9 +184,26 @@ mindplot.model.NodeModel = new Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
findNodeById : function(id) {
|
||||||
|
var result = null;
|
||||||
|
if (this.getId() == id) {
|
||||||
|
return this;
|
||||||
|
} else {
|
||||||
|
var children = this.getChildren();
|
||||||
|
for (var i = 0; i < children.length; i++) {
|
||||||
|
var child = children[i];
|
||||||
|
result = child.findNodeById(id);
|
||||||
|
if (result) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
inspect : function() {
|
inspect : function() {
|
||||||
return '(type:' + this.getType() + ' , id: ' + this.getId() + ')';
|
return '(type:' + this.getType() + ' , id: ' + this.getId() + ')';
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
mindplot.persistence.XMLSerializer_Pela = new Class({
|
mindplot.persistence.XMLSerializer_Pela = new Class({
|
||||||
|
|
||||||
toXML : function(mindmap) {
|
toXML:function (mindmap) {
|
||||||
$assert(mindmap, "Can not save a null mindmap");
|
$assert(mindmap, "Can not save a null mindmap");
|
||||||
|
|
||||||
var document = core.Utils.createDocument();
|
var document = core.Utils.createDocument();
|
||||||
@ -56,7 +56,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return document;
|
return document;
|
||||||
},
|
},
|
||||||
|
|
||||||
_topicToXML : function(document, topic) {
|
_topicToXML:function (document, topic) {
|
||||||
var parentTopic = document.createElement("topic");
|
var parentTopic = document.createElement("topic");
|
||||||
|
|
||||||
// Set topic attributes...
|
// Set topic attributes...
|
||||||
@ -164,7 +164,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return parentTopic;
|
return parentTopic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_noteTextToXML : function(document, elem, text) {
|
_noteTextToXML:function (document, elem, text) {
|
||||||
if (text.indexOf('\n') == -1) {
|
if (text.indexOf('\n') == -1) {
|
||||||
elem.setAttribute('text', text);
|
elem.setAttribute('text', text);
|
||||||
} else {
|
} else {
|
||||||
@ -175,7 +175,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_relationshipToXML : function(document, relationship) {
|
_relationshipToXML:function (document, relationship) {
|
||||||
var result = document.createElement("relationship");
|
var result = document.createElement("relationship");
|
||||||
result.setAttribute("srcTopicId", relationship.getFromNode());
|
result.setAttribute("srcTopicId", relationship.getFromNode());
|
||||||
result.setAttribute("destTopicId", relationship.getToNode());
|
result.setAttribute("destTopicId", relationship.getToNode());
|
||||||
@ -197,7 +197,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
loadFromDom : function(dom, mapId) {
|
loadFromDom:function (dom, mapId) {
|
||||||
$assert(dom, "dom can not be null");
|
$assert(dom, "dom can not be null");
|
||||||
$assert(mapId, "mapId can not be null");
|
$assert(mapId, "mapId can not be null");
|
||||||
|
|
||||||
@ -233,7 +233,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return mindmap;
|
return mindmap;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNode : function(domElem, mindmap) {
|
_deserializeNode:function (domElem, mindmap) {
|
||||||
var type = (domElem.getAttribute('central') != null) ? mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE : mindplot.model.INodeModel.MAIN_TOPIC_TYPE;
|
var type = (domElem.getAttribute('central') != null) ? mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE : mindplot.model.INodeModel.MAIN_TOPIC_TYPE;
|
||||||
|
|
||||||
// Load attributes...
|
// Load attributes...
|
||||||
@ -363,7 +363,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return topic;
|
return topic;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeTextAttr : function(domElem) {
|
_deserializeTextAttr:function (domElem) {
|
||||||
var value = domElem.getAttribute("text");
|
var value = domElem.getAttribute("text");
|
||||||
if (!$defined(value)) {
|
if (!$defined(value)) {
|
||||||
var children = domElem.childNodes;
|
var children = domElem.childNodes;
|
||||||
@ -386,7 +386,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeNodeText: function(domElem) {
|
_deserializeNodeText:function (domElem) {
|
||||||
var children = domElem.childNodes;
|
var children = domElem.childNodes;
|
||||||
var value = null;
|
var value = null;
|
||||||
for (var i = 0; i < children.length; i++) {
|
for (var i = 0; i < children.length; i++) {
|
||||||
@ -398,7 +398,7 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
return value;
|
return value;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deserializeRelationship : function(domElement, mindmap) {
|
_deserializeRelationship:function (domElement, mindmap) {
|
||||||
var srcId = domElement.getAttribute("srcTopicId");
|
var srcId = domElement.getAttribute("srcTopicId");
|
||||||
var destId = domElement.getAttribute("destTopicId");
|
var destId = domElement.getAttribute("destTopicId");
|
||||||
var lineType = domElement.getAttribute("lineType");
|
var lineType = domElement.getAttribute("lineType");
|
||||||
@ -410,6 +410,11 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
|
|||||||
if (srcId == destId) {
|
if (srcId == destId) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
// Is the connections points valid ?. If it's not, do not load the relationship ...
|
||||||
|
if (mindmap.findNodeById(srcId) == null || mindmap.findNodeById(destId)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
var model = mindmap.createRelationship(srcId, destId);
|
var model = mindmap.createRelationship(srcId, destId);
|
||||||
model.setLineType(lineType);
|
model.setLineType(lineType);
|
||||||
if ($defined(srcCtrlPoint) && srcCtrlPoint != "") {
|
if ($defined(srcCtrlPoint) && srcCtrlPoint != "") {
|
||||||
|
Loading…
Reference in New Issue
Block a user