GraphicsFactory.prototype.updateContainments = function(elements) { var self = this, elementRegistry = this._elementRegistry, parents; parents = reduce(elements, function(map, e) { if (e.parent) { map[e.parent.id] = e.parent; } return map; }, {}); // update all parents of changed and reorganized their children // in the correct order (as indicated in our model) forEach(parents, function(parent) { var children = parent.children; if (!children) { return; } var childGfx = self._getChildren(parent); forEach(children.slice().reverse(), function(c) { var gfx = elementRegistry.getGraphics(c); prependTo(gfx.parentNode, childGfx); }); }); };
CopyPaste.prototype.paste = function(context) { var clipboard = this._clipboard, modeling = this._modeling, eventBus = this._eventBus, rules = this._rules; var tree = clipboard.get(), topParent = context.element, position = context.point, newTree, canPaste; if (clipboard.isEmpty()) { return; } newTree = reduce(tree, function(pasteTree, elements, depthStr) { var depth = parseInt(depthStr, 10); if (isNaN(depth)) { return pasteTree; } pasteTree[depth] = elements; return pasteTree; }, {}); canPaste = rules.allowed('elements.paste', { tree: newTree, target: topParent }); if (!canPaste) { eventBus.fire('elements.paste.rejected', { context: { tree: newTree, position: position, target: topParent } }); return; } modeling.pasteElements(newTree, topParent, position); };
export function getFlowNodeDistance(source, element) { var sourceTrbl = asTRBL(source); // is connection a reference to consider? function isReference(c) { return is(c, 'bpmn:SequenceFlow'); } function toTargetNode(weight) { return function(shape) { return { shape: shape, weight: weight, distanceTo: function(shape) { var shapeTrbl = asTRBL(shape); return shapeTrbl.left - sourceTrbl.right; } }; }; } function toSourceNode(weight) { return function(shape) { return { shape: shape, weight: weight, distanceTo: function(shape) { var shapeTrbl = asTRBL(shape); return sourceTrbl.left - shapeTrbl.right; } }; }; } // we create a list of nodes to take into consideration // for calculating the optimal flow node distance // // * weight existing target nodes higher than source nodes // * only take into account individual nodes once // var nodes = reduce([].concat( getTargets(source, isReference).map(toTargetNode(5)), getSources(source, isReference).map(toSourceNode(1)) ), function(nodes, node) { // filter out shapes connected twice via source or target nodes[node.shape.id + '__weight_' + node.weight] = node; return nodes; }, {}); // compute distances between source and incoming nodes; // group at the same time by distance and expose the // favourite distance as { fav: { count, value } }. var distancesGrouped = reduce(nodes, function(result, node) { var shape = node.shape, weight = node.weight, distanceTo = node.distanceTo; var fav = result.fav, currentDistance, currentDistanceCount, currentDistanceEntry; currentDistance = distanceTo(shape); // ignore too far away peers // or non-left to right modeled nodes if (currentDistance < 0 || currentDistance > MAX_HORIZONTAL_DISTANCE) { return result; } currentDistanceEntry = result[String(currentDistance)] = result[String(currentDistance)] || { value: currentDistance, count: 0 }; // inc diff count currentDistanceCount = currentDistanceEntry.count += 1 * weight; if (!fav || fav.count < currentDistanceCount) { result.fav = currentDistanceEntry; } return result; }, { }); if (distancesGrouped.fav) { return distancesGrouped.fav.value; } else { return DEFAULT_HORIZONTAL_DISTANCE; } }