diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/View/src/CPbkThumbnailPopup.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/View/src/CPbkThumbnailPopup.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,393 @@ +/* +* Copyright (c) 2002 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: +* Provides methods for the thumbnail popup control on top of the context pane. +* +*/ + + +// INCLUDE FILES +#include "CPbkThumbnailPopup.h" +#include "CPbkThumbnailPopupControl.h" +#include "CPbkThumbnailPopupControlSlim.h" +#include "CPbkThumbnailManager.h" +#include "CPbkThumbnailScaler.h" +#include "CPbkSwapContextPaneIcon.h" +#include "PbkIconInfo.h" + +#include +#include +#include +#include +#include +#include + +/// Unnamed namespace for local defintions +namespace { + +// LOCAL CONSTANTS AND MACROS +#ifdef _DEBUG +enum TPanicCode + { + EPanicPostCond_Constructor = 1, + EPanicPostCond_CancelLoading, + EPanicInvariant_InvalidTimerState, + EPanicPreCond_PbkThumbnailGetComplete, + EPanicPreCond_PbkThumbnailGetFailed, + EPanicPreCond_LoadContactL + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbkThumbnailPopup"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +} // namespace + +/** + * Observer for the thumbnail scaling process. + */ +NONSHARABLE_CLASS(CPbkThumbnailScalerObserver) : + public CBase, + public MPbkThumbnailScalerObserver + { + public: // Construction + /** + * Static 2-phased constructor. + * @param aPopup Popup that is used to show the bitmap. + * @return Newly created CPbkThumbnailScalerObserver. + */ + static CPbkThumbnailScalerObserver* NewL(CPbkThumbnailPopup& aPopup); + + /** + * Standard C++ destructor. + */ + ~CPbkThumbnailScalerObserver(); + private: // Implementation + /** + * C++ constructor. + * @param aPopup Popup that is used to show the bitmap. + */ + CPbkThumbnailScalerObserver(CPbkThumbnailPopup& aPopup); + + private: // From MPbkThumbnailScalerObserver + void ThumbnailScalingComplete(TInt aError, CFbsBitmap* aBitmap); + + private: // Data + /// Ref: Popup that is used to show the bitmap. + CPbkThumbnailPopup& iPopup; + }; + +CPbkThumbnailScalerObserver* CPbkThumbnailScalerObserver::NewL + (CPbkThumbnailPopup& aPopup) + { + return new(ELeave) CPbkThumbnailScalerObserver(aPopup); + } + +CPbkThumbnailScalerObserver::CPbkThumbnailScalerObserver + (CPbkThumbnailPopup& aPopup) : + iPopup(aPopup) + { + } + +CPbkThumbnailScalerObserver::~CPbkThumbnailScalerObserver() + { + } + +void CPbkThumbnailScalerObserver::ThumbnailScalingComplete + (TInt aError, CFbsBitmap* aBitmap) + { + if (aError == KErrNone) + { + iPopup.ShowPopupBitmap(aBitmap); + } + else + { + delete aBitmap; + } + } + +// CPbkThumbnailPopup +inline CPbkThumbnailPopup::CPbkThumbnailPopup + (CPbkContactEngine& aEngine) : + iEngine(aEngine) + { + __ASSERT_DEBUG( !iThumbnailPopupControl, + Panic(EPanicPostCond_Constructor)); + + } + +EXPORT_C CPbkThumbnailPopup* CPbkThumbnailPopup::NewL + (CPbkContactEngine& aEngine) + { + CPbkThumbnailPopup* self = new (ELeave) CPbkThumbnailPopup(aEngine); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); //self + return self; + } + +void CPbkThumbnailPopup::ConstructL() + { + iSwapContextIcon = CPbkSwapContextPaneIcon::NewL( *CEikonEnv::Static() ); + LoadThumbnailBackgL(); + } + +CPbkThumbnailPopup::~CPbkThumbnailPopup() + { + delete iSwapContextIcon; + delete iThumbnailScaler; + delete iScalerObserver; + delete iThumbOperation; + delete iThumbnailPopupControl; + delete iThumbnailBackg; + delete iThumbnailBackgMask; + delete iManager; + delete iLoadedItem; + } + +EXPORT_C void CPbkThumbnailPopup::Load + (TContactItemId aContactId, + TBool /*aDelay*/) + { + TRAP_IGNORE(DoLoadL(aContactId)); + } + +EXPORT_C void CPbkThumbnailPopup::Load + (const CPbkContactItem& aContactItem, + TBool /*aDelay*/) + { + TRAP_IGNORE(DoLoadL(aContactItem)); + } + +void CPbkThumbnailPopup::Load + (TContactItemId aContactId, + CEikListBox* aListBox ) + { + iListBox = aListBox; + TRAP_IGNORE(DoLoadL(aContactId)); + } + +void CPbkThumbnailPopup::Load + (const CPbkContactItem& aContactItem, + CEikListBox* aListBox ) + { + iListBox = aListBox; + TRAP_IGNORE(DoLoadL(aContactItem)); + } + + +EXPORT_C void CPbkThumbnailPopup::CancelLoading() + { + HideControl(); + + // Cancel thumbnail loading + delete iThumbOperation; + iThumbOperation = NULL; + // Cancel thumbnail scaling + delete iThumbnailScaler; + iThumbnailScaler = NULL; + // Delete any loaded contact + delete iLoadedItem; + iLoadedItem = NULL; + } + +TContactItemId CPbkThumbnailPopup::ContactId() const + { + if (iContactItem) + { + return iContactItem->Id(); + } + else + { + return iLoadContactId; + } + } + +void CPbkThumbnailPopup::DoLoadL + (TContactItemId aContactId) + { + CancelLoading(); + + iLoadContactId = aContactId; + iContactItem = NULL; + + LoadContactL(); + + } + +void CPbkThumbnailPopup::DoLoadL + (const CPbkContactItem& aContactItem) + { + CancelLoading(); + + iContactItem = &aContactItem; + iLoadContactId = KNullContactId; + GetThumbnailL(*iContactItem); + } + +void CPbkThumbnailPopup::__DbgTestInvariant() const + { + } + +void CPbkThumbnailPopup::PbkThumbnailGetComplete + (MPbkThumbnailOperation& aOperation, + CFbsBitmap* aBitmap) + { + __ASSERT_DEBUG(&aOperation==iThumbOperation && aBitmap + && iThumbnailPopupControl && iThumbnailScaler, + Panic(EPanicPreCond_PbkThumbnailGetComplete)); + + // Suppress the unreferenced parameter warning + (void) aOperation; + + iThumbnailScaler->CreateThumbnail(aBitmap); + + delete iThumbOperation; + iThumbOperation = NULL; + } + +void CPbkThumbnailPopup::ShowPopupBitmap(CFbsBitmap* aBitmap) + { + // set the scaled bitmap to the control + AknIconUtils::SetSize( iThumbnailBackg, aBitmap->SizeInPixels(), EAspectRatioNotPreserved ); + AknIconUtils::SetSize( iThumbnailBackgMask, aBitmap->SizeInPixels(), EAspectRatioNotPreserved ); + + iThumbnailPopupControl->SetThumbnailBackg( iThumbnailBackg, iThumbnailBackgMask ); + iThumbnailPopupControl->ChangeBitmap( aBitmap, iListBox ); + ShowControl(); + } + +void CPbkThumbnailPopup::PbkThumbnailGetFailed + (MPbkThumbnailOperation& aOperation, + TInt aError) + { + __ASSERT_DEBUG(iThumbOperation == &aOperation && aError != KErrNone, + Panic(EPanicPreCond_PbkThumbnailGetFailed)); + + // Suppress the unreferenced parameter warnings + (void) aError; + (void) aOperation; + + HideControl(); + delete iThumbOperation; + iThumbOperation = NULL; + } + +void CPbkThumbnailPopup::ShowControl() + { + if ( iThumbnailPopupControl ) + { + iSwapContextIcon->ShowContextPaneIcon( CPbkSwapContextPaneIcon::EEmptyIcon ); + iThumbnailPopupControl->MakeControlVisible( ETrue ); + } + } + +void CPbkThumbnailPopup::HideControl() + { + if (iThumbnailPopupControl) + { + // hide the control + iSwapContextIcon->ShowContextPaneIcon( CPbkSwapContextPaneIcon::EPhonebookIcon ); + iThumbnailPopupControl->MakeControlVisible(EFalse); + } + } + +void CPbkThumbnailPopup::LoadContactL() + { + __ASSERT_DEBUG(iLoadContactId!=KNullContactId, + Panic(EPanicPreCond_LoadContactL)); + + // Load contact item + CPbkContactItem* loadedItem = iEngine.ReadContactL(iLoadContactId); + delete iLoadedItem; + iLoadedItem = loadedItem; + + // start loading picture + GetThumbnailL(*iLoadedItem); + } + +void CPbkThumbnailPopup::GetThumbnailL(const CPbkContactItem& aItem) + { + if (!iManager) + { + iManager = CPbkThumbnailManager::NewL(iEngine); + } + + if (iManager->HasThumbnail(aItem)) + { + TBool landscape = Layout_Meta_Data::IsLandscapeOrientation(); + if (!iThumbnailPopupControl || iLandscape != landscape ) + { + delete iThumbnailPopupControl; + iThumbnailPopupControl = NULL; + iLandscape = landscape; + if ( landscape ) + { + iThumbnailPopupControl = CPbkThumbnailPopupControlSlim::NewL(); + } + else + { + iThumbnailPopupControl = CPbkThumbnailPopupControl::NewL(); + } + } + if (!iScalerObserver) + { + iScalerObserver = CPbkThumbnailScalerObserver::NewL(*this); + } + if (!iThumbnailScaler) + { + iThumbnailScaler = CPbkThumbnailScaler::NewL(*iScalerObserver); + } + + // start loading picture + delete iThumbOperation; + iThumbOperation = NULL; + iThumbOperation = iManager->GetThumbnailAsyncL(*this, aItem); + } + } + +void CPbkThumbnailPopup::LoadThumbnailBackgL() + { + CPbkIconInfoContainer* iconInfoContainer = + CPbkIconInfoContainer::NewL(R_PBK_GRAF_BG_THUMBNAIL, CCoeEnv::Static()); + CleanupStack::PushL( iconInfoContainer ); + const TPbkIconInfo* iconInfo = + iconInfoContainer->Find( EPbkqgn_graf_phob_thumbnail_backg ); + + AknsUtils::CreateIconL( + AknsUtils::SkinInstance(), + iconInfo->SkinId(), + iThumbnailBackg, + iThumbnailBackgMask, + iconInfo->MbmFileName(), + iconInfo->IconId(), + iconInfo->MaskId() ); + + CleanupStack::PopAndDestroy(); //iconInfoContainer + } + +void CPbkThumbnailPopup::Refresh() + { + // This method can be called when iThumbnailPopupControl is NULL + if ( iThumbnailPopupControl ) + { + iThumbnailPopupControl->ChangeBitmap( NULL, iListBox ); + } + } + + +// End of File