////////////////////////////////////////////////////////////////////////////////
//
//  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.core
{
import flash.geom.Matrix;
import flash.geom.Matrix3D;

/**
 *  The IAssetLayoutFeatures interface defines the minimum properties and methods 
 *  required for an Object to support advanced transforms in embedded assets.
 *  
 *  @see mx.core.AdvancedLayoutFeatures
 *  
 *  @langversion 3.0
 *  @playerversion Flash 10
 *  @playerversion AIR 1.5
 *  @productversion Flex 4.1
 */
public interface IAssetLayoutFeatures
{

    /**
     *  Layout transform convenience property.  Represents the x value of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutX(value:Number):void;
    
    /**
     * @private
     */
    function get layoutX():Number;
    
    /**
     *  Layout transform convenience property.  Represents the y value of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutY(value:Number):void;
    
    /**
     * @private
     */
    function get layoutY():Number;
    
    /**
     *  Layout transform convenience property.  Represents the z value of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutZ(value:Number):void;
    
    /**
     * @private
     */
    function get layoutZ():Number;
    
    /**
     *  Used by the mirroring transform. See the mirror property.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get layoutWidth():Number;
    
    /**
     *  @private
     */
    function set layoutWidth(value:Number):void;
    
    //------------------------------------------------------------------------------
    
    /**
     *  The x value of the point around which any rotation and scale is performed in both the layout and computed matrix.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set transformX(value:Number):void;
    /**
     * @private
     */
    function get transformX():Number;
    
    /**
     *  The y value of the point around which any rotation and scale is performed in both the layout and computed matrix.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set transformY(value:Number):void;
    
    /**
     * @private
     */
    function get transformY():Number;
    
    /**
     *  The z value of the point around which any rotation and scale is performed in both the layout and computed matrix.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set transformZ(value:Number):void;
    
    /**
     * @private
     */
    function get transformZ():Number;
    
    //------------------------------------------------------------------------------

    /**
     *  Layout transform convenience property.  Represents the rotation around the X axis of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutRotationX(value:Number):void;
    
    /**
     * @private
     */
    function get layoutRotationX():Number;
    
    /**
     *  Layout transform convenience property.  Represents the rotation around the Y axis of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutRotationY(value:Number):void;
    
    /**
     * @private
     */
    function get layoutRotationY():Number;
    
    /**
     *  Layout transform convenience property.  Represents the rotation around the Z axis of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutRotationZ(value:Number):void;
    
    /**
     * @private
     */
    function get layoutRotationZ():Number;
    
    //------------------------------------------------------------------------------

    /**
     *  Layout transform convenience property.  Represents the scale along the X axis of the layout matrix used in layout and in 
     *  the computed transform.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutScaleX(value:Number):void;
    
    /**
     * @private
     */
    function get layoutScaleX():Number;
    
    /**
     *  Layout transform convenience property.  Represents the scale along the Y axis of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutScaleY(value:Number):void;
    
    /**
     * @private
     */
    function get layoutScaleY():Number;
    
    /**
     *  Layout transform convenience property.  Represents the scale along the Z axis of the layout matrix used in layout and in 
     *  the computed transform.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutScaleZ(value:Number):void;
    
    /**
     * @private
     */
    function get layoutScaleZ():Number;
    
    /**
     *  The 2D matrix used during layout calculations to determine the layout and size of the component and its parent and siblings.
     *  
     *   @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutMatrix(value:Matrix):void;
    
    /**
     * @private
     */
    function get layoutMatrix():Matrix;
    
    /**
     *  The 3D matrix used during layout calculations to determine the layout and size of the component and its parent and siblings.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function set layoutMatrix3D(value:Matrix3D):void;
    
    /**
     * @private
     */
    function get layoutMatrix3D():Matrix3D;
    
    /**
     *  True if the computed transform has 3D values.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get is3D():Boolean;
    
    /**
     *  True if the layout transform has 3D values.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get layoutIs3D():Boolean;
    
    /**
     *  If true the X axis is scaled by -1 and the x coordinate of the origin
     *  is translated by the component's width.  
     * 
     *  The net effect of this "mirror" transform is to flip the direction 
     *  that the X axis increases in without changing the layout element's 
     *  location relative to the parent's origin.
     * 
     *  @default false
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get mirror():Boolean;
    
    /**
     *  @private
     */
    function set mirror(value:Boolean):void;
    
    
    /**
     *  The stretchY is the horizontal component of the stretch scale factor which
     *  is applied before any other transformation property.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get stretchX():Number;
    
    /**
     *  @private
     */
    function set stretchX(value:Number):void;
    
    /**
     *  The stretchY is the vertical component of the stretch scale factor which
     *  is applied before any other transformation property.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get stretchY():Number;
    
    /**
     *  @private
     */
    function set stretchY(value:Number):void;
    
    //------------------------------------------------------------------------------
    
    /**
     *  The computed matrix, calculated by combining the layout matrix and any offsets provided.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get computedMatrix():Matrix;
    
    /**
     *  The computed 3D matrix, calculated by combining the 3D layout matrix and any offsets provided.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 1.5
     *  @productversion Flex 4.1
     */
    function get computedMatrix3D():Matrix3D;
}
}
