Fix error connecting to the central node.

This commit is contained in:
Paulo Gustavo Veiga 2012-07-06 21:21:56 -03:00
parent d921cecb19
commit 8da65a9102
22 changed files with 957 additions and 942 deletions

View File

@ -106,7 +106,7 @@
<include>DragManager.js</include> <include>DragManager.js</include>
<include>DragPivot.js</include> <include>DragPivot.js</include>
<include>ConnectionLine.js</include> <include>ConnectionLine.js</include>
<include>RelationshipLine.js</include> <include>Relationship.js</include>
<include>DragConnector.js</include> <include>DragConnector.js</include>
<include>TextEditor.js</include> <include>TextEditor.js</include>
<include>MultilineTextEditor.js</include> <include>MultilineTextEditor.js</include>

View File

@ -31,7 +31,7 @@ mindplot.ActionDispatcher = new Class({
throw "method must be implemented."; throw "method must be implemented.";
}, },
deleteTopics: function(topicsIds, relIds) { deleteEntities: function(topicsIds, relIds) {
throw "method must be implemented."; throw "method must be implemented.";
}, },

View File

@ -63,7 +63,7 @@ mindplot.CentralTopic = new Class({
}, },
_updatePositionOnChangeSize : function(oldSize, newSize, updatePosition) { _updatePositionOnChangeSize:function () {
// Center main topic ... // Center main topic ...
var zeroPoint = new core.Point(0, 0); var zeroPoint = new core.Point(0, 0);
@ -94,5 +94,13 @@ mindplot.CentralTopic = new Class({
getShrinkConnector:function () { getShrinkConnector:function () {
return null; return null;
},
workoutOutgoingConnectionPoint:function (targetPosition) {
$assert(targetPosition, 'targetPoint can not be null');
var pos = this.getPosition();
var isAtRight = mindplot.util.Shape.isAtRight(targetPosition, pos);
var size = this.getSize();
return mindplot.util.Shape.calculateRectConnectionPoint(pos, size, !isAtRight);
} }
}); });

View File

