X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/bd0c9397ecd0cccdc7af0f0b0153adf5126e1538..4ff93211ebf44be111ae2c00b7ee9c843ff6d7c9:/src/smartxml/smartxml.js?ds=sidebyside
diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js
index e525c14..102a506 100644
--- a/src/smartxml/smartxml.js
+++ b/src/smartxml/smartxml.js
@@ -33,14 +33,17 @@ $.extend(DocumentNode.prototype, {
},
clone: function() {
- var clone = this._$.clone(true, true);
+ var clone = this._$.clone(true, true),
+ node = this;
clone.find('*').addBack().each(function() {
- var clonedData = $(this).data();
+ var el = this,
+ clonedData = $(this).data();
+
_.pairs(clonedData).forEach(function(pair) {
var key = pair[0],
value = pair[1];
if(_.isFunction(value.clone)) {
- clonedData[key] = value.clone();
+ clonedData[key] = value.clone(node.document.createDocumentNode(el));
}
});
});
@@ -63,7 +66,7 @@ $.extend(DocumentNode.prototype, {
}
});
- if(idx !== 'undefined') {
+ if(idx !== undefined) {
nodePath = nodePath.slice(0, idx);
}
toret = nodePath.map(function(node) {return node.getIndex(); });
@@ -120,6 +123,9 @@ $.extend(DocumentNode.prototype, {
var node = (metaData && metaData.node) ? metaData.node : this,
event = new events.ChangeEvent(type, $.extend({node: node}, metaData || {}));
if(type === 'nodeDetached' || this.document.containsNode(event.meta.node)) {
+ if(type === 'nodeMoved') {
+ event.meta.parent = origParent;
+ }
this.document.trigger('change', event);
}
if((type === 'nodeAdded' || type === 'nodeMoved') && !this.document.containsNode(this) && nodeWasContained) {
@@ -200,6 +206,10 @@ $.extend(ElementNode.prototype, {
return toret;
},
+ containsNode: function(node) {
+ return node && (node.nativeNode === this.nativeNode || node._$.parents().index(this._$) !== -1);
+ },
+
toXML: function() {
var wrapper = $('
');
wrapper.append(this._getXMLDOMToDump());
@@ -351,7 +361,7 @@ $.extend(Document.prototype, Backbone.Events, {
},
containsNode: function(node) {
- return this.root && (node.nativeNode === this.root.nativeNode || node._$.parents().index(this.root._$) !== -1);
+ return this.root && this.root.containsNode(node);
},
getSiblingParents: function(params) {
@@ -438,6 +448,27 @@ $.extend(Document.prototype, Backbone.Events, {
});
},
+ ifChanged: function(context, action, documentChangedHandler, documentUnchangedHandler) {
+ var hasChanged = false,
+ changeMonitor = function() {
+ hasChanged = true;
+ };
+
+ this.on('change', changeMonitor);
+ action.call(context);
+ this.off('change', changeMonitor);
+
+ if(hasChanged) {
+ if(documentChangedHandler) {
+ documentChangedHandler.call(context);
+ }
+ } else {
+ if(documentUnchangedHandler) {
+ documentUnchangedHandler.call(context);
+ }
+ }
+ },
+
transform: function(Transformation, args) {
var toret, transformation;
@@ -448,17 +479,26 @@ $.extend(Document.prototype, Backbone.Events, {
}
if(transformation) {
this._transformationLevel++;
- toret = transformation.run({beUndoable:this._transformationLevel === 1});
- if(this._transformationLevel === 1 && !this._undoInProgress) {
- if(this._transactionInProgress) {
- this._transactionStack.push(transformation);
- } else {
- this.undoStack.push(transformation);
+
+ this.ifChanged(
+ this,
+ function() {
+ toret = transformation.run({beUndoable:this._transformationLevel === 1});
+ },
+ function() {
+ if(this._transformationLevel === 1 && !this._undoInProgress) {
+ if(this._transactionInProgress) {
+ this._transactionStack.push(transformation);
+ } else {
+ this.undoStack.push(transformation);
+ }
+ }
+ if(!this._undoInProgress && this._transformationLevel === 1) {
+ this.redoStack = [];
+ }
}
- }
- if(!this._undoInProgress && this._transformationLevel === 1) {
- this.redoStack = [];
- }
+ );
+
this._transformationLevel--;
return toret;
} else {
@@ -537,6 +577,12 @@ $.extend(Document.prototype, Backbone.Events, {
}
},
+ transaction: function(callback, context) {
+ this.startTransaction();
+ callback.call(context);
+ this.endTransaction();
+ },
+
getNodeByPath: function(path) {
var toret = this.root;
path.forEach(function(idx) {