blob: b7dfa9f869e3d81bb6b5aeb58239dd35e1fd655f [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.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;
}
}
}