1 define(function(require) {
5 var _ = require('libs/underscore'),
8 var getTransDesc = function(desc, name) {
9 if(typeof desc === 'function') {
13 throw new Error('Got transformation description without implementation.')
18 toret.createGenericTransformation = function(desc, name) {
19 desc = getTransDesc(desc);
21 var GenericTransformation = function(document, args) {
22 this.args = args || [];
24 var transformation = this;
25 // _.keys(this.args).forEach(function(key) {
26 // if(transformation.args[key].nodeType) { //@@ change to instanceof check, fix circular dependency
27 // var value = transformation.args[key],
28 // path = value.getPath();
29 // Object.defineProperty(transformation.args, key, {
31 // if(transformation.hasRun) {
32 // //console.log('returning via path');
33 // return transformation.document.getNodeByPath(path);
35 // //console.log('returning original arg');
44 // potem spr na dotychczasowych undo/redo tests;
45 this.args.forEach(function(arg, idx, args) {
46 if(arg.nodeType) { // ~
47 var path = arg.getPath();
48 Object.defineProperty(args, idx, {
50 if(transformation.hasRun) {
51 return transformation.document.getNodeByPath(path);
60 this.document = document;
66 _.extend(GenericTransformation.prototype, {
71 changeRoot = desc.getChangeRoot ? desc.getChangeRoot.call(this) : this.document.root;
72 this.snapshot = changeRoot.clone();
73 this.changeRootPath = changeRoot.getPath();
75 //var toret = desc.impl.call(this.context, this.args); // a argumenty do metody?
76 var toret = desc.impl.apply(this.context, this.args);
82 desc.undo.call(this.context);
84 this.document.getNodeByPath(this.changeRootPath).replaceWith(this.snapshot);
89 return GenericTransformation;
91 // var T = createGenericTransformation({impl: function() {}});
92 // var t = T(doc, {a:1,b:2,c3:3});
95 toret.createContextTransformation = function(desc, name) {
96 // mozna sie pozbyc przez przeniesienie object/context na koniec argumentow konstruktora generic transformation
97 var GenericTransformation = toret.createGenericTransformation(desc, name);
99 var ContextTransformation = function(document, object, args) {
100 GenericTransformation.call(this, document, args);
102 if(document === object) {
103 this.context = document;
105 var contextPath = object.getPath(),
106 transformation = this;
107 Object.defineProperty(this, 'context', {
109 // todo: to jakos inaczej, bo np. this.context w undo transformacji before to juz nie ten sam obiekt
110 // moze transformacja powinna zwracac zmodyfikowana sciezke do obiektu po dzialaniu run?
112 if(transformation.hasRun) {
113 //console.log('returning via path');
114 return transformation.document.getNodeByPath(contextPath);
116 //console.log('returning original arg');
124 ContextTransformation.prototype = Object.create(GenericTransformation.prototype);
125 return ContextTransformation;
127 // var T = createContextTransformation({impl: function() {}});
128 // var t = T(doc, node, {a:1,b:2,c3:3});
133 toret.TransformationStorage = function() {
134 this._transformations = {};
137 _.extend(toret.TransformationStorage.prototype, {
139 register: function(Transformation) {
140 var list = (this._transformations[Transformation.prototype.name] = this._transformations[Transformation.prototype.name] || []);
141 list.push(Transformation);
144 get: function(name) {
145 var transformations = this._transformations[name];
146 if(!transformations) {
147 throw new Error('Transformation "' + name + '" not found!');
149 // na razie zwraca pierwsza
150 return transformations[0];
156 // var registerTransformationFromMethod = (object, methodName, desc) {
157 // if(!object[methodName]) {
158 // throw new Exeption('Cannot register transformation from unknown method ' + methodName + ' on ' + object);
160 // desc.impl = object[name];
161 // Transformation = createContextTransformation(desc);
162 // object.prototype.registerContextTransformation(name, createContextTransformation(method));
166 // registerTransformationFromMethod(ElementNode, 'setAttr', {
167 // impl: function(args) {
168 // this.setAttr(args.name, args.value);
170 // getChangeRoot: function() {
171 // return this.context;