blob: e41b83f2653d5ffd5d100dceba7d0d91199c2095 [file]
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<!--- The Spark skin class for the MX Panel component's border.
@see mx.containers.Panel
@langversion 3.0
@playerversion Flash 10
@playerversion AIR 1.5
@productversion Flex 4
-->
<local:SparkSkinForHalo xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:local="mx.skins.spark.*"
implements="mx.core.IRectangularBorder">
<fx:Script>
<![CDATA[
import mx.core.EdgeMetrics;
import mx.core.IUIComponent;
/**
* @private
*/
override protected function initializationComplete():void
{
useChromeColor = true;
super.initializationComplete();
}
/* Define the skin elements that should not be colorized.
For panel, border and title backround are skinned, but the content area and title text are not. */
static private const exclusions:Array = ["background"];
/**
* @private
*/
override public function get colorizeExclusions():Array {return exclusions;}
/* Define the border items.*/
static private const borderItem:Array = ["borderStroke"];
/**
* @private
*/
override protected function get borderItems():Array {return borderItem;}
/**
* @private
*/
override protected function get defaultBorderItemColor():uint {return getStyle("borderColor");}
/**
* @private
*/
override protected function get defaultBorderAlpha():Number {return getStyle("borderAlpha");}
private var _metrics:EdgeMetrics = new EdgeMetrics(1, 32, 1, 1);
/**
* @private
*/
public function get borderMetrics():EdgeMetrics
{
var hasPanelParent:Boolean = isPanel(parent);
var controlBar:IUIComponent = hasPanelParent ? Object(parent).mx_internal::_controlBar : null;
var titleBarHeight:Number;
// if headerHeight is specified, use it, plus 1 for the border, plus 1 more for the divider
if (hasPanelParent)
titleBarHeight = Object(parent).getStyle("headerHeight") + 2;
// if headerHeight is not specified, measure the text. It comes out 1 higher than we'd like
// so we only add 1 more here
if (isNaN(titleBarHeight))
titleBarHeight = hasPanelParent ? Object(parent).mx_internal::getHeaderHeightProxy(true) + 1: 32;
_metrics.top = titleBarHeight;
if (controlBar && controlBar.includeInLayout)
_metrics.bottom = controlBar.getExplicitOrMeasuredHeight() + 1;
else
_metrics.bottom = 1;
return _metrics;
}
//----------------------------------
// backgroundImageBounds
//----------------------------------
/**
* @private
* Storage for backgroundImageBounds property.
*/
private var _backgroundImageBounds:Rectangle;
/**
* Rectangular area within which to draw the background image.
*
* This can be larger than the dimensions of the border
* if the parent container has scrollable content.
* If this property is null, the border can use
* the parent's size and <code>viewMetrics</code> property to determine its value.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function get backgroundImageBounds():Rectangle
{
return _backgroundImageBounds;
}
/**
* @private
*/
public function set backgroundImageBounds(value:Rectangle):void
{
if (_backgroundImageBounds && value && _backgroundImageBounds.equals(value))
return;
_backgroundImageBounds = value;
invalidateDisplayList();
}
/**
* @private
*/
public function get hasBackgroundImage():Boolean
{
return false;
}
/**
* @private
*/
public function layoutBackgroundImage():void
{
}
/**
* @private
*/
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
var hasPanelParent:Boolean = isPanel(parent);
var titleBarHeight:Number;
if (hasPanelParent)
titleBarHeight = Object(parent).getStyle("headerHeight");
if (isNaN(titleBarHeight))
titleBarHeight = hasPanelParent ? Object(parent).mx_internal::getHeaderHeightProxy(true) - 1 : 30;
tbbg.height = titleBarHeight;
tbhi.height = titleBarHeight;
tbdiv.top = titleBarHeight;
var em:EdgeMetrics = borderMetrics;
// Control bar visibility is determined by a borderMetric.bottom greater than 1
if (em.bottom > 1)
{
cbbg.height = em.bottom - 1;
cbdiv.bottom = cbbg.height;
cbbg.visible = cbdiv.visible = true;
}
else
{
cbbg.visible = cbdiv.visible = false;
}
if (getStyle("borderVisible") == false)
{
border.visible = false;
contents.left = contents.top = contents.right = contents.bottom = 0;
}
else
{
border.visible = true;
contents.left = contents.top = contents.right = contents.bottom = 1;
}
dropShadow.visible = getStyle("dropShadowVisible") && width > 0 && height > 0;
var cr:Number = getStyle("cornerRadius");
if (cornerRadius != cr)
{
cornerRadius = cr;
contentMaskRect.topLeftRadiusX = cornerRadius;
contentMaskRect.topRightRadiusX = cornerRadius;
border.topLeftRadiusX = cornerRadius;
border.topRightRadiusX = cornerRadius;
dropShadow.trRadius = cornerRadius;
dropShadow.tlRadius = cornerRadius;
if (cbbg.visible)
{
contentMaskRect.bottomLeftRadiusX = cornerRadius;
contentMaskRect.bottomRightRadiusX = cornerRadius;
border.bottomLeftRadiusX = cornerRadius;
border.bottomRightRadiusX = cornerRadius;
dropShadow.blRadius = cornerRadius;
dropShadow.brRadius = cornerRadius;
}
}
backgroundFill.color = getStyle("backgroundColor");
backgroundFill.alpha = getStyle("backgroundAlpha");
super.updateDisplayList(unscaledWidth, unscaledHeight);
}
/**
* We don't use 'is' to prevent dependency issues
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
private static var panels:Object = {};
private static function isPanel(parent:Object):Boolean
{
var s:String = getQualifiedClassName(parent);
if (panels[s] == 1)
return true;
if (panels[s] == 0)
return false;
if (s == "mx.containers::Panel")
{
panels[s] == 1;
return true;
}
var x:XML = describeType(parent);
var xmllist:XMLList = x.extendsClass.(@type == "mx.containers::Panel");
if (xmllist.length() == 0)
{
panels[s] = 0;
return false;
}
panels[s] = 1;
return true;
}
private var cornerRadius:Number;
]]>
</fx:Script>
<!-- drop shadow -->
<!--- @private -->
<s:RectangularDropShadow id="dropShadow" blurX="20" blurY="20" alpha="0.32" distance="11"
angle="90" color="#000000" left="0" top="0" right="0" bottom="0"
tlRadius="0" trRadius="0"
blRadius="0"
brRadius="0" />
<!-- content mask -->
<!--- @private -->
<s:Group left="1" top="1" right="1" bottom="1" id="contentMask" >
<!--- @private -->
<s:Rect left="0" top="0" right="0" bottom="0" id="contentMaskRect"
topLeftRadiusX="0" topRightRadiusX="0">
<s:fill>
<s:SolidColor alpha="0"/>
</s:fill>
</s:Rect>
</s:Group>
<!-- layer 1: border -->
<!--- @private -->
<s:Rect id="border" left="0" right="0" top="0" bottom="0"
topLeftRadiusX="0" topRightRadiusX="0">
<s:stroke>
<!--- @private -->
<s:SolidColorStroke id="borderStroke" weight="1" />
</s:stroke>
</s:Rect>
<!--- @private -->
<s:Group left="1" right="1" top="1" bottom="1" id="contents" mask="{contentMask}">
<!-- layer 2: background fill -->
<!--- @private -->
<s:Rect id="background" left="0" top="0" right="0" bottom="0">
<s:fill>
<!--- @private -->
<s:SolidColor id="backgroundFill" />
</s:fill>
</s:Rect>
<!-- layer 3: title bar fill -->
<!--- @private -->
<s:Rect id="tbbg" left="0" right="0" top="0" minHeight="30">
<s:fill>
<s:LinearGradient rotation="90">
<s:GradientEntry color="0xE2E2E2" />
<s:GradientEntry color="0xD9D9D9" />
</s:LinearGradient>
</s:fill>
</s:Rect>
<!-- layer 4: title bar highlight -->
<!--- @private -->
<s:Rect id="tbhi" left="0" right="0" top="0" minHeight="30">
<s:stroke>
<s:LinearGradientStroke rotation="90" weight="1">
<s:GradientEntry color="0xEAEAEA" />
<s:GradientEntry color="0xD9D9D9" />
</s:LinearGradientStroke>
</s:stroke>
</s:Rect>
<!--- @private -->
<s:Rect id="tbdiv" left="0" right="0" top="30" height="1">
<s:fill>
<s:SolidColor color="0xC0C0C0" />
</s:fill>
</s:Rect>
<!-- layer 5: control bar background -->
<!--- @private -->
<s:Rect id="cbbg" left="0" right="0" bottom="0" height="20">
<s:fill>
<s:SolidColor color="0xE8E8E8" />
</s:fill>
</s:Rect>
<!-- layer 6: control bar divider line -->
<!--- @private -->
<s:Rect id="cbdiv" left="0" right="0" bottom="20" height="1">
<s:fill>
<s:SolidColor color="0xCDCDCD" />
</s:fill>
</s:Rect>
</s:Group>
</local:SparkSkinForHalo>