////////////////////////////////////////////////////////////////////////////////
//
//  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.controls.listClasses
{

import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import mx.collections.IViewCursor;
import mx.core.FlexShape;
import mx.core.FlexSprite;
import mx.core.UIComponent;
import mx.core.mx_internal;

use namespace mx_internal;

//--------------------------------------
//  Styles
//--------------------------------------

include "../../styles/metadata/PaddingStyles.as"

/**
 *  Background color of the component.
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
[Style(name="backgroundColor", type="uint", format="Color", inherit="no")]

/**
 *  The ListBaseContentHolder class defines a container in a list-based control
 *  of all of the control's item renderers and item editors.
 *  Flex uses it to mask areas of the renderers that extend outside
 *  of the control, and to block certain styles, such as <code>backgroundColor</code>, 
 *  from propagating to the renderers so that highlights and 
 *  alternating row colors can show through the control.
 *
 *  @see mx.controls.listClasses.ListBase
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class ListBaseContentHolder extends UIComponent
{
    include "../../core/Version.as";

    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------

    /**
     *  Constructor.
     *
     *  @param parentList The list-based control.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function ListBaseContentHolder(parentList:ListBase)
    {
        super();

        this.parentList = parentList;

        setStyle("backgroundColor", "");
        setStyle("borderStyle", "none");
        setStyle("borderSkin", null);

        // This invisible layer, which is a child of listContent
        // catches mouse events for all items
        // and is where we put selection highlighting by default.
        if (!selectionLayer)
        {
            selectionLayer = new FlexSprite();
            selectionLayer.name = "selectionLayer";
            selectionLayer.mouseEnabled = false;
            addChild(selectionLayer);

            // trace("selectionLayer parent set to " + selectionLayer.parent);

            var g:Graphics = selectionLayer.graphics;
            g.beginFill(0, 0); // 0 alpha means transparent
            g.drawRect(0, 0, 10, 10);
            g.endFill();
        }
    }

    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------

    /**
     *  The layer in the content defined by the <code>:istbase.listContent</code> property 
     *  where all selection and highlight indicators are drawn.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var selectionLayer:Sprite;

    /**
     *  A hash table of data provider item renderers currently in view.
     *  The table is indexed by the data provider item's UID and is used
     *  to quickly get the renderer used to display a particular item.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var visibleData:Object = {};

    /**
     *  An Array of Arrays that contains
     *  the item renderer instances that render each data provider item.
     *  This is a two-dimensional, row-major array, which means 
     *  an Array of rows that are Arrays of columns.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var listItems:Array = [];

    /**
     *  An Array of ListRowInfo objects that cache row heights and 
     *  other tracking information for the rows defined in 
     *  the <code>listItems</code> property.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var rowInfo:Array = [];

    /**
     *  The IViewCursor instance used to fetch items from the
     *  data provider and pass the items to the renderers.
     *  At the end of any sequence of code, it must always
     *  be positioned at the top-most visible item being displayed.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var iterator:IViewCursor;

    /**
     *  @private
     */
    private var parentList:ListBase;

    /**
     *  @private
     */
    private var maskShape:Shape;

    /**
     *  @private
     */
    mx_internal var allowItemSizeChangeNotification:Boolean = true;

    //--------------------------------------------------------------------------
    //
    //  Overridden properties: UIComponent
    //
    //--------------------------------------------------------------------------

    //----------------------------------
    //  focusPane
    //----------------------------------

    /**
     *  @private
     */
    override public function set focusPane(value:Sprite):void
    {
        if (value)
        {
            // Something inside us is getting focus so apply a clip mask
            // if we don't already have one.
            if (!maskShape)
            {
                maskShape = new FlexShape();
                maskShape.name = "mask";

                var g:Graphics = maskShape.graphics;
                g.beginFill(0xFFFFFF);
                g.drawRect(-2, -2, parentList.width + 2, parentList.height + 2);
                g.endFill();

                addChild(maskShape);
            }

            maskShape.visible = false;

            value.mask = maskShape;
        }
        else
        {
            if (parentList.focusPane.mask == maskShape)
                parentList.focusPane.mask = null;
        }

        parentList.focusPane = value;
        value.x = x;
        value.y = y;
    }

    //--------------------------------------------------------------------------
    //
    //  Overridden methods: UIComponent
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     */
    override public function invalidateSize():void
    {
        if (allowItemSizeChangeNotification)
            parentList.invalidateList();
    }

    /**
     *  Sets the position and size of the scroll bars and content
     *  and adjusts the mask.
     *
     *  @param unscaledWidth Specifies the width of the component, in pixels,
     *  in the component's coordinates, regardless of the value of the
     *  <code>scaleX</code> property of the component.
     *
     *  @param unscaledHeight Specifies the height of the component, in pixels,
     *  in the component's coordinates, regardless of the value of the
     *  <code>scaleY</code> property of the component.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    override protected function updateDisplayList(unscaledWidth:Number,
                                                  unscaledHeight:Number):void
    {
        super.updateDisplayList(unscaledWidth, unscaledHeight);

        // have to resize selection layer without scaling so refill it
        var g:Graphics = selectionLayer.graphics;
        g.clear();
        if (unscaledWidth > 0 && unscaledHeight > 0)
        {
            g.beginFill(0x808080, 0);
            g.drawRect(0, 0, unscaledWidth, unscaledHeight);
            g.endFill();
        }

        if (maskShape)
        {
            maskShape.width = unscaledWidth;
            maskShape.height = unscaledHeight;
        }
    }

    /**
     *  @private
     */
    mx_internal function getParentList():ListBase
    {
        return parentList;
    }

    /**
     *  Offset, in pixels, for the upper-left corner in the list control of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var leftOffset:Number = 0;

    /**
     *  Offset, in pixels, for the upper-left corner in the list control of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var topOffset:Number = 0;

    /**
     *  Offset, in pixels, for the lower-right corner in the list control of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var rightOffset:Number = 0;

    /**
     *  Offset, in pixels, for the lower-right corner in the list control of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public var bottomOffset:Number = 0;
    
    /**
     *  Height, in pixels excluding the top and
     *  bottom offsets, of the central part of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function get heightExcludingOffsets():Number
    {
        return height + topOffset - bottomOffset;
    }
    
    /**
     *  Width, in pixels excluding the top and
     *  bottom offsets, of the central part of the content defined 
     *  by the <code>ListBase.listContent</code> property.
     *
     *  @see mx.controls.listClasses.ListBase#listContent
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function get widthExcludingOffsets():Number
    {
        return width + leftOffset - rightOffset;
    }
}

}
