editor: canvas - let every child of a detached element clean up after itself
[fnpeditor.git] / src / smartxml / core.js
index 048130e..fdce751 100644 (file)
@@ -13,7 +13,7 @@ var INSERTION = function(implementation) {
             nodeParent,
             returned;
         options = options || {};
             nodeParent,
             returned;
         options = options || {};
-        if(!(this.document.containsNode(this)) || !insertion.isNew) {
+        if(!(this.document.containsNode(this)) || !insertion.insertsNew) {
             nodeParent = insertion.ofNode.parent();
         }
         if(!insertion.insertsNew && insertion.ofNode.isSurroundedByTextNodes()) {
             nodeParent = insertion.ofNode.parent();
         }
         if(!insertion.insertsNew && insertion.ofNode.isSurroundedByTextNodes()) {
@@ -24,7 +24,10 @@ var INSERTION = function(implementation) {
         }
         returned = implementation.call(this, insertion.ofNode);
         if(!options.silent && returned.sameNode(insertion.ofNode)) {
         }
         returned = implementation.call(this, insertion.ofNode);
         if(!options.silent && returned.sameNode(insertion.ofNode)) {
-            this.triggerChangeEvent(insertion.insertsNew ? 'nodeAdded' : 'nodeMoved', {node: insertion.ofNode}, nodeParent, nodeWasContained);
+            if(!insertion.insertsNew) {
+                this.triggerChangeEvent('nodeDetached', {node: insertion.ofNode, parent: nodeParent, move: true});
+            }
+            this.triggerChangeEvent('nodeAdded', {node: insertion.ofNode, move: !insertion.insertsNew}, nodeParent, nodeWasContained);
         }
         return returned;
     };
         }
         return returned;
     };
@@ -184,15 +187,21 @@ var elementNodeTransformations = {
             return;
         }
 
             return;
         }
 
+        this.contents()
+            .filter(function(child) {
+                return child.getProperty('describesParent');
+            }.bind(this))
+            .forEach(function(child) {
+                child.detach();
+            });
+
         var myContents = this.contents(),
             myIdx = parent.indexOf(this);
 
         var myContents = this.contents(),
             myIdx = parent.indexOf(this);
 
-
         if(myContents.length === 0) {
             return this.detach();
         }
 
         if(myContents.length === 0) {
             return this.detach();
         }
 
-
         var childrenLength = this.contents().length,
             first = true,
             shiftRange = false;
         var childrenLength = this.contents().length,
             first = true,
             shiftRange = false;
@@ -378,7 +387,9 @@ var documentTransformations = {
         }
 
         for(var i = idx1; i <= idx2; i++) {
         }
 
         for(var i = idx1; i <= idx2; i++) {
-            wrapper.append(parentContents[i].detach());
+            if(!parentContents[i].getProperty('describesParent')) {
+                wrapper.append(parentContents[i].detach());
+            }
         }
 
         insertingTarget[insertingMethod](wrapper);
         }
 
         insertingTarget[insertingMethod](wrapper);
@@ -423,7 +434,9 @@ var documentTransformations = {
                 wrapperElement.append({text: prefixInside});
             }
             for(var i = idx1 + 1; i < idx2; i++) {
                 wrapperElement.append({text: prefixInside});
             }
             for(var i = idx1 + 1; i < idx2; i++) {
-                wrapperElement.append(contentsInside[i]);
+                if(!contentsInside[i].getProperty('describesParent')) {
+                    wrapperElement.append(contentsInside[i]);
+                }
             }
             if(suffixInside.length > 0) {
                 wrapperElement.append({text: suffixInside});
             }
             if(suffixInside.length > 0) {
                 wrapperElement.append({text: suffixInside});