uifw/AvKon/src/aknsignal.cpp
changeset 0 2f259fa3e83a
child 4 8ca85d2f0db7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/aknsignal.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,1073 @@
+/*
+* Copyright (c) 2002-2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  Control for status pane's signal pane.
+*
+*/
+
+
+// INCLUDE FILES
+#include <AknSignal.h>
+#include <barsread.h>
+#include <eikspane.h>
+#include <avkon.mbg>
+#include <AknsDrawUtils.h>
+#include <AknsUtils.h>
+#include <AknIconUtils.h>
+#include <AknUtils.h>
+#include <aknconsts.h>
+#include <aknenv.h>
+#include <AknStatuspaneUtils.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknDef.h>
+
+#include <AknTasHook.h>
+#include "AknSignalIcon.h"
+#include "AknSignalStrength.h"
+#include "aknsignaldataobserver.h"
+
+/** Frame delay for signal state animations. */
+const TInt KAknIndicatorAnimationDelay    = 500000; // microseconds
+
+/** Frame interval for signal state animations. */
+const TInt KAknIndicatorAnimationInterval = 500000; // microseconds
+
+
+/** Number of bitmap frames for CDMA animations. */
+const TInt KAknCdmaAnimationFrames = 14;
+
+// Flags for Signal Pane
+enum TSignalPaneControlFlags
+    {
+    EAknSignalPaneButton1DownInSignalRect = 0x00000001
+    };
+
+
+class CAknSignalPaneExtension: public CBase
+    {
+public:
+
+    CAknSignalPaneExtension();
+    ~CAknSignalPaneExtension();
+
+public: // new methods
+
+    TBool CdmaSignalIconInUse();
+    CFbsBitmap* CdmaSignalIcon();
+    void CdmaSignalAnimate();
+
+public:
+
+    // General signal indicators
+    TAny* iSpare1; // was iSignalIcon
+    TAny* iSpare2; // was iSignalIconMask
+
+    // CDMA Signal indicators
+    TInt        iCdmaAnimationIndex;
+    TInt        iCdmaSignalState;
+    CFbsBitmap* iCdmaReceiveIcons[KAknCdmaAnimationFrames];  // animation frames
+    CFbsBitmap* iCdmaReceiveMasks[KAknCdmaAnimationFrames];  // animation frame masks (needed because of AknIconUtils)
+    CFbsBitmap* iCdmaSendIcons[KAknCdmaAnimationFrames];     // animation frames
+    CFbsBitmap* iCdmaSendMasks[KAknCdmaAnimationFrames];     // animation frame masks (needed because of AknIconUtils)
+    CFbsBitmap* iCdmaStaticIcons[5];    // non-animated icons
+    CFbsBitmap* iCdmaStaticMasks[5];    // non-animated masks (needed because of AknIconUtils)
+
+    TBool       iIsActiveIdle;
+    };
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPaneExtension::CAknSignalPaneExtension
+// Default constructor.
+// ---------------------------------------------------------------------------
+//
+CAknSignalPaneExtension::CAknSignalPaneExtension()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPaneExtension::~CAknSignalPaneExtension
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CAknSignalPaneExtension::~CAknSignalPaneExtension()
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPaneExtension::CdmaSignalIconInUse
+// Determine if any CDMA indicator is being used.
+// ---------------------------------------------------------------------------
+//
+TBool CAknSignalPaneExtension::CdmaSignalIconInUse()
+    {
+    if ( iCdmaSignalState != EAknSignalCdmaIndicatorOff )
+        {
+        return ETrue;
+        }
+    return EFalse;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPaneExtension::CdmaSignalIcon
+// Get the current CDMA icon to be displayed.
+// ---------------------------------------------------------------------------
+//
+CFbsBitmap* CAknSignalPaneExtension::CdmaSignalIcon()
+    {
+    if ( iCdmaSignalState == EAknSignalCdmaIndicatorReceiving )
+        {
+        return iCdmaReceiveMasks[iCdmaAnimationIndex];
+        }
+    else if ( iCdmaSignalState == EAknSignalCdmaIndicatorSending )
+        {
+        return iCdmaSendMasks[iCdmaAnimationIndex];
+        }
+    else
+        {
+        return iCdmaStaticMasks[iCdmaSignalState - EAknSignalCdmaIndicatorNoService];
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPaneExtension::CdmaSignalAnimate
+// Adjusts the animation of the CDMA signal icon.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPaneExtension::CdmaSignalAnimate()
+    {
+    iCdmaAnimationIndex++;
+    if ( iCdmaAnimationIndex >= KAknCdmaAnimationFrames )
+        {
+        iCdmaAnimationIndex = 0;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::CAknSignalPane
+// Default contructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknSignalPane::CAknSignalPane()
+    {
+    AKNTASHOOK_ADD( this, "CAknSignalPane" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::~CAknSignalPane
+// Destructor
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknSignalPane::~CAknSignalPane()
+    {
+    AKNTASHOOK_REMOVE();
+    AknsUtils::DeregisterControlPosition( this );
+
+    delete iDataObserver;
+    delete iTicker;
+    for ( TInt ll = 0; ll < KAknCdmaAnimationFrames; ll++ )
+        {
+        delete iExtension->iCdmaReceiveIcons[ll];
+        delete iExtension->iCdmaReceiveMasks[ll];
+        }
+
+    for ( TInt mm = 0; mm < KAknCdmaAnimationFrames; mm++ )
+        {
+        delete iExtension->iCdmaSendIcons[mm];
+        delete iExtension->iCdmaSendMasks[mm];
+        }
+
+    for ( TInt nn = 0; nn < 5; nn++ )
+        {
+        delete iExtension->iCdmaStaticIcons[nn];
+        delete iExtension->iCdmaStaticMasks[nn];
+        }
+    delete iSignalIconControl;
+    delete iSignalStrengthControl;
+
+    delete iExtension;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ConstructL
+// Second-phase constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ConstructL()
+    {
+    iExtension = new (ELeave) CAknSignalPaneExtension();
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+#ifdef __PROTOCOL_CDMA
+    // Create CDMA indicator icons
+    for ( TInt mm = 0; mm < KAknCdmaAnimationFrames; mm++ )
+        {
+        AknIconUtils::CreateIconL(
+            iExtension->iCdmaReceiveIcons[mm],
+            iExtension->iCdmaReceiveMasks[mm],
+            AknIconUtils::AvkonIconFileName(),
+            EMbmAvkonQgn_indi_signal_receiving_cdma_01 + mm,
+            EMbmAvkonQgn_indi_signal_receiving_cdma_01 + mm );
+
+        AknIconUtils::CreateIconL(
+            iExtension->iCdmaSendIcons[mm],
+            iExtension->iCdmaSendMasks[mm],
+            AknIconUtils::AvkonIconFileName(),
+            EMbmAvkonQgn_indi_signal_sending_cdma_01 + mm,
+            EMbmAvkonQgn_indi_signal_sending_cdma_01 + mm );
+        }
+
+    // No service
+    AknsUtils::CreateColorIconL(
+        skin,
+        KAknsIIDQgnIndiSignalNoService,
+        iExtension->iCdmaStaticIcons[0],
+        iExtension->iCdmaStaticMasks[0],
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_indi_signal_no_service,
+        EMbmAvkonQgn_indi_signal_no_service );
+
+     // Packet data available, uses standard signal icon
+    AknsUtils::CreateColorIconL(
+        skin,
+        KAknsIIDQgnPropSignalIcon,
+        iExtension->iCdmaStaticIcons[1],
+        iExtension->iCdmaStaticMasks[1],
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_prop_signal_icon,
+        EMbmAvkonQgn_prop_signal_icon );
+
+    // Packet data unavailable
+    AknsUtils::CreateColorIconL(
+        skin,
+        KAknsIIDQgnIndiSignalNotAvailCdma,
+        iExtension->iCdmaStaticIcons[2],
+        iExtension->iCdmaStaticMasks[2],
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_indi_signal_not_avail_cdma,
+        EMbmAvkonQgn_indi_signal_not_avail_cdma );
+
+    // Packet data active
+    AknsUtils::CreateColorIconL(
+        skin,
+        KAknsIIDQgnIndiSignalActiveCdma,
+        iExtension->iCdmaStaticIcons[3],
+        iExtension->iCdmaStaticMasks[3],
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_indi_signal_active_cdma,
+        EMbmAvkonQgn_indi_signal_active_cdma );
+
+    // Packet data dormant
+    AknsUtils::CreateColorIconL(
+        skin,
+        KAknsIIDQgnIndiSignalDormantCdma,
+        iExtension->iCdmaStaticIcons[4],
+        iExtension->iCdmaStaticMasks[4],
+        AknIconUtils::AvkonIconFileName(),
+        EMbmAvkonQgn_indi_signal_dormant_cdma,
+        EMbmAvkonQgn_indi_signal_dormant_cdma );
+#endif // __PROTOCOL_CDMA
+
+    // off by default
+    iExtension->iCdmaSignalState    = EAknSignalCdmaIndicatorOff;
+    iExtension->iCdmaAnimationIndex = 0;
+    iExtension->iIsActiveIdle = AknStatuspaneUtils::IsActiveIdle();
+
+    iSignalIconControl = CAknSignalIcon::NewL();
+    iSignalIconControl->SetDrawBlank( EFalse );
+
+    // Load default icon
+    LoadSignalIconL( 0, 0 );
+
+    iSignalStrengthControl = CAknSignalStrength::NewL();
+
+    iSignalIconControl->SetContainerWindowL( *this );
+    iSignalStrengthControl->SetContainerWindowL( *this );
+
+    iTicker = CPeriodic::NewL( CActive::EPriorityLow );
+
+    // Set flags to default values
+    iPrivateFlags = 0;
+
+    iDataObserver = new (ELeave) CAknSignalDataObserver( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ConstructFromResourceL
+// Resource constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ConstructFromResourceL(
+    TResourceReader& aReader )
+    {
+    ConstructL();
+    SetSignalLevel( aReader.ReadInt16() ); // Initial signal level.
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::SetSignalLevel
+// Sets the signal level.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::SetSignalLevel( TInt aLevel )
+    {
+    if ( aLevel == KAknSignalOffLineMode )
+        {
+        iSignalIconControl->SetOffLine( ETrue );
+        }
+    else
+        {
+        iSignalIconControl->SetOffLine( EFalse );
+        }
+
+    iSignalStrengthControl->SetSignalLevel( aLevel );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::SignalLevel
+// Returns the current signal level.
+// ---------------------------------------------------------------------------
+//
+TInt CAknSignalPane::SignalLevel()
+    {
+    if ( iSignalStrengthControl )
+        {
+        return iSignalStrengthControl->SignalLevel();
+        }
+    else
+        {
+        return 0;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::SignalState
+// Returns the current signal state.
+// ---------------------------------------------------------------------------
+//
+TInt CAknSignalPane::SignalState()
+    {
+    return iSignalState;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DisableAnimation
+// Stops ongoing signal state animation.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::DisableAnimation()
+    {
+    if ( iTicker && iTicker->IsActive() )
+        {
+        iTicker->Cancel();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowGprsIcon
+// Displays a GRPS state icon.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ShowGprsIcon( TInt aGprsIconState )
+    {
+    // Gprs state is not changed if illegal value was given.
+    if (  aGprsIconState >= EAknSignalGprsIndicatorOff &&
+          aGprsIconState <= EAknSignalGprsIndicatorMultipdp )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aGprsIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iSignalIconControl->SetDrawBlank( EFalse );
+
+        if ( aGprsIconState != EAknSignalGprsIndicatorEstablishingContext &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+        else if ( aGprsIconState == EAknSignalGprsIndicatorEstablishingContext )
+            {
+            if ( iTicker && !iTicker->IsActive() )
+                {
+                iTicker->Start( KAknIndicatorAnimationDelay,
+                                KAknIndicatorAnimationInterval,
+                                TCallBack( TickerCallback, this ) );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::SizeChanged
+// Handles size change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::SizeChanged()
+    {
+    // No fading if staconpane is active.
+    SetContainerWindowNonFading( AknStatuspaneUtils::StaconPaneActive() );
+
+    TAknWindowComponentLayout signalIconLayout;
+    TAknWindowComponentLayout signalStrenghtLayout;
+
+    TRect parent( Rect() );
+
+    TAknLayoutRect rect;
+
+    if ( AknStatuspaneUtils::StaconPaneActive() )
+        {
+        //  Signal pane in STACON PANE.
+        TInt varietyIndex = AknStatuspaneUtils::StaconSoftKeysLeft() ? 1 : 0;
+        signalIconLayout =
+            AknLayoutScalable_Avkon::signal_pane_stacon_g2( varietyIndex );
+        signalStrenghtLayout =
+            AknLayoutScalable_Avkon::signal_pane_stacon_g1( varietyIndex );
+
+        AknLayoutUtils::LayoutControl( iSignalIconControl,
+                                       parent,
+                                       signalIconLayout );
+        AknLayoutUtils::LayoutControl( iSignalStrengthControl,
+                                       parent,
+                                       signalStrenghtLayout );
+        }
+    else if ( AknStatuspaneUtils::FlatLayoutActive() )
+        {
+        //  Signal pane in FLAT STATUSPANE.
+        signalIconLayout     = AknLayoutScalable_Avkon::signal_pane_g2( 1 );
+        signalStrenghtLayout = AknLayoutScalable_Avkon::signal_pane_g1( 1 );
+
+        AknLayoutUtils::LayoutControl( iSignalIconControl,
+                                       parent,
+                                       signalIconLayout);
+        AknLayoutUtils::LayoutControl( iSignalStrengthControl,
+                                       parent,
+                                       signalStrenghtLayout );
+        }
+    else if ( AknStatuspaneUtils::SmallLayoutActive() )
+        {
+        //  Signal pane in SMALL STATUSPANE, only icon shown.
+        signalIconLayout = AknLayoutScalable_Avkon::status_small_pane_g2( 0 );
+        AknLayoutUtils::LayoutControl( iSignalIconControl,
+                                       parent,
+                                       signalIconLayout );
+        iSignalStrengthControl->SetRect( TRect( 0, 0, 0, 0 ) );
+        }
+    else
+        {
+        // Signal pane in NORMAL or WIDESCREEN STATUS PANE.
+        TBool hdLayout( AknStatuspaneUtils::HDLayoutActive() );
+        signalIconLayout =
+            AknLayoutScalable_Avkon::signal_pane_g2( hdLayout ? 2 : 0 );
+        signalStrenghtLayout =
+            AknLayoutScalable_Avkon::signal_pane_g1( hdLayout ? 2 : 0 );
+
+        AknLayoutUtils::LayoutControl( iSignalIconControl,
+                                       parent,
+                                       signalIconLayout );
+
+        AknLayoutUtils::LayoutControl( iSignalStrengthControl,
+                                       parent,
+                                       signalStrenghtLayout );
+        }
+
+    TInt iconColorIndex = 0;
+    if ( AknStatuspaneUtils::StaconPaneActive() ||
+         AknStatuspaneUtils::FlatLayoutActive() )
+        {
+        iconColorIndex = EAknsCIQsnIconColorsCG23;
+        }
+    else
+        {
+        iconColorIndex = EAknsCIQsnIconColorsCG5;
+        }
+
+    TRAP_IGNORE( LoadSignalIconL( iSignalState, iconColorIndex ) );
+
+    AknsUtils::RegisterControlPosition( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::PositionChanged
+// Handles position change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::PositionChanged()
+    {
+    AknsUtils::RegisterControlPosition( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::Draw
+// Draws the signal pane.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::Draw( const TRect& /*aRect*/ ) const
+    {
+    if ( iExtension->iIsActiveIdle )
+        {
+        return;
+        }
+
+    if ( AknStatuspaneUtils::StaconPaneActive() )
+        {
+        //  Signal pane in STACON PANE layout
+        DrawInStaconPane( Rect() );
+        }
+    else if ( AknStatuspaneUtils::FlatLayoutActive() )
+        {
+        //  Signal pane in FLAT STATUSPANE layout
+        DrawInFlatStatusPane( Rect() );
+        }
+    else if ( AknStatuspaneUtils::SmallLayoutActive() )
+        {
+        //  Signal pane in SMALL STATUSPANE layout
+        DrawInSmallStatusPane( Rect() );
+        }
+    else
+        {
+        // Signal pane in NORMAL STATUSPANE layout
+        DrawInNormalStatusPane( Rect() );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::TickerCallback
+// Static callback function for signal state animation timer.
+// ---------------------------------------------------------------------------
+//
+TInt CAknSignalPane::TickerCallback( TAny* aThis )
+    {
+    return static_cast<CAknSignalPane*>( aThis )->DoTick();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DoTick
+// Callback function for signal state animation timer.
+// ---------------------------------------------------------------------------
+//
+TInt CAknSignalPane::DoTick()
+    {
+    if ( iExtension->CdmaSignalIconInUse() )
+        {
+        // tick used for cdma animation
+        iExtension->CdmaSignalAnimate();
+        iSignalIconControl->SetSignalIcon( iExtension->CdmaSignalIcon() );
+        iSignalIconControl->SetSignalIconMask( iExtension->CdmaSignalIcon() );
+        }
+    else
+        {
+        // default tick blinks icon
+        iSignalIconControl->SetDrawBlank( !iSignalIconControl->DrawBlank() );
+        }
+
+    // Must be DrawDeferred (not DrawNow) so that we don't block
+    // application thread in high load situations.
+    DrawDeferred();
+
+    return ETrue;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::HandleResourceChange
+// Handles resource change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+
+    if ( aType == KEikDynamicLayoutVariantSwitch )
+        {
+        DrawDeferred();
+        }
+
+    if ( aType == KEikColorResourceChange || aType == KAknsMessageSkinChange )
+        {
+        if ( iSignalIconControl )
+            {
+            iSignalIconControl->SetColorIndex( 0 ); // reset skin color
+            }
+        SizeChanged(); // Sizechanged updates the color
+        DrawDeferred();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::SetNaviPaneBackgroundType
+// Not used anymore.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::SetNaviPaneBackgroundType( TInt /*aType*/ )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DrawInNormalStatusPane
+// Draws the signal pane in normal status pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::DrawInNormalStatusPane( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+    TRect rect( Rect() );
+
+    // Solid or wipe comes from background
+    if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) )
+        {
+        // Default drawing if skinning is not available
+        gc.Clear( rect );
+        // Default solid
+        gc.SetPenStyle( CGraphicsContext::ENullPen );
+        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        gc.SetBrushColor(
+            AKN_LAF_COLOR( KStatusPaneBackgroundGraphicsColorUsual ) );
+        gc.DrawRect( rect );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DrawInSmallStatusPane
+// Draws the signal pane in small status pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::DrawInSmallStatusPane( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+    TRect rect( Rect() );
+
+    if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) )
+        {
+        gc.Clear( rect );
+        // If there is no background, draw navi pane part
+        gc.SetPenStyle( CGraphicsContext::ENullPen );
+        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        gc.SetBrushColor(
+            AKN_LAF_COLOR( KStatusPaneBackgroundGraphicsColorUsual ) );
+        gc.DrawRect( rect );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DrawInStaconPane
+// Draws the signal pane in stacon pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::DrawInStaconPane( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+    TRect rect( Rect() );
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+    if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) )
+        {
+        gc.SetPenStyle( CGraphicsContext::ENullPen );
+        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        gc.SetBrushColor(
+            AKN_LAF_COLOR( KStatusPaneBackgroundGraphicsColorUsual ) );
+        gc.DrawRect( rect );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::DrawInFlatStatusPane
+// Draws the signal pane in flat status pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::DrawInFlatStatusPane( const TRect& /*aRect*/ ) const
+    {
+    CWindowGc& gc = SystemGc();
+    TRect rect( Rect() );
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+    if( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) )
+        {
+        gc.SetPenStyle( CGraphicsContext::ENullPen );
+        gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+        gc.SetBrushColor(
+            AKN_LAF_COLOR( KStatusPaneBackgroundGraphicsColorUsual ) );
+        gc.DrawRect( rect );
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowCommonPacketDataIcon
+// Displays a common packet data state icon.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ShowCommonPacketDataIcon(
+    TInt aCommonPacketDataIconState )
+    {
+    // State is not changed if illegal value was given.
+    if ( aCommonPacketDataIconState >= EAknSignalCommonPacketDataIndicatorOff &&
+         aCommonPacketDataIconState <= EAknSignalCommonPacketDataIndicatorMultipdp )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aCommonPacketDataIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iSignalIconControl->SetDrawBlank( EFalse );
+
+        if ( aCommonPacketDataIconState != EAknSignalCommonPacketDataIndicatorEstablishingContext &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+        else if ( aCommonPacketDataIconState == EAknSignalCommonPacketDataIndicatorEstablishingContext )
+            {
+            if ( iTicker && !iTicker->IsActive() )
+                {
+                iTicker->Start( KAknIndicatorAnimationDelay,
+                                KAknIndicatorAnimationInterval,
+                                TCallBack( TickerCallback, this ) );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowEdgeIcon
+// Displays an EDGE state icon.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ShowEdgeIcon( TInt aEdgeIconState )
+    {
+    // State is not changed if illegal value was given.
+    if ( aEdgeIconState >= EAknSignalEdgeIndicatorOff &&
+         aEdgeIconState <= EAknSignalEdgeIndicatorMultipdp )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aEdgeIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iSignalIconControl->SetDrawBlank( EFalse );
+
+        if ( aEdgeIconState != EAknSignalEdgeIndicatorEstablishingContext &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+        else if ( aEdgeIconState == EAknSignalEdgeIndicatorEstablishingContext )
+            {
+            if ( iTicker && !iTicker->IsActive() )
+                {
+                iTicker->Start( KAknIndicatorAnimationDelay,
+                                KAknIndicatorAnimationInterval,
+                                TCallBack( TickerCallback, this ) );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowWcdmaIcon
+// Displays a WCDMA state icon.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ShowWcdmaIcon( TInt aWcdmaIconState )
+    {
+    // State is not changed if illegal value was given.
+    if ( aWcdmaIconState >= EAknSignalWcdmaIndicatorOff &&
+         aWcdmaIconState <= EAknSignalWcdmaIndicatorSuspended )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aWcdmaIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iSignalIconControl->SetDrawBlank( EFalse );
+
+        if ( aWcdmaIconState != EAknSignalWcdmaIndicatorEstablishingContext &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+        else if ( aWcdmaIconState == EAknSignalWcdmaIndicatorEstablishingContext )
+            {
+            if ( iTicker && !iTicker->IsActive() )
+                {
+                iTicker->Start( KAknIndicatorAnimationDelay,
+                                KAknIndicatorAnimationInterval,
+                                TCallBack( TickerCallback, this ) );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowHsdpaIcon
+// Displays an HSDPA state icon.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknSignalPane::ShowHsdpaIcon( TInt aHsdpaIconState )
+    {
+    // State is not changed if illegal value was given.
+    if ( aHsdpaIconState >= EAknSignalHsdpaIndicatorOff &&
+         aHsdpaIconState <= EAknSignalHsdpaIndicatorMultipdp )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aHsdpaIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iSignalIconControl->SetDrawBlank( EFalse );
+
+        if ( aHsdpaIconState != EAknSignalHsdpaIndicatorEstablishingContext &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+        else if ( aHsdpaIconState == EAknSignalHsdpaIndicatorEstablishingContext )
+            {
+            if ( iTicker && !iTicker->IsActive() )
+                {
+                iTicker->Start( KAknIndicatorAnimationDelay,
+                                KAknIndicatorAnimationInterval,
+                                TCallBack( TickerCallback, this ) );
+                }
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::ShowCdmaIcon
+// Displays a CDMA state icon.
+// ---------------------------------------------------------------------------
+//
+#ifdef __PROTOCOL_CDMA
+EXPORT_C void CAknSignalPane::ShowCdmaIcon( TInt aCdmaIconState )
+    {
+    // Cdma state is not changed if illegal value was given, or if there was no change
+    if ( aCdmaIconState >= EAknSignalCdmaIndicatorOff &&
+         aCdmaIconState <= EAknSignalCdmaIndicatorReceiving &&
+         aCdmaIconState != iExtension->iCdmaSignalState )
+        {
+        TRAP_IGNORE( LoadSignalIconL( aCdmaIconState,
+                                      iSignalIconControl->ColorIndex() ) );
+
+        iExtension->iCdmaSignalState = aCdmaIconState;
+
+        // Tick timer is only used when animating.
+        if ( aCdmaIconState != EAknSignalCdmaIndicatorSending &&
+             aCdmaIconState != EAknSignalCdmaIndicatorReceiving &&
+             iTicker )
+            {
+            iTicker->Cancel();
+            }
+
+        switch ( aCdmaIconState )
+            {
+            case EAknSignalCdmaIndicatorSending:
+            case EAknSignalCdmaIndicatorReceiving:
+                if ( iTicker && !iTicker->IsActive() )
+                    {
+                    // restart animation
+                    iExtension->iCdmaAnimationIndex = 0;
+                    iTicker->Start( KAknIndicatorShortAnimationInterval,
+                                    KAknIndicatorShortAnimationInterval,
+                                    TCallBack( TickerCallback, this ) );
+                    }
+                break;
+            default:
+                break;
+            }
+        }
+    }
+#else
+EXPORT_C void CAknSignalPane::ShowCdmaIcon(TInt /*aCdmaIconState*/ )
+    {
+    }
+#endif // __PROTOCOL_CDMA
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::CountComponentControls
+// Returns the amount of component controls.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknSignalPane::CountComponentControls() const
+    {
+    return 2;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::ComponentControl
+// Gets a component control by a control index.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCoeControl* CAknSignalPane::ComponentControl( TInt aIndex ) const
+    {
+    CCoeControl* control = NULL;
+
+    switch ( aIndex )
+        {
+        case 0:
+            {
+            control = iSignalStrengthControl;
+            break;
+            }
+        case 1:
+            {
+            control = iSignalIconControl;
+            break;
+            }
+        }
+
+    return control;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CAknControl.
+// CAknSignalPane::ExtensionInterface
+// Not implemented.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void* CAknSignalPane::ExtensionInterface( TUid /*aInterface*/ )
+    {
+    return NULL;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CCoeControl.
+// CAknSignalPane::HandlePointerEventL()
+// Processes signal pane's pointer events. Actually this does nothing yet
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+    if ( AknLayoutUtils::PenEnabled() )
+        {
+        if ( IsDimmed() )
+            {
+            iPrivateFlags &= (~EAknSignalPaneButton1DownInSignalRect);
+            return;
+            }
+
+        // Get rect of signal pane.
+        TRect rect( Rect() );
+
+        // Switch by type
+        switch ( aPointerEvent.iType )
+            {
+            case TPointerEvent::EButton1Down:
+                {
+                // if signal pane's rect contains pointer down position
+                if ( rect.Contains( aPointerEvent.iPosition ) )
+                    {
+                    // set flag that down was inside signal pane
+                    iPrivateFlags |= EAknSignalPaneButton1DownInSignalRect;
+                    }
+                }
+                break;
+
+            case TPointerEvent::EButton1Up:
+                {
+                // if signalPane's rect contains pointer down position
+                if ( iPrivateFlags&EAknSignalPaneButton1DownInSignalRect &&
+                     rect.Contains( aPointerEvent.iPosition ) )
+                    {
+                    // Up happened inside signal pane's rect
+                    // activate something
+                    }
+
+                // Up happened, reset button down flag
+                iPrivateFlags &= (~EAknSignalPaneButton1DownInSignalRect);
+                }
+                break;
+
+            default:
+                break;
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::SetContainerWindowNonFading
+// Allows/disallows fading of signal pane.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::SetContainerWindowNonFading( TBool aNonFading )
+    {
+    CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current();
+    if ( statusPane )
+        {
+        CCoeControl* control = NULL;
+        TRAP_IGNORE(
+            control = statusPane->ContainerControlL(
+                TUid::Uid( EEikStatusPaneUidSignal ) ) );
+        if ( control )
+            {
+            control->DrawableWindow()->SetNonFading( aNonFading );
+            }
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// CAknSignalPane::LoadSignalIconL
+// Changes the signal state icon of the signal icon control.
+// ---------------------------------------------------------------------------
+//
+void CAknSignalPane::LoadSignalIconL( TInt aIconState, TInt aIconColorIndex )
+    {
+    if ( iSignalIconControl )
+        {
+        iSignalIconControl->LoadIconL( aIconState, aIconColorIndex );
+        }
+
+    iSignalState = aIconState;
+    }
+
+//  End of File