phonebookui/Phonebook/View/src/CPbkContactEditorFieldArray.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: 
       
    15 *           Methods for Phonebook Contact editor field array.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include "CPbkContactEditorFieldArray.h"  // this class
       
    22 
       
    23 #include "MPbkContactEditorUiBuilder.h"
       
    24 #include <MPbkContactEditorField.h>
       
    25 #include "PbkContactEditorFieldFactory.h"
       
    26 #include "PbkFieldFormatterFactory.h"
       
    27 #include "CPbkContactItem.h"
       
    28 #include "MPbkPhoneNumberFormat.h"
       
    29 #include "PbkIconInfo.h"
       
    30 #include "CPbkFieldInfo.h"
       
    31 #include "CPbkReadingEditorBinderVisitor.h"
       
    32 #include <PbkView.rsg>
       
    33 
       
    34 #include <CPbkExtGlobals.h>
       
    35 #include <MPbkExtensionFactory.h>
       
    36 
       
    37 #include <PbkDebug.h>
       
    38 
       
    39 /// Unnamed namespace for local definitons
       
    40 namespace {
       
    41 
       
    42 // LOCAL CONSTANTS AND MACROS
       
    43 
       
    44 const TInt KArrayGranularity = 5;
       
    45 
       
    46 #ifdef _DEBUG
       
    47 /// Panic codes for CPbkContactEditorFieldArray
       
    48 enum TPanicCode
       
    49     {
       
    50 	EPanicPostCond_ConstructL,
       
    51 	EPanicInvariant_FieldNotFound,
       
    52 	EPanicInvariant_MembersNotCreated,
       
    53 	EPanicPreCond_CreateFieldsFromContactL,
       
    54 	EPanicPreCond_DoAddFieldL,
       
    55 	EPanicInvariant_CountMismatch
       
    56     };
       
    57 #endif  // _DEBUG
       
    58 
       
    59 // ==================== LOCAL FUNCTIONS ====================
       
    60 
       
    61 #ifdef _DEBUG
       
    62 void Panic(TPanicCode aReason)
       
    63     {
       
    64     _LIT(KPanicText, "CPbkContactEditorFieldArray");
       
    65     User::Panic(KPanicText, aReason);
       
    66     }
       
    67 #endif  // _DEBUG
       
    68 
       
    69 }  // namespace
       
    70 
       
    71 
       
    72 // ================= MEMBER FUNCTIONS =======================
       
    73 
       
    74 inline CPbkContactEditorFieldArray::CPbkContactEditorFieldArray
       
    75         (CPbkContactItem& aContactItem, 
       
    76         MPbkContactEditorUiBuilder& aUiBuilder) :
       
    77     iContactItem(aContactItem),
       
    78     iUiBuilder(aUiBuilder),
       
    79     iFieldArray(KArrayGranularity)
       
    80     {
       
    81     }
       
    82 
       
    83 inline void CPbkContactEditorFieldArray::ConstructL()
       
    84     {
       
    85     iIconInfoContainer = CPbkIconInfoContainer::NewL(R_PBK_ICON_INFO_ARRAY);
       
    86 
       
    87     // Get extension factory for setting extension icons
       
    88     CPbkExtGlobals* extGlobal = CPbkExtGlobals::InstanceL();
       
    89     extGlobal->PushL();
       
    90     MPbkExtensionFactory& factory = extGlobal->FactoryL();    
       
    91     factory.AddPbkFieldIconsL(iIconInfoContainer);
       
    92     CleanupStack::PopAndDestroy(extGlobal);
       
    93 
       
    94     // Construct the reading field binder (visitor pattern)
       
    95     iReadingFieldBinder = CPbkReadingEditorBinderVisitor::NewL();
       
    96 
       
    97     __TEST_INVARIANT;
       
    98 
       
    99     //PostCond:
       
   100     __ASSERT_DEBUG(iIconInfoContainer, 
       
   101             Panic(EPanicPostCond_ConstructL));
       
   102     }
       
   103 
       
   104 CPbkContactEditorFieldArray* CPbkContactEditorFieldArray::NewL
       
   105         (CPbkContactItem& aContactItem, 
       
   106         MPbkContactEditorUiBuilder& aUiBuilder)
       
   107     {
       
   108 	CPbkContactEditorFieldArray* dlg = new(ELeave) CPbkContactEditorFieldArray(aContactItem, aUiBuilder);
       
   109     CleanupStack::PushL(dlg);
       
   110     dlg->ConstructL();
       
   111     CleanupStack::Pop();  // dlg
       
   112     return dlg;
       
   113     }
       
   114 
       
   115 CPbkContactEditorFieldArray::~CPbkContactEditorFieldArray()
       
   116     {
       
   117 	__TEST_INVARIANT;
       
   118 
       
   119     PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkContactEditorFieldArray::~CPbkContactEditorFieldArray"));
       
   120 
       
   121     // delete member data
       
   122     delete iReadingFieldBinder;
       
   123     delete iIconInfoContainer;
       
   124 
       
   125     iFieldArray.ResetAndDestroy();
       
   126     }
       
   127 
       
   128 void CPbkContactEditorFieldArray::CreateFieldsFromContactL()
       
   129     {
       
   130 	__ASSERT_DEBUG(iFieldArray.Count() == 0, Panic(EPanicPreCond_CreateFieldsFromContactL));
       
   131 
       
   132 	__TEST_INVARIANT;
       
   133 
       
   134     CPbkFieldArray& fieldSet = iContactItem.CardFields();
       
   135     const TInt fieldCount = fieldSet.Count();
       
   136     for (TInt i=0; i < fieldCount; ++i)
       
   137         {
       
   138         TPbkContactItemField& contactItemField = fieldSet[i];
       
   139         if (contactItemField.FieldInfo().IsEditable())
       
   140             {
       
   141 	        MPbkContactEditorField* field = PbkContactEditorFieldFactory::CreateFieldL(
       
   142                     contactItemField, iUiBuilder, *iIconInfoContainer);
       
   143             iFieldArray.InsertL(iFieldArray.Count(), field);
       
   144             }
       
   145         }
       
   146 
       
   147     AcceptL(*iReadingFieldBinder);
       
   148 
       
   149 	__TEST_INVARIANT;
       
   150     }
       
   151 
       
   152 void CPbkContactEditorFieldArray::AcceptL(MPbkFieldEditorVisitor& aVisitor)
       
   153     {
       
   154     const TInt count = iFieldArray.Count();
       
   155     for (TInt i = 0; i < count; ++i)
       
   156         {
       
   157         iFieldArray[i]->AcceptL(aVisitor);
       
   158         }
       
   159     }
       
   160 
       
   161 TBool CPbkContactEditorFieldArray::AreAllFieldsEmpty() const
       
   162     {
       
   163 	__TEST_INVARIANT;
       
   164 
       
   165 	TBool result = ETrue;
       
   166     const CPbkFieldArray& fields = iContactItem.CardFields();
       
   167     const TInt fieldCount = fields.Count();
       
   168     for (TInt i=0; i < fieldCount; ++i)
       
   169         {
       
   170         const TPbkContactItemField& contactItemField = fields[i];
       
   171         if ( !contactItemField.IsEmptyOrAllSpaces() &&
       
   172                 // The Synchronization field does not count here
       
   173                 contactItemField.FieldInfo().FieldId()
       
   174                 != EPbkFieldIdSyncronization )
       
   175             {
       
   176 			result = EFalse;
       
   177 			break;
       
   178             }
       
   179         }
       
   180 
       
   181 	__TEST_INVARIANT;
       
   182 
       
   183     return result;
       
   184     }
       
   185 
       
   186 void CPbkContactEditorFieldArray::AddFieldL
       
   187         (TPbkContactItemField& aField)
       
   188     {
       
   189 	__TEST_INVARIANT;
       
   190 
       
   191 	DoAddFieldL(aField, iFieldArray.Count());
       
   192 
       
   193 	__TEST_INVARIANT;
       
   194     }
       
   195 
       
   196 void CPbkContactEditorFieldArray::RemoveField
       
   197         (MPbkContactEditorField& aField)
       
   198     {
       
   199 	__TEST_INVARIANT;
       
   200 
       
   201 	const TInt count = iFieldArray.Count();
       
   202     for (TInt i = 0; i < count; ++i)
       
   203         {
       
   204         MPbkContactEditorField* field = iFieldArray[i];
       
   205         if (field == &aField)
       
   206             {
       
   207             iReadingFieldBinder->NotifyEditorDeletion( field->FieldId() );
       
   208             iUiBuilder.DeleteControl(field->ControlId());     
       
   209             iFieldArray.Delete(i);
       
   210 			iContactItem.RemoveField(
       
   211 				iContactItem.FindFieldIndex(aField.ContactItemField()));
       
   212 			delete field;
       
   213 			break;
       
   214             }
       
   215         }
       
   216 
       
   217 	__TEST_INVARIANT;
       
   218     }
       
   219 
       
   220 TInt CPbkContactEditorFieldArray::ContactItemFieldCount() const
       
   221     {
       
   222 	__TEST_INVARIANT;
       
   223 
       
   224     return iContactItem.CardFields().Count();
       
   225     }
       
   226 
       
   227 TInt CPbkContactEditorFieldArray::EditorCount() const
       
   228     {
       
   229 	__TEST_INVARIANT;
       
   230 
       
   231     return iFieldArray.Count();
       
   232     }
       
   233 
       
   234 const MPbkContactEditorField& CPbkContactEditorFieldArray::FieldAt
       
   235 		(TInt aFieldIndex)
       
   236 	{
       
   237 	__TEST_INVARIANT;
       
   238 
       
   239 	return *iFieldArray[aFieldIndex];
       
   240 	}
       
   241 
       
   242 MPbkContactEditorField* CPbkContactEditorFieldArray::Find
       
   243         (const TPbkContactItemField& aField) const
       
   244     {
       
   245 	__TEST_INVARIANT;
       
   246 
       
   247     MPbkContactEditorField* result = NULL;
       
   248 	const TInt count = iFieldArray.Count();
       
   249     for (TInt i = 0; i < count; ++i)
       
   250         {
       
   251         if (iFieldArray[i]->ContactItemField().IsSame(aField))
       
   252             {
       
   253             result = iFieldArray[i];
       
   254             break;
       
   255             }
       
   256         }
       
   257 
       
   258 	__TEST_INVARIANT;
       
   259     return result;
       
   260     }
       
   261 
       
   262 MPbkContactEditorField* CPbkContactEditorFieldArray::Find
       
   263         (TInt aControlId) const
       
   264     {
       
   265 	__TEST_INVARIANT;
       
   266 
       
   267     MPbkContactEditorField* field = NULL;
       
   268 	const TInt count = iFieldArray.Count();
       
   269     for (TInt i = 0; i < count; ++i)
       
   270         {
       
   271         if (iFieldArray[i]->ControlId() == aControlId)
       
   272             {
       
   273             field = iFieldArray[i];
       
   274             break;
       
   275             }
       
   276         }
       
   277 
       
   278 	__TEST_INVARIANT;
       
   279     return field;
       
   280     }
       
   281 
       
   282 TInt CPbkContactEditorFieldArray::FindContactItemFieldIndex
       
   283         (const TPbkContactItemField& aField) const
       
   284     {
       
   285 	__TEST_INVARIANT;
       
   286 
       
   287     return iContactItem.FindFieldIndex(aField);
       
   288     }
       
   289 
       
   290 void CPbkContactEditorFieldArray::SaveFieldsL()
       
   291     {
       
   292 	__TEST_INVARIANT;
       
   293 
       
   294     for (TInt i = 0; i < iFieldArray.Count(); ++i)
       
   295         {
       
   296         iFieldArray[i]->SaveFieldL();
       
   297         }
       
   298 
       
   299 	__TEST_INVARIANT;
       
   300 	}
       
   301 
       
   302 TBool CPbkContactEditorFieldArray::FieldsChanged() const
       
   303     {
       
   304 	__TEST_INVARIANT;
       
   305 
       
   306 	TBool result = EFalse;
       
   307     for (TInt i = 0; i < iFieldArray.Count(); ++i)
       
   308         {
       
   309         if (iFieldArray[i]->FieldDataChanged())
       
   310 			{
       
   311 			result = ETrue;
       
   312 			}
       
   313         // can break because at least one field has changed
       
   314         if (result)
       
   315             {
       
   316             break;
       
   317             }
       
   318         }
       
   319 
       
   320 	__TEST_INVARIANT;
       
   321     return result;
       
   322     }
       
   323 
       
   324 void CPbkContactEditorFieldArray::SetFocusToIndex
       
   325 		(TInt aFocusIndex)
       
   326 	{
       
   327 	__TEST_INVARIANT;
       
   328 
       
   329 	MPbkContactEditorField* field = Find(iContactItem.CardFields()[aFocusIndex]);
       
   330 	TInt err = KErrNotFound;
       
   331 	if (field)
       
   332 		{
       
   333 		TRAP(err, iUiBuilder.TryChangeFocusL(field->ControlId()));
       
   334 		}
       
   335 
       
   336 	for (TInt i = 0; i < iFieldArray.Count() && err!=KErrNone; ++i)
       
   337 		{
       
   338 		if (iUiBuilder.Control(iFieldArray[i]->ControlId()))
       
   339 			{
       
   340 			TRAP(err,iUiBuilder.TryChangeFocusL(iFieldArray[i]->ControlId()));
       
   341 			}
       
   342 		}
       
   343 
       
   344 	__TEST_INVARIANT;
       
   345 	}
       
   346 
       
   347 MPbkContactEditorField& CPbkContactEditorFieldArray::CreateFieldL
       
   348 		(CPbkFieldInfo& aFieldInfo)
       
   349 	{
       
   350 	__TEST_INVARIANT;
       
   351 
       
   352 	TPbkContactItemField& newField = iContactItem.AddFieldL(aFieldInfo);
       
   353 	
       
   354 	// Find field from iContact item. 
       
   355 	// Its editable field index is the insertion position
       
   356 	TInt fieldIndex = 0;
       
   357 	for (TInt i = 0; i < iContactItem.CardFields().Count(); ++i)
       
   358 		{
       
   359 		const TPbkContactItemField& field = iContactItem.CardFields()[i];
       
   360 		const TBool match = field.IsSame(newField);
       
   361 		if(field.FieldInfo().IsEditable() && !match)
       
   362 			{
       
   363 			fieldIndex++;
       
   364 			}
       
   365 		if (match)
       
   366 			{
       
   367 			break;
       
   368 			}
       
   369 		}
       
   370 		
       
   371 	MPbkContactEditorField& addedField = DoAddFieldL(newField, fieldIndex);
       
   372     addedField.AcceptL(*iReadingFieldBinder);
       
   373     addedField.ActivateL();
       
   374 	
       
   375 	__TEST_INVARIANT;
       
   376 
       
   377 	return addedField;
       
   378 	}
       
   379 
       
   380 /**
       
   381  * Not class invariant compliant.
       
   382  */
       
   383 MPbkContactEditorField& CPbkContactEditorFieldArray::DoAddFieldL
       
   384         (TPbkContactItemField& aField,
       
   385 		TInt aFieldInsertIndex)
       
   386     {
       
   387 	__ASSERT_DEBUG(aFieldInsertIndex <= iFieldArray.Count(), 
       
   388 		Panic(EPanicPreCond_DoAddFieldL));
       
   389 
       
   390     // create same order in UI
       
   391 	if (aFieldInsertIndex > 0)
       
   392 		{
       
   393 		// Focus must be set to the field preceeding the insertion point.
       
   394 		// Please note that this means it is not possible to insert to the 
       
   395 		// first dialog position!
       
   396 		const TInt controlId = iFieldArray[aFieldInsertIndex-1]->ControlId();
       
   397 		iUiBuilder.TryChangeFocusL(controlId);
       
   398 		}
       
   399 
       
   400 	MPbkContactEditorField* field = PbkContactEditorFieldFactory::CreateFieldL(
       
   401             aField, iUiBuilder, *iIconInfoContainer);
       
   402     iFieldArray.InsertL(aFieldInsertIndex, field);
       
   403 	return *field;
       
   404     }
       
   405 
       
   406 void CPbkContactEditorFieldArray::__DbgTestInvariant() const
       
   407 	{
       
   408 	#if defined(_DEBUG)
       
   409 
       
   410 	__ASSERT_DEBUG(iFieldArray.Count() <= iContactItem.CardFields().Count(), 
       
   411 			Panic(EPanicInvariant_CountMismatch));
       
   412 
       
   413 	const TInt count = iFieldArray.Count();
       
   414 	for (TInt i = 0; i < count; ++i)
       
   415 		{
       
   416 		TBool result = EFalse;
       
   417 		for (TInt j = 0; j < iContactItem.CardFields().Count() && !result; ++j)
       
   418 			{
       
   419 			TPbkContactItemField& field = iContactItem.CardFields()[j];
       
   420 			if (&field.ContactItemField() == &iFieldArray[j]->ContactItemField().ContactItemField() &&
       
   421 				field.FieldInfo().IsEditable())
       
   422 				{
       
   423 				result = ETrue;
       
   424 				}
       
   425 			}
       
   426 		__ASSERT_DEBUG(result, Panic(EPanicInvariant_FieldNotFound));
       
   427 		}
       
   428 
       
   429     __ASSERT_DEBUG(iIconInfoContainer, 
       
   430             Panic(EPanicInvariant_MembersNotCreated));
       
   431 
       
   432 	#endif
       
   433 	}
       
   434 
       
   435 // End of File