diff -r 5b6f26637ad3 -r f4a778e096c2 phonebookui/Speeddial/ControlSrc/SpdiaControl_platsec.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Speeddial/ControlSrc/SpdiaControl_platsec.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,2402 @@ +/* +* 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: A utility that provides services to both the Speeddial and +* PhoneBook applications for getting and setting speeddial +* number configuration. +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // Phonebook Engine +#include // Phonebook Contact +#include // Phonebook Field +#include // Phonebook Single Entry Fetch API +#include +#include // Phonebook view dll resource file loader +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "SpdiaGrid.h" +#include "SpdiaGridDlg.h" +#include "SpdiaIndexData.h" +#include "SpdiaControl.h" +#include "SpdiaControl.hrh" +#include "Speeddial.laf" +#include "SpdiaPanic.h" +#include +#include "speeddial.hrh" + +#include +#include +#include + +// const TUint KShortcutKey0('0'); // not referenced +const TInt KDialBmpCount = 9; +const TInt KDialHindiBmpCount = 9; + +const TUint KDialBmp[KDialBmpCount] = + { + //EMbmSpdctrlQgn_graf_quick_one, +#ifdef __SCALABLE_ICONS + EMbmSpdctrlQgn_menu_smsvo, +#else + EMbmSpdctrlQgn_menu_smsvo_lst, +#endif + EMbmSpdctrlQgn_graf_quick_two, + EMbmSpdctrlQgn_graf_quick_three, + EMbmSpdctrlQgn_graf_quick_four, + EMbmSpdctrlQgn_graf_quick_five, + EMbmSpdctrlQgn_graf_quick_six, + EMbmSpdctrlQgn_graf_quick_seven, + EMbmSpdctrlQgn_graf_quick_eight, + EMbmSpdctrlQgn_graf_quick_nine + }; + +const TUint KDialBmpMask[KDialBmpCount] = + { + //EMbmSpdctrlQgn_graf_quick_one_mask_soft, +#ifdef __SCALABLE_ICONS + EMbmSpdctrlQgn_menu_smsvo_mask, +#else + EMbmSpdctrlQgn_menu_smsvo_lst_mask, +#endif + EMbmSpdctrlQgn_graf_quick_two_mask, + EMbmSpdctrlQgn_graf_quick_three_mask, + EMbmSpdctrlQgn_graf_quick_four_mask, + EMbmSpdctrlQgn_graf_quick_five_mask, + EMbmSpdctrlQgn_graf_quick_six_mask, + EMbmSpdctrlQgn_graf_quick_seven_mask, + EMbmSpdctrlQgn_graf_quick_eight_mask, + EMbmSpdctrlQgn_graf_quick_nine_mask + }; + +const TUint KDialHindiBmp[KDialHindiBmpCount] = + { + //EMbmSpdctrlQgn_graf_quick_one, +#ifdef __SCALABLE_ICONS + EMbmSpdctrlQgn_menu_smsvo, +#else + EMbmSpdctrlQgn_menu_smsvo_lst, +#endif + EMbmSpdctrlQgn_graf_deva_quick_two, + EMbmSpdctrlQgn_graf_deva_quick_three, + EMbmSpdctrlQgn_graf_deva_quick_four, + EMbmSpdctrlQgn_graf_deva_quick_five, + EMbmSpdctrlQgn_graf_deva_quick_six, + EMbmSpdctrlQgn_graf_deva_quick_seven, + EMbmSpdctrlQgn_graf_deva_quick_eight, + EMbmSpdctrlQgn_graf_deva_quick_nine + }; + +const TUint KDialHindiBmpMask[KDialHindiBmpCount] = + { + //EMbmSpdctrlQgn_graf_quick_one, +#ifdef __SCALABLE_ICONS + EMbmSpdctrlQgn_menu_smsvo_mask, +#else + EMbmSpdctrlQgn_menu_smsvo_lst_mask, +#endif + EMbmSpdctrlQgn_graf_deva_quick_two_mask, + EMbmSpdctrlQgn_graf_deva_quick_three_mask, + EMbmSpdctrlQgn_graf_deva_quick_four_mask, + EMbmSpdctrlQgn_graf_deva_quick_five_mask, + EMbmSpdctrlQgn_graf_deva_quick_six_mask, + EMbmSpdctrlQgn_graf_deva_quick_seven_mask, + EMbmSpdctrlQgn_graf_deva_quick_eight_mask, + EMbmSpdctrlQgn_graf_deva_quick_nine_mask + }; + +const TInt KCellRowCount(3); +const TInt KCellColCount(3); +const TInt KVoiceMail(0); +const TInt KLayoutCount(5); +const TInt KNullIndexData(-1); +const TInt32 KVmbxUid(0x100058F5) ; +const TInt KOperatorNameLength(100); +const TInt KIconsCount(15); +const TInt KIconsIdCount(15); +const TInt KIconsMaskCount(15); + +_LIT(KNullCell, "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t%d\t"); +_LIT(KDesTab, "\t"); +_LIT(KDesTab2, "\t\t"); + +/// Unnamed namespace for local definitions +namespace { + +CPbkContactItem* OpenContactL( + CPbkContactEngine* aEngine, + TContactItemId aId ) + { + CPbkContactItem* item = NULL; + TRAPD(err, item = aEngine->OpenContactL(aId)); + if (err != KErrNone) + { + CCoeEnv::Static()->HandleError(err); + } + User::LeaveIfError(err); + + return item; + } + +} /// namespace + + +// --------------------------------------------------------- +// E32Dll(TDllReason) +// Entry point function for Symbian dll +// Returns: KErrNone: No error +// --------------------------------------------------------- +// + + + +// ================= MEMBER FUNCTIONS ======================= + +// --------------------------------------------------------- +// CSpdiaControl::NewL +// +// --------------------------------------------------------- +// +EXPORT_C CSpdiaControl* CSpdiaControl::NewL() + { + CSpdiaControl* self = new(ELeave) CSpdiaControl(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// --------------------------------------------------------- +// CSpdiaControl::NewL +// +// --------------------------------------------------------- +// +EXPORT_C CSpdiaControl* CSpdiaControl::NewL(CPbkContactEngine& aPbkEngine) + { + CSpdiaControl* self = new(ELeave) CSpdiaControl(&aPbkEngine); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// --------------------------------------------------------- +// CSpdiaControl::AssignDialNumberL +// Function called when assigning a speed dial +// from the Idle state. +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::AssignDialNumberL( + TInt aLocation, CEikStatusPane* /*aStatusPane*/) + { + TBool result(EFalse); + TInt index(Index(aLocation)); + + TInt vmbxSupport = 0; + CRepository* vmbxSupported = CRepository::NewL( KCRUidVideoMailbox ); + vmbxSupported->Get( KVideoMbxSupport, vmbxSupport ); + delete vmbxSupported; + + TInt vmbxPos; + CRepository* vmbxKey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxKey2->Get( KTelVideoMbxKey, vmbxPos ); + delete vmbxKey2; + TInt vdoIndex( Index( vmbxPos ) ); + + if ( index != VMBoxPosition() && + ( !vmbxSupport || index != vdoIndex ) && + ( aLocation > 0 && aLocation <= iSdmCount) ) + { + result = ETrue; + if (ContactId(index) == KNullContactId) + { + // Assign it now? + iQueryDialog = CAknQueryDialog::NewL(CAknQueryDialog::ENoTone); + TBool resDialog(EFalse); + TRAPD(error, + resDialog = iQueryDialog->ExecuteLD(R_SPDIA_QUERY_ASSIGN) ); + iQueryDialog = NULL; + User::LeaveIfError(error); + if (!resDialog) + { + result = EFalse; + } + } + + if (result) + { + iPopupDialog = ETrue; + + result = AssignDialIndexL(index); + + + } + iPopupDialog = EFalse; + } + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::ExecuteLD +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::ExecuteLD( + TContactItemId aId, TInt aFieldIdx) + { + // Live up to the "D" + CleanupStack::PushL(this); + + // Check if the item is available now, otherwise leave happens + // Open current contact now, in order to get the lock. + CPbkContactItem* item = OpenContactL( iEngine, aId ); + CleanupStack::PushL(item); + + // Create a CPbkFetchEntryDlg dialog + TInt dial; + iGridDlg = CSpdiaGridDlg::NewL(dial, *this); + + CEikAppUi* pAppUi = NULL; + CAknNavigationDecorator *pNaviDecorator = NULL; + CAknTitlePane* titlePane = NULL; + HBufC* title = NULL; + pAppUi = CEikonEnv::Static()->EikAppUi(); + if ( pAppUi ) + { + CEikStatusPane* StatusPane = ((CAknAppUi*) pAppUi)->StatusPane(); + TUid naviPaneUid; + naviPaneUid.iUid = EEikStatusPaneUidNavi; + CAknNavigationControlContainer*naviPane = (CAknNavigationControlContainer *) StatusPane->ControlL(naviPaneUid); + pNaviDecorator = naviPane->Top(); + if ( pNaviDecorator ) + { + pNaviDecorator->MakeVisible( EFalse ); + pNaviDecorator->DrawNow(); + } + + titlePane = STATIC_CAST(CAknTitlePane*, StatusPane->ControlL( TUid::Uid(EEikStatusPaneUidTitle) ) ); + title = titlePane->Text()->AllocLC(); + } + + // Execute the CPbkFetchEntryDlg dialog + TInt result(ETrue); + TRAPD(error, result = iGridDlg->ExecuteLD(R_SPDIA_GRID_DIALOG)); + iGridDlg = NULL; + iIconArray = NULL; + + if ( pNaviDecorator ) + { + pNaviDecorator->MakeVisible( ETrue ); + pNaviDecorator->DrawNow(); + } + if ( title ) + { + titlePane->SetText( title ); + CleanupStack::Pop(); // title + titlePane->DrawNow(); + } + if ( pAppUi ) + { + CEikStatusPane* StatusPane = ( ( CAknAppUi* ) pAppUi )->StatusPane(); + StatusPane->MakeVisible( ETrue ); + StatusPane->DrawNow(); + } + + // Check errors + User::LeaveIfError(error); + + // unlock the item( contact ) so that it can be removed or assigend after back from speedial grid + // delete item; + iEngine->CloseContactL(aId); + CleanupStack::PopAndDestroy(); // item + + if (result && !CheckSpaceBelowCriticalLevelL()) + { + AssignDialL(aId, aFieldIdx, dial); + } + + // Cleanup and return + CleanupStack::PopAndDestroy(); // this + return (result); + } + +// --------------------------------------------------------- +// CSpdiaControl::Cancel +// +// --------------------------------------------------------- +// +EXPORT_C void CSpdiaControl::Cancel() + { + if ( iPbkSingleItem ) + { + delete iPbkSingleItem; + iPbkSingleItem = NULL; + } + + if ( iQueryDialog ) + { + delete iQueryDialog; + iQueryDialog = NULL; + } + + iSaveDlg = ETrue; + } + +// --------------------------------------------------------- +// CSpdiaControl::DialNumberL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::DialNumberL(TInt aLocation, + TDes& aPhoneNumber, CEikStatusPane* /*aStatusPane*/) + { + TBool result(ETrue); + TInt index(Index(aLocation)); + if (index == VMBoxPosition()) + { + result = VoiceMailL(aPhoneNumber); + } + else + { + if (ContactId(index) == KNullContactId) + { + result = AssignDialNumberL(aLocation); + } + if (result) + { + aPhoneNumber = (*iSdmArray)[index].PhoneNumber(); + } + } + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::CSpdiaControl +// +// --------------------------------------------------------- +// +CSpdiaControl::CSpdiaControl() + : iIconsCount( KIconsCount ), iIconsIdCount( KIconsIdCount ), iIconsMaskCount( KIconsMaskCount ) + { + if ( !( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) ) + { + iIconsCount -= 1; + iIconsIdCount -= 1; + iIconsMaskCount -= 1; + } + } +// --------------------------------------------------------- +// CSpdiaControl::InitializeArray +// +// --------------------------------------------------------- +void CSpdiaControl::InitializeArray() + { + iDialSkinBmp->Append( KAknsIIDQgnMenuSmsvoLst ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickTwo ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickThree ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickFour ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickFive ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickSix ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickSeven ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickEight ); + iDialSkinBmp->Append( KAknsIIDQgnGrafQuickNine ); + + iSkinIcons->Append( KAknsIIDQgnPropNrtypPhone ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypHome ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypWork ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypMobile ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypVideo ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypFax ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypPager ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypCar ); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iSkinIcons->Append( KAknsIIDQgnPropNrtypVoip ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypSwis ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypSip ); + } + iSkinIcons->Append( KAknsIIDQgnPropNrtypAssistant ); + iSkinIcons->Append( KAknsIIDQgnPropEmpty ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypEmail ); + iSkinIcons->Append( KAknsIIDQgnPropNrtypAddress ); + + // LOCAL CONSTANTS AND MACROS + //This order is based on 'Standard field ids' (PbkFields.hrh) + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_phone ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_home ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_work ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_mobile ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_video ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_fax ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_pager ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_car ); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_voip ); + iIcons->Append( EMbmAvkonQgn_prop_empty ); + iIcons->Append( EMbmAvkonQgn_prop_empty ); + } + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_assistant ); + iIcons->Append( EMbmAvkonQgn_prop_empty ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_email ); + iIcons->Append( EMbmAvkonQgn_prop_nrtyp_address ); + + iIconsId->Append( EPbkqgn_prop_nrtyp_phone ); + iIconsId->Append( EPbkqgn_prop_nrtyp_home ); + iIconsId->Append( EPbkqgn_prop_nrtyp_work ); + iIconsId->Append( EPbkqgn_prop_nrtyp_mobile ); + iIconsId->Append( EPbkqgn_prop_nrtyp_video ); + iIconsId->Append( EPbkqgn_prop_nrtyp_fax ); + iIconsId->Append( EPbkqgn_prop_nrtyp_pager ); + iIconsId->Append( EPbkqgn_prop_nrtyp_car ); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iIconsId->Append( EPbkqgn_prop_nrtyp_voip ); + iIconsId->Append( EPbkqgn_prop_nrtyp_swis ); + iIconsId->Append( EPbkqgn_prop_nrtyp_sip ); + } + iIconsId->Append( EPbkqgn_prop_nrtyp_assistant ); + iIconsId->Append( EPbkqgn_prop_nrtyp_empty ); + iIconsId->Append( EPbkqgn_prop_nrtyp_empty ); + iIconsId->Append( EPbkqgn_prop_nrtyp_empty ); + + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_phone_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_home_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_work_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_mobile_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_video_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_fax_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_pager_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_car_mask ); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_voip_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_empty_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_empty_mask ); + } + iIconsMask->Append( EMbmAvkonQgn_prop_nrtyp_assistant_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_empty_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_empty_mask ); + iIconsMask->Append( EMbmAvkonQgn_prop_empty_mask ); + } +// --------------------------------------------------------- +// CSpdiaControl::CSpdiaControl +// +// --------------------------------------------------------- +// +CSpdiaControl::CSpdiaControl( CPbkContactEngine* aPbkEngine ) + : iEngine( aPbkEngine ), iExEngine( ETrue ), iFocusedGrid( KNullIndexData ), + iIconsCount( KIconsCount ), iIconsIdCount( KIconsIdCount ), iIconsMaskCount( KIconsMaskCount ) + { + } + +// --------------------------------------------------------- +// CSpdiaControl::~CSpdiaControl +// +// --------------------------------------------------------- +// +EXPORT_C CSpdiaControl::~CSpdiaControl() + { + //delete iThumbFactory; + delete iManager; + delete iShadowLayout; + + delete iPbkNotifier; + if ( iGridUsed == EGridNoUse ) + { + if ( iIconArray ) + { + iIconArray->ResetAndDestroy(); + delete iIconArray; + } + } + if (!iExEngine) + { + delete iEngine; + } + + ResetArray(); + delete iSdmArray; + + delete iPbkSingleItem; + delete iQueryDialog; + + if (iPbkResourceFile != NULL) + { + iPbkResourceFile->Close(); + } + delete iPbkResourceFile; + + if (iCoeEnv != NULL) + { + iCoeEnv->DeleteResourceFile(iFileOffset); + } + delete iBgContext; + + if ( iDialSkinBmp != NULL ) + { + iDialSkinBmp->Close(); + } + delete iDialSkinBmp; + + if ( iSkinIcons != NULL ) + { + iSkinIcons->Close(); + } + delete iSkinIcons; + if ( iIcons != NULL ) + { + iIcons->Close(); + } + delete iIcons; + + if ( iIconsId != NULL ) + { + iIconsId->Close(); + } + delete iIconsId; + + if ( iIconsMask != NULL ) + { + iIconsMask->Close(); + } + delete iIconsMask; + } + +// --------------------------------------------------------- +// CSpdiaControl::VoiceMailL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::VoiceMailL(TDes& aNumber) + { + TBool result(ETrue); + + RVmbxNumber vmbx; + CleanupClosePushL(vmbx); // So that Close() is called if a leave happens. + if ( vmbx.Open() == KErrNone ) + { + TInt err1 = vmbx.GetVmbxNumber( aNumber ); + TInt err2 = vmbx.GetVideoMbxNumber( aNumber ); + + if ( ( err1 == KErrNotFound || err1 == KErrNotSupported ) && + ( err2 == KErrNotFound || err2 == KErrNotSupported )) + { + iType = vmbx.SelectTypeL( EVmbxDefine ); + } + else + { + iType = vmbx.SelectTypeL( EVmbxCall ); + } + + if( iType == EVmbxIP && !vmbx.IsVoIPProfilesFound() ) + { + TInt err( vmbx.GetVmbxAddressL( aNumber ) ); + if ( err != KErrNone ) + { + aNumber.Zero(); + if (err != KErrNotFound || !vmbx.QueryAddressL( EVmbxNotDefinedQuery, aNumber ) ) + { + result = EFalse; + } + } + } + else if( iType == EVmbxVideo ) + { + TInt err( vmbx.GetVideoMbxNumber( aNumber ) ); + if ( err != KErrNone ) + { + aNumber.Zero(); + if ( err != KErrNotFound ||!vmbx.QueryVideoMbxNumberL( EVmbxNotDefinedQuery, aNumber) ) + { + result = EFalse; + } + } + } + else if ( iType ==EVmbx ) + { + TInt err( vmbx.GetVmbxNumber( aNumber ) ); + if ( err != KErrNone ) + { + aNumber.Zero(); + if (err != KErrNotFound || !vmbx.QueryNumberL( EVmbxNotDefinedQuery, aNumber ) ) + { + result = EFalse; + } + } + } + else + { + result = EFalse; + } + } + CleanupStack::PopAndDestroy(); // It will call vmbx.Close() + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::PbkEngine +// phone book engine pointer +// --------------------------------------------------------- +// +EXPORT_C CPbkContactEngine* CSpdiaControl::PbkEngine() const + { + return iEngine; + } + +// --------------------------------------------------------- +// CSpdiaControl::Index +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::Index(TInt aDial) const + { + return ( aDial - 1 ); + } + +// --------------------------------------------------------- +// CSpdiaControl::Number +// An interface for accessing index data array +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::Number(TInt aIndex) const + { + return (*iSdmArray)[aIndex].Number(); + } + +// --------------------------------------------------------- +// CSpdiaControl::ContactId +// An interface for accessing index data array +// --------------------------------------------------------- +// +EXPORT_C TContactItemId CSpdiaControl::ContactId(TInt aIndex) const + { + return (*iSdmArray)[aIndex].ContactId(); + } + +// --------------------------------------------------------- +// CSpdiaControl::PhoneDialNumber +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C const TDesC& CSpdiaControl::PhoneDialNumber(TInt aDial) const + { + return (*iSdmArray)[Index(aDial)].TelNumber(); + } + +// --------------------------------------------------------- +// CSpdiaControl::PhoneNumber +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C const TDesC& CSpdiaControl::PhoneNumber(TInt aIndex) const + { + return (*iSdmArray)[aIndex].PhoneNumber(); + } + +// --------------------------------------------------------- +// CSpdiaControl::ContactTitleL +// phone book access +// --------------------------------------------------------- +EXPORT_C HBufC* CSpdiaControl::ContactTitleL(TContactItemId aCid, TBool aUnnamed) + { + HBufC* title = NULL; + if (aCid != KNullContactId) + { + CPbkContactItem* item = + iEngine->ReadContactLC(aCid); + if ((title = item->GetContactTitleOrNullL()) == NULL && aUnnamed) + { + title = iEngine->UnnamedTitle().AllocL(); + } + CleanupStack::PopAndDestroy(); // item + } + + return title; + } + +// --------------------------------------------------------- +// CSpdiaControl::ThumbIndex +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::ThumbIndex(TInt aIndex) const + { + return (*iSdmArray)[aIndex].ThumbIndex(); + } + +// --------------------------------------------------------- +// CSpdiaControl::IconIndex +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::IconIndex(TInt aIndex) const + { + TInt index = (*iSdmArray)[aIndex].IconIndex(); + if (index >= 0) + { + return ( *iIconsMask )[index - iSdmCount]; + } + return index; + } + +// --------------------------------------------------------- +// CSpdiaControl::NumberType +// An interface for accessing phone number type. +// Number types are defined in PbkFields.hrh. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::NumberType(TInt aIndex) const + { + return (*iSdmArray)[aIndex].FieldId(); + } + +// --------------------------------------------------------- +// CSpdiaControl::IconArray +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C CArrayPtr* CSpdiaControl::IconArray() const + { + return iIconArray; + } + +// --------------------------------------------------------- +// CSpdiaControl::CreateGridDataL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::CreateGridDataL( + CAknGrid* aGrid, TBool aIndex) + { + iGrid = aGrid; + if (iGridUsed == EGridNoUse) + { + iGridUsed = EGridUse; + } + + // The specified index is updated. + if (aIndex >= 0) + { + return UpdateIndexDataL(aIndex); + } + + // All items are updated. + CDesCArray* array = + STATIC_CAST(CDesCArray*, aGrid->Model()->ItemTextArray()); + array->Reset(); + InitIndexDataL(); + if (SetIconArrayL(iIconArray) > 0) + { + SetOperationsL(); + } + + TKeyArrayFix key(TSpdiaIndexData::OffsetValue( + TSpdiaIndexData::EIndex), ECmpTInt); + iSdmArray->Sort(key); + + TRAPD(err, SetItemDataL(*array)); + if (err) + { + array->Reset(); + User::Leave(err); + } + + CFormattedCellListBoxData* list = aGrid->ItemDrawer()->FormattedCellData(); + if (list->IconArray() == NULL) + { + aGrid->ItemDrawer()->FormattedCellData()->SetIconArrayL(iIconArray); + } + + return ETrue; + } + +// --------------------------------------------------------- +// CSpdiaControl::CheckingIfPopUpNeeded +// Internal rutine to check if pop up has to be shown +// to enable the One-Key-Dialling setting. +// --------------------------------------------------------- +// + +EXPORT_C TBool CSpdiaControl::CheckingIfPopUpNeeded() + { + TBool result(ETrue); + TRAP_IGNORE(result = CheckingIfPopUpNeededL()); + + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::CheckingIfPopUpNeededL +// Internal rutine to check if pop up has to be shown +// to enable the One-Key-Dialling setting. +// --------------------------------------------------------- +// + +TBool CSpdiaControl::CheckingIfPopUpNeededL() + { + TBool gridEmpty( ETrue ); + TInt gridIndex( 1 ); + TInt value; + TBool result( ETrue ); + + CRepository* repository = CRepository::NewL( KCRUidTelephonySettings ); + repository->Get( KSettingsOneKeyDialling, value ); + + if ( value == 0 ) + { + while ( ( gridIndex < 9 ) && gridEmpty ) + { + if ( CSpdiaControl::ContactId( gridIndex ) != KNullContactId ) + { + gridEmpty=EFalse; + } + ++gridIndex; + } + if ( gridEmpty ) + { + iSaveDlg = EFalse; + if( iSaveDlg ) + { + delete repository; + return EFalse; + } + + repository->Set( KSettingsOneKeyDialling, 1 ); + } + } + delete repository; + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::AssignDialIndexL +// Function called when the access is done through +// the speed dial application. +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::AssignDialIndexL(TInt aIndex) + { + TBool result(EFalse); + HBufC* prompt = NULL; + TBuf operatorName; + CAknTitlePane* title = NULL; + + if (iBooleanVarForAddingDialogVariation) + { + if(iPopupDialog) + { + if(!CSpdiaControl::CheckingIfPopUpNeeded()) + return result; + } + } + else + { // do nothing + } + + if(iPopupDialog) + { + CEikStatusPane *sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + title = STATIC_CAST(CAknTitlePane*, sp->ControlL( TUid::Uid(EEikStatusPaneUidTitle) ) ); + prompt = StringLoader::LoadLC(R_QTN_SPDIA_TITLE, iCoeEnv); + operatorName.Copy(*title->Text()); + title->SetTextL(*prompt); + title->MakeVisible(ETrue); + CleanupStack::PopAndDestroy(prompt); + } + // Contact id before selection is saved. + TContactItemId id(ContactId(aIndex)); + CContactDatabase::TContactViewFilter filter( CContactDatabase::EPhonable ); + + // No filtering if VoIP is supported. + TInt VoIPSupported( 0 ); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + CRepository* voiprepository = CRepository::NewL( KCRUidTelephonySettings ); + voiprepository->Get( KDynamicVoIP, VoIPSupported ); + delete voiprepository; + + if ( 0 < VoIPSupported ) + { + filter = CContactDatabase::EUnfiltered; + } + } + + CContactViewBase& filteredView = iEngine->FilteredContactsViewL( filter ); + + CPbkSingleItemFetchDlg::TParams params; + // The array of fieldId to display is made. + CPbkFieldIdArray* fieldIds = new (ELeave) CPbkFieldIdArray(); + CleanupStack::PushL(fieldIds); + fieldIds->AppendL(EPbkFieldIdPhoneNumberStandard); + fieldIds->AppendL(EPbkFieldIdPhoneNumberHome); + fieldIds->AppendL(EPbkFieldIdPhoneNumberWork); + fieldIds->AppendL(EPbkFieldIdPhoneNumberMobile); + fieldIds->AppendL(EPbkFieldIdAssistantNumber);//changed + fieldIds->AppendL(EPbkFieldIdCarNumber);//changed + fieldIds->AppendL(EPbkFieldIdPhoneNumberVideo); + fieldIds->AppendL(EPbkFieldIdFaxNumber); + fieldIds->AppendL(EPbkFieldIdPagerNumber); + if ( VoIPSupported ) + { + fieldIds->AppendL(EPbkFieldIdVOIP); + } + params.iFieldIdArray = fieldIds; + params.iContactView = &filteredView; + iPbkSingleItem = CPbkSingleItemFetchDlg::NewL(params, *iEngine); + + TRAPD(error, result = iPbkSingleItem->ExecuteLD()); + iPbkSingleItem = NULL; + User::LeaveIfError(error); + + CleanupStack::PushL(params.iContactItem); + if (result && params.iContactItem != NULL) + { + result = ETrue; + // It is already assigned from other applications. + if (id == KNullContactId && ContactId(aIndex) != KNullContactId) + { + id = ContactId(aIndex); + } + + if (result && !CheckSpaceBelowCriticalLevelL()) + { + if (id != KNullContactId) + { + RemoveDialIndexL(aIndex, EFalse); + (*iSdmArray)[aIndex].SetContactId(KNullContactId); + } + + CPbkContactItem* item = + iEngine->OpenContactL(params.iContactItem->Id()); + CleanupStack::PushL(item); + + TPhCltTelephoneNumber phonenumber; + params.iContactItemField->GetTextL(phonenumber); + CPbkFieldInfo& info = params.iContactItemField->FieldInfo(); + + CPbkFieldArray& array = item->CardFields(); + for (TInt index(0); index < array.Count(); ++index) + { + if (array[index].ItemField().Id() == + params.iContactItemField->ItemField().Id()) + { + iEngine->SetFieldAsSpeedDialL(*item, + index, (*iSdmArray)[aIndex].Number()); + (*iSdmArray)[aIndex].SetContactId(params.iContactItem->Id()); + (*iSdmArray)[aIndex].SetPhoneNumber(phonenumber); + (*iSdmArray)[aIndex].SetIconIndex(FindIconIndex(info.IconId())); + (*iSdmArray)[aIndex].SetThumbIndex(aIndex, NULL); + index = array.Count(); + } + } + iEngine->CloseContactL(params.iContactItem->Id()); + CleanupStack::PopAndDestroy(); // item + } + } + CleanupStack::PopAndDestroy(2); // params.iContactItem, fieldIds + if(iPopupDialog) + { + title->SetTextL(operatorName); + } + return result; + } + +// --------------------------------------------------------- +// CSpdiaControl::RemoveDialIndexL +// phone book access +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::RemoveDialIndexL(TInt aIndex, TBool aConfirmation) + { + TBool release(ETrue); + + if (release) + { + TContactItemId cid((*iSdmArray)[aIndex].ContactId()); + TInt pos((*iSdmArray)[aIndex].Number()); + release = EFalse; + if (cid != KNullContactId && (aIndex >= 0 && aIndex < iSdmCount)) + { + iEngine->RemoveSpeedDialFieldL(cid, pos); + (*iSdmArray)[aIndex].SetContactId(KNullContactId); + release = ETrue; + } + } + return release; + } + +// --------------------------------------------------------- +// deprecated +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpdiaControl::AssignNumberL(TInt /*aIndex*/, + CEikStatusPane* /*aStatusPane*/, + CCoeControl* /*aContainer*/, + TBool /*aConfirmation*/) + { + __ASSERT_DEBUG(0, Panic(ESdmPanicNotSupported)); + return EFalse; + } + +EXPORT_C void CSpdiaControl::ApplyCellSpdiaPaneStyleL( + CAknGrid& /*aListBox*/, TSize& /*aSize*/) + { + __ASSERT_DEBUG(0, Panic(ESdmPanicNotSupported)); + } + +EXPORT_C void CSpdiaControl::DrawShadow( + CWindowGc& /*aGc*/, + const TSize& /*aSize*/ ) + { + __ASSERT_DEBUG(0, Panic(ESdmPanicNotSupported)); + } + +// --------------------------------------------------------- +// CSpdiaContainer::SetLayout +// +// --------------------------------------------------------- +// +EXPORT_C void CSpdiaControl::SetLayout(const TRect& aRect) + { + //Scalable UI. + if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + TRect mainPaneRect ; + TRect statusPaneRect; + TAknLayoutRect mainQdialRect; + TAknLayoutRect gridQdialPaneRect; + TAknLayoutRect cellQdialPaneRect; + TAknWindowLineLayout cellQdialPane; + TInt varient =0; + + if ( Layout_Meta_Data::IsLandscapeOrientation() ) + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl = statusPaneRect.iTl; + mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY; + varient =1; + if ( AknLayoutUtils::PenEnabled() ) + { + mainPaneRect.iTl -= statusPaneRect.iTl; + mainPaneRect.iBr.iY +=statusPaneRect.iTl.iY; + } + } + else + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl= statusPaneRect.iTl; + if ( AknLayoutUtils::PenEnabled() ) + { + mainPaneRect.iTl -= statusPaneRect.iTl; + } + } + + SetRect( mainPaneRect ); + + mainQdialRect.LayoutRect(mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane().LayoutLine()); + gridQdialPaneRect.LayoutRect(mainQdialRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine()); + cellQdialPaneRect.LayoutRect(gridQdialPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(0,0).LayoutLine()); + cellQdialPane = AknLayoutScalable_Apps::cell_qdial_pane_g4(varient).LayoutLine(); + + TInt Cnt = 0; + + for(TInt rowSize=0;rowSize < 3; rowSize++) + { + for(TInt column=0;column < 3; column++) + { + icellLayout[Cnt].LayoutRect(gridQdialPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(column,rowSize).LayoutLine()); + Cnt ++ ; + } + } + + + (*iShadowLayout)[CSpdiaGrid::EtnCIF].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane + /*sdm_tn_shadow_cif_c, + sdm_tn_shadow_cif_l, + sdm_tn_shadow_cif_t, + sdm_tn_shadow_cif_r, + sdm_tn_shadow_cif_b, + sdm_tn_shadow_cif_w, + sdm_tn_shadow_cif_h*/); + + (*iShadowLayout)[CSpdiaGrid::EtnVGA90].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane + /*sdm_tn_shadow_vga90_c, + sdm_tn_shadow_vga90_l, + sdm_tn_shadow_vga90_t, + sdm_tn_shadow_vga90_r, + sdm_tn_shadow_vga90_b, + sdm_tn_shadow_vga90_w, + sdm_tn_shadow_vga90_h*/); + + (*iShadowLayout)[CSpdiaGrid::EtnVGA].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane + /*sdm_tn_shadow_vga_c, + sdm_tn_shadow_vga_l, + sdm_tn_shadow_vga_t, + sdm_tn_shadow_vga_r, + sdm_tn_shadow_vga_b, + sdm_tn_shadow_vga_w, + sdm_tn_shadow_vga_h*/); + + (*iShadowLayout)[CSpdiaGrid::EtnCOM].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane + /*sdm_tn_shadow_com_c, + sdm_tn_shadow_com_l, + sdm_tn_shadow_com_t, + sdm_tn_shadow_com_r, + sdm_tn_shadow_com_b, + sdm_tn_shadow_com_w, + sdm_tn_shadow_com_h*/); + } + else + { + TAknWindowLineLayout lScr = AknLayout::screen(); + TAknWindowLineLayout lCtrlPane = AknLayout::control_pane(TRect( TPoint(lScr.il, lScr.it), TSize(lScr.iW, lScr.iH) )); + SetRect(TRect( TPoint(lScr.il, lScr.it), TSize(lScr.iW, lScr.iH - lCtrlPane.iH) ) ); + + (*iShadowLayout)[CSpdiaGrid::EtnCIF90].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_1() + /*sdm_tn_shadow_cif90_c, + sdm_tn_shadow_cif90_l, + sdm_tn_shadow_cif90_t, + sdm_tn_shadow_cif90_r, + sdm_tn_shadow_cif90_b, + sdm_tn_shadow_cif90_w, + sdm_tn_shadow_cif90_h*/); + (*iShadowLayout)[CSpdiaGrid::EtnCIF].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_4() + /*sdm_tn_shadow_cif_c, + sdm_tn_shadow_cif_l, + sdm_tn_shadow_cif_t, + sdm_tn_shadow_cif_r, + sdm_tn_shadow_cif_b, + sdm_tn_shadow_cif_w, + sdm_tn_shadow_cif_h*/); + (*iShadowLayout)[CSpdiaGrid::EtnVGA90].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_7() + /*sdm_tn_shadow_vga90_c, + sdm_tn_shadow_vga90_l, + sdm_tn_shadow_vga90_t, + sdm_tn_shadow_vga90_r, + sdm_tn_shadow_vga90_b, + sdm_tn_shadow_vga90_w, + sdm_tn_shadow_vga90_h*/); + (*iShadowLayout)[CSpdiaGrid::EtnVGA].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_10() + /*sdm_tn_shadow_vga_c, + sdm_tn_shadow_vga_l, + sdm_tn_shadow_vga_t, + sdm_tn_shadow_vga_r, + sdm_tn_shadow_vga_b, + sdm_tn_shadow_vga_w, + sdm_tn_shadow_vga_h*/); + (*iShadowLayout)[CSpdiaGrid::EtnCOM].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_13() + /*sdm_tn_shadow_com_c, + sdm_tn_shadow_com_l, + sdm_tn_shadow_com_t, + sdm_tn_shadow_com_r, + sdm_tn_shadow_com_b, + sdm_tn_shadow_com_w, + sdm_tn_shadow_com_h*/); + } + } + +// --------------------------------------------------------- +// deprecated +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::Size() const + { + __ASSERT_DEBUG(0, Panic(ESdmPanicNotSupported)); + return KCellRowCount; + } + +// --------------------------------------------------------- +// CSpdiaControl::VMBoxPosition +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::VMBoxPosition() const + { + return KVoiceMail; + } + +// --------------------------------------------------------- +// CSpdiaControl::SpdIconIndex +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::SpdIconIndex(TInt aIndex) const + { + return (*iSdmArray)[aIndex].IconIndex(); + } + +// --------------------------------------------------------- +// CSpdiaControl::CreateDataL +// Set grid used flag and calls CreateDataL. +// --------------------------------------------------------- +// +TBool CSpdiaControl::CreateDataL(const CAknGrid& aGrid) + { + iGridUsed = EGridUseAndUpdate; + + return CreateGridDataL(CONST_CAST(CAknGrid*, &aGrid), KNullIndexData); + } + +// --------------------------------------------------------- +// CSpdiaControl::PbkThumbnailGetComplete +// +// --------------------------------------------------------- +// +void CSpdiaControl::PbkThumbnailGetComplete + (MPbkThumbnailOperation& aOperation, CFbsBitmap* aBitmap) + { + TRAP_IGNORE(PbkThumbnailGetCompleteL(aOperation, aBitmap )); + } + +// --------------------------------------------------------- +// CSpdiaControl::PbkThumbnailGetCompleteL +// +// --------------------------------------------------------- +// +void CSpdiaControl::PbkThumbnailGetCompleteL + (MPbkThumbnailOperation& aOperation, CFbsBitmap* aBitmap) + { + TInt index(HasOperation(aOperation)); + if ( index != KNullIndexData ) + { + if ( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + CAknIcon* icon = CAknIcon::NewL(); + icon->SetBitmap(aBitmap); + + // create mask + CFbsBitmap* mask = new (ELeave) CFbsBitmap(); + + TSize size = aBitmap->SizeInPixels(); + mask->Create(size,EGray2); + + CFbsBitGc* fbsBitGc = CFbsBitGc::NewL(); + CleanupStack::PushL( fbsBitGc ); + CFbsBitmapDevice* bmpDevice = CFbsBitmapDevice::NewL( mask ); + CleanupStack::PushL( bmpDevice ); + bmpDevice->Resize( size ); + fbsBitGc->Activate( bmpDevice ); + + fbsBitGc->SetPenStyle(CGraphicsContext::ENullPen); + fbsBitGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + + fbsBitGc->SetBrushColor(KRgbBlack); + fbsBitGc->DrawRect( TRect( size ) ); + + CleanupStack::PopAndDestroy( 2, fbsBitGc ); // bmpDevice and fbsBitGc + + icon->SetMask(mask); + + // this creates both scalable icon and mask + CAknIcon* scaledIcon = AknIconUtils::CreateIconL(icon); + + TSize thumbnailSize = GetThumbnailSize(); + + AknIconUtils::SetSize(scaledIcon->Bitmap(),thumbnailSize,EAspectRatioPreservedAndUnusedSpaceRemoved); + AknIconUtils::SetSize(scaledIcon->Mask(),thumbnailSize,EAspectRatioPreservedAndUnusedSpaceRemoved); + + CFbsBitmap* bmp = new (ELeave) CFbsBitmap(); + CFbsBitmap* msk = new (ELeave) CFbsBitmap(); + TInt err = msk->Duplicate( scaledIcon->Mask()->Handle() ); + TInt err1 = bmp->Duplicate( scaledIcon->Bitmap()->Handle() ); + + + delete (*iIconArray)[index]; + (*iIconArray)[index] = NULL; + (*iIconArray)[index] = CGulIcon::NewL(bmp,msk); + // set the text array of grid + (*iSdmArray)[index].SetThumbIndex(index,bmp); + ChangeIndexDataL(index, (*iSdmArray)[index]); + if ((*iSdmArray)[index].LastThumb()) + { + DrawNow(); + iGrid->DrawNow(); + } + delete scaledIcon; + } + else + { + // set the scaled bitmap to the array of icons + delete (*iIconArray)[index]; + (*iIconArray)[index] = NULL; + (*iIconArray)[index] = CGulIcon::NewL(aBitmap); + // set the text array of grid + (*iSdmArray)[index].SetThumbIndex(index, aBitmap); + ChangeIndexDataL(index, (*iSdmArray)[index]); + if ((*iSdmArray)[index].LastThumb()) + { + DrawNow(); + iGrid->DrawNow(); + } + } + delete &aOperation; + (*iSdmArray)[index].SetOperation(NULL); + delete (*iSdmArray)[index].ContactItem(); + (*iSdmArray)[index].SetContactItem(NULL); + } + } + +// --------------------------------------------------------- +// CSpdiaControl::PbkThumbnailGetFailed +// +// --------------------------------------------------------- +// +void CSpdiaControl::PbkThumbnailGetFailed + (MPbkThumbnailOperation& aOperation, + TInt /*aError*/) + { + TInt index(HasOperation(aOperation)); + if (index != KNullIndexData) + { + delete &aOperation; + (*iSdmArray)[index].SetOperation(NULL); + delete (*iSdmArray)[index].ContactItem(); + (*iSdmArray)[index].SetContactItem(NULL); + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::Draw +// +// --------------------------------------------------------- +// +void CSpdiaControl::Draw(const TRect& /*aRect*/) const + { + CWindowGc& gc = SystemGc(); +// gc.SetBrushStyle(CGraphicsContext::ESolidBrush); +// gc.Clear(); + + AknsDrawUtils::Background( + AknsUtils::SkinInstance(), + AknsDrawUtils::ControlContext(this), + this, + gc, + Rect() ); + + DrawShadow(gc); + } + +// --------------------------------------------------------- +// CSpdiaContainer::HandleDatabaseEventL +// Handles an database event of type aEventType. +// --------------------------------------------------------- +// +void CSpdiaControl::HandleDatabaseEventL( + TContactDbObserverEvent /*aEvent*/) + { + // An update flag will be updated if the grid is used. + // Other than this, index data is updated. + if (iGridUsed != EGridUse) + { + InitIndexDataL(); + if ( iGridDlg ) + { + CreateGridDataL( ( CAknGrid* )iGrid , KNullIndexData ); + iGrid->DrawNow(); + + // The grid from 2 to 9 has the possibility to show the dialog, + // and the related index is the value from 1 to 8. + if ( iFocusedGrid != KNullIndexData + && ( iFocusedGrid >= 1 && iFocusedGrid < 9 ) + && iQueryDialog ) + { + TContactItemId id( ( *iSdmArray )[iFocusedGrid].ContactId() ); + if ( id == KNullContactId ) + { + delete iQueryDialog; + iQueryDialog = NULL; + } + } + } + } + } + +// --------------------------------------------------------- +// CSpdiaControl::ConstructL +// +// --------------------------------------------------------- +// +void CSpdiaControl::ConstructL() + { + TInt tmp = 1; + + _LIT(KMbmFileName, "Z:spdctrl.mbm"); + _LIT(KRscFileName, "Z:spdctrl.rsc" ); + + TParse* fpMbm = new(ELeave) TParse (); + fpMbm->Set (KMbmFileName, &KDC_APP_BITMAP_DIR, NULL); + iBmpPath.Copy(fpMbm ->FullName()); + delete fpMbm; + fpMbm=NULL; + + TParse* fpRsc = new(ELeave) TParse (); + fpRsc->Set (KRscFileName, &KDC_RESOURCE_FILES_DIR, NULL); + iRscPath.Copy(fpRsc ->FullName()); + delete fpRsc; + fpRsc=NULL; + + CRepository* repository = CRepository::NewLC(KCRUidSpeedDialLV); + repository->Get( KSpeedDialLVFlags, tmp ); + + //variable that will be used to variate the code. + // if 0 release is 2.1 and code shouldnt be used + // if 1 release is 2.x (where x:5, 6, ... )and the dialog should be used. + + iBooleanVarForAddingDialogVariation = ( tmp == 1); + + CleanupStack::PopAndDestroy(); + + if (iEngine == NULL) + { + TRAPD(error,iEngine = CPbkContactEngine::NewL()); + iError = error; + if(error !=KErrNone) + { + delete iEngine ; + iEngine = NULL; + return ; + } + } + + if ( iEngine ) + { + iPbkNotifier = iEngine->CreateContactChangeNotifierL(this); + } + iPbkResourceFile = new (ELeave) RPbkViewResourceFile(*iCoeEnv); + if (!iPbkResourceFile->IsOpen()) + { + iPbkResourceFile->OpenL(); + } + + TFileName fileName(iRscPath); + BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), fileName); + iFileOffset = iCoeEnv->AddResourceFileL(fileName); + + iSdmCount = KCellRowCount * KCellColCount; + iGridUsed = EGridNoUse; + + iIconArray = new (ELeave)CAknIconArray(iSdmCount); + iSdmArray = new (ELeave) CArrayFixFlat (iSdmCount); + + iDialSkinBmp = new (ELeave)RArray(KArraySize); + iSkinIcons = new (ELeave)RArray(iIconsIdCount); + iIcons = new (ELeave)RArray(iIconsCount); + iIconsId = new (ELeave)RArray(iIconsIdCount); + iIconsMask = new (ELeave)RArray(iIconsMaskCount); + iShadowLayout = new (ELeave) CArrayFixFlat (KLayoutCount); + for (TInt i(0); i < KLayoutCount; ++i) + { + TAknLayoutRect rect; + iShadowLayout->AppendL(rect); + } + + InitIndexDataL(); + InitializeArray(); + + // create skin context + // Size is set in SizeChanged() + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMainQdial, + TRect(0,0,0,0), + EFalse ); + iPopupDialog = EFalse; + + iType = EVmbx; + } + +// --------------------------------------------------------- +// CSpdiaControl::InitIndexDataL +// The SDM control data is initialized. +// --------------------------------------------------------- +// +void CSpdiaControl::InitIndexDataL() + { + // The dialog of grid is not closed. + if (iIconArray != NULL) + { + ResetArray(); + iSdmArray->Reset(); + for (TInt i(0); i < iSdmCount; ++i) + { + TSpdiaIndexData data; + SetIndexDataL(i, data); + iSdmArray->AppendL(data); + } + } + } + +// --------------------------------------------------------- +// CSpdiaControl::ThumbType +// An interface for accessing index data array. +// --------------------------------------------------------- +// +TInt CSpdiaControl::ThumbType(TInt aIndex) const + { + return ConvThumbType((*iSdmArray)[aIndex].ThumbSize()); + } + +// --------------------------------------------------------- +// CSpdiaControl::ThumbType +// An interface for accessing index data array. +// --------------------------------------------------------- +// +TSize CSpdiaControl::ThumbSize(TInt aIndex) const + { + return (*iSdmArray)[aIndex].ThumbSize(); + } + + +// --------------------------------------------------------- +// CSpdiaControl::IconPositionL +// phone book access +// --------------------------------------------------------- +// +TInt CSpdiaControl::IconPositionL(const CPbkContactItem& aItem, TInt aDial, TInt& aFieldId) + { + TInt index(KNullIndexData); + CPbkFieldArray& fields = aItem.CardFields(); + for (TInt fieldIdx(0); index == KNullIndexData && + fieldIdx < fields.Count(); ++fieldIdx) + { + TPbkContactItemField& field = fields[fieldIdx]; + CArrayFix* array = field.SpeedDialIndexesL(); + if (array) + { + for (TInt i(0); index < 0 && i < array->Count(); ++i) + { + if (aDial == (*array)[i]) + { + index = FindIconIndex(field.FieldInfo().IconId()); + aFieldId = field.FieldInfo().FieldId(); + } + } + delete array; + } + } + return index; + } + +// --------------------------------------------------------- +// CSpdiaControl::FindIconIndex +// +// --------------------------------------------------------- +// +TInt CSpdiaControl::FindIconIndex(TInt aId) const + { + TInt index(KNullIndexData); + for (TInt n(0); index == KNullIndexData && n < iIconsIdCount; ++n) + { + if ( ( *iIconsId )[n] == ( TUint )aId ) + { + index = n + iSdmCount; + } + } + return index; + } + +// --------------------------------------------------------- +// CSpdiaControl::DeleteIconArray +// Deletes the old icons. +// --------------------------------------------------------- +EXPORT_C void CSpdiaControl::DeleteIconArray() + { + if( iIconArray ) + { + iIconArray->ResetAndDestroy(); + delete iIconArray; + iIconArray = NULL; + } + } + +// --------------------------------------------------------- +// CSpdiaControl::ReloadIconArray +// Reloads the new skin icons. +// --------------------------------------------------------- +EXPORT_C void CSpdiaControl::ReloadIconArray() + { + TRAP_IGNORE(ReloadIconArrayL()); + } +// --------------------------------------------------------- +// CSpdiaControl::ReloadIconArrayL +// Reloads the new skin icons. +// --------------------------------------------------------- +void CSpdiaControl::ReloadIconArrayL() + { + if ( NULL == iIconArray ) + { + iIconArray = new (ELeave)CAknIconArray(iSdmCount); + } + SetIconArrayL(iIconArray); + } + +// --------------------------------------------------------- +// CSpdiaControl::SetIconArrayL +// +// --------------------------------------------------------- +// +TInt CSpdiaControl::SetIconArrayL(CArrayPtrFlat* aArray) + { + CFbsBitmap* bitmap,*mask; + bitmap = NULL; + mask= NULL; + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + if (!iManager) + { + iManager = CPbkThumbnailManager::NewL(*iEngine); + } + + if ( aArray != NULL ) + { + aArray->ResetAndDestroy(); + } + else + { + return 0; + } + + TInt vmbxSupport = 0; + CRepository* vmbxSupported = CRepository::NewL( KCRUidVideoMailbox ); + vmbxSupported->Get( KVideoMbxSupport, vmbxSupport ); + delete vmbxSupported; + + TInt vmbxPos; + CRepository* vmbxKey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxKey2->Get( KTelVideoMbxKey, vmbxPos ); + delete vmbxKey2; + TInt vdoIndex( Index( vmbxPos ) ); + + TInt existThumb(0); + for (TInt index(0); index < iSdmArray->Count(); index++) + { + if ( index == 0 ) + { + TUid uidVmbx; + uidVmbx.iUid =KVmbxUid; + AknsUtils::CreateAppIconLC( skinInstance,uidVmbx, EAknsAppIconTypeContext,bitmap ,mask); + CleanupStack::Pop(2); + } + else if ( index == 1 && ( vmbxSupport && vdoIndex == 1 ) ) + { + AknsUtils::CreateIconL( skinInstance, (*iDialSkinBmp)[index], bitmap, mask, + iBmpPath, EMbmSpdctrlQgn_prop_video_mb, EMbmSpdctrlQgn_prop_video_mb_mask ); + } + else + { + if( User::Language()== ELangHindi) + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[index],bitmap,mask,iBmpPath,KDialHindiBmp[index], KDialHindiBmpMask[index] ); + } + else + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[index],bitmap,mask,iBmpPath,KDialBmp[index], KDialBmpMask[index] ); + } + } + CGulIcon* icon = CGulIcon::NewL(bitmap,mask); + CleanupStack::PushL(icon); + aArray->AppendL(icon); + + if (CreateIndexIconL(index, + (*iSdmArray)[index], existThumb > 0? EFalse: ETrue)) + { + ++existThumb; + } + CleanupStack::Pop(); // icon + } + + // Add icons + for (TInt i(0); i < iIconsIdCount; ++i) + { + AknsUtils::CreateIconL(skinInstance, (*iSkinIcons)[i],bitmap,mask,AknIconUtils::AvkonIconFileName(),( *iIcons )[i], ( *iIconsMask )[i] ); + aArray->AppendL(CGulIcon::NewL(bitmap,mask)); + } + + return existThumb; + } + +// --------------------------------------------------------- +// CSpdiaContainer::ItemDescriptorL +// +// --------------------------------------------------------- +// +HBufC* CSpdiaControl::ItemDescriptorLC(TInt aIndex, + const TSpdiaIndexData& aSdmData) + { + HBufC* des = NULL; + if (aSdmData.ContactId() != KNullContactId) + { + des = CreateItemDescriptorLC(aSdmData); + } + else + { + des = HBufC::NewLC(KNullCell.iTypeLength); + des->Des().Format(KNullCell, aIndex); + } + return des; + } + +// --------------------------------------------------------- +// CSpdiaContainer::CreateItemDescriptorL +// +// --------------------------------------------------------- +// +HBufC* CSpdiaControl::CreateItemDescriptorLC(const TSpdiaIndexData& aSdmData) + { + HBufC* des = HBufC::NewLC(KApaMaxAppCaption); + TPtr ptr(des->Des()); + + // thumb type + TInt type(CSpdiaGrid::EText); + if (aSdmData.ThumbIndex() >= 0) + { + type = ConvThumbType(aSdmData.ThumbSize()); + } + + // Text + if (type == CSpdiaGrid::EText) + { + ptr.Append(KDesTab); // 1 + if (aSdmData.IconIndex() >= 0) + { + ptr.AppendNum(aSdmData.IconIndex()); + } + AppendTextL(aSdmData, ptr); // 2,3,4 + } + else + { + // icon + text + text + text + ptr.Append(KDesTab2); // 1, 2 + ptr.Append(KDesTab2); // 2 + } + + // thumbnail 5-14 + for (TInt i(CSpdiaGrid::EtnCIF90); i <= CSpdiaGrid::EtnCOM; ++i) + { + AppendThumbnail(aSdmData, ptr, (type == i? ETrue: EFalse)); + } + + // number + ptr.Append(KDesTab); // 15 + // check + ptr.Append(KDesTab); // 16 + + return des; + } + +// --------------------------------------------------------- +// CSpdiaContainer::AppendTextL +// output Text1\tText2\tText3\t +// --------------------------------------------------------- +// +void CSpdiaControl::AppendTextL(const TSpdiaIndexData& aSdmData, TPtr& aText) + { + CPbkContactItem* item = iEngine->ReadContactLC(aSdmData.ContactId()); + if (item == NULL) + { + aText.Append(KDesTab2); + aText.Append(KDesTab2); + } + else + { + TPbkContactItemField* lastNameField = + FindFieldL(*item, EPbkFieldIdLastName); // Last Name + TPbkContactItemField* firstNameField = + FindFieldL(*item, EPbkFieldIdFirstName); // First Name + TPbkContactItemField* companyNameField = + FindFieldL(*item, EPbkFieldIdCompanyName); + + aText.Append(KDesTab); // 2 + if (!lastNameField && !firstNameField && !companyNameField) + { + aText.Append(aSdmData.PhoneNumber()); + aText.Append(KDesTab); // 3 + } + else if (!lastNameField && !firstNameField) + { + aText.Append(companyNameField->Text()); + aText.Append(KDesTab); // 3 + } + else + { + if (lastNameField) + { + aText.Append(lastNameField->Text()); + aText.Append(KDesTab); // 3 + } + if (firstNameField) + { + aText.Append(firstNameField->Text()); + } + if (!lastNameField) + { + aText.Append(KDesTab); // 3 + } + } + aText.Append(KDesTab); // 4 + } + CleanupStack::PopAndDestroy(); // item + } + +// --------------------------------------------------------- +// CSpdiaContainer::FindFieldL +// +// --------------------------------------------------------- +// +TPbkContactItemField* CSpdiaControl::FindFieldL( + CPbkContactItem& aItem, TPbkFieldId aFieldId) + { + TPbkContactItemField* field = aItem.FindField(aFieldId); + if (field) + { + HBufC* buf = field->Text().AllocL(); + buf->Des().Trim(); + if (buf->Des().Length() == 0) + { + field = NULL; + } + delete buf; + } + return field; + } +// --------------------------------------------------------- +// CSpdiaContainer::AppendThumbnail +// output \tThumbnail\ticon +// --------------------------------------------------------- +// +void CSpdiaControl::AppendThumbnail( + const TSpdiaIndexData& aSdmData, + TPtr& aText, + TBool aFixedLocation ) + { + if (!aFixedLocation) + { + aText.Append(KDesTab2); + return; + } + + aText.Append(KDesTab); + if (aSdmData.ThumbIndex() >= 0) + { + aText.AppendNum(aSdmData.ThumbIndex()); + } + + aText.Append(KDesTab); + if (aSdmData.IconIndex() >= 0) + { + aText.AppendNum(aSdmData.IconIndex()); + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::ConvThumbType +// Returns +// EtnVGA : 640 x 480 40 x 30 VGA +// EtnVGA90: 480 x 640 30 x 40 VGA turned +// EtnCIF : 352 x 288 44 x 36 CIF +// EtnCIF90: 288 x 352 36 x 44 CIF turned +// EtnCOM : othre +// --------------------------------------------------------- +// +TInt CSpdiaControl::ConvThumbType(const TSize& aSize) const + { + // Scalable UI + TAknWindowLineLayout vga; + TAknWindowLineLayout cif; + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + vga = AknLayoutScalable_Apps::popup_phob_thumbnail_window_g2().LayoutLine(); + cif = AknLayoutScalable_Apps::popup_phob_thumbnail_window_g1().LayoutLine();//image + } + else + { + vga = AppLayout::Thumbnail_pop_up_window_elements_Line_1(); + cif = AppLayout::Thumbnail_pop_up_window_elements_Line_3(); + } + TInt type(CSpdiaGrid::EtnCOM); + + if (aSize.iWidth == cif.iH//SDM_TN_CIF_HEIGHT + && aSize.iHeight == cif.iW)// SDM_TN_CIF_WIDTH) + { + type = CSpdiaGrid::EtnCIF90; + } + else if (aSize.iWidth == cif.iW &&//SDM_TN_CIF_WIDTH && + aSize.iHeight == cif.iH)//SDM_TN_CIF_HEIGHT) + { + type = CSpdiaGrid::EtnCIF; + } + else if (aSize.iWidth == vga.iH &&//SDM_TN_VGA_HEIGHT && + aSize.iHeight == vga.iW )//SDM_TN_VGA_WIDTH) + { + type = CSpdiaGrid::EtnVGA90; + } + else if (aSize.iWidth == vga.iW &&//SDM_TN_VGA_WIDTH && + aSize.iHeight == vga.iH)//SDM_TN_VGA_HEIGHT) + { + type = CSpdiaGrid::EtnVGA; + } + + return type; + } + + +// --------------------------------------------------------- +// CSpdiaContainer::SetOperationsL +// +// --------------------------------------------------------- +// +void CSpdiaControl::SetOperationsL() + { + for (TInt index(iSdmArray->Count() -1); index > 0; --index) + { + TSpdiaIndexData& data = (*iSdmArray)[index]; + if (data.ContactItem() != NULL) + { + data.SetOperation( + iManager->GetThumbnailAsyncL(*this, *data.ContactItem())); + } + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::SetItemDataL +// +// --------------------------------------------------------- +// +void CSpdiaControl::SetItemDataL(CDesCArray& aArray) + { + for (TInt loop(0); loop < iSdmCount; loop++) + { + TSpdiaIndexData& data = (*iSdmArray)[loop]; + + aArray.AppendL(ItemDescriptorLC(loop, data)->Des()); + CleanupStack::PopAndDestroy(); // des + } + } + + +// --------------------------------------------------------- +// CSpdiaContainer::AssignDialL +// Function called when assigning speed dial from phone book +// application +// --------------------------------------------------------- +// +void CSpdiaControl::AssignDialL(TContactItemId aId, TInt aFieldIdx, TInt aDial) + { + if (iBooleanVarForAddingDialogVariation) + { + if(!CSpdiaControl::CheckingIfPopUpNeeded()) + return; + } + else + { // do nothing + } + + TInt index(Index(aDial)); + TPhCltTelephoneNumber phonenumber; + TContactItemId id(ContactId(index)); + + if (id != KNullContactId) + { + RemoveDialIndexL(index, EFalse); + } + + CPbkContactItem* item = OpenContactL( iEngine, aId ); + CleanupStack::PushL(item); + + CPbkFieldArray& fields = item->CardFields(); + TInt fieldCount = fields.Count(); + + if ( aFieldIdx < fieldCount ) + { + TPbkContactItemField& field = fields[aFieldIdx]; + field.GetTextL(phonenumber); + phonenumber.Trim(); + iEngine->SetFieldAsSpeedDialL(*item, aFieldIdx, aDial); + + iEngine->CloseContactL(aId); + CleanupStack::PopAndDestroy(); // item + + HBufC* prompt = + StringLoader::LoadLC(R_SPDIA_TEXT_KEY_ASSIGNED, aDial, iCoeEnv); + CAknConfirmationNote* note = new (ELeave)CAknConfirmationNote(); + note->ExecuteLD(*prompt); + CleanupStack::PopAndDestroy(); // prompt + } + else + { + iEngine->CloseContactL(aId); + CleanupStack::PopAndDestroy(); // item + } + } + +// --------------------------------------------------------- +// CCalenNoteForm::CheckSpaceBelowCriticalLevelL +// Checks if the Flash File System storage will fall below +// Critical Level. Warning will be displayed if sotrage +// is below Critical Level. +// (other items were commented in a header). +// --------------------------------------------------------- +// +TBool CSpdiaControl::CheckSpaceBelowCriticalLevelL() + { + TBool retcode(EFalse); + + if (SysUtil::FFSSpaceBelowCriticalLevelL(&(iCoeEnv->FsSession()))) + { + CErrorUI* errorUi = CErrorUI::NewLC(); + errorUi->ShowGlobalErrorNoteL(KErrDiskFull); + CleanupStack::PopAndDestroy(); // errorUi + retcode = ETrue; + } + return retcode; + } + +// --------------------------------------------------------- +// CSpdiaContainer::HasOperation +// +// --------------------------------------------------------- +// +TInt CSpdiaControl::HasOperation(const MPbkThumbnailOperation& aOperation) + { + for (TInt index(0); index < iSdmArray->Count(); index++) + { + if ((*iSdmArray)[index].Operation() == &aOperation) + { + return index; + } + } + return KNullIndexData; + } + +// --------------------------------------------------------- +// CSpdiaContainer::ResetArray +// +// --------------------------------------------------------- +// +void CSpdiaControl::ResetArray() + { + if(iSdmArray!= NULL) + { + for (TInt index(0); index < iSdmArray->Count(); index++) + { + delete (*iSdmArray)[index].ContactItem(); + delete (*iSdmArray)[index].Operation(); + } + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::UpdateIndexDataL +// +// --------------------------------------------------------- +// +TBool CSpdiaControl::UpdateIndexDataL(TInt aIndex) + { + CFbsBitmap* bitmap,*mask; + bitmap = NULL; + mask= NULL; + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + + TSpdiaIndexData& data = (*iSdmArray)[aIndex]; + delete (*iIconArray)[aIndex]; + (*iIconArray)[aIndex] = NULL; + TFileName bmpPath(iBmpPath); + + if(User::Language() == ELangHindi) + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[aIndex],bitmap,mask,bmpPath,KDialHindiBmp[aIndex], KDialHindiBmpMask[aIndex] ); + } + else + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[aIndex],bitmap,mask,bmpPath,KDialBmp[aIndex], KDialBmpMask[aIndex] ); + } + (*iIconArray)[aIndex] = CGulIcon::NewL(bitmap,mask); + + data.ResetThumbIndex(); + if (CreateIndexIconL(aIndex, data, ETrue)) + { + data.SetOperation( + iManager->GetThumbnailAsyncL(*this, *data.ContactItem())); + } + else + { + ChangeIndexDataL(aIndex, data); + iGrid->DrawNow(); + } + return ETrue; + } + +// --------------------------------------------------------- +// CSpdiaContainer::SetIndexDataL +// phone book access +// --------------------------------------------------------- +// +void CSpdiaControl::SetIndexDataL(TInt aIndex, TSpdiaIndexData& aSdmData) + { + TPhCltTelephoneNumber phonenumber; + + aSdmData.SetIndex(aIndex); + aSdmData.SetPhoneNumber(KNullDesC); + aSdmData.SetNumber(aIndex + 1); + aSdmData.SetContactId(iEngine->GetSpeedDialFieldL( + aIndex + 1, phonenumber)); + if (aSdmData.ContactId() != KNullContactId) + { + phonenumber.Trim(); + if (phonenumber.Length() > 0) + { + aSdmData.SetPhoneNumber(phonenumber); + } + else + { + iEngine->RemoveSpeedDialFieldL(aSdmData.ContactId(), aIndex + 1); + aSdmData.SetContactId(KNullContactId); + } + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::ChangeIndexDataL +// +// --------------------------------------------------------- +// +void CSpdiaControl::ChangeIndexDataL( + TInt aIndex, + const TSpdiaIndexData& aSdmData ) + { + CDesCArray* array = STATIC_CAST(CDesCArray*, + iGrid->Model()->ItemTextArray()); + HBufC* des = ItemDescriptorLC(aIndex, aSdmData); + array->Delete(aIndex); + array->InsertL(aIndex, *des); + CleanupStack::PopAndDestroy(); // des + } + +// --------------------------------------------------------- +// CSpdiaContainer::CreateIndexIconL +// +// --------------------------------------------------------- +// +TBool CSpdiaControl::CreateIndexIconL(TInt aIndex, + TSpdiaIndexData& aSdmData, TBool aSetUpdateThumb) + { + TBool existThumb(EFalse); + + if (aSdmData.ContactId() != KNullContactId) + { + CPbkContactItem* item = iEngine->ReadContactL(aSdmData.ContactId()); + TInt fieldId(EPbkFieldIdNone); + aSdmData.SetIconIndex(IconPositionL(*item, aIndex + 1, fieldId)); + aSdmData.SetFieldId( fieldId ); // set number type + + if (iManager->HasThumbnail(*item)) + { + existThumb = ETrue; + aSdmData.SetContactItem(item); + + if (aSetUpdateThumb) + { + aSdmData.SetLastThumb(ETrue); + } + aSdmData.SetThumbIndex(aIndex, NULL); + } + else + { + delete item; + } + } + return existThumb; + } + +// --------------------------------------------------------- +// CSpdiaContainer::DrawShadow +// +// --------------------------------------------------------- +// +void CSpdiaControl::DrawShadow(CWindowGc& aGc) const + { + //TSize size(cell_spdia_item_w, cell_spdia_item_h); + //Scalable UI. + TAknWindowLineLayout area; + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + area = AknLayoutScalable_Apps::cell_qdial_pane(0,0).LayoutLine(); + } + else + { + area = AppLayout::cell_qdial_pane(0,0); + } + + TSize size(area.iW, area.iH); + aGc.SetPenColor(AKN_LAF_COLOR(SDM_TN_SHADOW_COROL)); + TInt count(iSdmArray->Count()); + //TRect rect(TPoint(spdia_main_pane_grid_l, spdia_main_pane_grid_t), size); + //Scalable UI + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + area = AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine(); + } + else + { + area = AppLayout::Speed_Dial_descendants_Line_1(); + } + TRect rect(TPoint(area.il, area.it), size); + for (TInt i(0); i < count; ++i) + { + if (ThumbIndex(i) >= 0) + { + TInt type(ThumbType(i)); + TRect rc((*iShadowLayout)[type].Rect()); + if (type == CSpdiaGrid::EtnCOM) + { + TSize image(ThumbSize(i)); + image.iWidth = Min(image.iWidth, rc.Width()); + image.iHeight = Min(image.iHeight, rc.Height()); + rc = TRect(TPoint(0,0), image); + TInt x(Max(0, (size.iWidth - image.iWidth) / 2) + 2); + TInt y(Max(0, (size.iHeight - image.iHeight) / 2) + 2); + rc.Move(x, y); + } + rc.Move(rect.iTl.iX, rect.iTl.iY); + aGc.DrawRect(rc); + } + rect.Move(size.iWidth, 0); + if (((i + 1)/ KCellColCount) * KCellRowCount == i + 1) + { + rect.Move(-(KCellColCount * size.iWidth), size.iHeight); + } + } + } + +// --------------------------------------------------------- +// CSpdiaControl::MopSupplyObject() +// Pass skin information if need. +// --------------------------------------------------------- +// +TTypeUid::Ptr CSpdiaControl::MopSupplyObject(TTypeUid aId) + { + if(aId.iUid == MAknsControlContext::ETypeId) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + return CCoeControl::MopSupplyObject( aId ); + } + +// --------------------------------------------------------- +// CSpdiaControl::SizeChanged() +// --------------------------------------------------------- +// +void CSpdiaControl::SizeChanged() + { + iBgContext->SetRect( Rect() ); + } + + +// --------------------------------------------------------- +// CSpdiaControl::VoiceMailTypeL +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::VoiceMailType() + { + return iType; + } + +// --------------------------------------------------------- +// CSpdiaControl::GetThumbnailSize() +// Gets actual size of thumbnial to be drawn +// --------------------------------------------------------- +// +TSize CSpdiaControl::GetThumbnailSize() + { + TRect mainPaneRect ; + TRect statusPaneRect; + TInt varient =0; + + if (Layout_Meta_Data::IsLandscapeOrientation()) + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl = statusPaneRect.iTl; + mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY; + varient =1; + } + else + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl= statusPaneRect.iTl; + } + + TAknLayoutRect mainGridPaneRect; + TAknLayoutRect gridPaneRect; + TAknLayoutRect cellPaneRect; + TAknLayoutRect thumbPaneRect; + + mainGridPaneRect.LayoutRect(mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane());//main grid pane + gridPaneRect.LayoutRect(mainGridPaneRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane());//main grid pane + cellPaneRect.LayoutRect(gridPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(0,0)); + thumbPaneRect.LayoutRect(cellPaneRect.Rect(),AknLayoutScalable_Apps::thumbnail_qdial_pane(varient)); + + return thumbPaneRect.Rect().Size(); + } +// --------------------------------------------------------- +// CSpdiaControl::GetSpdCtrlLastError() +// retuns last error +// --------------------------------------------------------- +// +EXPORT_C TInt CSpdiaControl::GetSpdCtrlLastError() + { + return iError; + } +// End of File