| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // 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.supportClasses |
| { |
| import flash.display.DisplayObject; |
| |
| /** |
| * ActionScript-based skin for toggle buttons. This class can not be used |
| * by itself. You must subclass and specify a |
| * backgroundClass and selectedBackgroundClass. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public class SelectableButtonSkinBase extends ButtonSkinBase |
| { |
| /* Define the symbol fill items that should be colored by the "symbolColor" style. */ |
| static private const symbols:Array = ["symbolIcon"]; |
| |
| /** |
| * Constructor. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| * |
| */ |
| public function SelectableButtonSkinBase() |
| { |
| super(); |
| layoutGap = 15; |
| layoutPaddingLeft = 15; |
| layoutPaddingRight = 15; |
| layoutPaddingTop = 15; |
| layoutPaddingBottom = 15; |
| |
| // Instruct the super class to ignore the "icon" style. |
| // Instead, we're going to use the protected members |
| // (initialized in the sub-classes): |
| // upIconClass, |
| // upSelectedIconClass, |
| // downIconClass, |
| // downSelectedIconClass |
| useIconStyle = false; |
| useSymbolColor = true; |
| useCenterAlignment = false; |
| } |
| |
| /** |
| * The class used to create the icon in the up state. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var upIconClass:Class; |
| |
| /** |
| * The class used to create the icon in the selected upSelected state . |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var upSelectedIconClass:Class; |
| |
| /** |
| * The class used to create the icon in the down state. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var downIconClass:Class; |
| |
| /** |
| * The class used to create the icon in the selected downSelected state . |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var downSelectedIconClass:Class; |
| |
| /** |
| * The class used to create the symbol icon in all deselected states . |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var upSymbolIconClass:Class; |
| |
| /** |
| * The class used to create the selected symbol icon in all selected states. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var upSymbolIconSelectedClass:Class; |
| |
| /** |
| * The class used to create the symbol icon in all deselected states. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var downSymbolIconClass:Class; |
| |
| /** |
| * The class used to create the selected symbol icon in all selected states. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| protected var downSymbolIconSelectedClass:Class; |
| |
| /** |
| * Optional symbol to display selection state. |
| * |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| private var _symbolIcon:DisplayObject; |
| |
| /** |
| * Read-only button symbol graphic. Use commitCurrentState() to specify |
| * a symbol graphic per-state. |
| * |
| * @see #commitCurrentState() |
| * @langversion 3.0 |
| * @playerversion Flash 10 |
| * @playerversion AIR 2.5 |
| * @productversion Flex 4.5 |
| */ |
| public function get symbolIcon():DisplayObject |
| { |
| return _symbolIcon; |
| } |
| |
| //-------------------------------------------------------------------------- |
| // |
| // Overridden methods |
| // |
| //-------------------------------------------------------------------------- |
| |
| /** |
| * @private |
| */ |
| override protected function createChildren():void |
| { |
| super.createChildren(); |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function get symbolItems():Array |
| { |
| return symbols; |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function commitCurrentState():void |
| { |
| super.commitCurrentState(); |
| |
| // check for selected or not selected |
| if (currentState != null) |
| { |
| // if (currentState == "up" || currentState == "disabled") |
| var currentStateIconClass:Class = upIconClass; |
| var currentSymbolClass:Class = upSymbolIconClass; |
| var isSelected:Boolean = false; |
| |
| if (currentState == "down") |
| { |
| currentStateIconClass = downIconClass; |
| currentSymbolClass = downSymbolIconClass; |
| } |
| else if ((currentState == "upAndSelected") |
| || (currentState == "disabledAndSelected")) |
| { |
| currentStateIconClass = upSelectedIconClass; |
| currentSymbolClass = upSymbolIconSelectedClass; |
| isSelected = true; |
| } |
| else if (currentState == "downAndSelected") |
| { |
| currentStateIconClass = downSelectedIconClass; |
| currentSymbolClass = downSymbolIconSelectedClass; |
| isSelected = true; |
| } |
| |
| setIcon(currentStateIconClass); |
| |
| // swap symbol based on selection state |
| var hasSymbol:Boolean = (_symbolIcon) && contains(_symbolIcon); |
| |
| // remove the old symbol |
| if (hasSymbol) |
| { |
| // no current symbol exists |
| // or is existing symbol different than the current symbol |
| if ((currentSymbolClass == null) |
| || !(_symbolIcon is currentSymbolClass)) |
| { |
| removeChild(_symbolIcon); |
| _symbolIcon = null; |
| |
| invalidateDisplayList(); |
| } |
| } |
| |
| // add the current symbol |
| if ((_symbolIcon == null) && (currentSymbolClass != null)) |
| { |
| var currentSymbolInstance:Object = new currentSymbolClass(); |
| |
| if (currentSymbolInstance is DisplayObject) |
| { |
| _symbolIcon = DisplayObject(currentSymbolInstance); |
| addChild(_symbolIcon); |
| |
| invalidateDisplayList(); |
| } |
| } |
| } |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function layoutContents(unscaledWidth:Number, unscaledHeight:Number):void |
| { |
| super.layoutContents(unscaledWidth, unscaledHeight); |
| |
| // position the symbols to align with the background "icon" |
| if (_symbolIcon) |
| { |
| var currentIcon:DisplayObject = getIconDisplay(); |
| setElementPosition(_symbolIcon, currentIcon.x, currentIcon.y); |
| } |
| } |
| |
| /** |
| * @private |
| */ |
| override protected function drawBackground(unscaledWidth:Number, unscaledHeight:Number):void |
| { |
| super.drawBackground(unscaledWidth, unscaledHeight); |
| |
| // Draw a transparent hit area |
| graphics.beginFill(0, 0); |
| graphics.drawRect(0, 0, unscaledWidth, unscaledHeight); |
| graphics.endFill(); |
| } |
| } |
| } |