diff -r 924385140d98 -r c2c61fdca848 coreapplicationuis/powersaveutilities/batterypopupcontrol/src/batterypopupcontrol.cpp --- /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 +#include +#include +#include +#include // TResourceReader +#include +#include +#include +#include +#include +#include +#include // KDC_RESOURCE_FILES_DIR +#include +// ----------- Touch feedback additions start +#ifdef RD_TACTILE_FEEDBACK +#include +#endif //RD_TACTILE_FEEDBACK +// ----------- Touch feedback additions end +#include +#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