Fix several errors removing a node ...

This commit is contained in:
Paulo Gustavo Veiga 2012-07-07 11:52:23 -03:00
parent f3a13dfe7a
commit f3da916965
10 changed files with 616 additions and 557 deletions

View File

@ -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;
}
console.log("conector:" + x + ", " + y);
connector.setPosition(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';
}; };

View File

@ -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();
}); });

View File

@ -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 () {

View File

@ -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';
};

View File

@ -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;
} }
}); });

View File

@ -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;
} }
}); });

View File

@ -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);
} }

View File

@ -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);

View File

@ -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() + ')';
} }

View File

@ -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 != "") {