diff -r 0396474f30f5 -r 4ce476e64c59 emailuis/uicomponents/src/cuicscrollbar.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/uicomponents/src/cuicscrollbar.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,457 @@ +/* +* Copyright (c) 2007-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: cuicscrollbar.cpp +* +*/ + +#include "cuicscrollbar.h" +#include "emailtrace.h" + +#include +#include +#include +#include +#include +#include + +// Constants + +// Scroll bar opacity (visible) +const TReal32 KVisibleOpacity = 1.0f; +// Thumb opacity (visible) +const TReal32 KVisibleOpacityThumb = 0.85f; +// Background opacity (visible) +const TReal32 KVisibleOpacityBackground = 0.65f; +// How long scrollbar will be visible after change +const TReal32 KVisibleTimeout = 500; +// How long fading will take +const TReal32 KFadeTimeout = 500; +// Width of the scrollbar (this will be replaced with value from layout) +const TInt KScrollBarWidth = 18; + +// CUiCCompositeImage + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::NewL +// --------------------------------------------------------------------------- +// +CUiCCompositeImage* CUiCCompositeImage::NewL( CAlfControl& aControl, + CAlfLayout* aParentLayout, CAlfTexture& aTop, + CAlfTexture& aMiddle, CAlfTexture& aBottom ) + { + FUNC_LOG; + CUiCCompositeImage* self = new (ELeave) CUiCCompositeImage(); + CleanupStack::PushL( self ); + self->ConstructL( aControl, aParentLayout, aTop, aMiddle, aBottom ); + CleanupStack::Pop(); // self + return self; + } + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::~CUiCCompositeImage +// --------------------------------------------------------------------------- +// +CUiCCompositeImage::~CUiCCompositeImage() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::Layout +// --------------------------------------------------------------------------- +// +CAlfLayout& CUiCCompositeImage::Layout() + { + FUNC_LOG; + return *iLayout; + } + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::CUiCCompositeImage +// --------------------------------------------------------------------------- +// +CUiCCompositeImage::CUiCCompositeImage() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::ConstructL +// --------------------------------------------------------------------------- +// +void CUiCCompositeImage::ConstructL( CAlfControl& aControl, CAlfLayout* aParentLayout, + CAlfTexture& aTop, CAlfTexture& aMiddle, CAlfTexture& aBottom ) + { + FUNC_LOG; + iLayout = CAlfAnchorLayout::AddNewL( aControl, aParentLayout ); + iTop = CAlfImageVisual::AddNewL( aControl, iLayout ); + iTop->SetImage( TAlfImage( aTop ) ); + iMiddle = CAlfImageVisual::AddNewL( aControl, iLayout ); + iMiddle->SetImage( TAlfImage( aMiddle ) ); + iBottom = CAlfImageVisual::AddNewL( aControl, iLayout ); + iBottom->SetImage( TAlfImage( aBottom ) ); + SetAnchors(); + } + +// --------------------------------------------------------------------------- +// CUiCCompositeImage::SetAnchors +// --------------------------------------------------------------------------- +// +void CUiCCompositeImage::SetAnchors() + { + FUNC_LOG; + // iTop + iLayout->SetAnchor( + EAlfAnchorTopLeft, 0, + EAlfAnchorOriginLeft, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, 0 ) ); + iLayout->SetAnchor( + EAlfAnchorBottomRight, 0, + EAlfAnchorOriginRight, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, KScrollBarWidth ) ); + + // iMiddle + iLayout->SetAnchor( + EAlfAnchorTopLeft, 1, + EAlfAnchorOriginLeft, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, KScrollBarWidth ) ); + iLayout->SetAnchor( + EAlfAnchorBottomRight, 1, + EAlfAnchorOriginRight, EAlfAnchorOriginBottom, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, -KScrollBarWidth ) ); + + // iBottom + iLayout->SetAnchor( + EAlfAnchorTopLeft, 2, + EAlfAnchorOriginLeft, EAlfAnchorOriginBottom, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, -KScrollBarWidth ) ); + iLayout->SetAnchor( + EAlfAnchorBottomRight, 2, + EAlfAnchorOriginRight, EAlfAnchorOriginBottom, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, 0 ) ); + + iLayout->UpdateChildrenLayout(); + } + +// CUiCScrollBar + +// --------------------------------------------------------------------------- +// CUiCScrollBar::NewL +// --------------------------------------------------------------------------- +// +CUiCScrollBar* CUiCScrollBar::NewL( CAlfEnv& aEnv, CAlfLayout* aParentLayout ) + { + FUNC_LOG; + CUiCScrollBar* self = new (ELeave) CUiCScrollBar(); + CleanupStack::PushL( self ); + self->ConstructL( aEnv, aParentLayout ); + CleanupStack::Pop(); // self + return self; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::~CUiCScrollBar +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::Destroy() + { + FUNC_LOG; + delete this; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::Show +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::Show( const TBool aShow ) + { + FUNC_LOG; + Env().CancelCustomCommands( this ); + TAlfTimedValue opacity( aShow ? KVisibleOpacity : 0 ); + iDeck->SetOpacity( opacity ); + if ( aShow ) + { + iThumbVisual->Layout().SetOpacity( KVisibleOpacityThumb ); + iBackGroundVisual->Layout().SetOpacity( KVisibleOpacityBackground ); + TAlfCustomEventCommand command( EFadeOut, this ); + Env().Send( command, KVisibleTimeout ); + } + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::UpdateModelL +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::UpdateModelL( const TUiCScrollBarModel& aModel ) + { + FUNC_LOG; + iModel = aModel; + if ( iModel.ScrollBarNeeded() ) + { + SetThumbAnchors(); + Show( ETrue ); + } + else + { + Show( EFalse ); + } + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::ThumbPosition +// --------------------------------------------------------------------------- +// +TInt CUiCScrollBar::ThumbPosition() const + { + FUNC_LOG; + return iModel.ThumbPosition(); + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::SetRect +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::SetRect( const TRect& aRect ) + { + FUNC_LOG; + TAlfRealRect realRect( aRect ); + iDeck->SetRect( realRect ); + iDeck->UpdateChildrenLayout(); + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::Redraw +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::Redraw() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::NotifyThemeChanged +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::NotifyThemeChanged() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::LayoutHints +// --------------------------------------------------------------------------- +// +TInt CUiCScrollBar::LayoutHints() const + { + FUNC_LOG; + return ELayoutOnTopOfList | ELayoutRelativeToList | + ELayoutAutomaticMirroring; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::OfferEventL +// --------------------------------------------------------------------------- +// +TBool CUiCScrollBar::OfferEventL( const TAlfEvent& aEvent ) + { + FUNC_LOG; + TBool handled( EFalse ); + if ( aEvent.Type() == TAlfEvent::ETypeCustom ) + { + if ( aEvent.CustomParameter() == EFadeOut ) + { + handled = ETrue; + TAlfTimedValue opacity( 0, KFadeTimeout ); + iDeck->SetOpacity( opacity ); + } + } + else + { + handled = CAlfControl::OfferEventL( aEvent ); + } + return handled; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::ProvideBitmapL +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::ProvideBitmapL( TInt aId, CFbsBitmap*& aBitmap, CFbsBitmap*& aMaskBitmap ) + { + FUNC_LOG; + TAknsItemID itemId; + + switch ( aId ) + { + case EThumbTop: + itemId = KAknsIIDQsnCpScrollHandleTop; + break; + + case EThumbMiddle: + itemId = KAknsIIDQsnCpScrollHandleMiddle; + break; + + case EThumbBottom: + itemId = KAknsIIDQsnCpScrollHandleBottom; + break; + + case EBackgroundTop: + itemId = KAknsIIDQsnCpScrollBgTop; + break; + + case EBackgroundMiddle: + itemId = KAknsIIDQsnCpScrollBgMiddle; + break; + + case EBackgroundBottom: + itemId = KAknsIIDQsnCpScrollBgBottom; + break; + + default: + User::Leave( KErrNotFound ); + } + + AknsUtils::CreateIconL( AknsUtils::SkinInstance(), itemId, aBitmap, aMaskBitmap, KNullDesC, -1, -1 ); + + if ( aBitmap ) + { + TAknContentDimensions origDim; + AknIconUtils::GetContentDimensions( aBitmap, origDim ); + TSize iconSize( origDim.iWidth, origDim.iHeight ); + if (iconSize.iWidth != KScrollBarWidth && iconSize.iWidth > 0) + { + iconSize.iHeight = iconSize.iHeight * KScrollBarWidth / iconSize.iWidth; + iconSize.iWidth = KScrollBarWidth; + } + AknIconUtils::DisableCompression( aBitmap ); + AknIconUtils::SetSize( aBitmap, iconSize, EAspectRatioNotPreserved ); + if ( aMaskBitmap ) + { + AknIconUtils::DisableCompression( aMaskBitmap ); + AknIconUtils::SetSize( aMaskBitmap, iconSize, EAspectRatioNotPreserved ); + } + } + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::~CUiCScrollBar +// --------------------------------------------------------------------------- +// +CUiCScrollBar::~CUiCScrollBar() + { + FUNC_LOG; + Env().CancelCommands( this ); + if ( iDeck ) + { + iDeck->RemoveAndDestroyAllD(); + } + delete iBackGroundVisual; + delete iThumbVisual; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::CUiCScrollBar +// --------------------------------------------------------------------------- +// +CUiCScrollBar::CUiCScrollBar() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::ConstructL +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::ConstructL( CAlfEnv& aEnv, CAlfLayout* aParentLayout ) + { + FUNC_LOG; + CAlfControl::ConstructL( aEnv ); + iDeck = CAlfDeckLayout::AddNewL( *this, aParentLayout ); + iDeck->SetFlags( EAlfVisualFlagManualLayout | + EAlfVisualFlagAutomaticLocaleMirroringEnabled ); + iBgLayout = CAlfAnchorLayout::AddNewL( *this, iDeck ); + iBgLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled ); + iBackGroundVisual = CUiCCompositeImage::NewL( *this, iBgLayout, + Env().TextureManager().CreateTextureL( EBackgroundTop, this, EAlfTextureFlagSkinContent ), + Env().TextureManager().CreateTextureL( EBackgroundMiddle, this, EAlfTextureFlagSkinContent ), + Env().TextureManager().CreateTextureL( EBackgroundBottom, this, EAlfTextureFlagSkinContent ) ); + iThumbLayout = CAlfAnchorLayout::AddNewL( *this, iDeck ); + iThumbLayout->SetFlags( EAlfVisualFlagAutomaticLocaleMirroringEnabled ); + iThumbLayout->SetClipping( ETrue ); + iThumbVisual = CUiCCompositeImage::NewL( *this, iThumbLayout, + Env().TextureManager().CreateTextureL( EThumbTop, this, EAlfTextureFlagSkinContent ), + Env().TextureManager().CreateTextureL( EThumbMiddle, this, EAlfTextureFlagSkinContent ), + Env().TextureManager().CreateTextureL( EThumbBottom, this, EAlfTextureFlagSkinContent ) ); + iThumbVisual->Layout().SetFlags( EAlfVisualFlagDrawAfterOthers ); + SetAnchors(); + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::ConstructL +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::SetAnchors() + { + FUNC_LOG; + SetBgAnchors(); + SetThumbAnchors(); + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::SetBgAnchors +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::SetBgAnchors() + { + FUNC_LOG; + iBgLayout->SetAnchor( + EAlfAnchorTopLeft, 0, + EAlfAnchorOriginRight, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( -KScrollBarWidth, 0 ) ); + iBgLayout->SetAnchor( + EAlfAnchorBottomRight, 0, + EAlfAnchorOriginRight, EAlfAnchorOriginBottom, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, 0 ) ); + iBgLayout->UpdateChildrenLayout(); + } + +// --------------------------------------------------------------------------- +// CUiCScrollBar::SetThumbAnchors +// --------------------------------------------------------------------------- +// +void CUiCScrollBar::SetThumbAnchors() + { + FUNC_LOG; + iThumbLayout->SetAnchor( + EAlfAnchorTopLeft, 0, + EAlfAnchorOriginRight, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( -KScrollBarWidth, iModel.ThumbPosition() ) ); + iThumbLayout->SetAnchor( + EAlfAnchorBottomRight, 0, + EAlfAnchorOriginRight, EAlfAnchorOriginTop, + EAlfAnchorMetricAbsolute, EAlfAnchorMetricAbsolute, + TAlfTimedPoint( 0, iModel.ThumbPosition() + iModel.ThumbHeight() ) ); + iThumbLayout->UpdateChildrenLayout(); + } + +// end of file