diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/View/src/CPbkContactEditorFieldArray.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/View/src/CPbkContactEditorFieldArray.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,435 @@ +/* +* 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: +* Methods for Phonebook Contact editor field array. +* +*/ + + +// INCLUDE FILES +#include "CPbkContactEditorFieldArray.h" // this class + +#include "MPbkContactEditorUiBuilder.h" +#include +#include "PbkContactEditorFieldFactory.h" +#include "PbkFieldFormatterFactory.h" +#include "CPbkContactItem.h" +#include "MPbkPhoneNumberFormat.h" +#include "PbkIconInfo.h" +#include "CPbkFieldInfo.h" +#include "CPbkReadingEditorBinderVisitor.h" +#include + +#include +#include + +#include + +/// Unnamed namespace for local definitons +namespace { + +// LOCAL CONSTANTS AND MACROS + +const TInt KArrayGranularity = 5; + +#ifdef _DEBUG +/// Panic codes for CPbkContactEditorFieldArray +enum TPanicCode + { + EPanicPostCond_ConstructL, + EPanicInvariant_FieldNotFound, + EPanicInvariant_MembersNotCreated, + EPanicPreCond_CreateFieldsFromContactL, + EPanicPreCond_DoAddFieldL, + EPanicInvariant_CountMismatch + }; +#endif // _DEBUG + +// ==================== LOCAL FUNCTIONS ==================== + +#ifdef _DEBUG +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbkContactEditorFieldArray"); + User::Panic(KPanicText, aReason); + } +#endif // _DEBUG + +} // namespace + + +// ================= MEMBER FUNCTIONS ======================= + +inline CPbkContactEditorFieldArray::CPbkContactEditorFieldArray + (CPbkContactItem& aContactItem, + MPbkContactEditorUiBuilder& aUiBuilder) : + iContactItem(aContactItem), + iUiBuilder(aUiBuilder), + iFieldArray(KArrayGranularity) + { + } + +inline void CPbkContactEditorFieldArray::ConstructL() + { + iIconInfoContainer = CPbkIconInfoContainer::NewL(R_PBK_ICON_INFO_ARRAY); + + // Get extension factory for setting extension icons + CPbkExtGlobals* extGlobal = CPbkExtGlobals::InstanceL(); + extGlobal->PushL(); + MPbkExtensionFactory& factory = extGlobal->FactoryL(); + factory.AddPbkFieldIconsL(iIconInfoContainer); + CleanupStack::PopAndDestroy(extGlobal); + + // Construct the reading field binder (visitor pattern) + iReadingFieldBinder = CPbkReadingEditorBinderVisitor::NewL(); + + __TEST_INVARIANT; + + //PostCond: + __ASSERT_DEBUG(iIconInfoContainer, + Panic(EPanicPostCond_ConstructL)); + } + +CPbkContactEditorFieldArray* CPbkContactEditorFieldArray::NewL + (CPbkContactItem& aContactItem, + MPbkContactEditorUiBuilder& aUiBuilder) + { + CPbkContactEditorFieldArray* dlg = new(ELeave) CPbkContactEditorFieldArray(aContactItem, aUiBuilder); + CleanupStack::PushL(dlg); + dlg->ConstructL(); + CleanupStack::Pop(); // dlg + return dlg; + } + +CPbkContactEditorFieldArray::~CPbkContactEditorFieldArray() + { + __TEST_INVARIANT; + + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkContactEditorFieldArray::~CPbkContactEditorFieldArray")); + + // delete member data + delete iReadingFieldBinder; + delete iIconInfoContainer; + + iFieldArray.ResetAndDestroy(); + } + +void CPbkContactEditorFieldArray::CreateFieldsFromContactL() + { + __ASSERT_DEBUG(iFieldArray.Count() == 0, Panic(EPanicPreCond_CreateFieldsFromContactL)); + + __TEST_INVARIANT; + + CPbkFieldArray& fieldSet = iContactItem.CardFields(); + const TInt fieldCount = fieldSet.Count(); + for (TInt i=0; i < fieldCount; ++i) + { + TPbkContactItemField& contactItemField = fieldSet[i]; + if (contactItemField.FieldInfo().IsEditable()) + { + MPbkContactEditorField* field = PbkContactEditorFieldFactory::CreateFieldL( + contactItemField, iUiBuilder, *iIconInfoContainer); + iFieldArray.InsertL(iFieldArray.Count(), field); + } + } + + AcceptL(*iReadingFieldBinder); + + __TEST_INVARIANT; + } + +void CPbkContactEditorFieldArray::AcceptL(MPbkFieldEditorVisitor& aVisitor) + { + const TInt count = iFieldArray.Count(); + for (TInt i = 0; i < count; ++i) + { + iFieldArray[i]->AcceptL(aVisitor); + } + } + +TBool CPbkContactEditorFieldArray::AreAllFieldsEmpty() const + { + __TEST_INVARIANT; + + TBool result = ETrue; + const CPbkFieldArray& fields = iContactItem.CardFields(); + const TInt fieldCount = fields.Count(); + for (TInt i=0; i < fieldCount; ++i) + { + const TPbkContactItemField& contactItemField = fields[i]; + if ( !contactItemField.IsEmptyOrAllSpaces() && + // The Synchronization field does not count here + contactItemField.FieldInfo().FieldId() + != EPbkFieldIdSyncronization ) + { + result = EFalse; + break; + } + } + + __TEST_INVARIANT; + + return result; + } + +void CPbkContactEditorFieldArray::AddFieldL + (TPbkContactItemField& aField) + { + __TEST_INVARIANT; + + DoAddFieldL(aField, iFieldArray.Count()); + + __TEST_INVARIANT; + } + +void CPbkContactEditorFieldArray::RemoveField + (MPbkContactEditorField& aField) + { + __TEST_INVARIANT; + + const TInt count = iFieldArray.Count(); + for (TInt i = 0; i < count; ++i) + { + MPbkContactEditorField* field = iFieldArray[i]; + if (field == &aField) + { + iReadingFieldBinder->NotifyEditorDeletion( field->FieldId() ); + iUiBuilder.DeleteControl(field->ControlId()); + iFieldArray.Delete(i); + iContactItem.RemoveField( + iContactItem.FindFieldIndex(aField.ContactItemField())); + delete field; + break; + } + } + + __TEST_INVARIANT; + } + +TInt CPbkContactEditorFieldArray::ContactItemFieldCount() const + { + __TEST_INVARIANT; + + return iContactItem.CardFields().Count(); + } + +TInt CPbkContactEditorFieldArray::EditorCount() const + { + __TEST_INVARIANT; + + return iFieldArray.Count(); + } + +const MPbkContactEditorField& CPbkContactEditorFieldArray::FieldAt + (TInt aFieldIndex) + { + __TEST_INVARIANT; + + return *iFieldArray[aFieldIndex]; + } + +MPbkContactEditorField* CPbkContactEditorFieldArray::Find + (const TPbkContactItemField& aField) const + { + __TEST_INVARIANT; + + MPbkContactEditorField* result = NULL; + const TInt count = iFieldArray.Count(); + for (TInt i = 0; i < count; ++i) + { + if (iFieldArray[i]->ContactItemField().IsSame(aField)) + { + result = iFieldArray[i]; + break; + } + } + + __TEST_INVARIANT; + return result; + } + +MPbkContactEditorField* CPbkContactEditorFieldArray::Find + (TInt aControlId) const + { + __TEST_INVARIANT; + + MPbkContactEditorField* field = NULL; + const TInt count = iFieldArray.Count(); + for (TInt i = 0; i < count; ++i) + { + if (iFieldArray[i]->ControlId() == aControlId) + { + field = iFieldArray[i]; + break; + } + } + + __TEST_INVARIANT; + return field; + } + +TInt CPbkContactEditorFieldArray::FindContactItemFieldIndex + (const TPbkContactItemField& aField) const + { + __TEST_INVARIANT; + + return iContactItem.FindFieldIndex(aField); + } + +void CPbkContactEditorFieldArray::SaveFieldsL() + { + __TEST_INVARIANT; + + for (TInt i = 0; i < iFieldArray.Count(); ++i) + { + iFieldArray[i]->SaveFieldL(); + } + + __TEST_INVARIANT; + } + +TBool CPbkContactEditorFieldArray::FieldsChanged() const + { + __TEST_INVARIANT; + + TBool result = EFalse; + for (TInt i = 0; i < iFieldArray.Count(); ++i) + { + if (iFieldArray[i]->FieldDataChanged()) + { + result = ETrue; + } + // can break because at least one field has changed + if (result) + { + break; + } + } + + __TEST_INVARIANT; + return result; + } + +void CPbkContactEditorFieldArray::SetFocusToIndex + (TInt aFocusIndex) + { + __TEST_INVARIANT; + + MPbkContactEditorField* field = Find(iContactItem.CardFields()[aFocusIndex]); + TInt err = KErrNotFound; + if (field) + { + TRAP(err, iUiBuilder.TryChangeFocusL(field->ControlId())); + } + + for (TInt i = 0; i < iFieldArray.Count() && err!=KErrNone; ++i) + { + if (iUiBuilder.Control(iFieldArray[i]->ControlId())) + { + TRAP(err,iUiBuilder.TryChangeFocusL(iFieldArray[i]->ControlId())); + } + } + + __TEST_INVARIANT; + } + +MPbkContactEditorField& CPbkContactEditorFieldArray::CreateFieldL + (CPbkFieldInfo& aFieldInfo) + { + __TEST_INVARIANT; + + TPbkContactItemField& newField = iContactItem.AddFieldL(aFieldInfo); + + // Find field from iContact item. + // Its editable field index is the insertion position + TInt fieldIndex = 0; + for (TInt i = 0; i < iContactItem.CardFields().Count(); ++i) + { + const TPbkContactItemField& field = iContactItem.CardFields()[i]; + const TBool match = field.IsSame(newField); + if(field.FieldInfo().IsEditable() && !match) + { + fieldIndex++; + } + if (match) + { + break; + } + } + + MPbkContactEditorField& addedField = DoAddFieldL(newField, fieldIndex); + addedField.AcceptL(*iReadingFieldBinder); + addedField.ActivateL(); + + __TEST_INVARIANT; + + return addedField; + } + +/** + * Not class invariant compliant. + */ +MPbkContactEditorField& CPbkContactEditorFieldArray::DoAddFieldL + (TPbkContactItemField& aField, + TInt aFieldInsertIndex) + { + __ASSERT_DEBUG(aFieldInsertIndex <= iFieldArray.Count(), + Panic(EPanicPreCond_DoAddFieldL)); + + // create same order in UI + if (aFieldInsertIndex > 0) + { + // Focus must be set to the field preceeding the insertion point. + // Please note that this means it is not possible to insert to the + // first dialog position! + const TInt controlId = iFieldArray[aFieldInsertIndex-1]->ControlId(); + iUiBuilder.TryChangeFocusL(controlId); + } + + MPbkContactEditorField* field = PbkContactEditorFieldFactory::CreateFieldL( + aField, iUiBuilder, *iIconInfoContainer); + iFieldArray.InsertL(aFieldInsertIndex, field); + return *field; + } + +void CPbkContactEditorFieldArray::__DbgTestInvariant() const + { + #if defined(_DEBUG) + + __ASSERT_DEBUG(iFieldArray.Count() <= iContactItem.CardFields().Count(), + Panic(EPanicInvariant_CountMismatch)); + + const TInt count = iFieldArray.Count(); + for (TInt i = 0; i < count; ++i) + { + TBool result = EFalse; + for (TInt j = 0; j < iContactItem.CardFields().Count() && !result; ++j) + { + TPbkContactItemField& field = iContactItem.CardFields()[j]; + if (&field.ContactItemField() == &iFieldArray[j]->ContactItemField().ContactItemField() && + field.FieldInfo().IsEditable()) + { + result = ETrue; + } + } + __ASSERT_DEBUG(result, Panic(EPanicInvariant_FieldNotFound)); + } + + __ASSERT_DEBUG(iIconInfoContainer, + Panic(EPanicInvariant_MembersNotCreated)); + + #endif + } + +// End of File