@ -139,7 +139,7 @@ mindplot.BrixActionDispatcher = new Class({
}.bind(this)); }.bind(this));
}, },
deleteTopics : function(topicsIds, relIds) { deleteEntities : function(topicsIds, relIds) {
$assert(topicsIds, "topicsIds can not be null"); $assert(topicsIds, "topicsIds can not be null");
var framework = this._getFramework(); var framework = this._getFramework();
var mindmap = framework.getModel(); var mindmap = framework.getModel();

View File

@ -248,7 +248,7 @@ mindplot.Designer = new Class({
topic.addEvent('ontblur', function () { topic.addEvent('ontblur', function () {
var topics = this.getModel().filterSelectedTopics(); var topics = this.getModel().filterSelectedTopics();
var rels = this.getModel().filterSelectedRelations(); var rels = this.getModel().filterSelectedRelationships();
if (topics.length == 0 || rels.length == 0) { if (topics.length == 0 || rels.length == 0) {
this.fireEvent('onblur'); this.fireEvent('onblur');
@ -257,7 +257,7 @@ mindplot.Designer = new Class({
topic.addEvent('ontfocus', function () { topic.addEvent('ontfocus', function () {
var topics = this.getModel().filterSelectedTopics(); var topics = this.getModel().filterSelectedTopics();
var rels = this.getModel().filterSelectedRelations(); var rels = this.getModel().filterSelectedRelationships();
if (topics.length == 1 || rels.length == 1) { if (topics.length == 1 || rels.length == 1) {
this.fireEvent('onfocus'); this.fireEvent('onfocus');
@ -275,7 +275,7 @@ mindplot.Designer = new Class({
}); });
var model = this.getModel(); var model = this.getModel();
var objects = model.getObjects(); var objects = model.getEntities();
objects.forEach(function (object) { objects.forEach(function (object) {
// Disable all nodes on focus but not the current if Ctrl key isn't being pressed // Disable all nodes on focus but not the current if Ctrl key isn't being pressed
if (!$defined(event) || (!event.control && !event.meta)) { if (!$defined(event) || (!event.control && !event.meta)) {
@ -289,14 +289,14 @@ mindplot.Designer = new Class({
selectAll:function () { selectAll:function () {
var model = this.getModel(); var model = this.getModel();
var objects = model.getObjects(); var objects = model.getEntities();
objects.forEach(function (object) { objects.forEach(function (object) {
object.setOnFocus(true); object.setOnFocus(true);
}); });
}, },
deselectAll:function () { deselectAll:function () {
var objects = this.getModel().getObjects(); var objects = this.getModel().getEntities();
objects.forEach(function (object) { objects.forEach(function (object) {
object.setOnFocus(false); object.setOnFocus(false);
}); });
@ -475,13 +475,20 @@ mindplot.Designer = new Class({
}, },
showRelPivot:function (event) { showRelPivot:function (event) {
var nodes = this.getModel().filterSelectedTopics();
if (nodes.length <= 0) {
// This could not happen ...
$notify("Could not create relationship. Parent relationship topic must be selected first.");
return;
}
// Current mouse position .... // Current mouse position ....
var screen = this._workspace.getScreenManager(); var screen = this._workspace.getScreenManager();
var pos = screen.getWorkspaceMousePosition(event); var pos = screen.getWorkspaceMousePosition(event);
var selectedTopic = this.getModel().selectedTopic();
// create a connection ... // create a connection ...
this._relPivot.start(selectedTopic, pos); this._relPivot.start(nodes[0], pos);
}, },
connectByRelation:function (sourceTopic, targetTopic) { connectByRelation:function (sourceTopic, targetTopic) {
@ -489,10 +496,8 @@ mindplot.Designer = new Class({
$assert(targetTopic, "targetTopic can not be null"); $assert(targetTopic, "targetTopic can not be null");
// Create a new topic model ... // Create a new topic model ...
// @Todo: Model should not be modified from here ...
var mindmap = this.getMindmap(); var mindmap = this.getMindmap();
var model = mindmap.createRelationship(sourceTopic.getModel().getId(), targetTopic.getModel().getId()); var model = mindmap.createRelationship(sourceTopic.getModel().getId(), targetTopic.getModel().getId());
this._actionDispatcher.connectByRelation(model); this._actionDispatcher.connectByRelation(model);
}, },
@ -614,77 +619,46 @@ mindplot.Designer = new Class({
return this._relationshipModelToRelationship(model); return this._relationshipModelToRelationship(model);
}, },
removeRelationship:function (model) { _deleteRelationship:function (relationship) {
this._mindmap.removeRelationship(model);
var relationship = this._relationships[model.getId()];
var sourceTopic = relationship.getSourceTopic(); var sourceTopic = relationship.getSourceTopic();
sourceTopic.removeRelationship(relationship); sourceTopic.deleteRelationship(relationship);
var targetTopic = relationship.getTargetTopic(); var targetTopic = relationship.getTargetTopic();
targetTopic.removeRelationship(relationship); targetTopic.deleteRelationship(relationship);
this._workspace.removeChild(relationship); this._workspace.removeChild(relationship);
delete this._relationships[model.getId()];
this.getModel().removeRelationship(relationship);
}, },
_buildRelationship:function (model) { _buildRelationship:function (model) {
var elem = this;
var fromNodeId = model.getFromNode();
var toNodeId = model.getToNode();
var sourceTopic = null;
var targetTopic = null;
var dmodel = this.getModel(); var dmodel = this.getModel();
var topics = dmodel.getTopics();
for (var i = 0; i < topics.length; i++) { var sourceTopicId = model.getFromNode();
var t = topics[i]; var sourceTopic = dmodel.findTopicById(sourceTopicId);
if (t.getModel().getId() == fromNodeId) {
sourceTopic = t;
}
if (t.getModel().getId() == toNodeId) {
targetTopic = t;
}
if (targetTopic != null && sourceTopic != null) {
break;
}
}
// Create node graph ... var targetTopicId = model.getToNode();
var relationLine = new mindplot.RelationshipLine(sourceTopic, targetTopic, model.getLineType()); var targetTopic = dmodel.findTopicById(targetTopicId);
if ($defined(model.getSrcCtrlPoint())) {
var srcPoint = model.getSrcCtrlPoint().clone();
relationLine.setSrcControlPoint(srcPoint);
}
if ($defined(model.getDestCtrlPoint())) {
var destPoint = model.getDestCtrlPoint().clone();
relationLine.setDestControlPoint(destPoint);
}
// Build relationship line ....
relationLine.getLine().setDashed(3, 2); var relationship = new mindplot.Relationship(sourceTopic, targetTopic, model);
relationLine.setShowEndArrow(model.getEndArrow()); relationship.addEvent('onfocus', function (event) {
relationLine.setShowStartArrow(model.getStartArrow()); this.onObjectFocusEvent(relationship, event);
relationLine.setModel(model); }.bind(this));
//Add Listeners
relationLine.addEvent('onfocus', function (event) {
elem.onObjectFocusEvent(relationLine, event);
});
// Append it to the workspace ... // Append it to the workspace ...
dmodel.addRelationship(model.getId(), relationLine); dmodel.addRelationship(relationship);
return relationship;
return relationLine;
}, },
_removeNode:function (node) { _removeTopic:function (node) {
if (node.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) { if (node.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE) {
var parent = node._parent; var parent = node._parent;
node.disconnect(this._workspace); node.disconnect(this._workspace);
//remove children //remove children
while (node.getChildren().length > 0) { while (node.getChildren().length > 0) {
this._removeNode(node.getChildren()[0]); this._removeTopic(node.getChildren()[0]);
} }
this._workspace.removeChild(node); this._workspace.removeChild(node);
@ -700,19 +674,30 @@ mindplot.Designer = new Class({
} }
}, },
deleteCurrentNode:function () { deleteSelectedEntities:function () {
var topics = this.getModel().filterSelectedTopics();
var relation = this.getModel().filterSelectedRelationships();
if (topics.length <= 0 && relation.length <= 0) {
// If there are more than one node selected,
$notify($msg('ENTITIES_COULD_NOT_BE_DELETED'));
return;
}
// Filter the lists ...
var validateFunc = function (object) { var validateFunc = function (object) {
return object.getType() == mindplot.RelationshipLine.type || object.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE return object.getType() == mindplot.Relationship.type || object.getTopicType() != mindplot.model.INodeModel.CENTRAL_TOPIC_TYPE
}; };
var validateError = 'Central topic can not be deleted.'; var validateError = $msg('CENTRAL_TOPIC_CAN_NOT_BE_DELETED');
var model = this.getModel(); var model = this.getModel();
var topicsIds = model.filterTopicsIds(validateFunc, validateError); var topicIds = model.filterTopicsIds(validateFunc, validateError);
var relIds = model.filterRelationIds(validateFunc, validateError); var relIds = model.filterSelectedRelationships().map(function (rel) {
return rel.getId();
});
if (topicsIds.length > 0 || relIds.length > 0) { // Finally delete the topics ...
this._actionDispatcher.deleteTopics(topicsIds, relIds); if (topicIds.length > 0 || relIds.length > 0) {
this._actionDispatcher.deleteEntities(topicIds, relIds);
} }
}, },

View File

@ -42,7 +42,7 @@ mindplot.DesignerKeyboard = new Class({
var model = designer.getModel(); var model = designer.getModel();
var keyboardEvents = { var keyboardEvents = {
'backspace':function (event) { 'backspace':function (event) {
designer.deleteCurrentNode(); designer.deleteSelectedEntities();
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
@ -61,7 +61,7 @@ mindplot.DesignerKeyboard = new Class({
}.bind(this), }.bind(this),
'delete':function () { 'delete':function () {
designer.deleteCurrentNode(); designer.deleteSelectedEntities();
}.bind(this), }.bind(this),
'enter':function () { 'enter':function () {

View File

@ -21,7 +21,7 @@ mindplot.DesignerModel = new Class({
initialize:function (options) { initialize:function (options) {
this._zoom = options.zoom; this._zoom = options.zoom;
this._topics = []; this._topics = [];
this._relationships = {}; this._relationships = [];
}, },
getZoom:function () { getZoom:function () {
@ -36,6 +36,10 @@ mindplot.DesignerModel = new Class({
return this._topics; return this._topics;
}, },
getRelationships:function () {
return this._relationships;
},
getCentralTopic:function () { getCentralTopic:function () {
var topics = this.getTopics(); var topics = this.getTopics();
return topics[0]; return topics[0];
@ -51,22 +55,19 @@ mindplot.DesignerModel = new Class({
return result; return result;
}, },
filterSelectedRelations : function() { filterSelectedRelationships:function () {
var result = []; var result = [];
for (var id in this._relationships) { for (var i = 0; i < this._relationships.length; i++) {
var relationship = this._relationships[id]; if (this._relationships[i].isOnFocus()) {
if (relationship.isOnFocus()) { result.push(this._relationships[i]);
result.push(relationship);
} }
} }
return result; return result;
}, },
getObjects : function() { getEntities:function () {
var result = [].append(this._topics); var result = [].append(this._topics);
for (var id in this._relationships) { result.append(this._relationships);
result.push(this._relationships[id]);
}
return result; return result;
}, },
@ -75,16 +76,19 @@ mindplot.DesignerModel = new Class({
this._topics.erase(topic); this._topics.erase(topic);
}, },
removeRelationship:function (rel) {
$assert(rel, "rel can not be null");
this._relationships.erase(rel);
},
addTopic:function (topic) { addTopic:function (topic) {
$assert(topic, "topic can not be null"); $assert(topic, "topic can not be null");
this._topics.push(topic); this._topics.push(topic);
}, },
addRelationship : function(id, rel) { addRelationship:function (rel) {
$assert(rel, "rel can not be null"); $assert(rel, "rel can not be null");
$assert(id, "id can not be null"); this._relationships.push(rel);
this._relationships[id] = rel;
}, },
filterTopicsIds:function (validate, errorMsg) { filterTopicsIds:function (validate, errorMsg) {
@ -109,30 +113,6 @@ mindplot.DesignerModel = new Class({
return result; return result;
}, },
filterRelationIds : function(validate, errorMsg) {
var result = [];
var relationships = this.filterSelectedRelations();
var isValid = true;
for (var j = 0; j < relationships.length; j++) {
var selectedLine = relationships[j];
isValid = true;
if ($defined(validate)) {
isValid = validate(selectedLine);
}
if (isValid) {
result.push(selectedLine.getId());
} else {
$notify(errorMsg);
}
}
return result;
},
getRelationshipsById : function() {
return this._relationships;
},
selectedTopic:function () { selectedTopic:function () {
var topics = this.filterSelectedTopics(); var topics = this.filterSelectedTopics();

View File

@ -85,7 +85,9 @@ mindplot.Messages.BUNDLES = {
ISOLATED_TOPIC:'Isolated Topic', ISOLATED_TOPIC:'Isolated Topic',
CENTRAL_TOPIC:'Central Topic', CENTRAL_TOPIC:'Central Topic',
ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Children can not be collapsed. One topic must be selected.', ONLY_ONE_TOPIC_MUST_BE_SELECTED_COLLAPSE:'Children can not be collapsed. One topic must be selected.',
SHORTCUTS:'Keyboard Shortcuts' SHORTCUTS:'Keyboard Shortcuts',
ENTITIES_COULD_NOT_BE_DELETED: 'Could not delete topic or relation. At least one map entity must be selected.',
CENTRAL_TOPIC_CAN_NOT_BE_DELETED: 'Central topic can not be deleted.'
}, },
'es':{ 'es':{
DISCARD_CHANGES:'Descartar Cambios', DISCARD_CHANGES:'Descartar Cambios',

View File

@ -119,7 +119,7 @@ mindplot.NodeGraph = new Class({
this.closeEditors(); this.closeEditors();
// Fire event ... // Fire event ...
this.fireEvent(focus ? 'ontfocus' : 'ontblur'); this.fireEvent(focus ? 'ontfocus' : 'ontblur',this);
} }
}, },

View File

@ -15,15 +15,25 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
mindplot.RelationshipLine = new Class({ mindplot.Relationship = new Class({
Extends:mindplot.ConnectionLine, Extends:mindplot.ConnectionLine,
initialize:function(sourceNode, targetNode, lineType) { initialize:function (sourceNode, targetNode, model) {
this.parent(sourceNode, targetNode, lineType); $assert(sourceNode,"sourceNode can not be null");
$assert(targetNode,"targetNode can not be null");
this.parent(sourceNode, targetNode, model.getLineType());
this.setModel(model);
var strokeColor = mindplot.Relationship.getStrokeColor();
this._line2d.setIsSrcControlPointCustom(false); this._line2d.setIsSrcControlPointCustom(false);
this._line2d.setIsDestControlPointCustom(false); this._line2d.setIsDestControlPointCustom(false);
this._line2d.setCursor('pointer');
this._line2d.setStroke(1, 'solid', strokeColor);
this._line2d.setDashed(4, 2);
this._focusShape = this._createLine(this.getLineType(), mindplot.ConnectionLine.SIMPLE_CURVED); this._focusShape = this._createLine(this.getLineType(), mindplot.ConnectionLine.SIMPLE_CURVED);
this._focusShape.setStroke(2, "solid", "#3f96ff"); this._focusShape.setStroke(2, "solid", "#3f96ff");
var ctrlPoints = this._line2d.getControlPoints(); var ctrlPoints = this._line2d.getControlPoints();
this._focusShape.setSrcControlPoint(ctrlPoints[0]); this._focusShape.setSrcControlPoint(ctrlPoints[0]);
this._focusShape.setDestControlPoint(ctrlPoints[1]); this._focusShape.setDestControlPoint(ctrlPoints[1]);
@ -32,15 +42,27 @@ mindplot.RelationshipLine = new Class({
this._isInWorkspace = false; this._isInWorkspace = false;
this._controlPointsController = new mindplot.ControlPoint(); this._controlPointsController = new mindplot.ControlPoint();
var strokeColor = mindplot.RelationshipLine.getStrokeColor();
this._startArrow = new web2d.Arrow(); this._startArrow = new web2d.Arrow();
this._endArrow = new web2d.Arrow();
this._startArrow.setStrokeColor(strokeColor); this._startArrow.setStrokeColor(strokeColor);
this._startArrow.setStrokeWidth(2); this._startArrow.setStrokeWidth(2);
this.setShowStartArrow(true);
// Share style is disable ...
if (this._showEndArrow) {
this._endArrow = new web2d.Arrow();
this._endArrow.setStrokeColor(strokeColor); this._endArrow.setStrokeColor(strokeColor);
this._endArrow.setStrokeWidth(2); this._endArrow.setStrokeWidth(2);
this._line2d.setStroke(1, 'solid', strokeColor); }
// Position the line ...
if ($defined(model.getSrcCtrlPoint())) {
var srcPoint = model.getSrcCtrlPoint().clone();
this.setSrcControlPoint(srcPoint);
}
if ($defined(model.getDestCtrlPoint())) {
var destPoint = model.getDestCtrlPoint().clone();
this.setDestControlPoint(destPoint);
}
}, },
setStroke:function (color, style, opacity) { setStroke:function (color, style, opacity) {
@ -82,7 +104,7 @@ mindplot.RelationshipLine = new Class({
line2d.moveToFront(); line2d.moveToFront();
//Positionate Arrows //Positionate Arrows
this._positionateArrows(); this._positionArrows();
// Add connector ... // Add connector ...
this._positionateConnector(targetTopic); this._positionateConnector(targetTopic);
@ -94,40 +116,51 @@ mindplot.RelationshipLine = new Class({
this._controlPointsController.redraw(); this._controlPointsController.redraw();
}, },
_positionateArrows : function() { _positionArrows:function () {
var tpos = this._line2d.getTo(); var tpos = this._line2d.getTo();
this._endArrow.setFrom(tpos.x, tpos.y);
var spos = this._line2d.getFrom(); var spos = this._line2d.getFrom();
this._startArrow.setFrom(spos.x, spos.y);
this._endArrow.moveToBack(); this._startArrow.setFrom(spos.x, spos.y);
this._startArrow.moveToBack(); this._startArrow.moveToBack();
if (this._endArrow) {
this._endArrow.setFrom(tpos.x, tpos.y);
this._endArrow.moveToBack();
}
if (this._line2d.getType() == "CurvedLine") { if (this._line2d.getType() == "CurvedLine") {
var controlPoints = this._line2d.getControlPoints(); var controlPoints = this._line2d.getControlPoints();
this._startArrow.setControlPoint(controlPoints[0]); this._startArrow.setControlPoint(controlPoints[0]);
if (this._endArrow) {
this._endArrow.setControlPoint(controlPoints[1]); this._endArrow.setControlPoint(controlPoints[1]);
}
} else { } else {
this._startArrow.setControlPoint(this._line2d.getTo()); this._startArrow.setControlPoint(this._line2d.getTo());
if (this._endArrow) {
this._endArrow.setControlPoint(this._line2d.getFrom()); this._endArrow.setControlPoint(this._line2d.getFrom());
} }
}
this._endArrow.setVisibility(this.isVisible() && this._showEndArrow); if (this._showEndArrow) {
this._endArrow.setVisibility(this.isVisible());
}
this._startArrow.setVisibility(this.isVisible() && this._showStartArrow); this._startArrow.setVisibility(this.isVisible() && this._showStartArrow);
}, },
addToWorkspace:function (workspace) { addToWorkspace:function (workspace) {
workspace.appendChild(this._focusShape); workspace.appendChild(this._focusShape);
workspace.appendChild(this._controlPointsController); workspace.appendChild(this._controlPointsController);
this._controlPointControllerListener = this._initializeControlPointController.bind(this); this._controlPointControllerListener = this._initializeControlPointController.bind(this);
this._line2d.addEvent('click', this._controlPointControllerListener); this._line2d.addEvent('click', this._controlPointControllerListener);
this._isInWorkspace = true; this._isInWorkspace = true;
workspace.appendChild(this._startArrow); workspace.appendChild(this._startArrow);
if (this._endArrow)
workspace.appendChild(this._endArrow); workspace.appendChild(this._endArrow);
this.parent(workspace); this.parent(workspace);
this._positionArrows();
}, },
_initializeControlPointController:function () { _initializeControlPointController:function () {
@ -140,13 +173,14 @@ mindplot.RelationshipLine = new Class({
this._line2d.removeEvent('click', this._controlPointControllerListener); this._line2d.removeEvent('click', this._controlPointControllerListener);
this._isInWorkspace = false; this._isInWorkspace = false;
workspace.removeChild(this._startArrow); workspace.removeChild(this._startArrow);
if (this._endArrow)
workspace.removeChild(this._endArrow); workspace.removeChild(this._endArrow);
this.parent(workspace); this.parent(workspace);
}, },
getType:function () { getType:function () {
return mindplot.RelationshipLine.type; return mindplot.Relationship.type;
}, },
setOnFocus:function (focus) { setOnFocus:function (focus) {
@ -160,7 +194,7 @@ mindplot.RelationshipLine = new Class({
this._controlPointsController.setVisibility(focus); this._controlPointsController.setVisibility(focus);
this._onFocus = focus; this._onFocus = focus;
this._line2d.setCursor(this.isOnFocus() ? 'default' : 'pointer'); console.log("foucus:....");
} }
}, },
@ -199,7 +233,8 @@ mindplot.RelationshipLine = new Class({
setVisibility:function (value) { setVisibility:function (value) {
this.parent(value); this.parent(value);
this._endArrow.setVisibility(this._showEndArrow && value); if (this._showEndArrow)
this._endArrow.setVisibility(this._showEndArrow);
this._startArrow.setVisibility(this._showStartArrow && value); this._startArrow.setVisibility(this._showStartArrow && value);
}, },
@ -223,27 +258,20 @@ mindplot.RelationshipLine = new Class({
this.redraw(); this.redraw();
}, },
isShowEndArrow : function() {
return this._showEndArrow;
},
isShowStartArrow : function() {
return this._showStartArrow;
},
setFrom:function (x, y) { setFrom:function (x, y) {
$assert(x, "x must be defined"); $assert($defined(x), "x must be defined");
$assert(y, "y must be defined"); $assert($defined(y), "y must be defined");
this._line2d.setFrom(x, y); this._line2d.setFrom(x, y);
this._startArrow.setFrom(x, y); this._startArrow.setFrom(x, y);
}, },
setTo:function (x, y) { setTo:function (x, y) {
$assert(y, "x must be defined"); $assert($defined(x), "x must be defined");
$assert(y, "y must be defined"); $assert($defined(y), "y must be defined");
this._line2d.setTo(x, y); this._line2d.setTo(x, y);
if (this._endArrow)
this._endArrow.setFrom(x, y); this._endArrow.setFrom(x, y);
}, },
@ -254,6 +282,7 @@ mindplot.RelationshipLine = new Class({
setDestControlPoint:function (control) { setDestControlPoint:function (control) {
this._line2d.setDestControlPoint(control); this._line2d.setDestControlPoint(control);
if (this._showEndArrow)
this._endArrow.setControlPoint(control); this._endArrow.setControlPoint(control);
}, },
@ -275,10 +304,15 @@ mindplot.RelationshipLine = new Class({
setIsDestControlPointCustom:function (isCustom) { setIsDestControlPointCustom:function (isCustom) {
this._line2d.setIsDestControlPointCustom(isCustom); this._line2d.setIsDestControlPointCustom(isCustom);
}}); },
getId: function(){
return this._model.getId();
}
});
mindplot.RelationshipLine.type = "RelationshipLine"; mindplot.Relationship.type = "Relationship";
mindplot.RelationshipLine.getStrokeColor = function() { mindplot.Relationship.getStrokeColor = function () {
return '#9b74e6'; return '#9b74e6';
}; };

View File

@ -39,7 +39,7 @@ mindplot.StandaloneActionDispatcher = new Class({
this.execute(command); this.execute(command);
}, },
deleteTopics: function(topicsIds, relIds) { deleteEntities:function (topicsIds, relIds) {
var command = new mindplot.commands.DeleteCommand(topicsIds, relIds); var command = new mindplot.commands.DeleteCommand(topicsIds, relIds);
this.execute(command); this.execute(command);
}, },
@ -255,7 +255,7 @@ mindplot.CommandContext = new Class({
}, },
deleteTopic:function (topic) { deleteTopic:function (topic) {
this._designer._removeNode(topic); this._designer._removeTopic(topic);
}, },
createTopic:function (model, isVisible) { createTopic:function (model, isVisible) {
@ -280,19 +280,21 @@ mindplot.CommandContext = new Class({
$assert(model, "model cannot be null"); $assert(model, "model cannot be null");
return this._designer.createRelationship(model); return this._designer.createRelationship(model);
}, },
removeRelationship:function(model) {
this._designer.removeRelationship(model); deleteRelationship:function (relationship) {
this._designer._deleteRelationship(relationship);
}, },
findRelationships:function(lineIds) { findRelationships:function (relIds) {
var result = []; $assert($defined(relIds), "relId can not be null");
lineIds.forEach(function(lineId) { if (!(relIds instanceof Array)) {
var line = this._designer.getModel().getRelationshipsById()[lineId]; relIds = [relIds];
if ($defined(line)) {
result.push(line);
} }
}.bind(this));
return result; var designerRel = this._designer.getModel().getRelationships();
return designerRel.filter(function (rel) {
return relIds.contains(rel.getId());
});
} }
}); });

View File

@ -315,7 +315,7 @@ mindplot.Topic = new Class({
this._relationships.push(relationship); this._relationships.push(relationship);
}, },
removeRelationship : function(relationship) { deleteRelationship : function(relationship) {
this._relationships.erase(relationship); this._relationships.erase(relationship);
}, },

View File

@ -76,7 +76,7 @@ mindplot.collaboration.framework.brix.model.NodeModel = new Class({
for (var i = 0; i < brixChildren.size(); i++) { for (var i = 0; i < brixChildren.size(); i++) {
var brixNodeModel = brixChildren.get(i); var brixNodeModel = brixChildren.get(i);
var cmodel = new mindplot.collaboration.framework.brix.model.NodeModel(this._brixFramework, brixNodeModel, this.getMindmap()); var cmodel = new mindplot.collaboration.framework.brix.model.NodeModel(this._brixFramework, brixNodeModel, this.getMindmap());
actionDispatcher.deleteTopics([cmodel.getId()]); actionDispatcher.deleteEntities([cmodel.getId()]);
} }
} catch(e) { } catch(e) {
console.trace(); console.trace();

View File

@ -32,7 +32,7 @@ mindplot.commands.AddRelationshipCommand = new Class({
relationship.setOnFocus(true); relationship.setOnFocus(true);
}, },
undoExecute: function(commandContext) { undoExecute: function(commandContext) {
var relationship = commandContext.removeRelationship(this._model); var relationship = commandContext.deleteRelationship(this._model);
// @Todo: Esto esta mal. Designer toca el mindmap ... // @Todo: Esto esta mal. Designer toca el mindmap ...
// this._mindmap.removeRelationship(this._model); // this._mindmap.removeRelationship(this._model);

View File

@ -41,8 +41,9 @@ mindplot.commands.DeleteCommand = new Class({
var relationships = topic.getRelationships(); var relationships = topic.getRelationships();
while (relationships.length > 0) { while (relationships.length > 0) {
var relationship = relationships[0]; var relationship = relationships[0];
this._deletedRelationships.push(relationship.getModel().clone());
commandContext.removeRelationship(relationship.getModel()); this._deletedRelationships.push(relationship);
commandContext.deleteRelationship(relationship);
} }
this._deletedTopicModels.push(model); this._deletedTopicModels.push(model);
@ -61,13 +62,11 @@ mindplot.commands.DeleteCommand = new Class({
}.bind(this) }.bind(this)
); );
} }
var lines = commandContext.findRelationships(this._relIds); var rels = commandContext.findRelationships(this._relIds);
if (lines.length > 0) { if (rels.length > 0) {
lines.forEach(function(line, index) { rels.forEach(function (rel) {
if (line.isInWorkspace()) { this._deletedRelationships.push(rel.getModel().clone());
this._deletedRelationships.push(line.getModel().clone()); commandContext.deleteRelationship(rel);
commandContext.removeRelationship(line.getModel());
}
}.bind(this)); }.bind(this));
} }
}, },
@ -90,8 +89,8 @@ mindplot.commands.DeleteCommand = new Class({
}.bind(this) }.bind(this)
); );
this._deletedRelationships.forEach( this._deletedRelationships.forEach(
function(relationship, index) { function (rel) {
commandContext.createRelationship(relationship); commandContext.createRelationship(rel);
}.bind(this)); }.bind(this));
this._deletedTopicModels = []; this._deletedTopicModels = [];

View File

@ -100,7 +100,7 @@ mindplot.model.IMindmap = new Class({
throw "Unsupported operation"; throw "Unsupported operation";
}, },
removeRelationship : function(relationship) { deleteRelationship : function(relationship) {
throw "Unsupported operation"; throw "Unsupported operation";
}, },

View File

@ -106,7 +106,7 @@ mindplot.model.Mindmap = new Class({
this._relationships.push(relationship); this._relationships.push(relationship);
}, },
removeRelationship : function(relationship) { deleteRelationship : function(relationship) {
this._relationships.erase(relationship); this._relationships.erase(relationship);
} }
} }

View File

@ -16,6 +16,16 @@
* limitations under the License. * limitations under the License.
*/ */
mindplot.model.RelationshipModel = new Class({ mindplot.model.RelationshipModel = new Class({
Static:{
_nextUUID:function () {
if (!$defined(mindplot.model.RelationshipModel._uuid)) {
mindplot.model.RelationshipModel._uuid = 0;
}
mindplot.model.RelationshipModel._uuid = mindplot.model.RelationshipModel._uuid + 1;
return mindplot.model.RelationshipModel._uuid;
}
},
initialize:function (sourceTopicId, targetTopicId) { initialize:function (sourceTopicId, targetTopicId) {
$assert($defined(sourceTopicId), 'from node type can not be null'); $assert($defined(sourceTopicId), 'from node type can not be null');
$assert($defined(targetTopicId), 'to node type can not be null'); $assert($defined(targetTopicId), 'to node type can not be null');
@ -39,6 +49,7 @@ mindplot.model.RelationshipModel = new Class({
}, },
getId:function () { getId:function () {
$assert(this._id, "id is null");
return this._id; return this._id;
}, },
@ -99,15 +110,3 @@ mindplot.model.RelationshipModel = new Class({
}); });
/**
* @todo: This method must be implemented.
*/
mindplot.model.RelationshipModel._nextUUID = function() {
if (!$defined(this._uuid)) {
this._uuid = 0;
}
this._uuid = this._uuid + 1;
return this._uuid;
}

View File

@ -176,24 +176,25 @@ mindplot.persistence.XMLSerializer_Pela = new Class({
}, },
_relationshipToXML : function(document, relationship) { _relationshipToXML : function(document, relationship) {
var relationDom = document.createElement("relationship"); var result = document.createElement("relationship");
relationDom.setAttribute("srcTopicId", relationship.getFromNode()); result.setAttribute("srcTopicId", relationship.getFromNode());
relationDom.setAttribute("destTopicId", relationship.getToNode()); result.setAttribute("destTopicId", relationship.getToNode());
var lineType = relationship.getLineType(); var lineType = relationship.getLineType();
relationDom.setAttribute("lineType", lineType); result.setAttribute("lineType", lineType);
if (lineType == mindplot.ConnectionLine.CURVED || lineType == mindplot.ConnectionLine.SIMPLE_CURVED) { if (lineType == mindplot.ConnectionLine.CURVED || lineType == mindplot.ConnectionLine.SIMPLE_CURVED) {
if ($defined(relationship.getSrcCtrlPoint())) { if ($defined(relationship.getSrcCtrlPoint())) {
var srcPoint = relationship.getSrcCtrlPoint(); var srcPoint = relationship.getSrcCtrlPoint();
relationDom.setAttribute("srcCtrlPoint", Math.round(srcPoint.x) + "," + Math.round(srcPoint.y)); result.setAttribute("srcCtrlPoint", Math.round(srcPoint.x) + "," + Math.round(srcPoint.y));
} }
if ($defined(relationship.getDestCtrlPoint())) { if ($defined(relationship.getDestCtrlPoint())) {
var destPoint = relationship.getDestCtrlPoint(); var destPoint = relationship.getDestCtrlPoint();
relationDom.setAttribute("destCtrlPoint", Math.round(destPoint.x) + "," + Math.round(destPoint.y)); result.setAttribute("destCtrlPoint", Math.round(destPoint.x) + "," + Math.round(destPoint.y));
} }
} }
relationDom.setAttribute("endArrow", relationship.getEndArrow()); result.setAttribute("endArrow", relationship.getEndArrow());
relationDom.setAttribute("startArrow", relationship.getStartArrow()); result.setAttribute("startArrow", relationship.getStartArrow());
return relationDom; return result;
}, },
loadFromDom : function(dom, mapId) { loadFromDom : function(dom, mapId) {

View File

@ -258,7 +258,7 @@ mindplot.widget.Menu = new Class({
this._addButton('deleteTopic', true, true, function () { this._addButton('deleteTopic', true, true, function () {
designer.deleteCurrentNode(); designer.deleteSelectedEntities();
}); });
this._registerTooltip('deleteTopic', $msg('TOPIC_DELETE'), "Delete"); this._registerTooltip('deleteTopic', $msg('TOPIC_DELETE'), "Delete");
@ -446,7 +446,7 @@ mindplot.widget.Menu = new Class({
designer.addEvent('onblur', function () { designer.addEvent('onblur', function () {
var topics = designer.getModel().filterSelectedTopics(); var topics = designer.getModel().filterSelectedTopics();
var rels = designer.getModel().filterSelectedRelations(); var rels = designer.getModel().filterSelectedRelationships();
this._toolbarElems.forEach(function (button) { this._toolbarElems.forEach(function (button) {
var disable = false; var disable = false;
@ -472,7 +472,7 @@ mindplot.widget.Menu = new Class({
designer.addEvent('onfocus', function () { designer.addEvent('onfocus', function () {
var topics = designer.getModel().filterSelectedTopics(); var topics = designer.getModel().filterSelectedTopics();
var rels = designer.getModel().filterSelectedRelations(); var rels = designer.getModel().filterSelectedRelationships();
this._toolbarElems.forEach(function (button) { this._toolbarElems.forEach(function (button) {
if (button.isTopicAction() && topics.length > 0) { if (button.isTopicAction() && topics.length > 0) {

View File

@ -43,3 +43,5 @@ SUB_TOPIC=Sub Topic
ISOLATED_TOPIC=Isolated Topic ISOLATED_TOPIC=Isolated Topic
CENTRAL_TOPIC=Central Topic CENTRAL_TOPIC=Central Topic
SHORTCUTS=Keyboard Shortcuts SHORTCUTS=Keyboard Shortcuts
ENTITIES_COULD_NOT_BE_DELETED=Could not delete topic or relation. At least one map entity must be selected.
CENTRAL_TOPIC_CAN_NOT_BE_DELETED=Central topic can not be deleted.

View File

@ -90,6 +90,9 @@ public class UserServiceImpl
@Override @Override
public void auditLogin(@NotNull User user) { public void auditLogin(@NotNull User user) {
if(user==null){
throw new IllegalArgumentException("User can not be null");
}
final AccessAuditory accessAuditory = new AccessAuditory(); final AccessAuditory accessAuditory = new AccessAuditory();
accessAuditory.setUser(user); accessAuditory.setUser(user);
accessAuditory.setLoginDate(Calendar.getInstance()); accessAuditory.setLoginDate(Calendar.getInstance());