smartxml: fix - do not clear redo stack if we are just performing undo operation
[fnpeditor.git] / src / smartxml / transformations.js
index 772cf75..f0b89f1 100644 (file)
@@ -12,35 +12,73 @@ var getTransDesc = function(desc, name) {
     if(!desc.impl) {
         throw new Error('Got transformation description without implementation.')
     }
-    desc.name = desc.name || name;
     return desc;
 };
 
 toret.createGenericTransformation = function(desc, name) {
-    desc = getTransDesc(desc, name);
+    desc = getTransDesc(desc);
     
     var GenericTransformation = function(document, args) {
-        this.args = args || {};
+        this.args = args || [];
 
         var transformation = this;
-        _.keys(this.args).forEach(function(key) {
-            if(transformation.args[key].nodeType) { //@@ change to instanceof check, fix circular dependency
-                var value = transformation.args[key],
-                    path = value.getPath();
-                Object.defineProperty(transformation.args, key, {
-                    get: function() {
-                        if(transformation.hasRun) {
-                            //console.log('returning via path');
-                            return transformation.document.getNodeByPath(path);
-                        } else {
-                            //console.log('returning original arg');
-                            return value;
-
+        // _.keys(this.args).forEach(function(key) {
+        //     if(transformation.args[key].nodeType) { //@@ change to instanceof check, fix circular dependency
+        //         var value = transformation.args[key],
+        //             path = value.getPath();
+        //         Object.defineProperty(transformation.args, key, {
+        //             get: function() {
+        //                 if(transformation.hasRun) {
+        //                     //console.log('returning via path');
+        //                     return transformation.document.getNodeByPath(path);
+        //                 } else {
+        //                     //console.log('returning original arg');
+        //                     return value;
+
+        //                 }
+        //             }
+        //         });
+        //     }
+        // });
+
+        // potem spr na dotychczasowych undo/redo tests;
+        
+
+        this.args.forEach(function(arg, idx, args) {
+            var path;
+            if(arg) {
+                if(arg.nodeType) { // ~
+                    path = arg.getPath();
+                    Object.defineProperty(args, idx, {
+                        get: function() {
+                            if(transformation.hasRun && path) {
+                                return transformation.document.getNodeByPath(path);
+                            } else {
+                                return arg;
+                            }
                         }
-                    }
-                });
+                    });
+                } else if(_.isObject(arg)) {
+                    _.keys(arg).forEach(function(key) {
+                        var value = arg[key],
+                            path;
+                        if(value && value.nodeType) {
+                            path = value.getPath();
+                            Object.defineProperty(arg, key, {
+                                get: function() {
+                                    if(transformation.hasRun && path) {
+                                        return transformation.document.getNodeByPath(path);
+                                    } else {
+                                        return value;
+                                    }
+                                }
+                            });   
+                        }
+                    });
+                }
             }
         });
+
         this.document = document;
         this.hasRun = false;
         if(desc.init) {
@@ -48,7 +86,7 @@ toret.createGenericTransformation = function(desc, name) {
         }
     };
     _.extend(GenericTransformation.prototype, {
-        name: desc.name,
+        name: name,
         run: function() {
             var changeRoot;
             if(!desc.undo) {
@@ -56,7 +94,8 @@ toret.createGenericTransformation = function(desc, name) {
                 this.snapshot = changeRoot.clone();
                 this.changeRootPath = changeRoot.getPath();
             }
-            var toret = desc.impl.call(this.context, this.args); // a argumenty do metody?
+            //var toret = desc.impl.call(this.context, this.args); // a argumenty do metody?
+            var toret = desc.impl.apply(this.context, this.args);
             this.hasRun = true;
             return toret;
         },
@@ -85,14 +124,21 @@ toret.createContextTransformation = function(desc, name) {
         if(document === object) {
             this.context = document;
         } else {      
-            var contextPath = object.getPath();
+            var contextPath = object.getPath(),
+                transformation = this;
             Object.defineProperty(this, 'context', {
                 get: function() {
                     // todo: to jakos inaczej, bo np. this.context w undo transformacji before to juz nie ten sam obiekt
                     // moze transformacja powinna zwracac zmodyfikowana sciezke do obiektu po dzialaniu run?
                     
-                    // tu tez trick z hasRun
-                    return document.getNodeByPath(contextPath);
+                    if(transformation.hasRun) {
+                        //console.log('returning via path');
+                        return transformation.document.getNodeByPath(contextPath);
+                    } else {
+                        //console.log('returning original arg');
+                        return object;
+
+                    }
                 }
             });
         }