From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- js/controllers/elements/element-controller.js | 263 ++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 js/controllers/elements/element-controller.js (limited to 'js/controllers/elements/element-controller.js') diff --git a/js/controllers/elements/element-controller.js b/js/controllers/elements/element-controller.js new file mode 100644 index 00000000..f254220c --- /dev/null +++ b/js/controllers/elements/element-controller.js @@ -0,0 +1,263 @@ +/* +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, + NJComponent = require("js/lib/nj-base").NJComponent; + +var ElementController = exports.ElementController = Montage.create(NJComponent, { + + addElement: { + value: function(el, styles) { + this.application.ninja.currentDocument.documentRoot.appendChild(el); + this.application.ninja.stylesController.setElementStyles(el, styles); + } + }, + + removeElement: { + value: function(el) { + el.parentNode.removeChild(el); + } + }, + + getProperty: { + value: function(el, prop, fallbackOnComputed, isStageElement) { + return this.application.ninja.stylesController.getElementStyle(el, prop, fallbackOnComputed, isStageElement); + } + }, + + setProperty: { + value: function(el, p, value) { + this.application.ninja.stylesController.setElementStyle(el, p, value); + } + }, + + setProperties: { + value: function(el, props, index) { + for(var p in props) { + this.application.ninja.stylesController.setElementStyle(el, p, props[p][index]); + } + } + }, + + setAttribute: { + value: function(el, att, value) { + if(att === "id") { + if(value === "") { + el.setAttribute(att, value); + return; + } + + // Then check if this is a valid id by the following spec: http://www.w3.org/TR/REC-html40/types.html#h-6.2 + var regexID = /^([a-zA-Z])+([a-zA-Z0-9_\.\:\-])+/; + if(!regexID.test(value)) { + alert("Invalid ID"); + return; + } else if (this.application.ninja.currentDocument._document.getElementById(value) !== null) { + alert("The following ID: " + value + " is already in Use"); + } + + } + + el.setAttribute(att, value); + } + }, + + //-------------------------------------------------------------------------------------------------------- + // Routines to get/set color properties + getColor: { + value: function(el, isFill) { + if(isFill) + { + return this.application.ninja.stylesController.getElementStyle(el, "background-color"); + } + else + { + // TODO - Need to figure out which border side user wants + return this.application.ninja.stylesController.getElementStyle(el, "border-color"); + } + } + }, + + setColor: { + value: function(el, color, isFill) { + if(isFill) + { + this.application.ninja.stylesController.setElementStyle(el, "background-color", color.color.css); + } + else + { + this.application.ninja.stylesController.setElementStyle(el, "border-color", color.color.css); + } + } + }, + + getStroke: { + value: function(el) { + // TODO - Need to figure out which border side user wants + return this.application.ninja.stylesController.getElementStyle(el, "border"); + } + }, + + setStroke: { + value: function(el, stroke) { + var border = stroke.borderWidth + stroke.borderUnits + " " + stroke.borderStyle + " " + stroke.color.color.css; + this.application.ninja.stylesController.setElementStyle(el, "border", border); + } + }, + + //-------------------------------------------------------------------------------------------------------- + // Routines to get/set 3D properties + get3DProperty: { + value: function(el, prop) { + if(el.elementModel && el.elementModel.props3D) + { + return el.elementModel.props3D[prop]; + } + } + }, + + getMatrix: { + value: function(el) { + if(el.elementModel && el.elementModel.props3D && el.elementModel.props3D.matrix3d) + { + return el.elementModel.props3D.matrix3d.slice(0); + } + else + { + // TODO - for now, just return the identity matrix + return Matrix.I(4); +// var mat; +// +// if (elt) +// { +// var xformStr = ElementsMediator.getProperty(elt, "-webkit-transform"); +// if (xformStr) +// mat = this.transformStringToMat( xformStr ); +// if (!mat) +// mat = Matrix.I(4); +// +// if (elt.style && elt.style.zoom) +// { +// var zoom = Number(elt.style.zoom); +// if (zoom != 1) +// { +// var zoomMat = Matrix.create( [ +// [ zoom, 0, 0, 0], +// [ 0, zoom, 0, 0], +// [ 0, 0, zoom, 0], +// [ 0, 0, 0, 1] +// ] ); +// glmat4.multiply( zoomMat, mat, mat ); +// } +// } +// } +// +// elt.elementModel.props3D.matrix3d = mat; +// return mat; + } + } + }, + + getPerspectiveDist: { + value: function(el) { + if(el.elementModel && el.elementModel.props3D && el.elementModel.props3D.perspectiveDist) + { + return el.elementModel.props3D.perspectiveDist; + } + else + { + var dist = 1400; + + var str = this.getProperty(el, "-webkit-transform"); + if (str) + { + var index1 = str.indexOf( "perspective("); + if (index1 >= 0) + { + index1 += 12; // do not include 'perspective(' + var index2 = str.indexOf( ")", index1 ); + if (index2 >= 0) + { + var substr = str.substr( index1, (index2-index1)); + if (substr && (substr.length > 0)) + dist = MathUtils.styleToNumber( substr ); + } + } + } + + el.elementModel.props3D.perspectiveDist = dist; + return dist; + } + } + }, + + // TODO - perspective distance needs to be passed in as "dist" and matrix3d needs to be passed in as "mat" + set3DProperties: { + value: function(el, props, index, update3DModel) { + var dist = props[index]["dist"], + mat = props[index]["mat"]; + this.application.ninja.stylesController.setElementStyle(el, + "-webkit-transform", + "perspective(" + dist + ") " + + "matrix3d(" + MathUtils.scientificToDecimal(mat, 5) + ")"); + + el.elementModel.props3D.matrix3d = mat; + el.elementModel.props3D.perspectiveDist = dist; + +// if(update3DModel) + { + this._update3DProperties(el, mat, dist); + } + } + }, + + _update3DProperties: { + value: function(elt, mat, dist) { + var elt3DInfo = MathUtils.decomposeMatrix2(mat); + if(elt3DInfo) + { + elt.elementModel.props3D.xAngle = elt3DInfo.rotation[0] * MathUtils.RAD_TO_DEG; + elt.elementModel.props3D.yAngle = elt3DInfo.rotation[1] * MathUtils.RAD_TO_DEG; + elt.elementModel.props3D.zAngle = elt3DInfo.rotation[2] * MathUtils.RAD_TO_DEG; + + elt.elementModel.props3D.x3D = ~~(elt3DInfo.translation[0]); + elt.elementModel.props3D.y3D = ~~(elt3DInfo.translation[1]); + elt.elementModel.props3D.z3D = ~~(elt3DInfo.translation[2]); + } + } + }, + + transformStringToMat: { + value: function( str ) { + var rtnMat; + + var index1 = str.indexOf( "matrix3d("); + if (index1 >= 0) + { + index1 += 9; // do not include 'matrix3d(' + var index2 = str.indexOf( ")", index1 ); + if (index2 >= 0) + { + var substr = str.substr( index1, (index2-index1)); + if (substr && (substr.length > 0)) + { + var numArray = substr.split(','); + var nNums = numArray.length; + if (nNums == 16) + { + // gl-matrix wants row order + rtnMat = numArray; + for (var i=0; i<16; i++) + rtnMat[i] = Number( rtnMat[i] ); + } + } + } + } + + return rtnMat; + } + } +}); \ No newline at end of file -- cgit v1.2.3