Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
46061bcc53
commit
17bfeeace9
149
js/ui/mxgraph/src/js/io/mxChildChangeCodec.js
Normal file
149
js/ui/mxgraph/src/js/io/mxChildChangeCodec.js
Normal file
|
@ -0,0 +1,149 @@
|
|||
/**
|
||||
* Copyright (c) 2006-2015, JGraph Ltd
|
||||
* Copyright (c) 2006-2015, Gaudenz Alder
|
||||
*/
|
||||
mxCodecRegistry.register(function()
|
||||
{
|
||||
/**
|
||||
* Class: mxChildChangeCodec
|
||||
*
|
||||
* Codec for <mxChildChange>s. This class is created and registered
|
||||
* dynamically at load time and used implicitely via <mxCodec> and
|
||||
* the <mxCodecRegistry>.
|
||||
*
|
||||
* Transient Fields:
|
||||
*
|
||||
* - model
|
||||
* - previous
|
||||
* - previousIndex
|
||||
* - child
|
||||
*
|
||||
* Reference Fields:
|
||||
*
|
||||
* - parent
|
||||
*/
|
||||
var codec = new mxObjectCodec(new mxChildChange(),
|
||||
['model', 'child', 'previousIndex'],
|
||||
['parent', 'previous']);
|
||||
|
||||
/**
|
||||
* Function: isReference
|
||||
*
|
||||
* Returns true for the child attribute if the child
|
||||
* cell had a previous parent or if we're reading the
|
||||
* child as an attribute rather than a child node, in
|
||||
* which case it's always a reference.
|
||||
*/
|
||||
codec.isReference = function(obj, attr, value, isWrite)
|
||||
{
|
||||
if (attr == 'child' &&
|
||||
(obj.previous != null ||
|
||||
!isWrite))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return mxUtils.indexOf(this.idrefs, attr) >= 0;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: afterEncode
|
||||
*
|
||||
* Encodes the child recusively and adds the result
|
||||
* to the given node.
|
||||
*/
|
||||
codec.afterEncode = function(enc, obj, node)
|
||||
{
|
||||
if (this.isReference(obj, 'child', obj.child, true))
|
||||
{
|
||||
// Encodes as reference (id)
|
||||
node.setAttribute('child', enc.getId(obj.child));
|
||||
}
|
||||
else
|
||||
{
|
||||
// At this point, the encoder is no longer able to know which cells
|
||||
// are new, so we have to encode the complete cell hierarchy and
|
||||
// ignore the ones that are already there at decoding time. Note:
|
||||
// This can only be resolved by moving the notify event into the
|
||||
// execute of the edit.
|
||||
enc.encodeCell(obj.child, node);
|
||||
}
|
||||
|
||||
return node;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: beforeDecode
|
||||
*
|
||||
* Decodes the any child nodes as using the respective
|
||||
* codec from the registry.
|
||||
*/
|
||||
codec.beforeDecode = function(dec, node, obj)
|
||||
{
|
||||
if (node.firstChild != null &&
|
||||
node.firstChild.nodeType == mxConstants.NODETYPE_ELEMENT)
|
||||
{
|
||||
// Makes sure the original node isn't modified
|
||||
node = node.cloneNode(true);
|
||||
|
||||
var tmp = node.firstChild;
|
||||
obj.child = dec.decodeCell(tmp, false);
|
||||
|
||||
var tmp2 = tmp.nextSibling;
|
||||
tmp.parentNode.removeChild(tmp);
|
||||
tmp = tmp2;
|
||||
|
||||
while (tmp != null)
|
||||
{
|
||||
tmp2 = tmp.nextSibling;
|
||||
|
||||
if (tmp.nodeType == mxConstants.NODETYPE_ELEMENT)
|
||||
{
|
||||
// Ignores all existing cells because those do not need to
|
||||
// be re-inserted into the model. Since the encoded version
|
||||
// of these cells contains the new parent, this would leave
|
||||
// to an inconsistent state on the model (ie. a parent
|
||||
// change without a call to parentForCellChanged).
|
||||
var id = tmp.getAttribute('id');
|
||||
|
||||
if (dec.lookup(id) == null)
|
||||
{
|
||||
dec.decodeCell(tmp);
|
||||
}
|
||||
}
|
||||
|
||||
tmp.parentNode.removeChild(tmp);
|
||||
tmp = tmp2;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var childRef = node.getAttribute('child');
|
||||
obj.child = dec.getObject(childRef);
|
||||
}
|
||||
|
||||
return node;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: afterDecode
|
||||
*
|
||||
* Restores object state in the child change.
|
||||
*/
|
||||
codec.afterDecode = function(dec, node, obj)
|
||||
{
|
||||
// Cells are encoded here after a complete transaction so the previous
|
||||
// parent must be restored on the cell for the case where the cell was
|
||||
// added. This is needed for the local model to identify the cell as a
|
||||
// new cell and register the ID.
|
||||
obj.child.parent = obj.previous;
|
||||
obj.previous = obj.parent;
|
||||
obj.previousIndex = obj.index;
|
||||
|
||||
return obj;
|
||||
};
|
||||
|
||||
// Returns the codec into the registry
|
||||
return codec;
|
||||
|
||||
}());
|
Loading…
Reference in New Issue
Block a user