| <?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 default skin class for Spark TabBar buttons. |
| |
| @langversion 3.0 |
| @playerversion Flash 10 |
| @playerversion AIR 1.5 |
| @productversion Flex 4 |
| --> |
| |
| <s:SparkSkin |
| xmlns:fx="http://ns.adobe.com/mxml/2009" |
| xmlns:s="library://ns.adobe.com/flex/spark" |
| xmlns:fb="http://ns.adobe.com/flashbuilder/2009" |
| minWidth="21" minHeight="21" alpha.disabledStates="0.5"> |
| |
| <!-- host component --> |
| <fx:Metadata> |
| <![CDATA[ |
| /** |
| * @copy spark.skins.spark.ApplicationSkin#hostComponent |
| */ |
| [HostComponent("spark.components.ButtonBarButton")] |
| ]]> |
| </fx:Metadata> |
| |
| <fx:Script fb:purpose="styling" > |
| |
| import spark.components.TabBar; |
| |
| static private const exclusions:Array = ["labelDisplay"]; |
| |
| /** |
| * @private |
| */ |
| override public function get colorizeExclusions():Array {return exclusions;} |
| |
| /** |
| * @private |
| */ |
| override protected function initializationComplete():void |
| { |
| //useBaseColor = true; |
| super.initializationComplete(); |
| } |
| |
| private var cornerRadius:Number = 4 |
| |
| /** |
| * @private |
| * The borderTop s:Path is just a s:Rect with the bottom edge left out. |
| * Given the rounded corners per the cornerRadius style, the result is |
| * roughly an inverted U with the specified width, height, and cornerRadius. |
| * |
| * Circular arcs are drawn with two curves per flash.display.Graphics.GraphicsUtil. |
| */ |
| private function updateBorderTop(width:Number, height:Number):void |
| { |
| var left:Number = -0.5; |
| var right:Number = width - 0.5; |
| var top:Number = 0.5; |
| var bottom:Number = height; |
| |
| var a:Number = cornerRadius * 0.292893218813453; |
| var s:Number = cornerRadius * 0.585786437626905; |
| |
| var path:String = ""; |
| path += "M " + left + " " + bottom; |
| path += " L " + left + " " + (top + cornerRadius); |
| path += " Q " + left + " " + (top + s) + " " + (left + a) + " " + (top + a); |
| path += " Q " + (left + s) + " " + top + " " + (left + cornerRadius) + " " + top; |
| path += " L " + (right - cornerRadius) + " " + top; |
| path += " Q " + (right - s) + " " + top + " " + (right - a) + " " + (top + a); |
| path += " Q " + right + " " + (top + s) + " " + right + " " + (top + cornerRadius); |
| path += " L " + right + " " + bottom; |
| borderTop.data = path; |
| } |
| |
| /** |
| * @private |
| * The cornerRadius style is specified by the TabBar, not the button itself. |
| * |
| * Rather than bind the corner radius properties of the s:Rect's in the markup |
| * below to hostComponent.owner.getStyle("cornerRadius"), we reset them here, |
| * each time a change in the value of the style is detected. Note that each |
| * corner radius property is explicitly initialized to the default value of |
| * the style; the initial value of the private cornerRadius property. |
| */ |
| private function updateCornerRadius():void |
| { |
| var cr:Number = getStyle("cornerRadius"); |
| if (cornerRadius != cr) |
| { |
| cornerRadius = cr; |
| fill.topLeftRadiusX = cornerRadius; |
| fill.topRightRadiusX = cornerRadius; |
| lowlight.radiusX = cornerRadius; |
| highlight.radiusX = cornerRadius; |
| highlightStroke.topLeftRadiusX = cornerRadius; |
| highlightStroke.topRightRadiusX = cornerRadius; |
| } |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function updateDisplayList(unscaledWidth:Number, unscaleHeight:Number):void |
| { |
| updateCornerRadius(); |
| updateBorderTop(unscaledWidth, unscaledHeight); |
| super.updateDisplayList(unscaledWidth, unscaledHeight); |
| } |
| </fx:Script> |
| |
| <!-- states --> |
| <s:states> |
| <s:State name="up" /> |
| <s:State name="over" stateGroups="overStates" /> |
| <s:State name="down" stateGroups="downStates" /> |
| <s:State name="disabled" stateGroups="disabledStates" /> |
| <s:State name="upAndSelected" stateGroups="selectedStates, selectedUpStates" /> |
| <s:State name="overAndSelected" stateGroups="overStates, selectedStates" /> |
| <s:State name="downAndSelected" stateGroups="downStates, selectedStates" /> |
| <s:State name="disabledAndSelected" stateGroups="selectedUpStates, disabledStates, selectedStates" /> |
| </s:states> |
| |
| <s:Group left="-1" right="0" top="-1" bottom="-1"> |
| |
| <!-- layer 2: fill --> |
| <s:Rect id="fill" left="2" right="1" top="2" bottom="2" topLeftRadiusX="4" topRightRadiusX="4" width="69" height="21"> |
| <s:fill> |
| <s:LinearGradient rotation="90"> |
| <s:GradientEntry color="0xFFFFFF" |
| color.selectedUpStates="0xFFFFFF" |
| color.overStates="0xCC0000" |
| color.downStates="0xCC0000" |
| alpha="0.85" |
| alpha.overAndSelected="1" /> |
| <s:GradientEntry color="0xCCCCCC" |
| color.selectedUpStates="0x9FA0A1" |
| color.over="0xCC0000" |
| color.overAndSelected="0xFFFFFF" |
| color.downStates="0xCC0000" |
| alpha="0.85" |
| alpha.overAndSelected="1" /> |
| </s:LinearGradient> |
| </s:fill> |
| </s:Rect> |
| |
| <!-- layer 3: fill lowlight --> |
| <s:Rect id="lowlight" left="2" right="1" bottom="2" height="9" radiusX="4"> |
| <s:fill> |
| <s:LinearGradient rotation="90"> |
| <s:GradientEntry color="0xCC0000" alpha="0.0099" /> |
| <s:GradientEntry color="0xCC0000" alpha="0.0627" /> |
| </s:LinearGradient> |
| </s:fill> |
| </s:Rect> |
| |
| <!-- layer 4: fill highlight --> |
| <s:Rect id="highlight" left="2" right="1" top="2" height="9" radiusX="4"> |
| <s:fill> |
| <s:SolidColor color="0xCC0000" |
| alpha="0.33" |
| alpha.selectedUpStates="0.22" |
| alpha.overStates="0.22" |
| alpha.downStates="0.12" /> |
| </s:fill> |
| </s:Rect> |
| |
| <!-- layer 5: highlight stroke (all states except down) --> |
| <s:Rect id="highlightStroke" left="2" right="1" top="2" bottom="2" topLeftRadiusX="4" topRightRadiusX="4"> |
| <s:stroke> |
| <s:LinearGradientStroke rotation="90" weight="1"> |
| <s:GradientEntry color="0xCC0000" alpha.overStates="0.22" alpha.selectedUpStates="0.33" /> |
| </s:LinearGradientStroke> |
| </s:stroke> |
| </s:Rect> |
| |
| <!-- layer 6: highlight stroke (down state only) --> |
| <s:Rect left="2" top="2" bottom="2" width="1" includeIn="downStates, selectedUpStates, overAndSelected"> |
| <s:fill> |
| <s:SolidColor color="0xCC0000" alpha="0.07" /> |
| </s:fill> |
| </s:Rect> |
| <s:Rect right="1" top="2" bottom="2" width="1" includeIn="downStates, selectedUpStates, overAndSelected"> |
| <s:fill> |
| <s:SolidColor color="0xCC0000" alpha="0.07" /> |
| </s:fill> |
| </s:Rect> |
| <s:Rect left="3" top="2" right="1" height="1" includeIn="downStates, selectedUpStates, overAndSelected"> |
| <s:fill> |
| <s:SolidColor color="0xCC0000" alpha="0.25" /> |
| </s:fill> |
| </s:Rect> |
| <s:Rect left="2" top="3" right="1" height="1" includeIn="downStates, selectedUpStates, overAndSelected"> |
| <s:fill> |
| <s:SolidColor color="0xCC0000" alpha="0.09" /> |
| </s:fill> |
| </s:Rect> |
| |
| <!-- layer 7: border - put on top of the fill so it doesn't disappear when scale is less than 1 --> |
| <s:Line id="borderBottom" left="1" right="0" bottom="1"> |
| <s:stroke> |
| <s:SolidColorStroke weight="1" |
| color="0xCC0000" |
| color.selectedStates="0x434343" |
| alpha="0.75" |
| alpha.down="0.85" |
| alpha.selectedStates="0.5" /> |
| </s:stroke> |
| </s:Line> |
| <s:Path id="borderTop" left="1" right="0" top="1" bottom="1" width="69" height="21"> |
| <s:stroke> |
| <s:LinearGradientStroke rotation="90" weight="1"> |
| <s:GradientEntry color="0xCC0000" |
| alpha="0.5625" |
| /> |
| <s:GradientEntry color="0xFFFFFF" |
| color.selectedUpStates="0xFFFFFF" |
| color.overStates="0xFFFFFF" |
| color.downStates="0xCC0000" |
| alpha="0.85" |
| alpha.overAndSelected="1" /> |
| </s:LinearGradientStroke> |
| </s:stroke> |
| </s:Path> |
| </s:Group> |
| |
| <!-- layer 8: text --> |
| <!--- The defines the appearance of the label for the first button in the ButtonBar component. --> |
| <s:Group left="2" top="2"> |
| <s:BitmapImage source="@Embed('../personIcon.png')" width="16" height="16"/> |
| |
| <s:Label id="labelDisplay" |
| textAlign="right" |
| verticalAlign="middle" |
| maxDisplayedLines="1" |
| horizontalCenter="7" verticalCenter="1" |
| left="10" right="10" top="2" bottom="2" color.down="#FFFFFF"> |
| </s:Label> |
| </s:Group> |
| |
| </s:SparkSkin> |