From a11ef2eed7049835c8bdfa50a2b893632c46eaa0 Mon Sep 17 00:00:00 2001
From: Valerio Virgillito
Date: Wed, 4 Apr 2012 11:11:58 -0700
Subject: Squashed commit of Preparing for the montage undo-manager:
 Architecture changes

Reworked the add and remove elements into 1 function which can take 1 or more elements.
Removed the _element from the selection array
Many other changes related to those 2 changes
Undo/Redo shortcuts are now using montage undo/redo manager.

Signed-off-by: Valerio Virgillito <valerio@motorola.com>
---
 js/mediators/element-mediator.js | 218 +++++++++++----------------------------
 1 file changed, 63 insertions(+), 155 deletions(-)

(limited to 'js/mediators/element-mediator.js')

diff --git a/js/mediators/element-mediator.js b/js/mediators/element-mediator.js
index d62fa1f8..09f2aeed 100755
--- a/js/mediators/element-mediator.js
+++ b/js/mediators/element-mediator.js
@@ -5,147 +5,82 @@ No rights, expressed or implied, whatsoever to this software are provided by Mot
 </copyright> */
 
 var Montage = require("montage/core/core").Montage,
-    NJComponent = require("js/lib/nj-base").NJComponent;
+    Component = require("montage/ui/component").Component;
 
 var ElementController = require("js/controllers/elements/element-controller").ElementController,
     Command     =   require("js/controllers/undo-controller").Command,
-    GroupCommand = require("js/controllers/undo-controller").GroupCommand,
     NJUtils = require("js/lib/NJUtils").NJUtils;
 
