////////////////////////////////////////////////////////////////////////////////
//
//  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 skins
{
import flash.display.DisplayObject;
import flash.display.Graphics;
import flash.events.Event;
import flash.text.TextLineMetrics;

import mx.core.DPIClassification;
import mx.core.mx_internal;
import mx.events.FlexEvent;

import spark.components.ButtonBarButton;
import spark.components.IconPlacement;
import spark.components.supportClasses.ButtonBase;
import spark.components.supportClasses.ViewNavigatorBase;
import spark.skins.mobile.ButtonSkin;
import spark.skins.mobile.supportClasses.ButtonBarButtonSkinBase;

use namespace mx_internal;

/**
 *  ButtonBarButton skin base class for TabbedViewNavigator ButtonBarButtons.
 * 
 *  @langversion 3.0
 *  @playerversion Flash 10
 *  @playerversion AIR 2.5 
 *  @productversion Flex 4.5
 */
public class TabbedViewNavigatorTabBarTabSkinBase extends ButtonBarButtonSkinBase
{
    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------
    
    /**
     *  Constructor.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 10
     *  @playerversion AIR 2.5
     *  @productversion Flex 4.5
     */
    public function TabbedViewNavigatorTabBarTabSkinBase()
    {
        super();
        
        useCenterAlignment = false;
        
        switch (applicationDPI)
        {
            case DPIClassification.DPI_320:
            {
                layoutBorderSize = 2;
                layoutPaddingTop = 12;
                layoutPaddingBottom = 12;
                layoutPaddingLeft = 12;
                layoutPaddingRight = 12;
                layoutGap = 10;
                measuredDefaultHeight = 102;
                
                break;
            }
            case DPIClassification.DPI_240:
            {
                layoutBorderSize = 1;
                layoutPaddingTop = 9;
                layoutPaddingBottom = 9;
                layoutPaddingLeft = 9;
                layoutPaddingRight = 9;
                layoutGap = 7;
                measuredDefaultHeight = 76;
				
                this.measuredDefaultWidth=0;
                break;
            }
            default:
            {
                // default DPI_160
                layoutBorderSize = 1;
                layoutPaddingTop = 6;
                layoutPaddingBottom = 6;
                layoutPaddingLeft = 6;
                layoutPaddingRight = 6;
                layoutGap = 5;
                measuredDefaultHeight = 51;
                
                break;
            }
        }
    }
    
    //--------------------------------------------------------------------------
    //
    //  Overridden methods
    //
    //--------------------------------------------------------------------------
    
    /**
     *  @private
     */
    override public function set hostComponent(value:ButtonBase):void
    {
        if (hostComponent)
        {
            hostComponent.removeEventListener(FlexEvent.DATA_CHANGE, dataChanged);
        }
        
        super.hostComponent = value;
        
        // look for enabled in hostComponent data
        if (hostComponent)
        {
            hostComponent.addEventListener(FlexEvent.DATA_CHANGE, dataChanged);
            dataChanged();
        }
    }
    
    /**
     *  @private
     */
    override protected function commitDisabled():void
    {
        var alphaValue:Number = (currentState.indexOf("disabled") >= 0) ? 0.25 : 1;
        
        labelDisplay.alpha = alphaValue;
        labelDisplayShadow.alpha = alphaValue;
        
        var icon:DisplayObject = getIconDisplay();
        
        if (icon != null)
            icon.alpha = alphaValue;
    }
    
    /**
     *  @private
     */
    override protected function drawBackground(unscaledWidth:Number, unscaledHeight:Number):void
    {
        // omit super.drawBackground() to drawRect instead
        // use transparent ButtonBarButtons to support ViewNavigatorBase#overlayControls
        //graphics.beginFill(0, 0);
        //graphics.drawRect(0, 0, unscaledWidth, unscaledHeight);
		trace("Draw background");
		//this.unscaledWidth=0;
		//graphics.drawRect(0, 0, 0,0);
        //graphics.endFill();
    }
    
    /**
     *  @private
     *  Set enabled on ButtonBarButton host component based on ViewNavigator
     *  enabled value.
     */
    private function dataChanged(event:Event=null):void
    {
        var buttonBarButtonHost:ButtonBarButton = ButtonBarButton(hostComponent);
        
        // TabbedViewNavigator dataProvider for ButtonBar is
        // navigators:Vector.<ViewNavigatorBase>
        if (buttonBarButtonHost.data && (buttonBarButtonHost.data is ViewNavigatorBase))
        {
            var viewNavigator:ViewNavigatorBase = ViewNavigatorBase(buttonBarButtonHost.data);
            viewNavigator.addEventListener("enabledChanged", dataEnabledChanged);
            
            dataEnabledChanged();
        }
    }
    
    /**
     *  @private
     *  Update enabled state when ViewNavigator enabled value changes.
     */
    private function dataEnabledChanged(event:Event=null):void
    {
        hostComponent.enabled = ViewNavigatorBase(ButtonBarButton(hostComponent).data).enabled;
    }
}
}