diff -r e686773b3f54 -r 04ab22b956c2 phonebookui/Phonebook2/UIControls/src/CPbk2MergePhotoConflictDlg.cpp --- a/phonebookui/Phonebook2/UIControls/src/CPbk2MergePhotoConflictDlg.cpp Tue Feb 02 10:12:17 2010 +0200 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2MergePhotoConflictDlg.cpp Fri Feb 19 22:40:27 2010 +0200 @@ -16,15 +16,29 @@ * */ + + +#include +#include #include #include #include #include +#include #include #include #include +#include #include #include +#include +#include +#include +#include +#include +#include +#include +#include #include "CPbk2MergePhotoConflictDlg.h" /// Unnamed namespace for local definitions @@ -32,16 +46,27 @@ _LIT( KPictureRowFormat, "%d\t %S\t\t" ); +inline CGulIcon* CreateEmptyIconL() + { + CFbsBitmap* image = NULL; + CFbsBitmap* mask = NULL; + AknIconUtils::CreateIconL( image, mask, + AknIconUtils::AvkonIconFileName(), + EMbmAvkonQgn_prop_empty, + EMbmAvkonQgn_prop_empty_mask ); + return CGulIcon::NewL( image, mask ); + } + } // ----------------------------------------------------------------------------- // CPbk2MergePhotoConflictDlg::CPbk2MergePhotoConflictDlg // ----------------------------------------------------------------------------- // -CPbk2MergePhotoConflictDlg::CPbk2MergePhotoConflictDlg( CFbsBitmap* aFirstImage, - CFbsBitmap* aSecondImage, +CPbk2MergePhotoConflictDlg::CPbk2MergePhotoConflictDlg( MVPbkBaseContact* aFirstContact, + MVPbkBaseContact* aSecondContact, TInt* aResult ): - iFirstImage( aFirstImage ), iSecondImage( aSecondImage ), iSelectedItem( aResult ) + iFirstContact( aFirstContact ), iSecondContact( aSecondContact ), iSelectedItem( aResult ) { // No implementation required } @@ -52,6 +77,13 @@ // CPbk2MergePhotoConflictDlg::~CPbk2MergePhotoConflictDlg() { + StopWait(); + delete iWait; + delete iImageOperationFirst; + delete iImageOperationSecond; + delete iImageManager; + delete iFirstImage; + delete iSecondImage; delete iNaviDecorator; delete iSelectedString; } @@ -60,12 +92,12 @@ // CPbk2MergePhotoConflictDlg::NewL // ----------------------------------------------------------------------------- // -EXPORT_C CPbk2MergePhotoConflictDlg* CPbk2MergePhotoConflictDlg::NewL( CFbsBitmap* aFirstImage, - CFbsBitmap* aSecondImage, +EXPORT_C CPbk2MergePhotoConflictDlg* CPbk2MergePhotoConflictDlg::NewL( MVPbkBaseContact* aFirstContact, + MVPbkBaseContact* aSecondContact, TInt* aResult ) { CPbk2MergePhotoConflictDlg* self = - new (ELeave) CPbk2MergePhotoConflictDlg( aFirstImage, aSecondImage, aResult ); + new (ELeave) CPbk2MergePhotoConflictDlg( aFirstContact, aSecondContact, aResult ); CleanupStack::PushL(self); self->ConstructL(); CleanupStack::Pop(); // self; @@ -82,7 +114,10 @@ SetTitlePaneL( ETrue ); *iSelectedItem = EPbk2ConflictedFirst; iSelectedString = StringLoader::LoadL( R_QTN_PHOB_TITLE_SELECTED ); + iContactManager = &Phonebook2::Pbk2AppUi()->ApplicationServices().ContactManager(); + iImageManager = CPbk2ImageManager::NewL( *iContactManager ); CAknDialog::ConstructL( R_AVKON_MENUPANE_EMPTY ); + iWait = new (ELeave) CActiveSchedulerWait(); } // ----------------------------------------------------------------------------- @@ -102,7 +137,6 @@ iListBox = static_cast( Control( 1 ) ); - SetIconsL(); SetItemsL(); iListBox->CreateScrollBarFrameL( ETrue ); @@ -151,6 +185,19 @@ return result; } +void CPbk2MergePhotoConflictDlg::SizeChanged() + { + CAknDialog::SizeChanged(); + TSize size = iListBox->ItemDrawer()->FormattedCellData()->SubCellSize(0); + + if ( iSize != size ) + { + iSize = size; + TRAP_IGNORE( InitBitmapAsyncL( *iFirstContact ) ); + StartWait(); + } + } + // ----------------------------------------------------------------------------- // CPbk2MergePhotoConflictDlg::HandleListBoxEventL // ----------------------------------------------------------------------------- @@ -173,22 +220,34 @@ // void CPbk2MergePhotoConflictDlg::SetIconsL() { - if ( iFirstImage == NULL || iSecondImage == NULL ) - { - User::Leave( KErrArgument ); - } - CArrayPtr* iconList = new (ELeave) CAknIconArray( 2 ); CleanupStack::PushL( iconList ); - - CGulIcon* first = CGulIcon::NewL( iFirstImage ); - first->SetBitmapsOwnedExternally( ETrue ); + + CGulIcon* first = NULL; + if ( iFirstImage ) + { + first = CGulIcon::NewL( iFirstImage ); + first->SetBitmapsOwnedExternally( ETrue ); + } + else + { + first = CreateEmptyIconL(); + } CleanupStack::PushL( first ); iconList->AppendL( first ); CleanupStack::Pop( first ); - CGulIcon* second = CGulIcon::NewL( iSecondImage ); - second->SetBitmapsOwnedExternally( ETrue ); + CGulIcon* second = NULL; + if ( iSecondImage ) + { + second = CGulIcon::NewL( iSecondImage ); + second->SetBitmapsOwnedExternally( ETrue ); + + } + else + { + second = CreateEmptyIconL(); + } CleanupStack::PushL( second ); iconList->AppendL( second ); CleanupStack::Pop( second ); @@ -298,3 +357,132 @@ } } } + +// -------------------------------------------------------------------------- +// CPbk2MergePhotoConflictDlg::InitBitmapAsyncL +// -------------------------------------------------------------------------- +// +void CPbk2MergePhotoConflictDlg::InitBitmapAsyncL( MVPbkBaseContact& aContact ) + { + // cancel previous operations + if ( &aContact == iFirstContact ) + { + delete iImageOperationFirst; + iImageOperationFirst = NULL; + } + + const MVPbkFieldType* thumbType = iContactManager->FieldTypes().Find( + R_VPBK_FIELD_TYPE_THUMBNAILPIC ); + + if( thumbType ) + { + if( iImageManager->HasImage( aContact, *thumbType ) ) + { + // Define parameters for thumbnail + TPbk2ImageManagerParams params; + TInt useCropping = 0x0008; + + params.iSize = iSize; + params.iFlags = TPbk2ImageManagerParams::EScaleImage | + TPbk2ImageManagerParams::EKeepAspectRatio | + useCropping; //CROP IMAGE + // contact has image. load it. + if ( &aContact == iFirstContact ) + { + iImageOperationFirst = iImageManager->GetImageAsyncL( + ¶ms, aContact, *thumbType, *this ); + } + else if ( &aContact == iSecondContact ) + { + iImageOperationSecond = iImageManager->GetImageAsyncL( + ¶ms, aContact, *thumbType, *this ); + } + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2MergePhotoConflictDlg::StopWait +// -------------------------------------------------------------------------- +// +void CPbk2MergePhotoConflictDlg::StopWait() + { + if ( iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2MergePhotoConflictDlg::StartWait +// -------------------------------------------------------------------------- +// +void CPbk2MergePhotoConflictDlg::StartWait() + { + if ( !iWait->IsStarted() ) + { + iWait->Start(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2MergePhotoConflictDlg::Pbk2ImageGetComplete +// -------------------------------------------------------------------------- +// +void CPbk2MergePhotoConflictDlg::Pbk2ImageGetComplete( + MPbk2ImageOperation& aOperation, + CFbsBitmap* aBitmap ) + { + if ( &aOperation == iImageOperationFirst ) + { + delete iImageOperationFirst; + iImageOperationFirst = NULL; + delete iFirstImage; + iFirstImage = aBitmap; + + TRAPD( err, InitBitmapAsyncL( *iSecondContact ) ); + + if ( err != KErrNone ) + { + StopWait(); + TRAP_IGNORE( SetIconsL() ); + } + else + { + StartWait(); + } + } + + else if ( &aOperation == iImageOperationSecond ) + { + delete iImageOperationSecond; + iImageOperationSecond = NULL; + delete iSecondImage; + iSecondImage = aBitmap; + TRAP_IGNORE( SetIconsL() ); + + StopWait(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2MergePhotoConflictDlg::Pbk2ImageGetFailed +// -------------------------------------------------------------------------- +// +void CPbk2MergePhotoConflictDlg::Pbk2ImageGetFailed( + MPbk2ImageOperation& aOperation, + TInt /*aError*/ ) + { + StopWait(); + + if ( &aOperation == iImageOperationFirst ) + { + delete iImageOperationFirst; + iImageOperationFirst = NULL; + } + else if ( &aOperation == iImageOperationSecond ) + { + delete iImageOperationSecond; + iImageOperationSecond = NULL; + } + }