X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/7427515e04e110e91793887b873f5853751c271a..c782c7a4d11b830dd1c6efed0b382e33b56a790b:/src/smartxml/smartxml.js diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 505ab85..dcecc64 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -78,6 +78,10 @@ $.extend(DocumentNode.prototype, { return this.document.root.sameNode(this); }, + isSiblingOf: function(node) { + return node && this.parent().sameNode(node.parent()); + }, + sameNode: function(otherNode) { return !!(otherNode) && this.nativeNode === otherNode.nativeNode; }, @@ -143,6 +147,10 @@ $.extend(DocumentNode.prototype, { return 0; } return this.parent().indexOf(this); + }, + + getNearestElementNode: function() { + return this.nodeType === Node.ELEMENT_NODE ? this : this.parent(); } }); @@ -479,7 +487,7 @@ $.extend(Document.prototype, Backbone.Events, { if(!this._currentTransaction) { return this.transaction(function() { return this.transform(Transformation, args); - }, this); + }, {context: this}); } if(typeof Transformation === 'function') { @@ -498,8 +506,6 @@ $.extend(Document.prototype, Backbone.Events, { function() { if(this._transformationLevel === 1 && !this._undoInProgress) { this._currentTransaction.pushTransformation(transformation); - } - if(!this._undoInProgress && this._transformationLevel === 1) { this.redoStack = []; } } @@ -562,6 +568,7 @@ $.extend(Document.prototype, Backbone.Events, { if(this._currentTransaction) { throw new Error('Nested transactions not supported!'); } + this._rollbackBackup = this.root.clone(); this._currentTransaction = new Transaction([], metadata); }, @@ -575,11 +582,33 @@ $.extend(Document.prototype, Backbone.Events, { this._currentTransaction = null; }, - transaction: function(callback, context, metadata) { + rollbackTransaction: function() { + if(!this._currentTransaction) { + throw new Error('Transaction rollback requested, but there is no transaction in progress!'); + } + this.replaceRoot(this._rollbackBackup); + this._rollbackBackup = null; + this._currentTransaction = null; + this._transformationLevel = 0; + }, + + transaction: function(callback, params) { var toret; - this.startTransaction(metadata); - toret = callback.call(context); + params = params || {}; + this.startTransaction(params.metadata); + try { + toret = callback.call(params.context || this); + } catch(e) { + if(params.error) { + params.error(e); + } + this.rollbackTransaction(); + return; + } this.endTransaction(); + if(params.success) { + params.success(toret); + } return toret; },