Skip to content

Instantly share code, notes, and snippets.

@iannsp
Last active November 4, 2016 14:50
Show Gist options
  • Save iannsp/cf649debb85e7cd99195a0c483c119bf to your computer and use it in GitHub Desktop.
Save iannsp/cf649debb85e7cd99195a0c483c119bf to your computer and use it in GitHub Desktop.
This is a laboratory just to show a first implementation (focus on "just work", urge for improvments)

Improve copy paste coping attrbiutes, configurations and data of the selected task.

  • this copde still do not copy all properties.

how to

  1. Download camunda-modeler from repo
  2. npm Install)
  3. Replace files on project dependecy diagram-js (follow the path ) "diagram-js@^0.17.0"*
  • camunda-modeler\node_modules\diagram-js\lib\features\modeling\PasteHandler.js (replace)
  • camunda-modeler\node_modules\diagram-js\lib\features\copy-paste\CopyPaste.js (replace)
  • camunda-modeler\node_modules\diagram-js\lib\features\Modeling.js (replace)

Events

  • StartEvent > Forms > Field do tipo Form Data
    • Error: "field = undefined"
  • StartEvent > Listeners > Execution Listener do tipo Script
    • Error: "ListenerType = JavaClass"
  • IntermediateThrowEvent > Input/Output > Input ou Output Parameters > Input do tipo script, list e map
    • Error: "Type = Text"
  • TimerStartEvent > Details > Timer Definition Type
    • Error: Timer Definition Type em branco
  • MessageStartEvent > Details > Message
    • Error: Message em branco
  • SignalStartEvent > Details > Signal
    • Error: Signal em branco
