blob: bb8d7dc220e61d6f6d01660c739d3763aa1cf822 [file] [log] [blame]
////////////////////////////////////////////////////////////////////////////////
//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////////
package mx.geom
{
import flash.display.DisplayObject;
import flash.display.Shape;
import flash.geom.ColorTransform;
import flash.geom.Matrix;
import flash.geom.Matrix3D;
import flash.geom.PerspectiveProjection;
import flash.geom.Rectangle;
import flash.geom.Transform;
import mx.core.ILayoutElement;
import mx.core.IVisualElement;
import mx.core.mx_internal;
use namespace mx_internal;
/**
* Adds synchronization support on top of the flash.geom.Transform class.
* The class has a <code>target</code> property which is the IVisualElement that the Transform has been assigned to.
* The IVisualElement implementations typically set the target to themselves when the Transform
* is assigned to their <code>transform</code> property.
*
* <p>Changes to the Transform properties automatically get pushed to the target. Reading from the Transform
* properties reads directly from the target's transform.</p>
*
* @see flash.geom.Transform
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public class Transform extends flash.geom.Transform
{
/**
* Constructor.
*
* @param src The target of the transform.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function Transform(src:DisplayObject = null)
{
if (src == null)
src = new Shape();
super(src);
}
//--------------------------------------------------------------------------
//
// Overridden flash.geom.Transform Properties
//
//--------------------------------------------------------------------------
mx_internal var applyColorTransformAlpha:Boolean = false;
mx_internal var applyMatrix:Boolean = false;
mx_internal var applyMatrix3D:Boolean = false;
/**
* @private
*/
override public function set colorTransform(value:ColorTransform):void
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
target["$transform"]["colorTransform"] = value;
else if (target && "setColorTransform" in target)
target["setColorTransform"](value);
else
super.colorTransform = value;
applyColorTransformAlpha = true;
}
/**
* @private
*/
override public function get colorTransform():ColorTransform
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["colorTransform"];
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["colorTransform"];
else
return super.colorTransform;
}
/**
* @private
*/
override public function get concatenatedColorTransform():ColorTransform
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["concatenatedColorTransform"];
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["concatenatedColorTransform"];
else
return super.concatenatedColorTransform;
}
/**
* @private
*/
override public function get concatenatedMatrix():Matrix
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["concatenatedMatrix"];
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["concatenatedMatrix"];
else
return super.concatenatedMatrix;
}
/**
* @private
*/
override public function set matrix(value:Matrix):void
{
if (target is ILayoutElement && value != null)
ILayoutElement(target).setLayoutMatrix(value, true);
else
super.matrix = value;
applyMatrix = value != null;
applyMatrix3D = false;
}
/**
* @private
*/
override public function get matrix():Matrix
{
if (target is ILayoutElement)
return ILayoutElement(target).getLayoutMatrix();
else
return super.matrix;
}
// TODO (jszeto): SDK-22046 If the Player team changes the return type,
// we will need to update
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
override public function set matrix3D(value:Matrix3D):*
{
if (target is ILayoutElement && value != null)
ILayoutElement(target).setLayoutMatrix3D(value, true);
else
super.matrix3D = value;
applyMatrix3D = value != null;
applyMatrix = false;
}
/**
* @private
*/
override public function get matrix3D():Matrix3D
{
if (target is ILayoutElement)
return ILayoutElement(target).getLayoutMatrix3D();
else
return super.matrix3D;
}
/**
* @private
*/
override public function set perspectiveProjection(value:PerspectiveProjection):void
{
// TODO (jszeto): Implement this
var oldValue:PerspectiveProjection = super.perspectiveProjection;
super.perspectiveProjection = value;
}
/**
* @private
*/
override public function get perspectiveProjection():PerspectiveProjection
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["perspectiveProjection"];
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["perspectiveProjection"];
else
return super.perspectiveProjection;
}
/**
* @private
*/
override public function get pixelBounds():Rectangle
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["pixelBounds"];
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["pixelBounds"];
else
return super.pixelBounds;
}
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
private var _target:IVisualElement;
/**
* The IVisualElement with which the Transform will keep in synch.
* The IVisualElement implementations will typically set the target to
* themselves when the Transform is assigned to their transform property.
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
public function set target(value:IVisualElement):void
{
if (value !== _target)
_target = value;
}
/**
* @private
*/
public function get target():IVisualElement
{
return _target;
}
//--------------------------------------------------------------------------
//
// Overridden flash.geom.Transform Methods
//
//--------------------------------------------------------------------------
/**
* @inheritDoc
*
* @langversion 3.0
* @playerversion Flash 10
* @playerversion AIR 1.5
* @productversion Flex 4
*/
override public function getRelativeMatrix3D(relativeTo:DisplayObject):Matrix3D
{
if (target && "$transform" in target) // UIComponent/UIMovieClip
return target["$transform"]["getRelativeMatrix3D"](relativeTo);
else if (target && "displayObject" in target && target["displayObject"] != null)
return target["displayObject"]["transform"]["getRelativeMatrix3D"](relativeTo);
else
return super.getRelativeMatrix3D(relativeTo);
}
}
}