Mon 21 Jul 22:43:21 CEST 2025
This commit is contained in:
parent
33fe34917c
commit
f2385c1964
189
js/ui/mxgraph/src/js/io/mxCellCodec.js
Normal file
189
js/ui/mxgraph/src/js/io/mxCellCodec.js
Normal file
|
@ -0,0 +1,189 @@
|
|||
/**
|
||||
* Copyright (c) 2006-2015, JGraph Ltd
|
||||
* Copyright (c) 2006-2015, Gaudenz Alder
|
||||
*/
|
||||
mxCodecRegistry.register(function()
|
||||
{
|
||||
/**
|
||||
* Class: mxCellCodec
|
||||
*
|
||||
* Codec for <mxCell>s. This class is created and registered
|
||||
* dynamically at load time and used implicitely via <mxCodec>
|
||||
* and the <mxCodecRegistry>.
|
||||
*
|
||||
* Transient Fields:
|
||||
*
|
||||
* - children
|
||||
* - edges
|
||||
* - overlays
|
||||
* - mxTransient
|
||||
*
|
||||
* Reference Fields:
|
||||
*
|
||||
* - parent
|
||||
* - source
|
||||
* - target
|
||||
*
|
||||
* Transient fields can be added using the following code:
|
||||
*
|
||||
* mxCodecRegistry.getCodec(mxCell).exclude.push('name_of_field');
|
||||
*
|
||||
* To subclass <mxCell>, replace the template and add an alias as
|
||||
* follows.
|
||||
*
|
||||
* (code)
|
||||
* function CustomCell(value, geometry, style)
|
||||
* {
|
||||
* mxCell.apply(this, arguments);
|
||||
* }
|
||||
*
|
||||
* mxUtils.extend(CustomCell, mxCell);
|
||||
*
|
||||
* mxCodecRegistry.getCodec(mxCell).template = new CustomCell();
|
||||
* mxCodecRegistry.addAlias('CustomCell', 'mxCell');
|
||||
* (end)
|
||||
*/
|
||||
var codec = new mxObjectCodec(new mxCell(),
|
||||
['children', 'edges', 'overlays', 'mxTransient'],
|
||||
['parent', 'source', 'target']);
|
||||
|
||||
/**
|
||||
* Function: isCellCodec
|
||||
*
|
||||
* Returns true since this is a cell codec.
|
||||
*/
|
||||
codec.isCellCodec = function()
|
||||
{
|
||||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Overidden to disable conversion of value to number.
|
||||
*/
|
||||
codec.isNumericAttribute = function(dec, attr, obj)
|
||||
{
|
||||
return attr.nodeName !== 'value' && mxObjectCodec.prototype.isNumericAttribute.apply(this, arguments);
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: isExcluded
|
||||
*
|
||||
* Excludes user objects that are XML nodes.
|
||||
*/
|
||||
codec.isExcluded = function(obj, attr, value, isWrite)
|
||||
{
|
||||
return mxObjectCodec.prototype.isExcluded.apply(this, arguments) ||
|
||||
(isWrite && attr == 'value' &&
|
||||
value.nodeType == mxConstants.NODETYPE_ELEMENT);
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: afterEncode
|
||||
*
|
||||
* Encodes an <mxCell> and wraps the XML up inside the
|
||||
* XML of the user object (inversion).
|
||||
*/
|
||||
codec.afterEncode = function(enc, obj, node)
|
||||
{
|
||||
if (obj.value != null && obj.value.nodeType == mxConstants.NODETYPE_ELEMENT)
|
||||
{
|
||||
// Wraps the graphical annotation up in the user object (inversion)
|
||||
// by putting the result of the default encoding into a clone of the
|
||||
// user object (node type 1) and returning this cloned user object.
|
||||
var tmp = node;
|
||||
node = mxUtils.importNode(enc.document, obj.value, true);
|
||||
node.appendChild(tmp);
|
||||
|
||||
// Moves the id attribute to the outermost XML node, namely the
|
||||
// node which denotes the object boundaries in the file.
|
||||
var id = tmp.getAttribute('id');
|
||||
node.setAttribute('id', id);
|
||||
tmp.removeAttribute('id');
|
||||
}
|
||||
|
||||
return node;
|
||||
};
|
||||
|
||||
/**
|
||||
* Function: beforeDecode
|
||||
*
|
||||
* Decodes an <mxCell> and uses the enclosing XML node as
|
||||
* the user object for the cell (inversion).
|
||||
*/
|
||||
codec.beforeDecode = function(dec, node, obj)
|
||||
{
|
||||
var inner = node.cloneNode(true);
|
||||
var classname = this.getName();
|
||||
|
||||
if (node.nodeName != classname)
|
||||
{
|
||||
// Passes the inner graphical annotation node to the
|
||||
// object codec for further processing of the cell.
|
||||
var tmp = node.getElementsByTagName(classname)[0];
|
||||
|
||||
if (tmp != null && tmp.parentNode == node)
|
||||
{
|
||||
mxUtils.removeWhitespace(tmp, true);
|
||||
mxUtils.removeWhitespace(tmp, false);
|
||||
tmp.parentNode.removeChild(tmp);
|
||||
inner = tmp;
|
||||
}
|
||||
else
|
||||
{
|
||||
inner = null;
|
||||
}
|
||||
|
||||
// Creates the user object out of the XML node
|
||||
obj.value = node.cloneNode(true);
|
||||
var id = obj.value.getAttribute('id');
|
||||
|
||||
if (id != null)
|
||||
{
|
||||
obj.setId(id);
|
||||
obj.value.removeAttribute('id');
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Uses ID from XML file as ID for cell in model
|
||||
obj.setId(node.getAttribute('id'));
|
||||
}
|
||||
|
||||
// Preprocesses and removes all Id-references in order to use the
|
||||
// correct encoder (this) for the known references to cells (all).
|
||||
if (inner != null)
|
||||
{
|
||||
for (var i = 0; i < this.idrefs.length; i++)
|
||||
{
|
||||
var attr = this.idrefs[i];
|
||||
var ref = inner.getAttribute(attr);
|
||||
|
||||
if (ref != null)
|
||||
{
|
||||
inner.removeAttribute(attr);
|
||||
var object = dec.objects[ref] || dec.lookup(ref);
|
||||
|
||||
if (object == null)
|
||||
{
|
||||
// Needs to decode forward reference
|
||||
var element = dec.getElementById(ref);
|
||||
|
||||
if (element != null)
|
||||
{
|
||||
var decoder = mxCodecRegistry.codecs[element.nodeName] || this;
|
||||
object = decoder.decode(dec, element);
|
||||
}
|
||||
}
|
||||
|
||||
obj[attr] = object;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return inner;
|
||||
};
|
||||
|
||||
// Returns the codec into the registry
|
||||
return codec;
|
||||
|
||||
}());
|
Loading…
Reference in New Issue
Block a user