103 lines
4.2 KiB
JavaScript
Raw Normal View History

/*
2011-07-27 08:25:10 -03:00
* Copyright [2011] [wisemapping]
*
* 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.
*/
mindplot.DragConnector = new Class({
2012-08-17 20:40:26 -03:00
initialize:function (designerModel, workspace) {
$assert(designerModel, 'designerModel can not be null');
$assert(workspace, 'workspace can not be null');
// this._layoutManager = layoutManager;
this._designerModel = designerModel;
this._workspace = workspace;
2011-07-27 08:25:10 -03:00
},
2009-06-07 18:59:43 +00:00
2012-08-17 20:40:26 -03:00
checkConnection:function (dragTopic) {
2012-01-12 13:44:35 -03:00
var topics = this._designerModel.getTopics();
2009-06-07 18:59:43 +00:00
2011-07-27 08:25:10 -03:00
// Must be disconnected from their current connection ?.
2012-08-18 23:20:23 -03:00
var candidates = this._searchConnectionCandidates(dragTopic);
2011-07-27 08:25:10 -03:00
var currentConnection = dragTopic.getConnectedToTopic();
2012-08-18 23:20:23 -03:00
if (currentConnection && (candidates.length == 0 || candidates[0] != currentConnection)) {
dragTopic.disconnect(this._workspace);
2009-06-07 18:59:43 +00:00
}
2011-07-27 08:25:10 -03:00
// Finally, connect nodes ...
2012-08-18 23:20:23 -03:00
if (!dragTopic.isConnected() && candidates.length > 0) {
dragTopic.connectTo(candidates[0]);
2009-06-07 18:59:43 +00:00
}
2011-07-27 08:25:10 -03:00
},
2009-06-07 18:59:43 +00:00
2012-08-18 23:20:23 -03:00
_searchConnectionCandidates:function (dragTopic) {
2012-01-12 13:44:35 -03:00
var topics = this._designerModel.getTopics();
2012-08-19 11:10:38 -03:00
var draggedNode = dragTopic.getDraggedTopic();
// Drag node connects to the border ...
var dragTopicWidth = dragTopic.getSize ? dragTopic.getSize().width : 0; // Hack...
var xMouseGap = dragTopic.getPosition().x > 0 ? 0 : dragTopicWidth;
var sPos = {x:dragTopic.getPosition().x - xMouseGap, y:dragTopic.getPosition().y};
2012-08-17 20:40:26 -03:00
2012-08-18 23:20:23 -03:00
// Perform a initial filter to discard topics:
// - Exclude dragged topic
// - Exclude dragTopic pivot
// - Nodes that are collapsed
topics = topics.filter(function (topic) {
return draggedNode != topic && topic != dragTopic._draggedNode && !topic.areChildrenShrunken() && !topic.isCollapsed();
});
// Filter all the nodes that are outside the vertical boundary:
// * The node is to out of the x scope
// * The x distance greater the vertical tolerated distance
2012-08-17 20:40:26 -03:00
topics = topics.filter(function (topic) {
2012-08-18 23:20:23 -03:00
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...
2012-08-19 11:10:38 -03:00
var txborder = tpos.x + (topic.getSize().width / 2) * Math.sign(sPos.x);
var distance = (sPos.x - txborder) * Math.sign(sPos.x);
return distance > 0 && (distance < mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE);
2012-08-17 20:40:26 -03:00
});
2012-08-18 23:20:23 -03:00
// Assign a priority based on the distance:
// - Alignment with the targetNode
// - Vertical distance
2012-08-19 11:10:38 -03:00
// - Horizontal proximity
2012-08-17 20:40:26 -03:00
topics = topics.sort(function (a, b) {
var aPos = a.getPosition();
var bPos = b.getPosition();
2012-08-19 11:10:38 -03:00
var av = this._isVerticallyAligned(a.getSize(), a.getPosition(), sPos);
var bv = this._isVerticallyAligned(b.getSize(), b.getPosition(), sPos);
2012-08-18 23:20:23 -03:00
2012-08-19 11:10:38 -03:00
return ((av ? 1 : 10000) + Math.abs(aPos.x - sPos.x) + Math.abs(aPos.y - sPos.y)) - ((bv ? 1 : 10000) + Math.abs(bPos.x - sPos.x) + Math.abs(bPos.y - sPos.y));
2012-08-18 23:20:23 -03:00
}.bind(this));
return topics;
},
_isVerticallyAligned:function (targetSize, targetPosition, sourcePosition) {
return (sourcePosition.y - targetPosition.y) < targetSize.height;
2009-06-07 18:59:43 +00:00
}
2012-08-18 23:20:23 -03:00
2011-07-27 08:25:10 -03:00
});
2012-08-18 23:20:23 -03:00
mindplot.DragConnector.MAX_VERTICAL_CONNECTION_TOLERANCE = 80;