blob: 3954fb94b7916fc478d0ebdb9530b8c4d73f6e18 [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 spark.skins.mobile
{
import flash.display.Graphics;
import flash.display.InteractiveObject;
import flash.display.Sprite;
import mx.core.DPIClassification;
import spark.components.Group;
import spark.components.SpinnerListContainer;
import spark.layouts.HorizontalLayout;
import spark.skins.mobile.supportClasses.MobileSkin;
import spark.skins.mobile120.assets.SpinnerListContainerBackground;
import spark.skins.mobile120.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile120.assets.SpinnerListContainerShadow;
import spark.skins.mobile160.assets.SpinnerListContainerBackground;
import spark.skins.mobile160.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile160.assets.SpinnerListContainerShadow;
import spark.skins.mobile240.assets.SpinnerListContainerBackground;
import spark.skins.mobile240.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile240.assets.SpinnerListContainerShadow;
import spark.skins.mobile320.assets.SpinnerListContainerBackground;
import spark.skins.mobile320.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile320.assets.SpinnerListContainerShadow;
import spark.skins.mobile480.assets.SpinnerListContainerBackground;
import spark.skins.mobile480.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile480.assets.SpinnerListContainerShadow;
import spark.skins.mobile640.assets.SpinnerListContainerBackground;
import spark.skins.mobile640.assets.SpinnerListContainerSelectionIndicator;
import spark.skins.mobile640.assets.SpinnerListContainerShadow;
/**
* ActionScript-based skin for the SpinnerListContainer in mobile applications.
*
* @see spark.components.SpinnerListContainer
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
public class SpinnerListContainerSkin extends MobileSkin
{
//--------------------------------------------------------------------------
//
// Constructor
//
//--------------------------------------------------------------------------
/**
* Constructor.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*
*/
public function SpinnerListContainerSkin()
{
super();
switch (applicationDPI)
{
case DPIClassification.DPI_640:
{
// Note provisional may need changes
borderClass = spark.skins.mobile640.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile640.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile640.assets.SpinnerListContainerShadow;
cornerRadius = 20;
borderThickness = 3;
selectionIndicatorHeight = 182;
break;
}
case DPIClassification.DPI_480:
{
// Note provisional may need changes
borderClass = spark.skins.mobile480.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile480.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile480.assets.SpinnerListContainerShadow;
cornerRadius = 16;
borderThickness = 2;
selectionIndicatorHeight = 144;
break;
}
case DPIClassification.DPI_320:
{
borderClass = spark.skins.mobile320.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile320.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile320.assets.SpinnerListContainerShadow;
cornerRadius = 10;
borderThickness = 2;
selectionIndicatorHeight = 96;
break;
}
case DPIClassification.DPI_240:
{
borderClass = spark.skins.mobile240.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile240.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile240.assets.SpinnerListContainerShadow;
cornerRadius = 8;
borderThickness = 1;
selectionIndicatorHeight = 72;
break;
}
case DPIClassification.DPI_120:
{
borderClass = spark.skins.mobile120.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile120.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile120.assets.SpinnerListContainerShadow;
cornerRadius = 4;
borderThickness = 1;
selectionIndicatorHeight = 37;
break;
}
default: // default DPI_160
{
borderClass = spark.skins.mobile160.assets.SpinnerListContainerBackground;
selectionIndicatorClass = spark.skins.mobile160.assets.SpinnerListContainerSelectionIndicator;
shadowClass = spark.skins.mobile160.assets.SpinnerListContainerShadow;
cornerRadius = 5;
borderThickness = 1;
selectionIndicatorHeight = 48;
break;
}
}
minWidth = 30;
}
//--------------------------------------------------------------------------
//
// Variables
//
//--------------------------------------------------------------------------
/**
* Pixel thickness of the border.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var borderThickness:Number;
/**
* Radius of the border corners.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var cornerRadius:Number;
/**
* Height of the selection indicator.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var selectionIndicatorHeight:Number;
/**
* Class for the border part.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var borderClass:Class;
/**
* Class for the selection indicator skin part.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var selectionIndicatorClass:Class;
/**
* Class for the shadow skin part.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var shadowClass:Class;
/**
* Border skin part which includes the background.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var border:InteractiveObject;
/**
* Selection indicator skin part.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var selectionIndicator:InteractiveObject;
/**
* Shadow skin part.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var shadow:InteractiveObject;
/**
* Mask for the content group.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
protected var contentGroupMask:Sprite;
//--------------------------------------------------------------------------
//
// Skin parts
//
//--------------------------------------------------------------------------
/**
* An optional skin part that defines the Group where the content
* children are pushed into and laid out.
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
public var contentGroup:Group;
//--------------------------------------------------------------------------
//
// Properties
//
//--------------------------------------------------------------------------
/**
* @copy spark.skins.spark.ApplicationSkin#hostComponent
*
* @langversion 3.0
* @playerversion AIR 3
* @productversion Flex 4.6
*/
public var hostComponent:SpinnerListContainer;
//--------------------------------------------------------------------------
//
// Overridden Methods
//
//--------------------------------------------------------------------------
/**
* @private
*/
override protected function createChildren():void
{
super.createChildren();
if (!border)
{
// Border and background
border = new borderClass();
border.mouseEnabled = false;
addChild(border);
}
if (!contentGroup)
{
// Contains the child elements
contentGroup = new Group();
var hLayout:HorizontalLayout = new HorizontalLayout();
hLayout.gap = 0;
hLayout.verticalAlign = "middle";
contentGroup.layout = hLayout;
contentGroup.id = "contentGroup";
addChild(contentGroup);
}
if (!shadow)
{
// Shadowing sits on top of the content
shadow = new shadowClass();
shadow.mouseEnabled = false;
addChild(shadow);
}
if (!selectionIndicator)
{
// Selection indicator is on top
selectionIndicator = new selectionIndicatorClass();
selectionIndicator.mouseEnabled = false;
addChild(selectionIndicator);
}
if (!contentGroupMask)
{
// Create a mask for the content
contentGroupMask = new Sprite();
addChild(contentGroupMask);
}
}
/**
* @private
*/
override protected function measure():void
{
super.measure();
var contentW:Number = contentGroup.getPreferredBoundsWidth();
var contentH:Number = contentGroup.getPreferredBoundsHeight();
measuredWidth = measuredMinWidth = contentW + borderThickness * 2;
measuredHeight = contentH + borderThickness * 2;
measuredMinHeight = selectionIndicatorHeight + borderThickness * 4;
minHeight = measuredMinHeight;
}
/**
* @private
*/
override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void
{
super.layoutContents(unscaledWidth, unscaledHeight);
unscaledHeight = Math.max(unscaledHeight, selectionIndicatorHeight + borderThickness * 4);
setElementSize(contentGroup, unscaledWidth - borderThickness * 2, unscaledHeight - borderThickness * 2);
setElementPosition(contentGroup, borderThickness, borderThickness);
// Inset by the borderThickness horizontally because the selectionIndicator starts at 0
setElementSize(border, unscaledWidth - borderThickness * 2, unscaledHeight);
setElementPosition(border, borderThickness, 0);
setElementSize(shadow, unscaledWidth - borderThickness * 4, unscaledHeight - borderThickness * 2);
setElementPosition(shadow, borderThickness * 2, borderThickness);
setElementSize(selectionIndicator, unscaledWidth, selectionIndicatorHeight);
setElementPosition(selectionIndicator, 0, Math.floor((unscaledHeight - selectionIndicatorHeight) / 2));
// The SpinnerLists contain a left and right border. We don't want to show the leftmost
// SpinnerLists's left border nor the rightmost one's right border.
// We inset the mask on the left and right sides to accomplish this.
var g:Graphics = contentGroupMask.graphics;
g.clear();
g.beginFill(0x00FF00);
g.drawRoundRect(borderThickness * 2, borderThickness,
unscaledWidth - borderThickness * 4,
unscaledHeight - borderThickness * 2,
cornerRadius, cornerRadius);
g.endFill();
contentGroup.mask = contentGroupMask;
}
}
}