-exports.ElementMediator = Montage.create(NJComponent, {
+exports.ElementMediator = Montage.create(Component, {
 
-    deleteDelegate: {
-        value: null
-    },
 
-    deserializedFromTemplate: {
-        value: function () {
-            this.eventManager.addEventListener("elementAdding", this, false);
-            this.eventManager.addEventListener("deleting", this, false);
-        }
+    addDelegate: {
+        enumerable: false,
+        value: null
     },
 
-    // TODO use the specific controller to be able to subclass the functionality
-    handleElementAdding: {
-        value: function(event) {
-            this.addElement(event.detail.el, event.detail.data);
-        }
+    deleteDelegate: {
+        enumerable: false,
+        value: null
     },
 
-    handleDeleting: {
-        value: function(event) {
-            if(this.deleteDelegate && (typeof this.deleteDelegate.handleDelete === 'function')) {
-                this.deleteDelegate.handleDelete();
+    addElements: {
+        value: function(elements, rules, notify) {
+            if(Array.isArray(elements)) {
+                elements.forEach(function(element) {
+                    element = element;
+                    ElementController.addElement(element, rules);
+                });
             } else {
-                // Add the Undo/Redo
-                var els = [],
-                    len = this.application.ninja.selectedElements.length;
+                ElementController.addElement(elements, rules);
 
-                if(len) {
-                    for(var i = 0; i<len; i++) {
-                        els.push(this.application.ninja.selectedElements[i]);
-                    }
-                    
-                    for(i=0; i<len; i++) {
-                        this._removeElement(els[i]._element);
-                    }
-
-                    NJevent( "deleteSelection", els );
+                // TODO - Check with webgl branch - Props seem to be already there.
+                var prop3d = this.get3DProperties(elements);
+                if(prop3d) {
+                    elements.elementModel.controller["set3DProperties"](elements, [prop3d], 0, true);
                 }
             }
-        }
-    },
-
-    addElement: {
-        value: function(el, rules, noEvent) {
-            var command = Montage.create(Command, {
-                _el:            { value: el },
-                _rules:         { value: rules },
-                _noEvent:       { value: noEvent },
 
-                description: { value: "Adding Element"},
+            if(this.addDelegate && typeof (this.addDelegate['onAddElements']) === "function") {
+                this.addDelegate['onAddElements'].call(this.addDelegate, elements);
+            }
 
-                receiver: { value: this},
+            var undoLabel = "add element";
 
-                execute: {
-                    value: function() {
-                        this.receiver._addElement(this._el, this._rules, this._noEvent);
-                        return this._el;
-                    }
-                },
-
-                unexecute: {
-                    value: function() {
-                        this.receiver._removeElement(this._el, this._rules, this._noEvent);
-                        return this._el;
-                    }
-                }
-            });
+            document.application.undoManager.add(undoLabel, this.removeElements, this, elements, notify);
 
-            NJevent("sendToUndo", command);
-            command.execute();
-        }
-    },
+            this.application.ninja.documentController.activeDocument.needsSave = true;
 
-    _addElement: {
-        value: function(el, rules, noEvent) {
-            ElementController.addElement(el, rules);
-            var p3d = this.get3DProperties(el);
-            if(p3d) {
-                el.elementModel.controller["set3DProperties"](el, [p3d], 0, true);
-            }
-            if(!noEvent) {
-                this.application.ninja.documentController.activeDocument.needsSave = true;
-                NJevent("elementAdded", el);
+            if(notify || notify === undefined) {
+                NJevent("elementAdded", elements);
             }
         }
     },
 
-    deleteElements: {
-         value: function(items) {
-            // Add the Undo/Redo
-            var len, el;
+    removeElements: {
+        value: function(elements, notify /* Used for the add undo */) {
 
-            len = items.length;
+            if(this.deleteDelegate && (typeof this.deleteDelegate.handleDelete === 'function')) {
+                return this.deleteDelegate.handleDelete();
+                // this.handleDelete.call(deleteDelegate);
+            }
 
-            if(len) {
+            if(Array.isArray(elements)) {
+                elements = Array.prototype.slice.call(elements, 0);
+                elements.forEach(function(element) {
+                    ElementController.removeElement(element);
+                });
+            } else {
+                ElementController.removeElement(elements);
+            }
 
-                for(var i = len - 1; i >= 0; i--) {
-                    el = items[i]._element || items[i];
-                    this._removeElement(el);
-                }
+            var undoLabel = "add element";
 
-                NJevent( "deleteSelection", items );
-            }
-         }
-    },
+            document.application.undoManager.add(undoLabel, this.addElements, this, elements, null, notify);
 
-    _removeElement: {
-        value: function(el, rules) {
-            ElementController.removeElement(el, rules);
             this.application.ninja.documentController.activeDocument.needsSave = true;
-            NJevent("elementDeleted", el);
-        }
-    },
-
-    replaceElement: {
-        value: function(el, el2) {
-            el2.elementModel = el.elementModel;
-            this.application.ninja.currentDocument.documentRoot.replaceChild(el2, el);
-        }
-    },
 
-    getNJProperty: {
-        value: function(el, p) {
-            if(el.elementModel) {
-                if(el.elementModel.hasOwnProperty(p)) {
-                    return el.elementModel[p];
-                } else {
-                    console.log("Element Model does not have ", p);
-                }
-            } else {
-                console.log("Element has no Model -- Create one");
-            }
+            NJevent("elementsRemoved", elements);
         }
     },
 
@@ -204,9 +139,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
             } else {
                 // Calculate currentValue if not found for each element
                 if(currentValue === null) {
-                    console.log("Here");
-                    var item = el._element || el;
-                    currentValue = item.getAttribute(att);
+                    currentValue = el.getAttribute(att);
                 }
 
                 var command = Montage.create(Command, {
@@ -245,9 +178,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
 
     _setAttribute: {
         value: function(el, att, value, eventType, source) {
-            var item = el._element || el;
-
-            item.elementModel.controller["setAttribute"](item, att, value);
+            el.elementModel.controller["setAttribute"](el, att, value);
 
             NJevent("attribute" + eventType, {type : "setAttribute", source: source, data: {"els": el, "prop": att, "value": value}, redraw: null});
         }
@@ -274,7 +205,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
                 if(!currentValue) {
                     var that = this;
                     currentValue = els.map(function(item) {
-                        return that.getProperty((item._element || item), p);
+                        return that.getProperty((item), p);
                     });
                 }
 
@@ -317,8 +248,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
             var el;
 
             for(var i=0, item; item = els[i]; i++) {
-                el = item._element || item;
-                el.elementModel.controller["setProperty"](el, p, value[i]);
+                item.elementModel.controller["setProperty"](item, p, value[i]);
             }
 
             NJevent("element" + eventType, {type : "setProperty", source: source, data: {"els": els, "prop": p, "value": value}, redraw: null});
@@ -373,11 +303,10 @@ exports.ElementMediator = Montage.create(NJComponent, {
 
     _setProperties: {
         value: function(els, props, eventType, source) {
-            var el, propsArray;
+            var propsArray;
 
             for(var i=0, item; item = els[i]; i++) {
-                el = item._element || item;
-                el.elementModel.controller["setProperties"](el, props, i);
+                item.elementModel.controller["setProperties"](item, props, i);
             }
 
             NJevent("element" + eventType, {type : "setProperties", source: source, data: {"els": els, "prop": props, "value": props}, redraw: null});
@@ -440,16 +369,14 @@ exports.ElementMediator = Montage.create(NJComponent, {
 
     _set3DProperties: {
         value: function(els, props, eventType, source) {
-            var el,
-                update3DModel = false;
+            var update3DModel = false;
 
-            if(eventType === "Change")
-            {
+            if(eventType === "Change") {
                 update3DModel = true;
             }
+
             for(var i=0, item; item = els[i]; i++) {
-                el = item._element || item;
-                el.elementModel.controller["set3DProperties"](el, props, i, update3DModel);
+                item.elementModel.controller["set3DProperties"](item, props, i, update3DModel);
             }
 
             NJevent("element" + eventType, {type : "set3DProperties", source: source, data: {"els": els, "prop": "matrix", "value": props}, redraw: null});
@@ -488,7 +415,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
                 if(!currentValue) {
                     var that = this;
                     currentValue = els.map(function(item) {
-                        return that.getColor(item._element, isFill);
+                        return that.getColor(item, isFill);
                     });
                 }
 
@@ -528,19 +455,14 @@ exports.ElementMediator = Montage.create(NJComponent, {
 
     _setColor: {
         value: function(els, value, isFill, eventType, source) {
-            var el;
-
             for(var i=0, item; item = els[i]; i++) {
-                el = item._element || item;
-                el.elementModel.controller["setColor"](el, value, isFill);
+                item.elementModel.controller["setColor"](item, value, isFill);
             }
 
             NJevent("element" + eventType, {type : "setColor", source: source, data: {"els": els, "prop": "color", "value": value, "isFill": isFill}, redraw: null});
         }
     },
 
-
-
     getStroke: {
         value: function(el) {
             if(!el.elementModel) {
@@ -570,7 +492,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
                 if(!currentValue) {
                     var that = this;
                     currentValue = els.map(function(item) {
-                        return that.getStroke(item._element);
+                        return that.getStroke(item);
                     });
                 }
 
@@ -609,11 +531,8 @@ exports.ElementMediator = Montage.create(NJComponent, {
 
     _setStroke: {
         value: function(els, value, eventType, source) {
-            var el;
-
             for(var i=0, item; item = els[i]; i++) {
-                el = item._element || item;
-                el.elementModel.controller["setStroke"](el, value);
+                item.elementModel.controller["setStroke"](item, value);
             }
 
             NJevent("element" + eventType, {type : "setStroke", source: source, data: {"els": els, "prop": "stroke", "value": value}, redraw: null});
@@ -663,8 +582,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
     },
 
     getPerspectiveMode: {
-        value: function(el)
-        {
+        value: function(el) {
             return this.getProperty(el, "-webkit-transform-style");
         }
     },
@@ -674,12 +592,9 @@ exports.ElementMediator = Montage.create(NJComponent, {
             var dist = el.elementModel.controller["getPerspectiveDist"](el);
             el.elementModel.controller["set3DProperties"](el, [{mat:mat, dist:dist}], 0, !isChanging);
 
-            if(isChanging)
-            {
+            if(isChanging) {
                 NJevent("elementChanging", {type : "setMatrix", source: null, data: {"els": [el], "prop": "matrix", "value": mat}, redraw: null});
-            }
-            else
-            {
+            } else {
                 NJevent("elementChange", {type : "setMatrix", source: null, data: {"els": [el], "prop": "matrix", "value": mat}, redraw: null});
             }
         }
@@ -688,14 +603,7 @@ exports.ElementMediator = Montage.create(NJComponent, {
     has3D: {
         value: function(el) {
             var str = this.getProperty(el, "-webkit-transform");
-            if (str && str.length)
-            {
-                return true;
-            }
-            else
-            {
-                return false;
-            }
+            return str && str.length;
         }
     }
 
-- 
cgit v1.2.3