169 lines
5.8 KiB
JavaScript
Raw Normal View History

2009-06-07 18:59:43 +00:00
/*
2012-10-04 20:48:01 -03:00
* Copyright [2012] [wisemapping]
2011-07-30 18:55:32 -03:00
*
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the license at
*
* http://www.wisemapping.org/license
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
2009-06-07 18:59:43 +00:00
mindplot.commands.DeleteCommand = new Class({
2011-07-26 15:07:53 -03:00
Extends:mindplot.Command,
initialize:function (topicIds, relIds) {
2012-07-07 01:33:34 -03:00
$assert($defined(relIds), 'topicIds can not be null');
this.parent();
this._relIds = relIds;
this._topicIds = topicIds;
2009-06-07 18:59:43 +00:00
this._deletedTopicModels = [];
2012-07-07 01:33:34 -03:00
this._deletedRelModel = [];
2009-06-07 18:59:43 +00:00
this._parentTopicIds = [];
},
execute:function (commandContext) {
2012-07-07 11:52:23 -03:00
// If a parent has been selected for deletion, the children must be excluded from the delete ...
var topics = this._filterChildren(this._topicIds, commandContext);
2011-07-30 18:55:32 -03:00
if (topics.length > 0) {
_.each(topics, function (topic) {
// In case that it's editing text node, force close without update ...
topic.closeEditors();
var model = topic.getModel();
// Delete relationships
var relationships = this._collectInDepthRelationships(topic);
this._deletedRelModel.append(relationships.map(function (rel) {
return rel.getModel().clone();
}));
_.each(relationships, function (relationship) {
commandContext.deleteRelationship(relationship);
});
// Store information for undo ...
var clonedModel = model.clone();
this._deletedTopicModels.push(clonedModel);
var outTopic = topic.getOutgoingConnectedTopic();
var outTopicId = null;
if (outTopic != null) {
outTopicId = outTopic.getId();
}
this._parentTopicIds.push(outTopicId);
// Finally, delete the topic from the workspace...
commandContext.deleteTopic(topic);
}, this);
2011-07-30 18:55:32 -03:00
}
var rels = commandContext.findRelationships(this._relIds);
if (rels.length > 0) {
_.each(rels, function (rel) {
2012-07-07 01:33:34 -03:00
this._deletedRelModel.push(rel.getModel().clone());
commandContext.deleteRelationship(rel);
}, this);
}
2009-06-07 18:59:43 +00:00
},
undoExecute:function (commandContext) {
2009-06-07 18:59:43 +00:00
2012-09-24 14:54:19 -03:00
// Add all the topics ...
_.each(this._deletedTopicModels, function (model) {
2012-09-24 14:54:19 -03:00
commandContext.createTopic(model);
}, this);
// Do they need to be connected ?
_.each(this._deletedTopicModels, function (topicModel, index) {
2012-09-24 14:54:19 -03:00
var topics = commandContext.findTopics(topicModel.getId());
2012-09-24 14:54:19 -03:00
var parentId = this._parentTopicIds[index];
if (parentId) {
var parentTopics = commandContext.findTopics(parentId);
commandContext.connect(topics[0], parentTopics[0]);
}
}, this);
2012-07-07 01:42:55 -03:00
2012-09-24 14:54:19 -03:00
// Add rebuild relationships ...
_.each(this._deletedRelModel, function (model) {
2012-07-07 01:33:34 -03:00
commandContext.addRelationship(model);
});
2009-06-07 18:59:43 +00:00
// Finally display the topics ...
_.each(this._deletedTopicModels, function (topicModel) {
var topics = commandContext.findTopics(topicModel.getId());
topics[0].setBranchVisibility(true);
}, this);
2012-09-25 08:58:37 -03:00
// Focus on last recovered topic ..
if (this._deletedTopicModels.length > 0) {
var firstTopic = this._deletedTopicModels[0];
var topic = commandContext.findTopics(firstTopic.getId())[0];
topic.setOnFocus(true);
}
2009-06-07 18:59:43 +00:00
this._deletedTopicModels = [];
this._parentTopicIds = [];
2012-07-07 01:33:34 -03:00
this._deletedRelModel = [];
2012-07-07 11:52:23 -03:00
},
_filterChildren:function (topicIds, commandContext) {
var topics = commandContext.findTopics(topicIds);
var result = [];
_.each(topics, function (topic) {
2012-07-07 11:52:23 -03:00
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;
},
_collectInDepthRelationships:function (topic) {
var result = [];
2012-09-24 20:40:01 -03:00
result.append(topic.getRelationships());
var children = topic.getChildren();
2012-09-24 20:40:01 -03:00
var rels = children.map(function (topic) {
return this._collectInDepthRelationships(topic);
}, this);
result.append(rels.flatten());
2012-11-17 13:57:06 -03:00
if (result.length > 0) {
// Filter for unique ...
result = result.sort(function (a, b) {
return a.getModel().getId() - b.getModel().getId();
});
var ret = [result[0]];
for (var i = 1; i < result.length; i++) { // start loop at 1 as element 0 can never be a duplicate
if (result[i - 1] !== result[i]) {
ret.push(result[i]);
}
}
2012-11-17 13:57:06 -03:00
result = ret;
}
2012-11-17 13:57:06 -03:00
return result;
2009-06-07 18:59:43 +00:00
}
2009-06-07 18:59:43 +00:00
});