'use strict';
var isArray = require('lodash/lang/isArray'),
forEach = require('lodash/collection/forEach'),
map = require('lodash/collection/map'),
find = require('lodash/collection/find'),
findIndex = require('lodash/array/findIndex'),
sortBy = require('lodash/collection/sortBy'),
reduce = require('lodash/collection/reduce');
var getBBox = require('../../util/Elements').getBBox;
var PositionUtil = require('../../util/PositionUtil');
var CopyPasteUtil = require('../../util/CopyPasteUtil'),
ElementsUtil = require('../../util/Elements');
function CopyPaste(eventBus, modeling, elementFactory, rules, clipboard, canvas) {
this._eventBus = eventBus;
this._modeling = modeling;
this._elementFactory = elementFactory;
this._rules = rules;
this._canvas = canvas;
this._clipboard = clipboard;
this._descriptors = [];
// Element creation priorities:
// - 1: Independent shapes
// - 2: Attached shapes
// - 3: Connections
// - 4: labels
this.registerDescriptor(function(element, descriptor) {
// Base priority
descriptor.priority = 1;
descriptor.id = element.id;
if (element.parent) {
descriptor.parent = element.parent.id;
}
if (element.labelTarget) {
// Labels priority
descriptor.priority = 4;
descriptor.labelTarget = element.labelTarget.id;
}
if (element.host) {
// Attached shapes priority
descriptor.priority = 2;
descriptor.host = element.host.id;
}
if (element.x) {
descriptor.x = element.x;
descriptor.y = element.y;
}
if (element.width) {
descriptor.width = element.width;
descriptor.height = element.height;
}
if (element.waypoints) {
// Connections priority
descriptor.priority = 3;
descriptor.waypoints = [];
forEach(element.waypoints, function(waypoint) {
var wp = {
x: waypoint.x,
y: waypoint.y
};
if (waypoint.original) {
wp.original = {
x: waypoint.original.x,
y: waypoint.original.y
};
}
descriptor.waypoints.push(wp);
});
}
if (element.source && element.target) {
descriptor.source = element.source.id;
descriptor.target = element.target.id;
}
return descriptor;
});
}
CopyPaste.$inject = [
'eventBus',
'modeling',
'elementFactory',
'rules',
'clipboard',
'canvas'
];
module.exports = CopyPaste;
/**
* Copy a number of elements.
*
* @param {djs.model.Base} selectedElements
*
* @return {Object} the copied tree
*/
CopyPaste.prototype.copy = function(selectedElements) {
var clipboard = this._clipboard,
tree, bbox;
if (!isArray(selectedElements)) {
selectedElements = selectedElements ? [ selectedElements ] : [];
}
if (!selectedElements.length) {
return;
}
tree = this.createTree(selectedElements);
bbox = this._bbox = PositionUtil.center(getBBox(tree.allShapes));
// not needed after computing the center position of the copied elements
var original=tree.allShapes;
delete tree.allShapes;
forEach(tree, function(elements) {
forEach(elements, function(element) {
var delta, labelTarget;
// set label's relative position to their label target
if (element.labelTarget) {
labelTarget = find(elements, { id: element.labelTarget });
// just grab the delta from the first waypoint
if (labelTarget.waypoints) {
delta = PositionUtil.delta(element, labelTarget.waypoints[0]);
} else {
delta = PositionUtil.delta(element, labelTarget);
}
} else
if (element.priority === 3) {
// connections have priority 3
delta = [];
forEach(element.waypoints, function(waypoint) {
var waypointDelta = PositionUtil.delta(waypoint, bbox);
delta.push(waypointDelta);
}, this);
} else {
delta = PositionUtil.delta(element, bbox);
}
element.delta = delta;
});
});
tree.allShapes=original;
this._eventBus.fire('elements.copy', { context: { tree: tree } });
// if tree is empty, means that nothing can be or is allowed to be copied
if (Object.keys(tree).length === 0) {
clipboard.clear();
} else {
clipboard.set(tree);
}
this._eventBus.fire('elements.copied', { context: { tree: tree } });
return tree;
};
// Allow pasting under the cursor
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;
}, {}, this);
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, tree.allShapes);
};
CopyPaste.prototype._computeDelta = function(elements, element) {
var bbox = this._bbox,
delta = {};
// set label's relative position to their label target
if (element.labelTarget) {
console.log(elements);
return PositionUtil.delta(element, element.labelTarget);
}
// connections have prority 3
if (element.priority === 3) {
delta = [];
forEach(element.waypoints, function(waypoint) {
var waypointDelta = PositionUtil.delta(waypoint, bbox);
delta.push(waypointDelta);
}, this);
} else {
delta = PositionUtil.delta(element, bbox);
}
return delta;
};
/**
* Checks if the element in question has a relations to other elements.
* Possible dependants: connections, labels, attachers
*
* @param {Array} elements
* @param {Object} element
*
* @return {Boolean}
*/
CopyPaste.prototype.hasRelations = function(elements, element) {
var source, target, labelTarget;
if (element.waypoints) {
source = find(elements, { id: element.source.id });
target = find(elements, { id: element.target.id });
if (!source || !target) {
return false;
}
}
if (element.labelTarget) {
labelTarget = find(elements, { id: element.labelTarget.id });
if (!labelTarget) {
return false;
}
}
return true;
};
CopyPaste.prototype.registerDescriptor = function(descriptor) {
if (typeof descriptor !== 'function') {
throw new Error('the descriptor must be a function');
}
if (this._descriptors.indexOf(descriptor) !== -1) {
throw new Error('this descriptor is already registered');
}
this._descriptors.push(descriptor);
};
CopyPaste.prototype._executeDescriptors = function(data) {
if (!data.descriptor) {
data.descriptor = {};
}
forEach(this._descriptors, function(descriptor) {
data.descriptor = descriptor(data.element, data.descriptor);
});
return data;
};
/**
* Creates a tree like structure from an arbitrary collection of elements
*
* @example
* tree: {
* 0: [
* { id: 'shape_12da', priority: 1, ... },
* { id: 'shape_01bj', priority: 1, ... },
* { id: 'connection_79fa', source: 'shape_12da', target: 'shape_01bj', priority: 3, ... },
* ],
* 1: [ ... ]
* };
*
* @param {Array} elements
* @return {Object}
*/
CopyPaste.prototype.createTree = function(elements) {
var rules = this._rules;
var tree = {},
includedElements = [],
_elements;
var topLevel = CopyPasteUtil.getTopLevel(elements);
tree.allShapes = [];
function canCopy(collection, element) {
return rules.allowed('element.copy', {
collection: collection,
element: element
});
}
function includeElement(data) {
var idx = findIndex(includedElements, { element: data.element }),
element;
if (idx !== -1) {
element = includedElements[idx];
} else {
return includedElements.push(data);
}
// makes sure that it has the correct depth
if (element.depth < data.depth) {
includedElements.splice(idx, 1);
includedElements.push(data);
}
}
ElementsUtil.eachElement(topLevel, function(element, i, depth) {
var nestedChildren = element.children;
// don't add labels directly
if (element.labelTarget) {
return;
}
function getNested(lists) {
forEach(lists, function(list) {
if (list && list.length) {
forEach(list, function(elem) {
// fetch element's label
if (elem.label) {
includeElement({
element: elem.label,
depth: depth
});
}
includeElement({
element: elem,
depth: depth
});
});
}
});
}
// fetch element's label
if (element.label) {
includeElement({
element: element.label,
depth: depth
});
}
getNested([ element.attachers, element.incoming, element.outgoing ]);
includeElement({
element: element,
depth: depth
});
if (nestedChildren) {
return nestedChildren;
}
});
includedElements = map(includedElements, function(data) {
// this is where other registered descriptors hook in
return this._executeDescriptors(data);
}, this);
// order the elements to check if the ones dependant on others (by relationship)
// can be copied. f.ex: label needs it's label target
includedElements = sortBy(includedElements, function(data) {
return data.descriptor.priority;
});
_elements = map(includedElements, function(data) {
return data.element;
});
forEach(includedElements, function(data) {
var depth = data.depth;
if (!this.hasRelations(tree.allShapes, data.element)) {
return;
}
if (!canCopy(_elements, data.element)) {
return;
}
tree.allShapes.push(data.element);
// create depth branches
if (!tree[depth]) {
tree[depth] = [];
}
tree[depth].push(data.descriptor);
}, this);
return tree;
};
'use strict';
var forEach = require('lodash/collection/forEach');
var model = require('../../model');
/**
* The basic modeling entry point.
*
* @param {EventBus} eventBus
* @param {ElementFactory} elementFactory
* @param {CommandStack} commandStack
*/
function Modeling(eventBus, elementFactory, commandStack) {
this._eventBus = eventBus;
this._elementFactory = elementFactory;
this._commandStack = commandStack;
var self = this;
eventBus.on('diagram.init', function() {
// register modeling handlers
self.registerHandlers(commandStack);
});
}
Modeling.$inject = [ 'eventBus', 'elementFactory', 'commandStack' ];
module.exports = Modeling;
Modeling.prototype.getHandlers = function() {
return {
'shape.append': require('./cmd/AppendShapeHandler'),
'shape.create': require('./cmd/CreateShapeHandler'),
'shape.delete': require('./cmd/DeleteShapeHandler'),
'shape.move': require('./cmd/MoveShapeHandler'),
'shape.resize': require('./cmd/ResizeShapeHandler'),
'shape.replace': require('./cmd/ReplaceShapeHandler'),
'shape.toggleCollapse': require('./cmd/ToggleShapeCollapseHandler'),
'spaceTool': require('./cmd/SpaceToolHandler'),
'label.create': require('./cmd/CreateLabelHandler'),
'connection.create': require('./cmd/CreateConnectionHandler'),
'connection.delete': require('./cmd/DeleteConnectionHandler'),
'connection.move': require('./cmd/MoveConnectionHandler'),
'connection.layout': require('./cmd/LayoutConnectionHandler'),
'connection.updateWaypoints': require('./cmd/UpdateWaypointsHandler'),
'connection.reconnectStart': require('./cmd/ReconnectConnectionHandler'),
'connection.reconnectEnd': require('./cmd/ReconnectConnectionHandler'),
'elements.move': require('./cmd/MoveElementsHandler'),
'elements.delete': require('./cmd/DeleteElementsHandler'),
'elements.distribute': require('./cmd/DistributeElementsHandler'),
'elements.align': require('./cmd/AlignElementsHandler'),
'element.updateAttachment': require('./cmd/UpdateAttachmentHandler'),
'elements.paste': require('./cmd/PasteHandler')
};
};
/**
* Register handlers with the command stack
*
* @param {CommandStack} commandStack
*/
Modeling.prototype.registerHandlers = function(commandStack) {
forEach(this.getHandlers(), function(handler, id) {
commandStack.registerHandler(id, handler);
});
};
///// modeling helpers /////////////////////////////////////////
Modeling.prototype.moveShape = function(shape, delta, newParent, newParentIndex, hints) {
if (typeof newParentIndex === 'object') {
hints = newParentIndex;
newParentIndex = null;
}
var context = {
shape: shape,
delta: delta,
newParent: newParent,
newParentIndex: newParentIndex,
hints: hints || {}
};
this._commandStack.execute('shape.move', context);
};
/**
* Update the attachment of the given shape.
*
* @param {djs.mode.Base} shape
* @param {djs.model.Base} [newHost]
*/
Modeling.prototype.updateAttachment = function(shape, newHost) {
var context = {
shape: shape,
newHost: newHost
};
this._commandStack.execute('element.updateAttachment', context);
};
/**
* Move a number of shapes to a new target, either setting it as
* the new parent or attaching it.
*
* @param {Array<djs.mode.Base>} shapes
* @param {Point} delta
* @param {djs.model.Base} [target]
* @param {Boolean} [isAttach=false]
* @param {Object} [hints]
*/
Modeling.prototype.moveElements = function(shapes, delta, target, isAttach, hints) {
if (typeof isAttach === 'object') {
hints = isAttach;
isAttach = undefined;
}
var newParent = target,
newHost;
if (isAttach === true) {
newHost = target;
newParent = target.parent;
}
if (isAttach === false) {
newHost = null;
}
var context = {
shapes: shapes,
delta: delta,
newParent: newParent,
newHost: newHost,
hints: hints || {}
};
this._commandStack.execute('elements.move', context);
};
Modeling.prototype.moveConnection = function(connection, delta, newParent, newParentIndex, hints) {
if (typeof newParentIndex === 'object') {
hints = newParentIndex;
newParentIndex = undefined;
}
var context = {
connection: connection,
delta: delta,
newParent: newParent,
newParentIndex: newParentIndex,
hints: hints || {}
};
this._commandStack.execute('connection.move', context);
};
Modeling.prototype.layoutConnection = function(connection, hints) {
var context = {
connection: connection,
hints: hints || {}
};
this._commandStack.execute('connection.layout', context);
};
/**
* Create connection.
*
* @param {djs.model.Base} source
* @param {djs.model.Base} target
* @param {Number} [targetIndex]
* @param {Object|djs.model.Connection} connection
* @param {djs.model.Base} parent
* @param {Object} hints
*
* @return {djs.model.Connection} the created connection.
*/
Modeling.prototype.createConnection = function(source, target, targetIndex, connection, parent, hints) {
if (typeof targetIndex === 'object') {
hints = parent;
parent = connection;
connection = targetIndex;
targetIndex = undefined;
}
connection = this._create('connection', connection);
var context = {
source: source,
target: target,
parent: parent,
parentIndex: targetIndex,
connection: connection,
hints: hints
};
this._commandStack.execute('connection.create', context);
return context.connection;
};
Modeling.prototype.createShape = function(shape, position, target, targetIndex, isAttach, hints) {
if (typeof targetIndex !== 'number') {
hints = isAttach;
isAttach = targetIndex;
}
if (typeof isAttach !== 'boolean') {
hints = isAttach;
isAttach = false;
}
shape = this._create('shape', shape);
var context = {
position: position,
shape: shape,
parent: target,
parentIndex: targetIndex,
host: shape.host,
hints: hints || {}
};
if (isAttach) {
context.parent = target.parent;
context.host = target;
}
this._commandStack.execute('shape.create', context);
return context.shape;
};
Modeling.prototype.createLabel = function(labelTarget, position, label, parent) {
label = this._create('label', label);
var context = {
labelTarget: labelTarget,
position: position,
parent: parent || labelTarget.parent,
shape: label
};
this._commandStack.execute('label.create', context);
return context.shape;
};
Modeling.prototype.appendShape = function(source, shape, position, parent, connection, connectionParent) {
shape = this._create('shape', shape);
var context = {
source: source,
position: position,
parent: parent,
shape: shape,
connection: connection,
connectionParent: connectionParent
};
this._commandStack.execute('shape.append', context);
return context.shape;
};
Modeling.prototype.removeElements = function(elements) {
var context = {
elements: elements
};
this._commandStack.execute('elements.delete', context);
};
Modeling.prototype.distributeElements = function(groups, axis, dimension) {
var context = {
groups: groups,
axis: axis,
dimension: dimension
};
this._commandStack.execute('elements.distribute', context);
};
Modeling.prototype.removeShape = function(shape, hints) {
var context = {
shape: shape,
hints: hints || {}
};
this._commandStack.execute('shape.delete', context);
};
Modeling.prototype.removeConnection = function(connection, hints) {
var context = {
connection: connection,
hints: hints || {}
};
this._commandStack.execute('connection.delete', context);
};
Modeling.prototype.replaceShape = function(oldShape, newShape, hints) {
var context = {
oldShape: oldShape,
newData: newShape,
hints: hints || {}
};
this._commandStack.execute('shape.replace', context);
return context.newShape;
};
Modeling.prototype.pasteElements = function(tree, topParent, position, original) {
var context = {
tree: tree,
topParent: topParent,
position: position,
original: original
};
this._commandStack.execute('elements.paste', context);
};
Modeling.prototype.alignElements = function(elements, alignment) {
var context = {
elements: elements,
alignment: alignment
};
this._commandStack.execute('elements.align', context);
};
Modeling.prototype.resizeShape = function(shape, newBounds) {
var context = {
shape: shape,
newBounds: newBounds
};
this._commandStack.execute('shape.resize', context);
};
Modeling.prototype.createSpace = function(movingShapes, resizingShapes, delta, direction) {
var context = {
movingShapes: movingShapes,
resizingShapes: resizingShapes,
delta: delta,
direction: direction
};
this._commandStack.execute('spaceTool', context);
};
Modeling.prototype.updateWaypoints = function(connection, newWaypoints, hints) {
var context = {
connection: connection,
newWaypoints: newWaypoints,
hints: hints || {}
};
this._commandStack.execute('connection.updateWaypoints', context);
};
Modeling.prototype.reconnectStart = function(connection, newSource, dockingOrPoints) {
var context = {
connection: connection,
newSource: newSource,
dockingOrPoints: dockingOrPoints
};
this._commandStack.execute('connection.reconnectStart', context);
};
Modeling.prototype.reconnectEnd = function(connection, newTarget, dockingOrPoints) {
var context = {
connection: connection,
newTarget: newTarget,
dockingOrPoints: dockingOrPoints
};
this._commandStack.execute('connection.reconnectEnd', context);
};
Modeling.prototype.connect = function(source, target, attrs, hints) {
return this.createConnection(source, target, attrs || {}, source.parent, hints);
};
Modeling.prototype._create = function(type, attrs) {
if (attrs instanceof model.Base) {
return attrs;
} else {
return this._elementFactory.create(type, attrs);
}
};
Modeling.prototype.toggleCollapse = function(shape, hints) {
var context = {
shape: shape,
hints: hints || {}
};
this._commandStack.execute('shape.toggleCollapse', context);
};
'use strict';
var forEach = require('lodash/collection/forEach'),
map = require('lodash/collection/map'),
sortBy = require('lodash/collection/sortBy'),
clone = require('lodash/lang/clone');
var BpmnModdle = require('bpmn-moddle');
var CamundaModdle = require('camunda-bpmn-moddle/resources/camunda');
var inherits = require('inherits');
function removeProperties(element, properties) {
forEach(properties, function(prop) {
if (element[prop]) {
delete element[prop];
}
});
}
/**
* A handler that implements pasting of elements onto the diagram.
*
* @param {eventBus} EventBus
* @param {canvas} Canvas
* @param {selection} Selection
* @param {elementFactory} ElementFactory
* @param {modeling} Modeling
* @param {rules} Rules
*/
function PasteHandler(eventBus, canvas, selection, elementFactory, modeling, rules) {
this._eventBus = eventBus;
this._canvas = canvas;
this._selection = selection;
this._elementFactory = elementFactory;
this._modeling = modeling;
this._rules = rules;
}
inherits(PasteHandler, require('./NoopHandler'));
PasteHandler.$inject = [
'eventBus',
'canvas',
'selection',
'elementFactory',
'modeling',
'rules'
];
module.exports = PasteHandler;
////// api /////////////////////////////////////////////
/**
* Creates a new shape
*
* @param {Object} context
* @param {Object} context.tree the new shape
* @param {Element} context.topParent the paste target
*/
PasteHandler.prototype.preExecute = function(context) {
var eventBus = this._eventBus;
var tree = context.tree,
topParent = context.topParent,
position = context.position;
var original = context.original;
tree.createdElements = {};
tree.labels = [];
//copy of the original object
for(var i=0;i<tree[0].length;i++){
tree[0][i].original=original[i];
}
forEach(tree, function(elements, depthStr) {
var depth = parseInt(depthStr, 10);
if (isNaN(depth)) {
return;
}
// set the parent on the top level elements
if (!depth) {
elements = map(elements, function(descriptor) {
descriptor.parent = topParent;
return descriptor;
});
}
// Order by priority for element creation
elements = sortBy(elements, 'priority');
forEach(elements, function(descriptor) {
var id = descriptor.id,
parent = descriptor.parent,
isAttach = false,
hints,
newPosition;
var element = clone(descriptor);
if (depth) {
element.parent = this._getCreatedElement(parent, tree);
}
// this happens when shapes have not been created due to rules
if (!parent) {
return;
}
eventBus.fire('element.paste', {
createdElements: tree.createdElements,
descriptor: element
});
// in case the parent changed during 'element.paste'
parent = element.parent;
if (element.waypoints) {
element = this._createConnection(element, parent, position, tree);
if (element) {
tree.createdElements[id] = {
element: element,
descriptor: descriptor
};
}
return;
}
// supply not-root information as hint
if (element.parent !== topParent) {
hints = { root: false };
}
// set host
if (element.host) {
isAttach = true;
parent = this._getCreatedElement(element.host, tree);
}
// handle labels
if (element.labelTarget) {
return tree.labels.push(element);
}
newPosition = {
x: Math.round(position.x + element.delta.x + (element.width / 2)),
y: Math.round(position.y + element.delta.y + (element.height / 2))
};
var x=element.original;
function cloneBusinessObject(a,b){
console.log("===========Clone========================");
console.log(a);
console.log(b);
cloneAtt(a.businessObject,b.businessObject);
cloneModdleElement(a,b);
}
function cloneModdleElement(a,b,discardId){
cloneAtt(a,b,discardId);
var names=Object.getOwnPropertyNames(b);
console.log(names);
for(var i=0;i<names.length;i++){
var key=names[i];
if(key.startsWith("$")||key=="di"||key=="incoming"||key=="outgoing"||key.startsWith("__")){continue;}
console.log("==>"+key);
if(Array.isArray(b[key])){
a[key]=[];
cloneArray(a[key],b[key]);
}
else if(typeof(b[key])=="object"){
var e=copyElement(b[key]);
if(e){
a[key]=e;
}
}
}
}
function cloneArray(a,b){
for(var i=0;i<b.length;i++){
if(b[i].$type!==undefined){
var e=copyElement(b[i]);
if(e){
a.push(e);
}
}
}
}
function copyElement(b,discardId){
if(b===undefined || b.$type===undefined){return;}
if(b.$type.startsWith("bpmn:")){
var m=new BpmnModdle();
var bpm=m.create(b.$type);
cloneModdleElement(bpm,b,discardId);
return bpm;
}
if(b.$type.startsWith("camunda:")){
var c = new BpmnModdle({ camunda: CamundaModdle });
var camunda=c.create(b.$type);
cloneModdleElement(camunda,b);
return camunda;
}
return;
}
function cloneAtt(a,b,discardId){
for (var key in b) {
if(typeof(b[key])=="string" || typeof(b[key])=="number" || typeof(b[key])=="boolean"){
//skips Id an Type:
if((key=="id" && discardId)|| key=="$type"){
continue;
}
var x=Object.getOwnPropertyDescriptor(b, key);
if(x===undefined){
}else
if(x.writable){
a[key]=b[key];
}
}
}
}
removeProperties(element, [ 'id', 'parent', 'delta', 'host', 'priority' ]);
element = this._createShape(element, parent, newPosition, isAttach, hints);
console.log("======clone=======");
console.log(x);
console.log(element);
console.log("==================");
cloneModdleElement(element.businessObject,x.businessObject,true);
if (element) {
tree.createdElements[id] = {
element: element,
descriptor: descriptor
};
}
}, this);
}, this);
};
// move label's to their relative position
PasteHandler.prototype.postExecute = function(context) {
var modeling = this._modeling,
selection = this._selection;
var tree = context.tree,
labels = tree.labels,
topLevelElements = [];
forEach(labels, function(labelDescriptor) {
var labelTarget = this._getCreatedElement(labelDescriptor.labelTarget, tree),
label, labelTargetPos, newPosition;
if (!labelTarget) {
return;
}
label = labelTarget.label;
if (!label) {
return;
}
labelTargetPos = {
x: labelTarget.x,
y: labelTarget.y
};
if (labelTarget.waypoints) {
labelTargetPos = labelTarget.waypoints[0];
}
newPosition = {
x: Math.round((labelTargetPos.x - label.x) + labelDescriptor.delta.x),
y: Math.round((labelTargetPos.y - label.y) + labelDescriptor.delta.y)
};
modeling.moveShape(label, newPosition, labelTarget.parent);
}, this);
forEach(tree[0], function(descriptor) {
var id = descriptor.id,
toplevel = tree.createdElements[id];
if (toplevel) {
topLevelElements.push(toplevel.element);
}
});
selection.select(topLevelElements);
};
PasteHandler.prototype._createConnection = function(element, parent, parentCenter, tree) {
var modeling = this._modeling,
rules = this._rules;
var connection, source, target, canPaste;
element.waypoints = map(element.waypoints, function(waypoint, idx) {
return {
x: Math.round(parentCenter.x + element.delta[idx].x),
y: Math.round(parentCenter.y + element.delta[idx].y)
};
});
source = this._getCreatedElement(element.source, tree);
target = this._getCreatedElement(element.target, tree);
if (!source || !target) {
return null;
}
canPaste = rules.allowed('element.paste', {
source: source,
target: target
});
if (!canPaste) {
return null;
}
removeProperties(element, [ 'id', 'parent', 'delta', 'source', 'target', 'width', 'height', 'priority' ]);
connection = modeling.createConnection(source, target, element, parent);
return connection;
};
PasteHandler.prototype._createShape = function(element, parent, position, isAttach, hints) {
var modeling = this._modeling,
elementFactory = this._elementFactory,
rules = this._rules;
var canPaste = rules.allowed('element.paste', {
element: element,
position: position,
parent: parent
});
if (!canPaste) {
return null;
}
var shape = elementFactory.createShape(element);
modeling.createShape(shape, position, parent, isAttach, hints);
return shape;
};
PasteHandler.prototype._getCreatedElement = function(id, tree) {
return tree.createdElements[id] && tree.createdElements[id].element;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment