/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ var Montage = require("montage/core/core").Montage; var Component = require("montage/ui/component").Component; var Hintable = require("js/components/hintable.reel").Hintable; var nj = require("js/lib/NJUtils").NJUtils; var ElementsMediator = require("js/mediators/element-mediator").ElementMediator; var Layer = exports.Layer = Montage.create(Component, { /* Begin: Models */ _timelinePanel: { value: null }, _dynamicLayerTag: { value: null }, dynamicLayerTag: { serializable: true, get: function() { return this._dynamicLayerTag; }, set: function(newVal) { this._dynamicLayerTag = newVal; } }, _positionCollapser: { value: null }, positionCollapser: { serializable: true, get: function() { return this._positionCollapser; }, set: function(newVal) { this._positionCollapser = newVal; } }, _transformCollapser: { value: null }, transformCollapser: { serializable: true, get: function() { return this._transformCollapser; }, set: function(newVal) { this._transformCollapser = newVal; } }, _styleCollapser: { value: null }, styleCollapser: { serializable: true, get: function() { return this._styleCollapser; }, set: function(newVal) { this._styleCollapser = newVal; } }, _clickerMain: { value: null }, clickerMain: { serializable: true, get: function() { return this._clickerMain; }, set: function(newVal) { this._clickerMain = newVal; } }, _myLabel: { value: null }, myLabel: { serializable: true, get: function() { return this._myLabel; }, set: function(newVal) { this._myLabel = newVal; } }, _mainCollapser : { value: false }, mainCollapser: { get: function() { return this._mainCollapser; }, set: function(newVal) { this._mainCollapser = newVal; }, serializable: true }, _arrLayerStyles : { value: [] }, arrLayerStyles : { serializable: true, get: function() { return this._arrLayerStyles; }, set: function(newVal) { this._arrLayerStyles = newVal; } }, _styleRepetition : { value: false }, styleRepetition : { serializable: true, get: function() { return this._styleRepetition; }, set: function(newVal) { this._styleRepetition = newVal; } }, _styleCounter : { value: 0 }, styleCounter:{ serializable:true, get:function () { return this._styleCounter; }, set:function (newVal) { this._styleCounter = newVal; } }, _selectedStyleIndex: { value: false }, selectedStyleIndex: { get: function() { return this._selectedStyleIndex; }, set: function(newVal) { if (typeof(newVal) === "undefined") { return; } if (newVal !== this._selectedStyleIndex) { this._selectedStyleIndex = newVal; this.layerData.selectedStyleIndex = newVal; } } }, _storedStyleIndex : { value: false }, _layerName:{ value: "" }, layerName:{ serializable: true, get:function(){ return this._layerName; }, set:function(newVal){ if (this._layerEditable.value !== newVal) { this._layerEditable.value = newVal; } if (this._layerName !== newVal) { this._layerName = newVal; } if (this.layerData.layerName !== newVal) { this.layerData.layerName = newVal; } if (typeof(this.dynamicLayerName) !== "undefined") { if (this.dynamicLayerName.value !== newVal) { this.dynamicLayerName.value = newVal; } } this.needsDraw = true; } }, _layerID:{ value: "Default Layer ID" }, layerID:{ serializable: true, get:function(){ return this._layerID; }, set:function(value){ this._layerID = value; this.layerData.layerID = value; } }, _layerTag:{ value: "tag" }, layerTag:{ serializable: true, get:function(){ return this._layerTag; }, set:function(newVal){ this._layerTag = newVal; this.layerData.layerTag = newVal; } }, _docUUID : { value: null }, docUUID : { serializable: true, get: function() { return this._docUUID; }, set: function(newVal) { this._docUUID = newVal; } }, _stageElement: { value: null }, stageElement: { get: function() { return this._stageElement; }, set: function(newVal) { this._stageElement = newVal; this.layerData.stageElement = newVal; } }, _elementsList : { value: [] }, elementsList : { serializable: true, get: function() { return this._elementsList; }, set: function(newVal) { this._elementsList = newVal; } }, _dtextPositionX : { value:null }, dtextPositionX:{ serializable: true, get:function(){ return this._dtextPositionX; }, set:function(value){ if (this._dtextPositionX !== value) { this._dtextPositionX = value; this.layerData.dtextPositionX = value; } } }, _dtextPositionY : { value:null }, dtextPositionY:{ serializable: true, get:function(){ return this._dtextPositionY; }, set:function(value){ if (this._dtextPositionY !== value) { this._dtextPositionY = value; this.layerData.dtextPositionY = value; } } }, _dtextScaleX : { value:null }, dtextScaleX:{ serializable: true, get:function(){ return this._dtextScaleX; }, set:function(value){ if (this._dtextScaleX !== value) { this._dtextScaleX = value; this.layerData.dtextScaleX = value; } } }, _dtextScaleY : { value:null }, dtextScaleY:{ serializable: true, get:function(){ return this._dtextScaleY; }, set:function(value){ if (this._dtextScaleY !== value) { this._dtextScaleY = value; this.layerData.dtextScaleY = value; } } }, _isSelected:{ value: false }, isSelected:{ get:function(){ return this._isSelected; }, set:function(value){ if (value !== this._isSelected) { // Only concerned about different values if (value === false) { // If changing from true to false, we need to deselect any associated styles this.selectStyle(false); } else { if (this._storedStyleIndex !== false) { this.selectStyle(this._storedStyleIndex); } } this._isSelected = value; this.layerData.isSelected = value; this.needsDraw = true; } } }, _isActive: { value: false }, isActive: { serializable:true, get: function() { return this._isActive; }, set: function(newVal) { this._isActive = newVal; this.layerData.isActive = newVal; } }, _isAnimated:{ value: false }, isAnimated:{ get:function(){ return this._isAnimated; }, set:function(value){ this._isAnimated = value; this.layerData.isAnimated = value; } }, _isVisible:{ value: true }, isVisible:{ get:function(){ return this._isVisible; }, set:function(value){ if (this._isVisible !== value) { this._isVisible = value; if (value === true) { this.element.classList.remove("layer-hidden"); } else { this.element.classList.add("layer-hidden"); } } this.layerData.isVisible = value; } }, _isLock:{ value: false }, isLock:{ get:function(){ return this._isLock; }, set:function(value){ if (this._isLock !== value) { this._isLock = value; this.layerData.isLock = value; } } }, _isHidden:{ value: false }, isHidden:{ get:function(){ return this._isHidden; }, set:function(value){ if (this._isHidden !== value) { this._isHidden = value; this.layerData._isHidden = value; } } }, _justAdded: { value: false }, _layerEditable : { value: false }, _dynamicLayerName:{ value:true }, dynamicLayerName:{ serializable:true, get:function () { return this._dynamicLayerName; }, set:function (newVal) { this._dynamicLayerName = newVal; } }, // Are the various collapsers collapsed or not _isMainCollapsed : { value: true }, isMainCollapsed : { serializable: true, get: function() { return this._isMainCollapsed; }, set: function(newVal) { this._isMainCollapsed = newVal; this.layerData.isMainCollapsed = newVal; } }, _isPositionCollapsed : { value: true }, isPositionCollapsed : { serializable: true, get: function() { return this._isPositionCollapsed; }, set: function(newVal) { this._isPositionCollapsed = newVal; this.layerData.isPositionCollapsed = newVal; } }, _isStyleCollapsed : { value: true }, isStyleCollapsed : { serializable: true, get: function() { return this._isStyleCollapsed; }, set: function(newVal) { this._isStyleCollapsed = newVal; this.layerData.isStyleCollapsed = newVal; } }, _bypassAnimation : { value: false }, bypassAnimation : { serializable: true, get: function() { return this._bypassAnimation; }, set: function(newVal) { if (typeof(this.layerData) !== "undefined") { this._bypassAnimation = newVal; this.layerData.bypassAnimation = newVal; } } }, // Is this the first draw? _isFirstDraw : { value: true }, _layerData:{ value:{} }, layerData:{ serializable: true, get:function(){ return this._layerData; }, set:function(val){ this._layerData = val; if(this._layerData){ this.setData(true); } } }, setData:{ value:function(boolNeedsDraw){ if (typeof(this._layerData) === "undefined") { return; } if (typeof(this._layerData.layerName) === "undefined") { return; } if (typeof(boolNeedsDraw) === "undefined") { boolNeedsDraw = false; } this.layerName = this.layerData.layerName; this.layerID = this.layerData.layerID; this.stageElement = this.layerData.stageElement this.arrLayerStyles = this.layerData.arrLayerStyles; this.isMainCollapsed = this.layerData.isMainCollapsed; this.isPositionCollapsed = this.layerData.isPositionCollapsed; this.isSelected = this.layerData.isSelected; this.isActive = this.layerData.isActive; this.isStyleCollapsed = this.layerData.isStyleCollapsed; this.bypassAnimation = this.layerData.bypassAnimation; this.dtextPositionX = this.layerData.dtextPositionX; this.dtextPositionY = this.layerData.dtextPositionY; this.dtextSkewX = this.layerData.dtextSkewX; this.dtextSkewY = this.layerData.dtextSkewY; this.dtextScaleX = this.layerData.dtextScaleX; this.dtextScaleY = this.layerData.dtextScaleY; this.dtextRotate = this.layerData.dtextRotate; //this._isFirstDraw = this.layerData._isFirstDraw; this.layerTag = this.layerData.layerTag; this.isVisible = this.layerData.isVisible; this.isAnimated = this.layerData.isAnimated; this.docUUID = this.layerData.docUUID; this.selectedStyleIndex = this.layerData.selectedStyleIndex; this.needsDraw = boolNeedsDraw; this.isLock = this.layerData.isLock; this.isHidden = this.layerData.isHidden; } }, /* Data binding point and outgoing binding trigger method */ _bindingPoint : { value : {} }, bindingPoint: { get: function() { return this._bindingPoint; }, set: function(newVal) { if (newVal !== this._bindingPoint) { this._bindingPoint = newVal; this.setData(true); } } }, triggerOutgoingBinding : { value: function() { this.layerData.triggerBinding = !this.layerData.triggerBinding; } }, /* END: Models */ /* Begin: Draw cycle */ prepareForDraw: { value: function() { // Initialize myself this.init(); // Make it editable this._layerEditable = Hintable.create(); this._layerEditable.element = this.titleSelector; this.titleSelector.identifier = "selectorEditable"; this.titleSelector.addEventListener("click", this, false); this._layerEditable.addEventListener("blur", this.handleSelectorEditableBlur.bind(this), false); this._layerEditable.addEventListener("change", this.handleLayerNameChange.bind(this), false); this._layerEditable.editingClass = "editable2"; this._layerEditable.value = this.layerName; // Collapser event handlers. this.mainCollapser.clicker.addEventListener("click", this.handleMainCollapserClick.bind(this), false); this.positionCollapser.clicker.addEventListener("click", this.handlePositionCollapserClick.bind(this), false); this.styleCollapser.clicker.addEventListener("click", this.handleStyleCollapserClick.bind(this), false); this.layerLock.addEventListener("click",this.handleLayerLock.bind(this),false); this.visibilityButton.addEventListener("click",this.handleLayerVisibility.bind(this),false); // Add event listeners to add and delete style buttons this.buttonAddStyle.addEventListener("click", this.handleAddStyleClick.bind(this), false); this.buttonDeleteStyle.addEventListener("click", this.handleDeleteStyleClick.bind(this), false); // Add mousedown listener to set isActive this.element.addEventListener("mousedown", this, false); this.element.addEventListener("click", this, false); // Drag and drop event handlers this.myLabel.addEventListener("mouseover", this.handleMouseover.bind(this), false); this.myLabel.addEventListener("mouseout", this.handleMouseout.bind(this), false); this.element.addEventListener("dragover", this.handleDragover.bind(this), false); this.element.addEventListener("dragleave", this.handleDragleave.bind(this), false); this.element.addEventListener("dragstart", this.handleDragstart.bind(this), false); this.element.addEventListener("drop", this.handleDrop.bind(this), false); // Register event handler for element change this.eventManager.addEventListener("elementChange",this,false); this.leftControl.identifier = "left"; this.leftControl.addEventListener("changing",this,false); this.leftControl.addEventListener("change",this,false); this.topControl.identifier = "top"; this.topControl.addEventListener("changing",this,false); this.topControl.addEventListener("change",this,false); this.widthControl.identifier = "width"; this.widthControl.addEventListener("changing",this,false); this.widthControl.addEventListener("change",this,false); this.heightControl.identifier = "height"; this.heightControl.addEventListener("changing",this,false); this.heightControl.addEventListener("change",this,false); el=this.layerData.stageElement; this.dtextPositionX = parseFloat(ElementsMediator.getProperty(el, "left")); this.dtextPositionY = parseFloat(ElementsMediator.getProperty(el, "top")); this.dtextScaleY = parseFloat(ElementsMediator.getProperty(el, "height")); this.dtextScaleX= parseFloat(ElementsMediator.getProperty(el, "width")); } }, willDraw: { value: function() { if (this._timelinePanel === null) { this._timelinePanel = this.parentComponent.parentComponent; } } }, draw: { value: function() { // Update layer selection? var boolHasClass = this.element.classList.contains("layerSelected"); if (this.isSelected && !boolHasClass) { this.element.classList.add("layerSelected"); } if (!this.isSelected && boolHasClass) { this.element.classList.remove("layerSelected"); } // then enable or disable the delete style button as appropriate if (this.isSelected) { if (this.selectedStyleIndex !== false) { this.selectStyle(this.selectedStyleIndex); this.buttonDeleteStyle.classList.remove("disabled"); } } else { this.buttonDeleteStyle.classList.add("disabled"); } // Update layer name? if (this.layerName !== this.layer_label_text.innerText) { this.layer_label_text.innerText = this.layerName; } } }, didDraw: { value: function() { if (this._isFirstDraw === true) { // First draw of layer since instantiation; collapse/expand things as needed. this._isFirstDraw = false; this.layerData._isFirstDraw = false; if (this.isMainCollapsed === false) { this.mainCollapser.myContent.style.height = "auto"; this.mainCollapser.myContent.classList.remove(this.mainCollapser.collapsedClass); this.mainCollapser.clicker.classList.remove(this.mainCollapser.collapsedClass); } if (this.isPositionCollapsed === false) { this.positionCollapser.myContent.style.height = "auto"; this.positionCollapser.myContent.classList.remove(this.positionCollapser.collapsedClass); this.positionCollapser.clicker.classList.remove(this.positionCollapser.collapsedClass); } if (this.isStyleCollapsed === false) { this.styleCollapser.myContent.style.height = "auto"; this.styleCollapser.myContent.classList.remove(this.styleCollapser.collapsedClass); this.styleCollapser.clicker.classList.remove(this.styleCollapser.collapsedClass); } } } }, /* End: Draw cycle */ /* Begin: Controllers */ init: { value: function() { // Get some selectors. this.label = this.element.querySelector(".label-layer"); this.titleSelector = this.label.querySelector(".collapsible-label"); this.buttonAddStyle = this.element.querySelector(".button-add"); this.buttonDeleteStyle = this.element.querySelector(".button-delete"); } }, addStyle : { value: function(styleProperty, existingRule) { // Add a new style rule. It should be added above the currently selected rule, // Or at the end, if no rule is selected. var newLength = 0, newStyle = {}, newEvent = document.createEvent("CustomEvent"); newEvent.initCustomEvent("layerEvent", false, true); newEvent.layerEventLocale = "styles"; newEvent.layerEventType = "newStyle"; newEvent.layerID = this.layerID; newEvent.styleIndex = this.styleCounter; newEvent.styleID = this.layerID + "@" + this.styleCounter; newStyle.styleID = newEvent.styleID; newStyle.whichView = "hintable"; newStyle.editorProperty = ""; if(styleProperty){ newStyle.editorProperty = styleProperty; newEvent.layerEventType = "restoreStyle"; newEvent.trackEditorProperty = styleProperty; if(existingRule){ newEvent.existingRule = existingRule; } } newStyle.editorValue = ""; newStyle.ruleTweener = false; newStyle.isSelected = false; newStyle.colorelement = ""; this.arrLayerStyles.push(newStyle); this.selectStyle(this.arrLayerStyles.length -1); // Set up the event info and dispatch the event this.styleCounter += 1; // Dispatch the event to the TimelineTrack component associated with this Layer. var myIndex = false, i = 0, arrLayersLength = this._timelinePanel.arrLayers.length, arrTracks = document.querySelectorAll('[data-montage-id="track"]'); for (i = 0; i < arrLayersLength; i++) { if (this.stageElement == this._timelinePanel.arrLayers[i].layerData.stageElement) { myIndex = i; } } if (myIndex !== false) { arrTracks[myIndex].dispatchEvent(newEvent); } } }, deleteStyle : { value: function() { // Only delete a style if we have one or more styles, and one of them is selected if ((this.arrLayerStyles.length > 0) && (this.selectedStyleIndex !== false)) { var newEvent = document.createEvent("CustomEvent"); // Set up the event info and dispatch the event newEvent.initCustomEvent("layerEvent", false, true); newEvent.layerEventLocale = "styles"; newEvent.layerEventType = "deleteStyle"; newEvent.layerID = this.layerID; newEvent.styleID = this.selectedStyleIndex; newEvent.selectedStyleIndex = this.selectedStyleIndex; // Dispatch the event to the TimelineTrack component associated with this Layer. var myIndex = this.application.ninja.timeline.getActiveLayerIndex(), arrTracks = document.querySelectorAll('[data-montage-id="track"]'); if (myIndex !== false) { arrTracks[myIndex].dispatchEvent(newEvent); } // Delete the style from the view this.arrLayerStyles.splice(this.selectedStyleIndex, 1); // Set selection to none this.selectedStyleIndex = false; // Disable the delete style button, because now nothing is selected this.buttonDeleteStyle.classList.add("disabled"); } } }, selectStyle : { value: function(styleIndex) { // Select a style based on its index. // use layerIndex = false to deselect all styles. var i = 0, arrLayerStylesLength = this.arrLayerStyles.length; if (styleIndex === false) { if (arrLayerStylesLength === 0) { // No styles selected, so do nothing. return; } for (i = 0; i < arrLayerStylesLength; i++) { if (this.arrLayerStyles[i].isSelected === true) { this.arrLayerStyles[i].isSelected = false; } } } else { for (i = 0; i < arrLayerStylesLength; i++) { if (i === styleIndex) { this.arrLayerStyles[i].isSelected = true; } else { if (this.arrLayerStyles[i].isSelected === true) { this.arrLayerStyles[i].isSelected = false; } } } this.selectedStyleIndex = styleIndex; this._storedStyleIndex = styleIndex; } } }, getActiveStyleIndex : { value: function() { // Searches through the styles and looks for one that has // set its isActive flag to true. var i = 0, returnVal = false, arrLayerStylesLength = this.arrLayerStyles.length; for (i = 0; i < arrLayerStylesLength; i++) { if (this.arrLayerStyles[i].isActive === true) { returnVal = i; this.arrLayerStyles[i].isActive = false; } } //console.log("Layer.getActiveStyleIndex, returnVal ", returnVal) return returnVal; } }, /* End: Controllers */ /* Begin: Event handlers */ handleLayerNameChange: { value: function(event) { if (this._layerEditable.value !== this.layerName) { this.layerName = this._layerEditable.value; this.application.ninja.currentDocument.model.needsSave = true; this.layerData.stageElement.setAttribute("id",this._layerEditable.value); } } }, handleAddStyleClick: { value: function(event) { this.isStyleCollapsed = false; this.layerData.isStyleCollapsed = false; this.triggerOutgoingBinding(); this.addStyle(); } }, handleDeleteStyleClick: { value: function(event) { if (event.target.classList.contains("disabled")) { return; } this.deleteStyle(); } }, handleSelectorEditableBlur : { value: function(event) { this.titleSelector.scrollLeft = 0; this.handleSelectorEditableChange(event); } }, handleSelectorEditableChange: { value: function(event) { var newVal = this._layerEditable.enteredValue; if (this._layerEditable.enteredValue.length === 0) { newVal = this._layerEditable._preEditValue; } this.layerName = newVal; if (newVal !== this.layerName) { this.layerName = newVal; this.application.ninja.currentDocument.model.needsSave = true; this.layerData.stageElement.setAttribute("id", newVal); } } }, handleMousedown: { value: function(event) { if (event.target.classList.contains("button-delete")) { return; } this.layerData.isActive = true; var ptrParent = nj.queryParentSelector(event.target, ".content-style"), activeStyleIndex = this.getActiveStyleIndex(); this.selectedStyleIndex = activeStyleIndex; if (ptrParent !== false) { this.selectStyle(this.selectedStyleIndex); } } }, handleLayerClick : { value: function(event) { var ptrParent = nj.queryParentSelector(event.target, ".content-style"); if (ptrParent !== false) { var myIndex = this.getActiveStyleIndex(); this.selectStyle(myIndex); } } }, handleMainCollapserClick : { value: function(event) { this.mainCollapser.bypassAnimation = false; this.bypassAnimation = false; this.layerData.bypassAnimation = false; if (this.isMainCollapsed) { this.isMainCollapsed = false; } else { this.isMainCollapsed = true; this.application.ninja.timeline.synchScrollbars(43); } this.triggerOutgoingBinding(); } }, handlePositionCollapserClick : { value: function(event) { var myHeight = this.positionCollapser.element.offsetHeight; this.positionCollapser.bypassAnimation = false; this.bypassAnimation = false; this.layerData.bypassAnimation = false; if (this.isPositionCollapsed) { this.isPositionCollapsed = false; } else { this.isPositionCollapsed = true; this.application.ninja.timeline.synchScrollbars(myHeight); } this.triggerOutgoingBinding(); } }, handleStyleCollapserClick : { value: function(event) { var myHeight = this.styleCollapser.element.offsetHeight; this.styleCollapser.bypassAnimation = false; this.bypassAnimation = false; this.layerData.bypassAnimation = false; if (this.isStyleCollapsed) { this.isStyleCollapsed = false; } else { this.isStyleCollapsed = true; this.application.ninja.timeline.synchScrollbars(myHeight); } this.triggerOutgoingBinding(); } }, handleMouseover: { value: function(event) { this.element.draggable = true; } }, handleMouseout: { value: function(event) { this.element.draggable = false; } }, handleDragenter: { value: function(event) { } }, handleDragleave: { value: function(event) { if (this._timelinePanel.draggingType !== "layer") { return; } this.element.classList.remove("dragOver"); } }, handleDragstart: { value: function(event) { //this._timelinePanel.dragLayerID = this.layerID; event.dataTransfer.setData('Text', 'Layer'); this._timelinePanel.draggingType = "layer"; } }, handleDragover: { value: function(event) { if (this._timelinePanel.draggingType !== "layer") { return; } event.preventDefault(); this.element.classList.add("dragOver"); event.dataTransfer.dropEffect = "move"; return false; } }, handleDrop : { value: function(event) { if (this._timelinePanel.draggingType !== "layer") { return; } event.stopPropagation(); this.element.classList.remove("dragOver"); if (this._timelinePanel.dragLayerID !== this.layerID) { this._timelinePanel.dropLayerID = this.layerID; } return false; } }, handleLeftChange: { value: function(event) { var prevPosition; if(!event.wasSetByCode) { if(this.savedPosition) prevPosition = [this.savedPosition + "px"]; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "left", [this.leftControl.value + "px"] , "Change", "timeline", prevPosition); this.savedPosition = null; } } }, handleTopChange: { value: function(event) { var prevPosition; if(!event.wasSetByCode) { if(this.savedPosition) prevPosition = [this.savedPosition + "px"]; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "top", [this.topControl.value + "px"] , "Change", "timeline", prevPosition); this.savedPosition = null; } } }, handleWidthChange:{ value: function(event) { var prevPosition; if(!event.wasSetByCode) { if(this.savedPosition) prevPosition = [this.savedPosition + "px"]; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "width", [this.dtextScaleX + "px"] , "Change", "timeline", prevPosition); this.savedPosition = null; } } }, handleHeightChange:{ value: function(event) { var prevPosition; if(!event.wasSetByCode) { if(this.savedPosition) prevPosition = [this.savedPosition + "px"]; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "height", [this.dtextScaleY + "px"] , "Change", "timeline", prevPosition); this.savedPosition = null; } } }, handleLeftChanging: { value: function(event) { if(!event.wasSetByCode) { if(!this.savedPosition) this.savedPosition = this.leftPosition; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "left", [this.leftControl.value + "px"] , "Changing", "timeline"); } } }, handleTopChanging: { value: function(event) { if(!event.wasSetByCode) { if(!this.savedPosition) this.savedPosition = this.topPosition; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "top", [this.topControl.value + "px"] , "Changing", "timeline"); } } }, handleWidthChanging:{ value: function(event) { if(!event.wasSetByCode) { if(!this.savedPosition) this.savedPosition = this.dtextScaleX; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "width", [this.dtextScaleX + "px"] , "Changing", "timeline"); } } }, handleHeightChanging:{ value: function(event) { if(!event.wasSetByCode) { if(!this.savedPosition) this.savedPosition = this.dtextScaleY; this.application.ninja.elementMediator.setProperty([this.layerData.stageElement], "height", [this.dtextScaleY + "px"] , "Changing", "timeline"); } } }, handleElementChange:{ value:function(event){ if(this.layerData){ var el =this.layerData.stageElement; var length = this.arrLayerStyles.length , i , k=0; this.dtextPositionX = parseFloat(ElementsMediator.getProperty(el, "left")); this.dtextPositionY = parseFloat(ElementsMediator.getProperty(el, "top")); this.dtextScaleY = parseFloat(ElementsMediator.getProperty(el, "height")); this.dtextScaleX= parseFloat(ElementsMediator.getProperty(el, "width")); for(i=0; i