--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook2/UIControls/src/CPbk2MergePhotoConflictDlg.cpp Wed Sep 01 12:29:52 2010 +0100
@@ -0,0 +1,488 @@
+/*
+* Copyright (c) 2009 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 Image conflict resolution dialog for Contact Merge command.
+*
+*/
+
+
+
+#include <eikclbd.h>
+#include <aknlayoutscalable_apps.cdl.h>
+#include <aknlists.h>
+#include <AknIconArray.h>
+#include <eikapp.h>
+#include <gulicon.h>
+#include <AknIconUtils.h>
+#include <StringLoader.h>
+#include <aknnavide.h>
+#include <akntitle.h>
+#include <avkon.mbg>
+#include <Pbk2UIControls.rsg>
+#include <MPbk2MergeConflict.h>
+#include <CPbk2ImageManager.h>
+#include <TPbk2ImageManagerParams.h>
+#include <MVPbkBaseContact.h>
+#include <MVPbkFieldType.h>
+#include <VPbkEng.rsg>
+#include <MPbk2AppUi.h>
+#include <MPbk2ApplicationServices.h>
+#include <CVPbkContactManager.h>
+#include "CPbk2MergePhotoConflictDlg.h"
+
+/// Unnamed namespace for local definitions
+namespace {
+
+_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( MVPbkBaseContact* aFirstContact,
+ MVPbkBaseContact* aSecondContact,
+ TInt* aResult ):
+ iFirstContact( aFirstContact ), iSecondContact( aSecondContact ), iSelectedItem( aResult )
+ {
+ // No implementation required
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::~CPbk2MergePhotoConflictDlg
+// -----------------------------------------------------------------------------
+//
+CPbk2MergePhotoConflictDlg::~CPbk2MergePhotoConflictDlg()
+ {
+ StopWait();
+ delete iWait;
+ delete iImageOperationFirst;
+ delete iImageOperationSecond;
+ delete iImageManager;
+ delete iFirstImage;
+ delete iSecondImage;
+ delete iNaviDecorator;
+ delete iSelectedString;
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CPbk2MergePhotoConflictDlg* CPbk2MergePhotoConflictDlg::NewL( MVPbkBaseContact* aFirstContact,
+ MVPbkBaseContact* aSecondContact,
+ TInt* aResult )
+ {
+ CPbk2MergePhotoConflictDlg* self =
+ new (ELeave) CPbk2MergePhotoConflictDlg( aFirstContact, aSecondContact, aResult );
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(); // self;
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::ConstructL()
+ {
+ SetNaviPaneL();
+ 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();
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::PreLayoutDynInitL
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::PreLayoutDynInitL()
+ {
+ CAknDialog::PreLayoutDynInitL();
+
+ CEikButtonGroupContainer& cba = ButtonGroupContainer();
+ CEikCba* eikCba = static_cast<CEikCba*>( cba.ButtonGroup() );
+ if( eikCba )
+ {
+ eikCba->EnableItemSpecificSoftkey( EFalse );
+ }
+
+ iListBox = static_cast<CEikFormattedCellListBox*>( Control( 1 ) );
+
+ SetItemsL();
+
+ iListBox->CreateScrollBarFrameL( ETrue );
+ iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+
+ iListBox->HandleItemAdditionL();
+ iListBox->SetListBoxObserver( this ); // MEikListBoxObserver
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::OkToExitL
+// -----------------------------------------------------------------------------
+//
+TBool CPbk2MergePhotoConflictDlg::OkToExitL( TInt aButtonId )
+ {
+ if ( aButtonId == EAknSoftkeyDone || aButtonId == EAknSoftkeyCancel )
+ {
+ TRAP_IGNORE( SetTitlePaneL( EFalse ) );
+ return ETrue;
+ }
+ return EFalse;
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::OfferKeyEventL
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CPbk2MergePhotoConflictDlg::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+ {
+ TKeyResponse result = EKeyWasNotConsumed;
+
+ if ( aKeyEvent.iCode == EKeyEscape )
+ {
+ result = CEikDialog::OfferKeyEventL( aKeyEvent, aType );
+ return result;
+ }
+
+ result = iListBox->OfferKeyEventL( aKeyEvent, aType );
+
+ if ( aType == EEventKeyDown && aKeyEvent.iScanCode == EStdKeyDevice3 )
+ {
+ SwitchRadioButtonL();
+ }
+ 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
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType )
+ {
+ if( AknLayoutUtils::PenEnabled() )
+ {
+ if ( aEventType == EEventItemSingleClicked )
+ {
+ SwitchRadioButtonL();
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::SetIconsL
+// Sets icons for the listbox.
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::SetIconsL()
+ {
+ CArrayPtr<CGulIcon>* iconList = new (ELeave) CAknIconArray( 2 );
+ CleanupStack::PushL( iconList );
+
+ 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 = NULL;
+ if ( iSecondImage )
+ {
+ second = CGulIcon::NewL( iSecondImage );
+ second->SetBitmapsOwnedExternally( ETrue );
+
+ }
+ else
+ {
+ second = CreateEmptyIconL();
+ }
+ CleanupStack::PushL( second );
+ iconList->AppendL( second );
+ CleanupStack::Pop( second );
+
+ iListBox->ItemDrawer()->ColumnData()->SetIconArray( iconList );
+ CleanupStack::Pop( iconList );
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::SetItemsL
+// Sets items to the listbox.
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::SetItemsL()
+ {
+ CDesCArray* itemArray = new ( ELeave ) CDesCArrayFlat( 2 );
+
+ RBuf listItem;
+ listItem.Create( KPictureRowFormat().Length() + iSelectedString->Length() );
+ listItem.Format( KPictureRowFormat, EPbk2ConflictedFirst, iSelectedString );
+ itemArray->AppendL( listItem );
+ listItem.Close();
+
+ listItem.Create( KPictureRowFormat().Length() + iSelectedString->Length() );
+ listItem.Format( KPictureRowFormat, EPbk2ConflictedSecond, &KNullDesC );
+ itemArray->AppendL( listItem );
+ listItem.Close();
+
+ iListBox->Model()->SetItemTextArray( itemArray );
+ iListBox->Model()->SetOwnershipType( ELbmOwnsItemArray );
+
+ iListBox->HandleItemAdditionL();
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergePhotoConflictDlg::SwitchRadioButtonL
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::SwitchRadioButtonL()
+ {
+ TInt itemIndex = iListBox->CurrentItemIndex();
+ if ( *iSelectedItem != itemIndex)
+ {
+ CDesCArray* itemArray = static_cast<CDesC16ArrayFlat*>( iListBox->Model()->ItemTextArray() );
+
+ // deselect item
+ RBuf listItem;
+ listItem.Create( KPictureRowFormat().Length() );
+ listItem.Format( KPictureRowFormat, *iSelectedItem , &KNullDesC );
+ itemArray->Delete( *iSelectedItem );
+ itemArray->InsertL( *iSelectedItem, listItem );
+ listItem.Close();
+
+ // select item
+ listItem.Create( KPictureRowFormat().Length() + iSelectedString->Length() );
+ listItem.Format( KPictureRowFormat, itemIndex, iSelectedString );
+ itemArray->Delete( itemIndex );
+ itemArray->InsertL( itemIndex, listItem );
+ listItem.Close();
+
+ *iSelectedItem = itemIndex;
+ iListBox->DrawDeferred();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergeConflictsDlg::SetNaviPaneL
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::SetNaviPaneL()
+ {
+ CEikStatusPane* statusPane = iAvkonAppUi->StatusPane();
+ if ( statusPane && statusPane->PaneCapabilities( TUid::Uid( EEikStatusPaneUidNavi ) ).IsPresent() )
+ {
+ CAknNavigationControlContainer* naviPane = static_cast<CAknNavigationControlContainer*>
+ ( statusPane->ControlL ( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+
+ HBufC* naviLabel = StringLoader::LoadLC( R_QTN_PHOB_TITLE_SELECT_IMAGE );
+
+ iNaviDecorator = naviPane->CreateNavigationLabelL( *naviLabel );
+ CleanupStack::PopAndDestroy( naviLabel );
+ naviPane->PushL( *iNaviDecorator );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CPbk2MergeConflictsDlg::SetTitlePaneL
+// -----------------------------------------------------------------------------
+//
+void CPbk2MergePhotoConflictDlg::SetTitlePaneL( TBool aCustom )
+ {
+ CEikStatusPane* statusPane = iAvkonAppUi->StatusPane();
+ if ( statusPane && statusPane->PaneCapabilities( TUid::Uid( EEikStatusPaneUidTitle ) ).IsPresent() )
+ {
+ CAknTitlePane* titlePane = static_cast<CAknTitlePane*>
+ ( statusPane->ControlL ( TUid::Uid( EEikStatusPaneUidTitle ) ) );
+
+ if ( aCustom )
+ {
+ HBufC* title = StringLoader::LoadLC( R_QTN_PHOB_TITLE_CONFLICT_RESOLUTION );
+ titlePane->SetTextL( *title );
+ CleanupStack::PopAndDestroy( title );
+ }
+ else
+ {
+ titlePane->SetTextToDefaultL();
+ }
+ }
+ }
+
+// --------------------------------------------------------------------------
+// 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;
+ }
+ }