phonebookui/Phonebook/View/src/CPbkMemoryEntryDefaultsDlg.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/View/src/CPbkMemoryEntryDefaultsDlg.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,831 @@
+/*
+* 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: 
+*       Phonebook Memory entry Defaults dialog methods.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkMemoryEntryDefaultsDlg.h"
+#include <aknlists.h>    // EikControlFactory
+#include <StringLoader.h>
+#include <featmgr.h>
+
+#include <PbkView.rsg>
+#include "MPbkClipListBoxText.h"
+#include "CPbkFieldListBoxModel.h"
+#include <CPbkIconArray.h>
+
+// PbkEng classes
+#include <CPbkContactEngine.h>
+#include <CPbkFieldInfo.h>
+#include <CPbkConstants.h>
+#include <CPbkContactItem.h>
+#include <DigCleanupResetPointer.h>
+#include <CPbkExtGlobals.h>
+#include <MPbkExtensionFactory.h>
+
+#include <PbkDebug.h>
+
+// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+
+/**
+ * Enum for default field types. Defines also order of items in list.
+ *
+ * Because the list returns the index of the currently displayed item,
+ * it's been decided to treat the two versions of SMS (regular SMS versus
+ * the enhanced email-over-sms version) the same when populating the list,
+ * and differentiate between the two when an SMS operation is selected.
+ */
+enum TDefaults
+    {
+    EPbkCallDefault = 0,
+    EPbkVideoDefault,
+    EPbkVoipDefault,
+    EPbkPocDefault,
+    EPbkSmsDefault,
+    EPbkMmsDefault,
+    EPbkEmailDefault,
+    KPbkNumberOfDefaults
+    };
+
+static const TInt KMaxIntLength = 15;
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicPostCond_Constructor = 1,
+    EPanicPostCond_ConstructL,
+    EPanicPreCond_FixIndex
+    };
+static void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkMemoryEntryDefaultsDlg");
+    User::Panic(KPanicText, aReason);
+    }
+#endif // _DEBUG
+
+} // namespace
+
+
+// MODULE DATA STRUCTURES
+
+NONSHARABLE_CLASS(CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg) :
+        public CBase,
+        public MPbkClipListBoxText
+    {
+    public:  // Interface
+        CPbkMemoryEntryDefaultAssignDlg();
+        TInt ExecuteLD(CPbkFieldArray& aArray);
+        ~CPbkMemoryEntryDefaultAssignDlg();
+
+    public:  // from MPbkClipListBoxText
+        TBool ClipFromBeginning(TDes& aBuffer, TInt aItemIndex,
+            TInt aSubCellNumber);
+
+    private: // Data
+        /// Own: field selection listbox
+        CEikFormattedCellListBox* iListBox;
+        /// Own: popup list for the listbox
+        CAknPopupList* iPopupList;
+        /// Ref: Referred TBool is set ETrue in destructor
+        TBool* iDestroyedPtr;
+    };
+
+/**
+ * Returns default field identified by aDefaultIndex from aContact
+ * or NULL if the default is not set.
+ */
+TPbkContactItemField* DefaultField
+        (const CPbkContactItem& aContact, TInt aDefaultIndex)
+    {
+    TPbkContactItemField* result = NULL;
+    switch (aDefaultIndex)
+        {
+        case EPbkCallDefault:
+            {
+            result = aContact.DefaultPhoneNumberField();
+            break;
+            }
+        case EPbkVideoDefault:
+            {
+            result = aContact.DefaultVideoNumberField();
+            break;
+            }
+        case EPbkMmsDefault:
+            {
+            result = aContact.DefaultMmsField();
+            break;
+            }
+        case EPbkSmsDefault:
+            {
+            if (FeatureManager::FeatureSupported(KFeatureIdEmailOverSms))
+                {
+                result = aContact.DefaultEmailOverSmsField();
+                }
+            else
+                {
+                result = aContact.DefaultSmsField();
+                }
+            break;
+            }
+        case EPbkEmailDefault:
+            {
+            result = aContact.DefaultEmailField();
+            break;
+            }
+        case EPbkVoipDefault:
+            {
+            result = aContact.DefaultVoipField();
+            break;
+            }
+        case EPbkPocDefault:
+            {
+            result = aContact.DefaultPocField();
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return result;
+    }
+
+/**
+ * Returns the default UI text for default field identified by aDefaultIndex.
+ */
+HBufC* DefaultFieldTextLC(TInt aDefaultIndex)
+    {
+    HBufC* result = NULL;
+    switch (aDefaultIndex)
+        {
+        case EPbkCallDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_CALL_DEFAULT);
+            break;
+            }
+        case EPbkVideoDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_VIDEO_DEFAULT);
+            break;
+            }
+        case EPbkMmsDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_MMS_DEFAULT);
+            break;
+            }
+        case EPbkSmsDefault:
+            {
+            // this is the same text for either SMS or EmailOverSms
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_SMS_DEFAULT);
+            break;
+            }
+        case EPbkEmailDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_EMAIL_DEFAULT);
+            break;
+            }
+        case EPbkVoipDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_VOIP_DEFAULT);
+            break;
+            }
+        case EPbkPocDefault:
+            {
+            result = StringLoader::LoadLC(R_QTN_PHOB_SETI_POC_DEFAULT);
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return result;
+    }
+
+/**
+ * Returns true if aField is an applicable default field of type identified
+ * by aDefaultIndex.
+ */
+TBool IsApplicableDefaultField
+        (const TPbkContactItemField& aField, TInt aDefaultIndex)
+    {
+    TBool result = EFalse;
+
+    switch (aDefaultIndex)
+        {
+        case EPbkCallDefault:
+            {
+            if ( aField.FieldInfo().IsPhoneNumberField() &&
+                 aField.Text().Length() > 0 )
+                {
+                result = ETrue;
+                }
+            break;
+            }
+
+        case EPbkVideoDefault:
+            {
+            if ( aField.FieldInfo().IsPhoneNumberField() &&
+                 aField.Text().Length() > 0 )
+                {
+                if ( ( aField.FieldInfo().FieldId() != EPbkFieldIdFaxNumber ) &&
+                     ( aField.FieldInfo().FieldId() != EPbkFieldIdPagerNumber ) )
+                    {
+                    result = ETrue;
+                    }
+                }
+            break;
+            }
+
+        case EPbkSmsDefault:
+            {
+            if (FeatureManager::FeatureSupported(KFeatureIdEmailOverSms))
+                {
+                if (aField.FieldInfo().IsEmailOverSmsField() &&
+                    aField.Text().Length() > 0)
+                    {
+                    result = ETrue;
+                    }
+                }
+            else
+                {
+                if (aField.FieldInfo().IsPhoneNumberField() &&
+                    aField.Text().Length() > 0)
+                    {
+                    result = ETrue;
+                    }
+                }
+            break;
+            }
+
+        case EPbkMmsDefault:
+            {
+            if (aField.FieldInfo().IsMmsField() &&
+                aField.Text().Length() > 0)
+                {
+                result = ETrue;
+                }
+            break;
+            }
+        case EPbkEmailDefault:
+            {
+            if (aField.FieldInfo().FieldId()==EPbkFieldIdEmailAddress &&
+                aField.Text().Length() > 0)
+                {
+                result = ETrue;
+                }
+            break;
+            }
+        case EPbkVoipDefault:
+            {
+            if ( aField.FieldInfo().IsVoipField() &&
+                 aField.Text().Length() > 0 )
+                {
+                result = ETrue;
+
+                }
+            break;
+            }
+        case EPbkPocDefault:
+            {
+            if (aField.FieldInfo().IsPocField() &&
+                aField.Text().Length() > 0)
+                {
+                result = ETrue;
+                }
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+
+    // Check that the field contains something
+    if (aField.IsEmptyOrAllSpaces())
+        {
+        result = EFalse;
+        }
+
+    return result;
+    }
+
+/**
+ * Sets aField as the default field for aContact identified by aField.
+ */
+TBool SetDefaultL
+        (CPbkContactItem& aContact,
+        TInt aDefaultIndex,
+        TPbkContactItemField* aField)
+    {
+    TBool result = EFalse;
+    switch (aDefaultIndex)
+        {
+        case EPbkCallDefault:
+            {
+            aContact.SetDefaultPhoneNumberFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        case EPbkVideoDefault:
+            {
+            aContact.SetDefaultVideoNumberFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        case EPbkMmsDefault:
+            {
+            aContact.SetDefaultMmsFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        case EPbkSmsDefault:
+            {
+            if (FeatureManager::FeatureSupported(KFeatureIdEmailOverSms))
+                {
+                aContact.SetDefaultEmailOverSmsFieldL(aField);
+                }
+            else
+                {
+                aContact.SetDefaultSmsFieldL(aField);
+                }
+
+            result = ETrue;
+            break;
+            }
+        case EPbkEmailDefault:
+            {
+            aContact.SetDefaultEmailFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        case EPbkVoipDefault:
+            {
+            aContact.SetDefaultVoipFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        case EPbkPocDefault:
+            {
+            aContact.SetDefaultPocFieldL(aField);
+            result = ETrue;
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    return result;
+    }
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+inline CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultsDlg
+        (CPbkContactEngine& aEngine, TContactItemId aContactId) :
+        iContactId(aContactId),
+        iEngine(aEngine)
+    {
+    __ASSERT_DEBUG(
+        iContactId==aContactId && &iEngine==&aEngine && !iListBox &&
+        !iDefaultAssignDlg && !iDestroyedPtr,
+        Panic(EPanicPostCond_Constructor));
+    }
+
+EXPORT_C CPbkMemoryEntryDefaultsDlg* CPbkMemoryEntryDefaultsDlg::NewL
+        (TContactItemId aContactId,
+        CPbkContactEngine& aEngine)
+    {
+    CPbkMemoryEntryDefaultsDlg* self = new(ELeave)
+        CPbkMemoryEntryDefaultsDlg(aEngine, aContactId);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+EXPORT_C void CPbkMemoryEntryDefaultsDlg::ExecuteLD()
+    {
+    CAknPopupList::ExecuteLD();
+    }
+
+CPbkMemoryEntryDefaultsDlg::~CPbkMemoryEntryDefaultsDlg()
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkMemoryEntryDefaultsDlg destructor start"));
+    if (iDestroyedPtr)
+        {
+        *iDestroyedPtr = ETrue;
+        }
+    delete iDefaultAssignDlg;
+    delete iListBox;
+
+    FeatureManager::UnInitializeLib();
+
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkMemoryEntryDefaultsDlg destructor end"));
+    }
+
+void CPbkMemoryEntryDefaultsDlg::ProcessCommandL(TInt aCommandId)
+    {
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkMemoryEntryDefaultsDlg::ProcessCommandL start"));
+
+    switch (aCommandId)
+        {
+        case EAknSoftkeyOk:
+            {
+            if (DefaultsAssignPopupL(iListBox->CurrentItemIndex()))
+                {
+                CreateLinesL();
+                iListBox->DrawDeferred();
+                }
+                //  If DefaultsAssignPopupL returns false, this object
+                //  might be destroyed
+            break;
+            }
+
+        default:
+            {
+            PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+                ("About to call CAknPopupList::ProcessCommandL"));
+            CAknPopupList::ProcessCommandL(aCommandId);
+            PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+                ("Called CAknPopupList::ProcessCommandL"));
+            break;
+            }
+        }
+    PBK_DEBUG_PRINT(PBK_DEBUG_STRING
+        ("CPbkMemoryEntryDefaultsDlg::ProcessCommandL end"));
+    }
+
+void CPbkMemoryEntryDefaultsDlg::HandleListBoxEventL
+        (CEikListBox* aListBox, TListBoxEvent aEventType)
+    {
+    // Respond to events from listboxitem
+    if (aListBox == iListBox)
+        {
+        if (aEventType == MEikListBoxObserver::EEventEnterKeyPressed)
+            {
+            // Ok/Enter key pressed, command is same as EAknSoftkeyOk
+            ProcessCommandL(EAknSoftkeyOk);
+            }
+        }
+    }
+
+void CPbkMemoryEntryDefaultsDlg::CreateLinesL() const
+    {
+    CPbkContactItem* item = iEngine.ReadContactLC(iContactId);
+
+    CDesCArray* lines = static_cast<CDesCArray*>
+        (iListBox->Model()->ItemTextArray());
+    lines->Reset();
+
+    _LIT(KFormat, "%S\t%S");
+    HBufC* noDefault = StringLoader::LoadLC(R_QTN_PHOB_SETI_NO_DEFAULT);
+
+    for (TInt row=0; row < KPbkNumberOfDefaults; ++row)
+        {
+        // Only supported lines are created
+        if (IsSupported(row))
+            {
+            HBufC* defaultFieldText = DefaultFieldTextLC(row);
+            const TPbkContactItemField* field = DefaultField(*item, row);
+            TPtrC label;
+            if(field)
+                {
+                label.Set(field->Label());
+                }
+            else
+                {
+                label.Set(*noDefault);
+                }
+
+            // Allocate and format the listbox line
+            HBufC* lineBuf = HBufC::NewLC(KFormat().Length()
+                + defaultFieldText->Length() + label.Length());
+            TPtr line(lineBuf->Des());
+            line.Format(KFormat, defaultFieldText, &label);
+
+            lines->AppendL(line);
+
+            // Cleanup
+            CleanupStack::PopAndDestroy(2);  // lineBuf, defaultFieldText
+            }
+        }
+
+    CleanupStack::PopAndDestroy(2); // noDefault, item
+    }
+
+TBool CPbkMemoryEntryDefaultsDlg::DefaultsAssignPopupL(TInt aDefaultIndex)
+    {
+    TBool thisDestroyed = EFalse;
+    iDestroyedPtr = &thisDestroyed;
+
+    CPbkContactItem* item = iEngine.OpenContactL(iContactId);
+    CleanupStack::PushL(item);
+
+    CPbkFieldArray* fields = new(ELeave) CPbkFieldArray(4 /*granularity*/);
+    CleanupStack::PushL(fields);
+    const TInt fieldCount = item->CardFields().Count();
+    for (TInt i=0; i < fieldCount; ++i)
+        {
+        TPbkContactItemField& field = item->CardFields()[i];
+        TInt theIndex = FixIndex(aDefaultIndex); // we have to fix the index
+        if (IsApplicableDefaultField(field, theIndex))
+            {
+            fields->AppendL(field);
+            }
+        }
+
+    iDefaultAssignDlg = new(ELeave) CPbkMemoryEntryDefaultAssignDlg;
+    TInt fieldIndex = 0;
+    TRAPD(err, fieldIndex = iDefaultAssignDlg->ExecuteLD(*fields));
+    iDefaultAssignDlg = NULL;
+    if (err)
+        {
+        User::Leave(err);
+        }
+
+    TBool result = EFalse;
+    if (!thisDestroyed && fieldIndex >= 0)
+        {
+        TPbkContactItemField* field = NULL;
+        if (fieldIndex < fields->Count())
+            {
+            field = &(*fields)[fieldIndex];
+            }
+            TInt theIndex = FixIndex(aDefaultIndex); // we have to fix the index
+            result = SetDefaultL(*item, theIndex, field);
+        }
+
+    CleanupStack::PopAndDestroy(fields);
+
+    if (result)
+        {
+        iEngine.CommitContactL(*item);
+        }
+    else
+        {
+        iEngine.CloseContactL(iContactId);
+        }
+
+    CleanupStack::PopAndDestroy(item);
+
+    return result;
+    }
+
+void CPbkMemoryEntryDefaultsDlg::ConstructL()
+    {
+    // initialize feature manager
+    FeatureManager::InitializeLibL();
+
+    // Create a list box
+    iListBox = static_cast<CEikColumnListBox*>
+        (EikControlFactory::CreateByTypeL
+            (EAknCtMenuDoublePopupMenuListBox).iControl);
+
+    CAknPopupList::ConstructL
+        (iListBox, R_PBK_SOFTKEYS_ASSIGN_BACK,
+        AknPopupLayouts::EMenuDoubleWindow);
+
+    // Init list box
+    iListBox->ConstructL(this, CEikListBox::ELeftDownInViewRect);
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL
+        (CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+    // set title of popuplist
+    HBufC* heading = StringLoader::LoadLC(R_QTN_PHOB_TITLE_DEFAULT_SETTINGS);
+    SetTitleL(*heading);
+    CleanupStack::PopAndDestroy(heading);
+
+    CreateLinesL();
+
+    __ASSERT_DEBUG(
+        iListBox && !iDefaultAssignDlg && !iDestroyedPtr,
+        Panic(EPanicPostCond_ConstructL));
+    }
+
+
+////////////////////////////////////////////////////////////
+// CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg
+
+inline CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg::
+        CPbkMemoryEntryDefaultAssignDlg()
+    {
+    // CBase::operator new(TLeave) will reset members
+    }
+
+TInt CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg::ExecuteLD
+        (CPbkFieldArray& aArray)
+    {
+    CleanupStack::PushL(this);
+    TBool thisDestroyed = EFalse;
+    iDestroyedPtr = &thisDestroyed;
+
+    // Create a list box
+    iListBox = static_cast<CEikFormattedCellListBox*>
+        (EikControlFactory::CreateByTypeL
+            (EAknCtDoubleGraphicPopupMenuListBox).iControl);
+
+    // Create a popup list
+    CAknPopupList* popupList = CAknPopupList::NewL
+        (iListBox, R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT,
+            AknPopupLayouts::EMenuDoubleLargeGraphicWindow);
+
+    CleanupStack::PushL(popupList);
+
+    // Init list box
+    iListBox->ConstructL(popupList, CEikListBox::ELeftDownInViewRect);
+    iListBox->CreateScrollBarFrameL(ETrue);
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL
+        (CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+
+    // set title of popuplist
+    // Select number §qtn.phob.title.select.default§
+    HBufC* heading = StringLoader::LoadLC(R_QTN_PHOB_TITLE_SELECT_DEFAULT);
+    popupList->SetTitleL(*heading);
+    CleanupStack::PopAndDestroy(heading);
+
+    CPbkIconArray* iconArray = new(ELeave) CPbkIconArray(4 /*granularity*/);
+    CleanupStack::PushL(iconArray);
+    iconArray->ConstructFromResourceL(R_PBK_FIELDTYPE_ICONS);
+
+    // get extension factory for setting extension icons
+    CPbkExtGlobals* extGlobal = CPbkExtGlobals::InstanceL();
+    extGlobal->PushL();
+    MPbkExtensionFactory& factory = extGlobal->FactoryL();
+    factory.AddPbkFieldIconsL(NULL, iconArray);
+    CleanupStack::PopAndDestroy(extGlobal);
+
+    CleanupStack::Pop();  // iconArray
+    iListBox->ItemDrawer()->ColumnData()->SetIconArray(iconArray);
+
+    // create model
+    HBufC* timeFormat = CCoeEnv::Static()->AllocReadResourceLC
+        (R_QTN_DATE_USUAL);
+
+    CPbkFieldListBoxModel::TParams params(aArray, *timeFormat, *iconArray);
+    CPbkFieldListBoxModel* listBoxModel = CPbkFieldListBoxModel::NewL(params);
+    CleanupStack::PopAndDestroy(timeFormat);
+    listBoxModel->SetClipper(*this);
+
+    // insert TEXT_NO_DEFAULT as the last item to the array
+    CPbkFieldListBoxRow* row = CPbkFieldListBoxRow::NewL();
+    CleanupStack::PushL(row);
+    TBuf<KMaxIntLength> iconBuffer;
+    _LIT(KIcon, "%d");
+    iconBuffer.Format(KIcon, iconArray->FindIcon(EPbkqgn_prop_nrtyp_empty));
+    row->AppendColumnL(iconBuffer);
+    HBufC* text = StringLoader::LoadLC(R_QTN_PHOB_SETI_NO_DEFAULT);  // LC
+    row->AppendColumnL(*text);
+    CleanupStack::PopAndDestroy(text);
+    row->AppendColumnL(KNullDesC); // empty data field
+    listBoxModel->AppendRowL(row);
+    CleanupStack::Pop(row);
+
+    iListBox->Model()->SetItemTextArray(listBoxModel);
+    iListBox->Model()->SetOwnershipType(ELbmOwnsItemArray);
+    iListBox->Reset();
+
+    // show popuplist dialog
+    TInt index = -1;
+    TBool res = EFalse;
+    CleanupStack::Pop();  // popupList
+    iPopupList = popupList;
+    TRAPD(err, res = iPopupList->ExecuteLD());
+
+    // Reset iPopupList member
+    if (!thisDestroyed)
+        {
+        iPopupList = NULL;
+        }
+    // Rethrow any error
+    if (err != KErrNone)
+        {
+        User::Leave(err);
+        }
+
+    if (thisDestroyed)
+        {
+        // this object has been destroyed
+        index = KErrNotFound;
+        CleanupStack::Pop();  // this
+        }
+    else
+        {
+        if (res)
+            {
+            index = iListBox->CurrentItemIndex();
+            }
+        CleanupStack::PopAndDestroy(); // this
+        }
+
+    return index;
+    }
+
+CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg::
+        ~CPbkMemoryEntryDefaultAssignDlg()
+    {
+    if (iDestroyedPtr)
+        {
+        *iDestroyedPtr = ETrue;
+        }
+    if (iPopupList)
+        {
+        iPopupList->CancelPopup();
+        }
+    delete iListBox;
+    }
+
+TBool CPbkMemoryEntryDefaultsDlg::CPbkMemoryEntryDefaultAssignDlg::
+        ClipFromBeginning (TDes& aBuffer, TInt aItemIndex,
+            TInt aSubCellNumber)
+    {
+    return AknTextUtils::ClipToFit
+        (aBuffer, AknTextUtils::EClipFromBeginning, iListBox,
+        aItemIndex, aSubCellNumber);
+    }
+
+
+TBool CPbkMemoryEntryDefaultsDlg::IsSupported(TInt aDefaults) const
+    {
+    TBool ret(ETrue);
+
+    // Skip the line if MMS field not supported
+    if ( aDefaults == EPbkMmsDefault &&
+        !FeatureManager::FeatureSupported(KFeatureIdMMS))
+        {
+        ret = EFalse;
+        }
+    // Skip the line if Email field not supported
+    else if ( aDefaults == EPbkEmailDefault &&
+        !FeatureManager::FeatureSupported(KFeatureIdEmailUi))
+        {
+        ret = EFalse;
+        }
+    // Do not add video fields if they are not enabled
+    else if ( aDefaults == EPbkVideoDefault &&
+            !iEngine.Constants()->LocallyVariatedFeatureEnabled
+                (EPbkLVAddVideoTelephonyFields))
+        {
+        ret = EFalse;
+        }
+    // Do not add Voip fields if they are not enabled
+    else if ( aDefaults == EPbkVoipDefault &&
+              !FeatureManager::FeatureSupported(KFeatureIdCommonVoip) )
+        {
+        ret = EFalse;
+        }
+    // Do not add POC fields if they are not enabled
+    else if ( aDefaults == EPbkPocDefault &&
+            !iEngine.Constants()->LocallyVariatedFeatureEnabled(EPbkLVPOC) )
+        {
+        ret = EFalse;
+        }
+
+    return ret;
+    }
+
+/**
+ * This method corrects the given focus index to map with TDefaults enum.
+ */
+inline TInt CPbkMemoryEntryDefaultsDlg::FixIndex(TInt aIndex) const
+    {
+    __ASSERT_DEBUG(aIndex < KPbkNumberOfDefaults,
+        Panic(EPanicPreCond_FixIndex));
+
+    TInt ret = aIndex;
+
+    for (TInt i=0; i <= ret; ++i)
+        {
+        // If the default in question is not supported,
+        // add one to the index, since there was a missing row
+        if (!IsSupported(i))
+            {
+            ++ret;
+            }
+        }
+    return ret;
+    }
+
+//  End of File