-Fix Uncaught RangeError: Maximum call stack size exceeded, line:114

This commit is contained in:
Paulo Gustavo Veiga 2012-09-02 19:52:37 -03:00
parent 04a221799a
commit ca37d3f384
2 changed files with 127 additions and 109 deletions

View File

@ -1,107 +1,112 @@
/* /*
* Copyright [2011] [wisemapping] * Copyright [2011] [wisemapping]
* *
* Licensed under WiseMapping Public License, Version 1.0 (the "License"). * Licensed under WiseMapping Public License, Version 1.0 (the "License").
* It is basically the Apache License, Version 2.0 (the "License") plus the * It is basically the Apache License, Version 2.0 (the "License") plus the
* "powered by wisemapping" text requirement on every single page; * "powered by wisemapping" text requirement on every single page;
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the license at * You may obtain a copy of the license at
* *
* http://www.wisemapping.org/license * http://www.wisemapping.org/license
* *
* Unless required by applicable law or agreed to in writing, software * Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, * distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* 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.DragConnector = new Class({ mindplot.DragConnector = new Class({
initialize:function (designerModel, workspace) { initialize:function (designerModel, workspace) {
$assert(designerModel, 'designerModel can not be null'); $assert(designerModel, 'designerModel can not be null');
$assert(workspace, 'workspace can not be null'); $assert(workspace, 'workspace can not be null');
// this._layoutManager = layoutManager; // this._layoutManager = layoutManager;
this._designerModel = designerModel; this._designerModel = designerModel;
this._workspace = workspace; this._workspace = workspace;
}, },
checkConnection:function (dragTopic) { checkConnection:function (dragTopic) {
var topics = this._designerModel.getTopics(); var topics = this._designerModel.getTopics();
// Must be disconnected from their current connection ?. // Must be disconnected from their current connection ?.
var candidates = this._searchConnectionCandidates(dragTopic); var candidates = this._searchConnectionCandidates(dragTopic);
var currentConnection = dragTopic.getConnectedToTopic(); var currentConnection = dragTopic.getConnectedToTopic();
if (currentConnection && (candidates.length == 0 || candidates[0] != currentConnection)) { if (currentConnection && (candidates.length == 0 || candidates[0] != currentConnection)) {
dragTopic.disconnect(this._workspace); dragTopic.disconnect(this._workspace);
} }
// Finally, connect nodes ... // Finally, connect nodes ...
if (!dragTopic.isConnected() && candidates.length > 0) { if (!dragTopic.isConnected() && candidates.length > 0) {
dragTopic.connectTo(candidates[0]); dragTopic.connectTo(candidates[0]);
} }
}, },
_searchConnectionCandidates:function (dragTopic) { _searchConnectionCandidates:function (dragTopic) {
var topics = this._designerModel.getTopics(); var topics = this._designerModel.getTopics();
var draggedNode = dragTopic.getDraggedTopic(); var draggedNode = dragTopic.getDraggedTopic();
// Drag node connects to the border ... // Drag node connects to the border ...
var dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack... var dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack...
var xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth; var xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth;
var sPos = {x:dragTopic.getPosition().x - xMouseGap, y:dragTopic.getPosition().y}; var sPos = {x:dragTopic.getPosition().x - xMouseGap, y:dragTopic.getPosition().y};
// Perform a initial filter to discard topics: // Perform a initial filter to discard topics:
// - Exclude dragged topic // - Exclude dragged topic
// - Exclude dragTopic pivot // - Exclude dragTopic pivot
// - Nodes that are collapsed // - Nodes that are collapsed
topics = topics.filter(function (topic) { // - It's not part of the branch dragged itself
return draggedNode != topic && topic != draggedNode && !topic.areChildrenShrunken() && !topic.isCollapsed(); topics = topics.filter(function (topic) {
}); var result = draggedNode != topic;
result = result && topic != draggedNode;
// Filter all the nodes that are outside the vertical boundary: result = result && !topic.areChildrenShrunken() && !topic.isCollapsed();
// * The node is to out of the x scope result = result && !draggedNode.isChildTopic(topic);
// * The x distance greater the vertical tolerated distance return result;
topics = topics.filter(function (topic) { });
var tpos = topic.getPosition();
// Center topic has different alignment than the rest of the nodes. That's why i need to divide it by two... // Filter all the nodes that are outside the vertical boundary:
var txborder = tpos.x + (topic.getSize().width / 2) * Math.sign(sPos.x); // * The node is to out of the x scope
var distance = (sPos.x - txborder) * Math.sign(sPos.x); // * The x distance greater the vertical tolerated distance
return distance > 0 && (distance < mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE); topics = topics.filter(function (topic) {
var tpos = topic.getPosition();
}); // Center topic has different alignment than the rest of the nodes. That's why i need to divide it by two...
var txborder = tpos.x + (topic.getSize().width / 2) * Math.sign(sPos.x);
// Assign a priority based on the distance: var distance = (sPos.x - txborder) * Math.sign(sPos.x);
// - Alignment with the targetNode return distance > 0 && (distance < mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE);
// - Vertical distance
// - Horizontal proximity });
// - It's already connected.
var currentConnection = dragTopic.getConnectedToTopic(); // Assign a priority based on the distance:
topics = topics.sort(function (a, b) { // - Alignment with the targetNode
var aPos = a.getPosition(); // - Vertical distance
var bPos = b.getPosition(); // - Horizontal proximity
// - It's already connected.
var av = this._isVerticallyAligned(a.getSize(), aPos, sPos); var currentConnection = dragTopic.getConnectedToTopic();
var bv = this._isVerticallyAligned(b.getSize(), bPos, sPos); topics = topics.sort(function (a, b) {
return this._proximityWeight(av, a, sPos, currentConnection) - this._proximityWeight(bv, b, sPos, currentConnection); var aPos = a.getPosition();
var bPos = b.getPosition();
}.bind(this));
return topics; var av = this._isVerticallyAligned(a.getSize(), aPos, sPos);
}, var bv = this._isVerticallyAligned(b.getSize(), bPos, sPos);
return this._proximityWeight(av, a, sPos, currentConnection) - this._proximityWeight(bv, b, sPos, currentConnection);
_proximityWeight:function (isAligned, target, sPos, currentConnection) {
var tPos = target.getPosition(); }.bind(this));
return (isAligned ? 0 : 200 ) + Math.abs(tPos.x - sPos.x) + Math.abs(tPos.y - sPos.y) + (currentConnection == target ? 0 : 100); return topics;
}, },
_isVerticallyAligned:function (targetSize, targetPosition, sourcePosition) { _proximityWeight:function (isAligned, target, sPos, currentConnection) {
var tPos = target.getPosition();
return Math.abs(sourcePosition.y - targetPosition.y) < targetSize.height / 2; return (isAligned ? 0 : 200 ) + Math.abs(tPos.x - sPos.x) + Math.abs(tPos.y - sPos.y) + (currentConnection == target ? 0 : 100);
},
}
_isVerticallyAligned:function (targetSize, targetPosition, sourcePosition) {
});
return Math.abs(sourcePosition.y - targetPosition.y) < targetSize.height / 2;
mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80;
}
});
mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80;

View File

@ -669,7 +669,6 @@ mindplot.Topic = new Class({
showNoteEditor:function () { showNoteEditor:function () {
var topicId = this.getId(); var topicId = this.getId();
var model = this.getModel(); var model = this.getModel();
var editorModel = { var editorModel = {
@ -1198,8 +1197,22 @@ mindplot.Topic = new Class({
result = result.concat(innerChilds); result = result.concat(innerChilds);
} }
return result; return result;
} },
isChildTopic:function (childTopic) {
var result = (this.getId() == childTopic.getId());
if (!result) {
var children = this.getChildren();
for (var i = 0; i < children.length; i++) {
var parent = children[i];
result = parent.isChildTopic(childTopic);
if (result) {
break;
}
}
}
return result;
}
}); });