2015-09-08 12:38:50 +00:00
|
|
|
'use strict';
|
|
|
|
|
2018-03-14 20:43:53 +00:00
|
|
|
var forEach = require('min-dash').forEach,
|
2015-09-08 12:38:50 +00:00
|
|
|
inherits = require('inherits');
|
|
|
|
|
|
|
|
var RuleProvider = require('diagram-js/lib/features/rules/RuleProvider');
|
|
|
|
|
|
|
|
var HIGH_PRIORITY = 1500;
|
|
|
|
|
|
|
|
|
|
|
|
function isType(element, type) {
|
|
|
|
var patt = new RegExp(type, 'i');
|
|
|
|
|
|
|
|
return element && patt.test(element.type);
|
|
|
|
}
|
|
|
|
|
|
|
|
function isCustom(element) {
|
2018-01-05 13:32:52 +00:00
|
|
|
return element && /^custom:/.test(element.type);
|
2015-09-08 12:38:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Specific rules for custom elements
|
|
|
|
*/
|
|
|
|
function CustomRules(eventBus) {
|
|
|
|
RuleProvider.call(this, eventBus);
|
|
|
|
}
|
|
|
|
|
|
|
|
inherits(CustomRules, RuleProvider);
|
|
|
|
|
|
|
|
CustomRules.$inject = [ 'eventBus' ];
|
|
|
|
|
|
|
|
module.exports = CustomRules;
|
|
|
|
|
|
|
|
|
|
|
|
CustomRules.prototype.init = function() {
|
|
|
|
|
|
|
|
this.addRule('connection.create', HIGH_PRIORITY, function(context) {
|
|
|
|
var source = context.source,
|
|
|
|
target = context.target;
|
|
|
|
|
|
|
|
return canConnect(source, target);
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('connection.reconnectStart', HIGH_PRIORITY, function(context) {
|
|
|
|
|
|
|
|
var connection = context.connection,
|
|
|
|
source = context.hover || context.source,
|
|
|
|
target = connection.target;
|
|
|
|
|
|
|
|
return canConnect(source, target, connection);
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('connection.reconnectEnd', HIGH_PRIORITY, function(context) {
|
|
|
|
|
|
|
|
var connection = context.connection,
|
|
|
|
source = connection.source,
|
|
|
|
target = context.hover || context.target;
|
|
|
|
|
|
|
|
return canConnect(source, target, connection);
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('connection.updateWaypoints', HIGH_PRIORITY, function(context) {
|
|
|
|
// OK! but visually ignore
|
|
|
|
return null;
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('elements.move', HIGH_PRIORITY, function(context) {
|
|
|
|
|
|
|
|
var target = context.target,
|
|
|
|
shapes = context.shapes,
|
|
|
|
position = context.position;
|
|
|
|
|
|
|
|
return canMove(shapes, target, position);
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('shape.create', HIGH_PRIORITY, function(context) {
|
|
|
|
var target = context.target,
|
|
|
|
shape = context.shape,
|
|
|
|
position = context.position;
|
|
|
|
|
|
|
|
return canCreate(shape, target, position);
|
|
|
|
});
|
|
|
|
|
|
|
|
this.addRule('shape.resize', HIGH_PRIORITY, function(context) {
|
|
|
|
var shape = context.shape;
|
|
|
|
|
|
|
|
if (isCustom(shape)) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
function canConnect(source, target) {
|
|
|
|
if (isType(target, 'custom:triangle')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isType(target, 'custom:circle')) {
|
|
|
|
if (isType(source, 'custom:triangle')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isCustom(source)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function canCreate(shape, target) {
|
|
|
|
if (isType(target, 'custom:triangle')) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isType(target, 'custom:circle')) {
|
|
|
|
if (isType(shape, 'custom:triangle')) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isCustom(shape)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function canMove(shapes, target, position) {
|
|
|
|
var result;
|
|
|
|
|
|
|
|
forEach(shapes, function(shape) {
|
|
|
|
if (isType(shape, 'custom:triangle') && isType(target, 'custom:circle')) {
|
|
|
|
result = true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isCustom(target)) {
|
|
|
|
result = false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (isCustom(shape)) {
|
|
|
|
result = true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|