--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/coreapplicationuis/powersaveutilities/batterypopupcontrol/src/batterypopupcontrol.cpp Wed Sep 01 12:24:48 2010 +0100
@@ -0,0 +1,628 @@
+/*
+* Copyright (c) 2007-2010 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: BatteryPopupControl implementation
+*
+*/
+
+
+#include <AknUtils.h>
+#include <AknPanic.h>
+#include <AknPreviewPopUpController.h>
+#include <aknglobalpopupprioritycontroller.h>
+#include <barsread.h> // TResourceReader
+#include <eiklabel.h>
+#include <fbs.h>
+#include <aknappui.h>
+#include <aknlayoutscalable_avkon.cdl.h>
+#include <AknsDrawUtils.h>
+#include <AknBidiTextUtils.h>
+#include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
+#include <batterypopupcontrol.mbg>
+// ----------- Touch feedback additions start
+#ifdef RD_TACTILE_FEEDBACK
+#include <touchfeedback.h>
+#endif //RD_TACTILE_FEEDBACK
+// ----------- Touch feedback additions end
+#include <gulicon.h>
+#include "batterypopupcontrol.h"
+#include "trace.h"
+
+// Constants
+const TInt KPopupShowDelay = 0; // Show immediately
+const TInt KPopupHideDelay = 3000000; // hide after 3 sec
+const TInt KMaxLinkTextLength = 255;
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// Default constructor.
+// -----------------------------------------------------------------------------
+//
+CBatteryPopupControl::CBatteryPopupControl():
+ iHighlightedItem( EFalse )
+ {
+ FUNC_LOG
+ }
+
+// -----------------------------------------------------------------------------
+// CBatteryPopupControl::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CBatteryPopupControl* CBatteryPopupControl::NewL(
+ const TDesC& aContentText,
+ const TDesC& aLinkText )
+ {
+ FUNC_LOG
+ CBatteryPopupControl* self =
+ new ( ELeave ) CBatteryPopupControl();
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aContentText, aLinkText );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CBatteryPopupControl::~CBatteryPopupControl()
+ {
+ FUNC_LOG
+ delete iController;
+ delete iText;
+ delete iIcon;
+ delete iLinkText;
+ }
+
+// -----------------------------------------------------------------------------
+// CBatteryPopupControl::SetCommandObserver
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CBatteryPopupControl::SetCommandObserver(
+ MEikCommandObserver& aCommandObserver )
+ {
+ FUNC_LOG
+ iCommandObserver = &aCommandObserver;
+ }
+
+// -----------------------------------------------------------------------------
+// CBatteryPopupControl::ShowPopUpL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CBatteryPopupControl::ShowPopUpL()
+ {
+ FUNC_LOG
+
+ iController = CAknPreviewPopUpController::NewL( *this, CAknPreviewPopUpController::ELayoutDefault | CAknPreviewPopUpController::EDontClose );
+ iController->AddObserverL( *this );
+
+ // Set popup's hide/show delays
+ iController->SetPopUpShowDelay( KPopupShowDelay );
+ iController->SetPopUpHideDelay( KPopupHideDelay );
+
+ // Position
+ TPoint uipRect;
+ if( AknLayoutUtils::LayoutMetricsPosition(
+ AknLayoutUtils::EBatteryPane, uipRect ) )
+ {
+ iController->SetPosition( uipRect );
+ }
+
+ // Launch
+ iController->ShowPopUp();
+ }
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::HandleResourceChange
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::HandleResourceChange(
+ TInt aType )
+ {
+ FUNC_LOG
+
+ CCoeControl::HandleResourceChange( aType );
+ if ( aType == KEikDynamicLayoutVariantSwitch )
+ {
+ SizeChanged();
+ }
+
+ // Position
+ TPoint uipRect;
+ if( AknLayoutUtils::LayoutMetricsPosition( AknLayoutUtils::EBatteryPane, uipRect ) )
+ {
+ iController->SetPosition( uipRect );
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::SetContainerWindowL
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::SetContainerWindowL(
+ const CCoeControl& aContainer )
+ {
+ FUNC_LOG
+
+ CCoeControl::SetContainerWindowL( aContainer );
+
+ if( iText )
+ {
+ iText->SetContainerWindowL( aContainer );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// From class MCoeControlObserver.
+// CBatteryPopupControl::HandleControlEventL
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::HandleControlEventL(
+ CCoeControl* /*aControl*/,
+ TCoeEvent /*aEventType*/ )
+ {
+ FUNC_LOG
+ }
+// ---------------------------------------------------------------------------
+// From MAknPreviewPopUpObserver
+// ---------------------------------------------------------------------------
+//
+void CBatteryPopupControl::HandlePreviewPopUpEventL(
+ CAknPreviewPopUpController* /*aController*/,
+ TPreviewPopUpEvent aEvent )
+ {
+ FUNC_LOG
+
+ switch ( aEvent )
+ {
+ case EPreviewPopUpShown:
+ AknGlobalPopupPriorityController::ShowPopup( *this, ETrue );
+ break;
+ case EPreviewPopUpHidden:
+ AknGlobalPopupPriorityController::RemovePopupPriority( *this );
+ break;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CAknStylusActivatedPopUpContent::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::ConstructL( const TDesC& aContentText,
+ const TDesC& aLinkText )
+ {
+ FUNC_LOG
+
+ if( aContentText != KNullDesC )
+ {
+ iText = new ( ELeave ) CEikLabel;
+ iText->SetTextL( aContentText );
+ CreateIconL();
+ }
+
+ if( aLinkText != KNullDesC )
+ {
+ // Check if only link is displayed.
+ if( aContentText != KNullDesC )
+ {
+ iVariant = EVariantIconTextLink;
+ }
+ iLinkText = aLinkText.AllocL();
+ }
+
+ TRect rectPopUpWindow = PopUpWindowRectFromLayout(
+ AknLayoutScalable_Avkon::popup_battery_window( iVariant ) );
+
+ TAknWindowComponentLayout infoPaneLayout =
+ AknLayoutScalable_Avkon::bg_popup_sub_pane_cp25( iVariant );
+
+ TRect rectInfoPane = RectFromLayout( rectPopUpWindow, infoPaneLayout );
+
+ TAknTextComponentLayout textLayout =
+ AknLayoutScalable_Avkon::popup_battery_window_t1( iVariant );
+ TAknLayoutText textRect;
+ textRect.LayoutText( rectPopUpWindow, textLayout );
+
+ // Font for command links
+ iFont = textRect.Font();
+ }
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::ComponentControl
+// -----------------------------------------------------------------------------
+//
+CCoeControl* CBatteryPopupControl::ComponentControl(
+ TInt aIndex ) const
+ {
+ FUNC_LOG
+ switch ( aIndex )
+ {
+ case 0:
+ {
+ if( iText )
+ {
+ return iText;
+ }
+ }
+ default:
+ __ASSERT_ALWAYS( aIndex >= 0, User::Panic(
+ _L("CBatteryPopupControl::ComponentControl"), EAknPanicOutOfRange ) );
+ return NULL;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::CountComponentControls
+// -----------------------------------------------------------------------------
+//
+TInt CBatteryPopupControl::CountComponentControls() const
+ {
+ FUNC_LOG
+ TInt count = 0;
+
+ if( iText )
+ {
+ count++;
+ }
+
+ return count;
+ }
+
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::Draw
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::Draw( const TRect& /*aRect*/ ) const
+ {
+ FUNC_LOG
+
+ CWindowGc& gc = SystemGc();
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ if( iIcon )
+ {
+ TRgb color( KRgbWhite ); // Default never used
+
+ AknsUtils::GetCachedColor( skin, color,
+ KAknsIIDQsnIconColors, EAknsCIQsnIconColorsCG6 );
+
+ if (AknIconUtils::IsMifIcon(iIcon->Bitmap()))
+ {
+ AknIconUtils::SetIconColor( iIcon->Bitmap(), color );
+ }
+
+ AknIconUtils::SetSize( iIcon->Bitmap(), iBitmapLayout.Rect().Size() );
+ iBitmapLayout.DrawImage( gc, iIcon->Bitmap(), iIcon->Mask() );
+
+ gc.Reset();
+ }
+
+ gc.SetPenStyle( CGraphicsContext::ESolidPen );
+ const CFont* font = iFont;
+ if ( !font )
+ {
+ font = iCoeEnv->NormalFont();
+ }
+ gc.UseFont( font );
+
+ if(iText)
+ {
+ TRect rect( iLinkRect );
+ TRgb textContentColor;
+ TInt err = AknsUtils::GetCachedColor( skin, textContentColor, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG6 );
+
+ if (!err)
+ {
+ TRAP_IGNORE( AknLayoutUtils::OverrideControlColorL( *iText,
+ EColorLabelText, textContentColor ) );
+ }
+
+ gc.SetPenColor( textContentColor );
+
+ TInt textBaseLineOffset = 0;
+ textBaseLineOffset = (rect.Height() - font->FontMaxHeight())/2;
+ gc.DrawText( *(iText->Text()), rect, textBaseLineOffset, iAlign );
+ //gc.Reset();
+
+ }
+
+ TRgb textColor;
+ AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnHighlightColors,
+ EAknsCIQsnHighlightColorsCG3 );
+
+ gc.SetPenColor( textColor );
+ gc.SetUnderlineStyle( EUnderlineOn );
+ if(iLinkText)
+ {
+ TRect rect( iLinkRect );
+ if ( Background() )
+ {
+ Background()->Draw( gc, *this, rect );
+ }
+
+ // buffer for visually ordered text
+ HBufC* visualText = NULL;
+ TRAPD( err, visualText = HBufC::NewL( KMaxLinkTextLength +
+ KAknBidiExtraSpacePerLine ) );
+ if ( err != KErrNone )
+ {
+ return;
+ }
+ TPtr ptr = visualText->Des();
+ TInt clipWidth = rect.Width();
+
+ if ( iHighlightedItem )
+ {
+ TRgb highlightcolor = AKN_LAF_COLOR( 244 );
+ AknsUtils::GetCachedColor( skin, highlightcolor,
+ KAknsIIDQsnHighlightColors, EAknsCIQsnHighlightColorsCG1 );
+
+ gc.SetBrushColor( highlightcolor );
+ gc.SetBrushStyle( CGraphicsContext::ESolidBrush );
+ }
+ else
+ {
+ gc.SetBrushStyle( CGraphicsContext::ENullBrush );
+ }
+
+ // bidi processing - using AknBidiTextUtils.
+ AknBidiTextUtils::ConvertToVisualAndClip(
+ *(iLinkText),
+ ptr,
+ *font,
+ clipWidth,
+ clipWidth );
+
+ TInt baselineOffset = 0;
+ baselineOffset = font->AscentInPixels() +
+ ( rect.Height() - font->AscentInPixels() ) / 2;
+ gc.DrawText( ptr, rect, baselineOffset,
+ iAlign );
+ delete visualText;
+ }
+ }
+
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::MinimumSize
+// -----------------------------------------------------------------------------
+//
+TSize CBatteryPopupControl::MinimumSize()
+ {
+ FUNC_LOG
+ TInt nbrOfInfoLines = 0;
+ TInt minWidth = 0;
+
+ if( iText )
+ {
+ nbrOfInfoLines = iText->NumberOfLines();
+ CEikLabel* textLabel;
+ for ( TInt i=0; i < nbrOfInfoLines; i++ )
+ {
+ textLabel = iText;
+ TPtrC ptrText = ( *textLabel->Text() );
+ minWidth = Max( textLabel->CalcMinimumSize( ptrText ).iWidth, minWidth );
+ }
+ }
+ if(iLinkText)
+ {
+ TInt tempWidth = iFont->TextWidthInPixels( *( iLinkText ) );
+ minWidth = Max( minWidth, tempWidth );
+ }
+ TInt rectWidth = 0;
+
+ TAknWindowComponentLayout infoPaneLayout =
+ AknLayoutScalable_Avkon::bg_popup_sub_pane_cp25( iVariant );
+
+ TRect rectPopUpWindow = PopUpWindowRectFromLayout(
+ AknLayoutScalable_Avkon::popup_battery_window( iVariant ) );
+
+ TRect rectInfoPane = RectFromLayout( rectPopUpWindow, infoPaneLayout );
+
+ rectWidth = Max( rectInfoPane.Width(), minWidth );
+
+ TInt rectHeight = rectInfoPane.Height();
+
+ return TSize( rectWidth, rectHeight );
+ }
+
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl.
+// CBatteryPopupControl::SizeChanged
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::SizeChanged()
+ {
+ FUNC_LOG
+ // Get popup window rect
+ TRect rectPopUpWindow = PopUpWindowRectFromLayout(
+ AknLayoutScalable_Avkon::bg_popup_sub_pane_cp25( iVariant ) );
+
+ // Get pane icon and text layouts
+ TAknWindowLineLayout paneIconLayout(
+ AknLayoutScalable_Avkon::popup_battery_window_g1(iVariant));
+
+ //Set icon and text rects
+ if( iIcon )
+ {
+ iBitmapLayout.LayoutRect( rectPopUpWindow, paneIconLayout );
+ }
+
+ if( iText )
+ {
+ TAknTextComponentLayout textLayout =
+ AknLayoutScalable_Avkon::popup_battery_window_t1( iVariant );
+
+ AknLayoutUtils::LayoutLabel(iText, rectPopUpWindow, textLayout);
+
+ }
+
+ // Set link text rect
+ if( iLinkText )
+ {
+ TAknLayoutText linkLayoutText;
+ // popup_battery_window_t2 doesn't have other variants as EVariantIconTextLink
+ linkLayoutText.LayoutText( rectPopUpWindow,
+ AknLayoutScalable_Avkon::popup_battery_window_t2( EVariantIconTextLink ) );
+
+ iAlign = linkLayoutText.Align();
+
+ iFont = linkLayoutText.Font();
+
+ TInt tempWidth = iFont->TextWidthInPixels( *(iLinkText) );
+ TRect tempRect;
+
+ if( iText )
+ {
+ tempRect = TRect( linkLayoutText.TextRect() );
+ }
+ else
+ {
+ TAknLayoutRect linkLayout;
+
+ linkLayout.LayoutRect( rectPopUpWindow, paneIconLayout );
+
+ tempRect = TRect( linkLayout.Rect() );
+ }
+
+ if( iAlign == CGraphicsContext::ERight )
+ {
+ tempRect.iTl.iX = tempWidth - tempRect.iBr.iX;
+ }
+ else
+ {
+ tempRect.SetWidth( tempWidth );
+ }
+
+
+ iLinkRect = tempRect;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// RectFromLayout
+// -----------------------------------------------------------------------------
+//
+TRect CBatteryPopupControl::RectFromLayout( const TRect& aParent,
+ const TAknWindowComponentLayout& aComponentLayout ) const
+ {
+ TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
+ TAknLayoutRect layoutRect;
+ layoutRect.LayoutRect( aParent, lineLayout );
+ return layoutRect.Rect();
+ }
+
+// -----------------------------------------------------------------------------
+// PopUpWindowRectFromLayout
+// -----------------------------------------------------------------------------
+//
+TRect CBatteryPopupControl::PopUpWindowRectFromLayout( const
+ TAknWindowComponentLayout& aComponentLayout ) const
+ {
+ FUNC_LOG
+ // get popup window width from the widest variety
+ TAknWindowLineLayout lineLayout = aComponentLayout.LayoutLine();
+
+ lineLayout.iW = AknLayoutScalable_Avkon::
+ popup_battery_window( iVariant ).LayoutLine().iW;
+ TAknLayoutRect layoutRect;
+ layoutRect.LayoutRect( iAvkonAppUi->ApplicationRect(), lineLayout );
+
+ return layoutRect.Rect();
+ }
+
+// -----------------------------------------------------------------------------
+// From class CCoeControl
+// CBatteryPopupControl::HandlePointerEventL
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::HandlePointerEventL(
+ const TPointerEvent& aPointerEvent )
+ {
+ FUNC_LOG
+ if(iLinkText)
+ {
+ if ( iLinkRect.Contains( aPointerEvent.iPosition ) )
+ {
+ if ( !iHighlightedItem )
+ {
+ iHighlightedItem = ETrue;
+ DrawNow( iLinkRect );
+ }
+#ifdef RD_TACTILE_FEEDBACK
+ if ( aPointerEvent.iType == TPointerEvent::EButton1Down )
+ {
+ MTouchFeedback* feedback = MTouchFeedback::Instance();
+
+ if ( feedback )
+ {
+ feedback->InstantFeedback( ETouchFeedbackBasic );
+ }
+ }
+#endif // RD_TACTILE_FEEDBACK
+ // Nofity command observer
+ if ( aPointerEvent.iType == TPointerEvent::EButton1Up )
+ {
+ iCommandObserver->ProcessCommandL( ELinkFirst );
+ iHighlightedItem = EFalse;
+ }
+ }
+ else
+ {
+ if ( iHighlightedItem )
+ {
+ iHighlightedItem = EFalse;
+ DrawNow( iLinkRect );
+ }
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CBatteryPopupControl::CreateIconL()
+//
+//
+// -----------------------------------------------------------------------------
+//
+void CBatteryPopupControl::CreateIconL( )
+ {
+ FUNC_LOG
+
+ TParse* fp = new( ELeave ) TParse();
+ CleanupStack::PushL( fp );
+ _LIT( KBIPPluginIconDirAndName, "z:\\resource\\apps\\batterypopupcontrol.mif");
+ fp->Set( KBIPPluginIconDirAndName, &KDC_BITMAP_DIR, NULL );
+
+ delete iIcon;
+ iIcon = NULL;
+
+ iIcon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
+ KAknsIIDQgnPropBatteryIcon,
+ fp->FullName(),
+ EMbmBatterypopupcontrolQgn_prop_battery_ps_deactivate,
+ EMbmBatterypopupcontrolQgn_prop_battery_ps_deactivate_mask );
+
+ CleanupStack::PopAndDestroy( fp );
+ }
+// End of File