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) {
}
};
_.extend(GenericTransformation.prototype, {
- name: desc.name,
+ name: name,
run: function() {
var changeRoot;
if(!desc.undo) {
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;
},
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;
+
+ }
}
});
}