--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/uifw/AvKon/src/aknbattery.cpp Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,583 @@
+/*
+* 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 battery pane.
+*
+*/
+
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <barsread.h>
+#include <avkon.mbg>
+#include <AknsDrawUtils.h>
+#include <eikspane.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <layoutmetadata.cdl.h>
+
+#include <AknTasHook.h>
+#include "AknUtils.h"
+#include "aknconsts.h"
+#include "AknBattery.h"
+#include "AknStatuspaneUtils.h"
+#include "AknBatteryIcon.h"
+#include "AknBatteryStrength.h"
+#include "aknappui.h"
+#include "AknDef.h"
+#include "aknbatterydataobserver.h"
+
+
+// Flags for battery pane
+enum TBatteryPaneControlFlags
+ {
+ EAknBatteryPaneButton1DownInBatteryRect = 0x00000001
+ };
+
+// Battery recharge animation frame interval.
+const TInt KBatteryRechargeTick = 500000; // 0.5 seconds
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::CAknBatteryPane
+// Default constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknBatteryPane::CAknBatteryPane()
+ {
+ AKNTASHOOK_ADD( this, "CAknBatteryPane" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::~CAknBatteryPane
+// Destructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CAknBatteryPane::~CAknBatteryPane()
+ {
+ AKNTASHOOK_REMOVE();
+ AknsUtils::DeregisterControlPosition( this );
+
+ delete iBatteryIconControl;
+ delete iBatteryStrengthControl;
+
+ if ( iTicker )
+ {
+ iTicker->Cancel();
+ }
+
+ delete iTicker;
+ delete iDataObserver;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::ConstructL
+// Second-phase constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::ConstructL()
+ {
+ iBatteryIconControl = CAknBatteryIcon::NewL();
+ iBatteryIconControl->SetContainerWindowL( *this );
+ iBatteryStrengthControl = CAknBatteryStrength::NewL();
+ iBatteryStrengthControl->SetContainerWindowL( *this );
+ iPrivateFlags = 0; // reset flags
+ iDataObserver = new (ELeave) CAknBatteryDataObserver( this );
+ iIsActiveIdle = AknStatuspaneUtils::IsActiveIdle();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::ConstructFromResourceL
+// Resource constructor.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::ConstructFromResourceL(
+ TResourceReader& aReader )
+ {
+ ConstructL();
+ SetBatteryLevel( aReader.ReadInt16() ); // Initial battery level.
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SetBatteryLevel
+// Sets the battery level.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::SetBatteryLevel( TInt aLevel )
+ {
+ iBatteryLevel = aLevel;
+
+ if ( !iBatteryStrengthControl->Recharging() )
+ {
+ iBatteryStrengthControl->SetBatteryLevel( aLevel );
+ DrawDeferred();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::BatteryLevel
+// Returns the current battery level.
+// ---------------------------------------------------------------------------
+//
+TInt CAknBatteryPane::BatteryLevel()
+ {
+ return iBatteryLevel;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SetRecharge
+// Sets the recharging state on/off.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::SetRecharge( TBool aRecharging )
+ {
+ if ( aRecharging )
+ {
+ if ( !iBatteryStrengthControl->Recharging() )
+ {
+ if ( !iTicker )
+ {
+ TRAP_IGNORE( iTicker = CPeriodic::NewL(
+ CActive::EPriorityLow ) );
+ }
+ else
+ {
+ iTicker->Cancel();
+ }
+
+ if ( iTicker )
+ {
+ iTicker->Start( KBatteryRechargeTick,
+ KBatteryRechargeTick,
+ TCallBack( TickerCallback, this ) );
+ }
+ }
+ }
+
+ iBatteryStrengthControl->SetRecharging( aRecharging );
+
+ if ( !iBatteryStrengthControl->Recharging() )
+ {
+ SetBatteryLevel( iBatteryLevel ); // Set battery level to right value.
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::Recharging
+// Returns the current recharging state.
+// ---------------------------------------------------------------------------
+//
+TBool CAknBatteryPane::Recharging()
+ {
+ if ( iBatteryStrengthControl )
+ {
+ return iBatteryStrengthControl->Recharging();
+ }
+ else
+ {
+ return EFalse;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::BatteryState
+// Returns the current battery state.
+// ---------------------------------------------------------------------------
+//
+TInt CAknBatteryPane::BatteryState()
+ {
+ if ( iBatteryIconControl )
+ {
+ return iBatteryIconControl->IconState();
+ }
+ else
+ {
+ return KErrNotFound;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SetBatteryStateL
+// Sets the battery state.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::SetBatteryStateL( TInt aState )
+ {
+ // Change battery icon only if the new state is
+ // different than the current one.
+ if ( iBatteryIconControl &&
+ iBatteryIconControl->IconState() != aState )
+ {
+ iBatteryIconControl->SetBatteryIconL( aState );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::TickerCallback
+// Static callback function for recharge animation timer.
+// ---------------------------------------------------------------------------
+//
+TInt CAknBatteryPane::TickerCallback( TAny* aThis )
+ {
+ return static_cast<CAknBatteryPane*>( aThis )->DoTick();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::DoTick
+// Callback function for recharge animation timer.
+// ---------------------------------------------------------------------------
+//
+TInt CAknBatteryPane::DoTick()
+ {
+ if ( !iBatteryStrengthControl->Recharging() )
+ {
+ iTicker->Cancel();
+ return EFalse;
+ }
+
+ TInt newLevel = iBatteryStrengthControl->BatteryLevel() + 1;
+
+ if ( newLevel > KBatteryLevelMax )
+ {
+ newLevel = KBatteryLevelMin;
+ }
+
+ iBatteryStrengthControl->SetBatteryLevel( newLevel );
+ DrawDeferred(); // Must be DrawDeferred (not DrawNow) so that we don't
+ // block application thread in high load situations
+ return ETrue;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SizeChanged
+// Handles size change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::SizeChanged()
+ {
+ // No fading if staconpane is active.
+ SetContainerWindowNonFading( AknStatuspaneUtils::StaconPaneActive() );
+
+ TAknWindowComponentLayout batteryIconLayout;
+ TAknWindowComponentLayout batteryStrenghtLayout;
+
+ TRect parent( Rect() );
+
+ if ( AknStatuspaneUtils::StaconPaneActive() )
+ {
+ // Battery pane in STACONPANE layout
+ // battery pane in status/controlpane layout used e.g. in landscape modes
+ // layout 0.75 has new varieties
+ TInt varietyIndex = AknStatuspaneUtils::StaconSoftKeysLeft() ? 1 : 0;
+ batteryIconLayout =
+ AknLayoutScalable_Avkon::battery_pane_stacon_g2( varietyIndex );
+ batteryStrenghtLayout =
+ AknLayoutScalable_Avkon::battery_pane_stacon_g1( varietyIndex );
+ }
+ else if ( AknStatuspaneUtils::FlatLayoutActive() )
+ {
+ batteryIconLayout = AknLayoutScalable_Avkon::battery_pane_g2( 1 );
+ batteryStrenghtLayout = AknLayoutScalable_Avkon::battery_pane_g1( 1 );
+ }
+ else if ((AknStatuspaneUtils::CurrentStatusPaneLayoutResId()
+ == R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE ||
+ AknStatuspaneUtils::CurrentStatusPaneLayoutResId()
+ == R_AVKON_STATUS_PANE_LAYOUT_POWER_OFF_RECHARGE_MIRRORED) &&
+ Layout_Meta_Data::IsLandscapeOrientation())
+ {
+ batteryIconLayout = AknLayoutScalable_Avkon::battery_pane_g2(1);
+ batteryStrenghtLayout = AknLayoutScalable_Avkon::battery_pane_g1(1);
+ }
+ else
+ {
+ // Battery pane in NORMAL of WIDESCREEN STATUS PANE layout.
+ TBool hdLayout( AknStatuspaneUtils::HDLayoutActive() );
+ batteryIconLayout =
+ AknLayoutScalable_Avkon::battery_pane_g2( hdLayout ? 2 : 0 );
+ batteryStrenghtLayout =
+ AknLayoutScalable_Avkon::battery_pane_g1( hdLayout ? 2 : 0 );
+ }
+
+ AknLayoutUtils::LayoutControl(
+ iBatteryIconControl, parent, batteryIconLayout );
+
+ AknLayoutUtils::LayoutControl(
+ iBatteryStrengthControl, parent, batteryStrenghtLayout );
+
+ AknsUtils::RegisterControlPosition( this );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SizeChanged
+// Handles position change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::PositionChanged()
+ {
+ AknsUtils::RegisterControlPosition( this );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::Draw
+// Draws the battery pane.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::Draw( const TRect& /*aRect*/ ) const
+ {
+ if ( iIsActiveIdle )
+ {
+ return;
+ }
+
+ if ( AknStatuspaneUtils::StaconPaneActive() )
+ {
+ DrawInStaconPane( Rect() );
+ }
+ else if ( AknStatuspaneUtils::FlatLayoutActive() )
+ {
+ DrawInFlatStatusPane( Rect() );
+ }
+ else
+ {
+ DrawInNormalStatusPane( Rect() );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::HandleResourceChange
+// Handles resource change events.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CAknBatteryPane::HandleResourceChange( TInt aType )
+ {
+ CCoeControl::HandleResourceChange( aType );
+
+ if ( aType == KEikDynamicLayoutVariantSwitch ||
+ aType == KAknsMessageSkinChange )
+ {
+ DrawDeferred();
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::CountComponentControls
+// Returns the amount of component controls.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CAknBatteryPane::CountComponentControls() const
+ {
+ return 2;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::ComponentControl
+// Returns a component control by a control index.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCoeControl* CAknBatteryPane::ComponentControl( TInt aIndex ) const
+ {
+ CCoeControl* control = NULL;
+
+ switch ( aIndex )
+ {
+ case 0:
+ {
+ control = iBatteryStrengthControl;
+ break;
+ }
+ case 1:
+ {
+ control = iBatteryIconControl;
+ break;
+ }
+ }
+
+ return control;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::DrawInNormalStatusPane
+// Draws the battery pane in normal status pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::DrawInNormalStatusPane( const TRect& /*aRect*/ ) const
+ {
+ CWindowGc& gc = SystemGc();
+ TRect rect( Rect() );
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+ MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
+
+ // Solid or wipe comes from background
+ if ( !AknsDrawUtils::Background( skin, cc, this, gc, rect ) )
+ {
+ // Default drawing if skinning is not available
+ gc.Clear( rect );
+ gc.SetPenStyle( CGraphicsContext::ENullPen );
+ gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+ gc.SetBrushColor(
+ AKN_LAF_COLOR( KStatusPaneBackgroundGraphicsColorUsual ) );
+ gc.DrawRect( rect );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::DrawInStaconPane
+// Draws the battery pane in stacon pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::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 );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::DrawInFlatStatusPane
+// Draws the battery pane in flat status pane layout.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::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 );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::ExtensionInterface
+// Not implemented.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void* CAknBatteryPane::ExtensionInterface( TUid /*aInterface*/ )
+ {
+ return NULL;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::HandlePointerEventL
+// Processes battery pane's pointer events. Actually this does nothing yet.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+ {
+ if ( AknLayoutUtils::PenEnabled() )
+ {
+ if ( IsDimmed() )
+ {
+ iPrivateFlags &= (~EAknBatteryPaneButton1DownInBatteryRect);
+ return;
+ }
+
+ // Get the rect of battery pane.
+ TRect rect( Rect() );
+
+ // Switch by type
+ switch ( aPointerEvent.iType )
+ {
+ case TPointerEvent::EButton1Down:
+ {
+ // if battery pane's rect contains pointer down position
+ if ( rect.Contains( aPointerEvent.iPosition ) )
+ {
+ // set flag that pointerdown was inside battery pane
+ iPrivateFlags |= EAknBatteryPaneButton1DownInBatteryRect;
+ }
+ }
+ break;
+
+ case TPointerEvent::EButton1Up:
+ {
+ // if battery pane's rect contains pointer down position and
+ // Button1Down was clicked inside battery rect
+ if ( iPrivateFlags&EAknBatteryPaneButton1DownInBatteryRect &&
+ rect.Contains( aPointerEvent.iPosition ) )
+ {
+ // Up happened inside battery pane's rect
+ // activate something
+ }
+
+ // Up happened, reset button down flag
+ iPrivateFlags &= (~EAknBatteryPaneButton1DownInBatteryRect);
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CAknBatteryPane::SetContainerWindowNonFading
+// Allows/disallows fading of battery pane.
+// ---------------------------------------------------------------------------
+//
+void CAknBatteryPane::SetContainerWindowNonFading( TBool aNonFading )
+ {
+ CEikStatusPaneBase* statusPane = CEikStatusPaneBase::Current();
+ if ( statusPane )
+ {
+ CCoeControl* control = NULL;
+ TRAP_IGNORE( control = statusPane->ContainerControlL(
+ TUid::Uid( EEikStatusPaneUidBattery ) ) );
+ if ( control )
+ {
+ control->DrawableWindow()->SetNonFading( aNonFading );
+ }
+ }
+ }
+
+// End of File