diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIControls/src/CPbk2FieldListBoxModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/CPbk2FieldListBoxModel.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,840 @@ +/* +* Copyright (c) 2005-2007 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 2 field list box model. +* +*/ + + + +// INCLUDE FILES +#include "CPbk2FieldListBoxModel.h" +#include + +// Phonebook 2 +#include "MPbk2ClipListBoxText.h" +#include "MPbk2FieldAnalyzer.h" +#include "CPbk2FieldFormatter.h" +#include "MPbk2ContactFieldDynamicProperties.h" +#include "CPbk2ContactFieldDynamicProperties.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include "Pbk2AddressTools.h" + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +_LIT( KCharsToReplace, "\t" ); +_LIT( KReplacementChars, " " ); +const TInt KMaxFormattedTIntLength( 15 ); +const TInt KInitialBufferLength( 128 ); +const TInt KGranularity( 8 ); + +} /// namespace + + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::CPbk2FieldListBoxRow +// -------------------------------------------------------------------------- +// +inline CPbk2FieldListBoxRow::CPbk2FieldListBoxRow() + { + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::~CPbk2FieldListBoxRow +// -------------------------------------------------------------------------- +// +CPbk2FieldListBoxRow::~CPbk2FieldListBoxRow() + { + iColumns.ResetAndDestroy(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::NewL +// -------------------------------------------------------------------------- +// +CPbk2FieldListBoxRow* CPbk2FieldListBoxRow::NewL() + { + return new( ELeave ) CPbk2FieldListBoxRow; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::ColumnCount +// -------------------------------------------------------------------------- +// +TInt CPbk2FieldListBoxRow::ColumnCount() const + { + return iColumns.Count(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::At +// -------------------------------------------------------------------------- +// +TPtrC CPbk2FieldListBoxRow::At( TInt aColumnIndex ) const + { + return *iColumns[aColumnIndex]; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::AppendColumnL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxRow::AppendColumnL( const TDesC& aColumnText ) + { + HBufC* buf = aColumnText.AllocLC(); + User::LeaveIfError( iColumns.Append( buf ) ); + CleanupStack::Pop( buf ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::TotalLength +// -------------------------------------------------------------------------- +// +TInt CPbk2FieldListBoxRow::TotalLength() const + { + TInt result = 0; + const TInt count = iColumns.Count(); + for (TInt i = 0; i < count; ++i) + { + result += At(i).Length(); + } + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxRow::MaxColumnLength +// -------------------------------------------------------------------------- +// +TInt CPbk2FieldListBoxRow::MaxColumnLength() const + { + TInt result = 0; + const TInt count = iColumns.Count(); + for (TInt i = 0; i < count; ++i) + { + result = Max(result, At(i).Length()); + } + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::CPbk2FieldListBoxModel +// -------------------------------------------------------------------------- +// +inline CPbk2FieldListBoxModel::CPbk2FieldListBoxModel( TParams& aParams, + const TArray* + aFieldCollectionArray, + const TArray* aPresenceIconsPos ): + iRows( KGranularity ), + iParams( aParams ), + iFieldCollectionArray( aFieldCollectionArray ), + iPresenceIconsPos( aPresenceIconsPos ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::~CPbk2FieldListBoxModel +// -------------------------------------------------------------------------- +// +CPbk2FieldListBoxModel::~CPbk2FieldListBoxModel() + { + iRows.ResetAndDestroy(); + delete iColumnBuf; + delete iLineBuf; + delete iFieldFormatter; + delete iDynamicProperties; + iDuplicatesArray.Reset(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::NewL +// -------------------------------------------------------------------------- +// +CPbk2FieldListBoxModel* CPbk2FieldListBoxModel::NewL + ( TParams& aParams, + const TArray* + aFieldCollectionArray, + const TArray* aPresenceIconsPos ) + { + CPbk2FieldListBoxModel* self = new ( ELeave ) + CPbk2FieldListBoxModel( aParams, aFieldCollectionArray, + aPresenceIconsPos ); + CleanupStack::PushL( self ); + self->ConstructL( aParams ); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::ConstructL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::ConstructL + ( TParams& aParams ) + { + iFieldFormatter = CPbk2FieldFormatter::NewL + ( aParams.iFieldProperties, aParams.iContactManager.FieldTypes() ); + iFieldFormatter->SetTimeFormatL( aParams.iTimeFormat ); + iLineBuf = HBufC::NewL( KInitialBufferLength ); + iColumnBuf = HBufC::NewL( KInitialBufferLength ); + iDynamicProperties = aParams.iDynamicProperties; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendRowL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::AppendRowL( CPbk2FieldListBoxRow* aLine ) + { + ExpandBuffersL( *aLine ); + iRows.AppendL( aLine ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::SetClipper +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::SetClipper + ( MPbk2ClipListBoxText& aTextClipper ) + { + this->iTextClipper = &aTextClipper; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::FormatFieldsL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::FormatFieldsL() + { + // Format all the fields and add lines to iTextArray + const TInt fieldCount = iParams.iFields.FieldCount(); + for ( TInt i=0; i < fieldCount; ++i ) + { + FormatFieldL( iParams.iFields.At(i), iParams ); + } + + // Do the same for xSP contacts, if there are any + if ( iFieldCollectionArray != NULL && iFieldCollectionArray->Count() > 0 ) + { + TInt contactsCount = iFieldCollectionArray->Count(); + for ( TInt j = 0; j < contactsCount; j++ ) + { + TInt xspFieldCount = iFieldCollectionArray->operator[](j)-> + FieldCount(); + for ( TInt k = 0; k < xspFieldCount; k++ ) + { + FormatFieldL( iFieldCollectionArray->operator[](j)->At(k), + iParams ); + } + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::GetModelIndex +// -------------------------------------------------------------------------- +// +TInt CPbk2FieldListBoxModel::GetModelIndex( TInt aListboxIndex ) + { + TInt retIndex = aListboxIndex; + TInt count = iDuplicatesArray.Count(); + for ( TInt i = 0; i < count; i++ ) + { + if ( iDuplicatesArray[i] < aListboxIndex ) + { + retIndex++; + } + } + return retIndex; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::MdcaCount +// -------------------------------------------------------------------------- +// +TInt CPbk2FieldListBoxModel::MdcaCount() const + { + return iRows.Count(); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::MdcaPoint +// -------------------------------------------------------------------------- +// +TPtrC16 CPbk2FieldListBoxModel::MdcaPoint( TInt aIndex ) const + { + const TText KSeparator = '\t'; + TPtr rowText( iLineBuf->Des() ); + rowText.Zero(); + + const CPbk2FieldListBoxRow& row = *iRows[aIndex]; + const TInt columnCount = row.ColumnCount(); + for ( TInt columnIndex = 0; columnIndex < columnCount; ++columnIndex ) + { + TPtr columnText( iColumnBuf->Des() ); + columnText.Copy( row.At( columnIndex ) ); + + // Clip the column if required + if ( iTextClipper && columnIndex == EContentColumn && + aIndex < iParams.iFields.FieldCount() ) + { + ClipText( iParams.iFields.At( aIndex ), aIndex, + columnText, columnIndex ); + } + + // Append the column and separator to the formatted row + rowText.Append( columnText ); + rowText.Append( KSeparator ); + } + + return rowText; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::FormatFieldL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::FormatFieldL + ( const CPbk2PresentationContactField& aField, TParams& aParams ) + { + // Figure out whether the field should be shown + const MPbk2FieldAnalyzer* fieldAnalyzer = aParams.iFieldAnalyzer; + const MPbk2ContactFieldDynamicProperties* dynamicProps + = iDynamicProperties; + + TBool showField = ETrue; + if ( fieldAnalyzer && fieldAnalyzer->IsHiddenField( aField ) || + dynamicProps && dynamicProps->IsHiddenField( aField ) ) + { + showField = EFalse; + } + + if (iParams.iCommMethod == VPbkFieldTypeSelectorFactory::EVOIPCallSelector && + showField && fieldAnalyzer ) + { + const TInt voipFlag = fieldAnalyzer->VoipSupportL( iParams.iFields ); + TInt resId = aField.BestMatchingFieldType()->FieldTypeResId(); + if ( !fieldAnalyzer->IsFieldVoipCapable( resId, voipFlag ) ) + { + showField = EFalse; + } + } + + if ( showField ) + { + // Get master field type list and match field's type against it + const MVPbkFieldTypeList* masterFieldTypeList = + &iParams.iContactManager.FieldTypes(); + + const MVPbkFieldType* fieldType = + VPbkUtils::MatchFieldType( *masterFieldTypeList, aField ); + + TPbk2StoreContactAnalyzer analyzer( iParams.iContactManager, NULL ); + if ( analyzer.IsFieldTypeIncludedL( + aField, R_PHONEBOOK2_ADDRESS_SELECTOR ) ) + { + FormatAddressFieldL( aField, aParams ); + } + else + { + CPbk2FieldListBoxRow* row = CPbk2FieldListBoxRow::NewL(); + CleanupStack::PushL(row); + TPtr columnBuf(iColumnBuf->Des()); + AppendIconsToBeginningL(aField, *fieldType, *row, aParams); + AppendFieldLabelL(aField, *row, columnBuf); + AppendFieldContentL(aField, *fieldType, *row, columnBuf); + AppendIconsToEndL(aField, *row, aParams); + + // Expand row formatting buffer if required + ExpandBuffersL(*row); + + // Add the row + // If the content of field is equal to other rows and need to be duplicated, + // duplicate it + if ( aParams.iFieldContentNeedToBeDuplicated && + DuplicatesExist( columnBuf ) ) + { + CleanupStack::PopAndDestroy(row); + iDuplicatesArray.AppendL( iRows.Count() - 1 ); // position of + // the duplicate + } + else + { + iRows.AppendL(row); + CleanupStack::Pop(row); + } + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::FormatAddressFieldL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::FormatAddressFieldL + ( const CPbk2PresentationContactField& aField, TParams& aParams ) + { + CPbk2FieldListBoxRow* row = CPbk2FieldListBoxRow::NewL(); + CleanupStack::PushL(row); + + TPtr columnBuf(iColumnBuf->Des()); + AppendAddressIconsToBeginningL(aField, *row, aParams); + AppendAddressFieldLabelL(aField, *row, columnBuf); + TBool duplicates = DuplicatesAddressExist( columnBuf, row->ColumnCount() - 1 ); + AppendAddressFieldContentL(aField, *row, columnBuf); + + // Expand row formatting buffer if required + ExpandBuffersL(*row); + + // Add the row + if ( !duplicates ) + { + iRows.AppendL(row); + CleanupStack::Pop(row); + } + else + { + CleanupStack::PopAndDestroy(row); + iDuplicatesArray.AppendL( iRows.Count() - 1 ); // position of + // the duplicate + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::ExpandBuffersL +// -------------------------------------------------------------------------- +// +void CPbk2FieldListBoxModel::ExpandBuffersL + ( const CPbk2FieldListBoxRow& aRow ) + { + // Row formatting buffer + const TInt rowLength = aRow.TotalLength() + + aRow.ColumnCount(); // for separator characters + + if (rowLength > iLineBuf->Des().MaxLength()) + { + iLineBuf = iLineBuf->ReAllocL( rowLength ); + } + + ExpandColumnBufferL( aRow.MaxColumnLength() ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::ExpandColumnBufferL +// -------------------------------------------------------------------------- +// +TPtr CPbk2FieldListBoxModel::ExpandColumnBufferL + ( TInt aRequiredLength ) + { + if ( aRequiredLength > iColumnBuf->Des().MaxLength() ) + { + iColumnBuf = iColumnBuf->ReAllocL( aRequiredLength ); + } + return ( iColumnBuf->Des() ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::ClipText +// Clip text from beginning if field is numeric field or e-mail field. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::ClipText + ( const CPbk2PresentationContactField& aField, TInt aIndex, + TPtr& aColumnText, TInt aColumnIndex ) const + { + TPbk2StoreContactAnalyzer analyzer( iParams.iContactManager, NULL ); + TBool clip = analyzer.IsFieldTypeIncludedL + ( aField, R_PHONEBOOK2_PHONENUMBER_SELECTOR ); + + if ( !clip ) + { + clip = analyzer.IsFieldTypeIncludedL + ( aField, R_PHONEBOOK2_EMAIL_SELECTOR ); + } + + // Clip if required + if ( clip ) + { + iTextClipper->ClipFromBeginning + ( aColumnText, aIndex, aColumnIndex ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendFieldLabelL +// Appends field label. Removes any listbox separator characters. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendFieldLabelL + ( const CPbk2PresentationContactField& aField, + CPbk2FieldListBoxRow& aRow, TPtr& aColumnBuf ) + { + aColumnBuf.Set( ExpandColumnBufferL( aField.FieldLabel().Length() ) ); + aColumnBuf.Zero(); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, aField.FieldLabel(), + KCharsToReplace, KReplacementChars ); + // Replace characters that can not be displayed correctly + Pbk2PresentationUtils::ReplaceNonGraphicCharacters + ( aColumnBuf, ' ' ); + aRow.AppendColumnL( aColumnBuf ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendAddressFieldLabelL +// Appends field label. Removes any listbox separator characters. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendAddressFieldLabelL + ( const CPbk2PresentationContactField& aField, + CPbk2FieldListBoxRow& aRow, TPtr& aColumnBuf ) + { + aColumnBuf.Set( ExpandColumnBufferL( aField.FieldLabel().Length() ) ); + aColumnBuf.Zero(); + TBool address = EFalse; + + const TInt countProperties = + aField.FieldProperty().FieldType().VersitProperties().Count(); + TArray props = + aField.FieldProperty().FieldType().VersitProperties(); + for ( TInt i = 0; i < countProperties; ++i ) + { + if ( props[ i ].Name() == EVPbkVersitNameADR + && props[ i ].Parameters().Contains( EVPbkVersitParamHOME ) ) + { + HBufC* label = + StringLoader::LoadLC( R_QTN_PHOB_HEADER_ADDRESS_HOME ); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, *label, + KCharsToReplace, KReplacementChars ); + CleanupStack::PopAndDestroy( label ); + address = ETrue; + } + else if ( props[ i ].Name() == EVPbkVersitNameADR + && props[ i ].Parameters().Contains( EVPbkVersitParamWORK ) ) + { + HBufC* label = + StringLoader::LoadLC( R_QTN_PHOB_HEADER_ADDRESS_WORK ); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, *label, + KCharsToReplace, KReplacementChars ); + CleanupStack::PopAndDestroy( label ); + address = ETrue; + } + else if ( props[ i ].Name() == EVPbkVersitNameADR + && !( props[ i ].Parameters().Contains( EVPbkVersitParamHOME ) ) + && !( props[ i ].Parameters().Contains( EVPbkVersitParamWORK ) ) ) + { + HBufC* label = StringLoader::LoadLC( R_QTN_PHOB_HEADER_ADDRESS ); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, *label, + KCharsToReplace, KReplacementChars ); + CleanupStack::PopAndDestroy( label ); + address = ETrue; + } + } + + // Replace characters that can not be displayed correctly + Pbk2PresentationUtils::ReplaceNonGraphicCharacters + ( aColumnBuf, ' ' ); + aRow.AppendColumnL( aColumnBuf ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendFieldContentL +// Appends field content. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendFieldContentL + ( const CPbk2PresentationContactField& aField, + const MVPbkFieldType& aFieldType, + CPbk2FieldListBoxRow& aRow, TPtr& aColumnBuf ) + { + TPtrC fieldText( iFieldFormatter->FormatFieldContentL + ( aField, aFieldType ) ); + aColumnBuf.Set( ExpandColumnBufferL( fieldText.Length() ) ); + aColumnBuf.Zero(); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, fieldText, KCharsToReplace, KReplacementChars ); + // Replace characters that can not be displayed correctly + Pbk2PresentationUtils::ReplaceNonGraphicCharacters + (aColumnBuf, ' '); + aRow.AppendColumnL( aColumnBuf ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendAddressFieldContentL +// Appends field content. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendAddressFieldContentL + ( const CPbk2PresentationContactField& aField, + CPbk2FieldListBoxRow& aRow, TPtr& aColumnBuf ) + { + TPbk2FieldGroupId address = EPbk2FieldGroupIdNone; + const TInt countFieldProps = + aField.FieldProperty().FieldType().VersitProperties().Count(); + TArray fieldProps = + aField.FieldProperty().FieldType().VersitProperties(); + for ( TInt i = 0; i < countFieldProps; ++i ) + { + if ( fieldProps[ i ].Name() == EVPbkVersitNameADR ) + { + if ( fieldProps[ i ].Parameters().Contains( EVPbkVersitParamHOME ) ) + { + address = EPbk2FieldGroupIdHomeAddress; + } + else if ( fieldProps[ i ].Parameters().Contains( EVPbkVersitParamWORK ) ) + { + address = EPbk2FieldGroupIdCompanyAddress; + } + else if ( !( fieldProps[ i ].Parameters().Contains( EVPbkVersitParamHOME ) ) + && !( fieldProps[ i ].Parameters().Contains( EVPbkVersitParamWORK ) ) ) + { + address = EPbk2FieldGroupIdPostalAddress; + } + } + } + if ( address ) + { + RBuf text; + Pbk2AddressTools::GetAddressShortPreviewLC( + static_cast( + aField.ParentContact() ), address, text ); + HBufC* buffer = HBufC::NewLC( text.Length() ); + TPtr textFormatted ( buffer->Des() ); + Pbk2PresentationUtils::AppendWithNewlineTranslationL + ( textFormatted, text ); + aColumnBuf.Set( ExpandColumnBufferL( textFormatted.Length() ) ); + aColumnBuf.Zero(); + Pbk2PresentationUtils::AppendAndReplaceChars + ( aColumnBuf, textFormatted, KCharsToReplace, KReplacementChars ); + CleanupStack::PopAndDestroy( buffer ); + CleanupStack::PopAndDestroy( &text ); // text + // Replace characters that can not be displayed correctly + Pbk2PresentationUtils::ReplaceNonGraphicCharacters + (aColumnBuf, ' '); + aRow.AppendColumnL( aColumnBuf ); + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendIconsToBeginningL +// Adds icons to the beginning. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendIconsToBeginningL + ( const CPbk2PresentationContactField& aField, + const MVPbkFieldType& aFieldType, + CPbk2FieldListBoxRow& aRow, TParams& aParams ) + { + // Format icon index + TBuf iconText; + + // appened presence icon for xSP field + TInt iconIndex = KErrNotFound; + if ( iPresenceIconsPos != NULL && + aFieldType.FieldTypeResId() == R_VPBK_FIELD_TYPE_IMPP ) + { + TPtrC fieldText( iFieldFormatter->FormatFieldContentL + ( aField, aFieldType ) ); + TInt count = iPresenceIconsPos->Count(); + for ( TInt i = 0; i < count && iconIndex == KErrNotFound; i++ ) + { + if ( !(fieldText.CompareF( iPresenceIconsPos->operator[](i). + iServiceName ) )) + { + iconIndex = aParams.iIconArray.FindIcon( + iPresenceIconsPos->operator[](i).iIconId ); + } + } + } + + if ( iconIndex == KErrNotFound ) + { + iconIndex = aParams.iIconArray.FindIcon( + aField.FieldProperty().IconId() ); + } + if ( iconIndex == KErrNotFound ) + { + iconIndex = aParams.iIconArray.FindIcon( iParams.iDefaultIconId ); + } + + iconText.Num( iconIndex ); + aRow.AppendColumnL( iconText ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendAddressIconsToBeginningL +// Adds icons to the beginning. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendAddressIconsToBeginningL + ( const CPbk2PresentationContactField& aField, + CPbk2FieldListBoxRow& aRow, TParams& aParams ) + { + // Format icon index + TBuf iconText; + TInt iconIndex = KErrNotFound; + + if ( IsGeoFieldForAddressL( aField ) ) + { + iconIndex = aParams.iIconArray.FindIcon( + TPbk2AppIconId( EPbk2qgn_prop_locev_map ) ); + } + else + { + iconIndex = aParams.iIconArray.FindIcon( + TPbk2AppIconId( EPbk2qgn_prop_pb_no_valid_lm ) ); + } + + iconText.Num( iconIndex ); + aRow.AppendColumnL( iconText ); + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::IsGeoFieldForAddressL +// Checks if address is validated. +// -------------------------------------------------------------------------- +// +inline TBool CPbk2FieldListBoxModel::IsGeoFieldForAddressL + ( const CPbk2PresentationContactField& aField ) + { + TBool result = EFalse; + TInt startIndex = 0; + + TPbk2StoreContactAnalyzer analyzer( iParams.iContactManager, NULL ); + if ( analyzer.IsFieldTypeIncludedL( + aField, R_PHONEBOOK2_HOME_ADDRESS_SELECTOR ) ) + { + if ( analyzer.HasFieldL( R_PHONEBOOK2_HOME_GEO_SELECTOR, + startIndex, + &iParams.iFields.ParentStoreContact() ) != KErrNotFound ) + { + result = ETrue; + } + } + else if ( analyzer.IsFieldTypeIncludedL( + aField, R_PHONEBOOK2_WORK_ADDRESS_SELECTOR ) ) + { + if ( analyzer.HasFieldL( R_PHONEBOOK2_WORK_GEO_SELECTOR, + startIndex, + &iParams.iFields.ParentStoreContact() ) != KErrNotFound ) + { + result = ETrue; + } + } + else if ( analyzer.IsFieldTypeIncludedL( + aField, R_PHONEBOOK2_GENERAL_ADDRESS_SELECTOR ) ) + { + if ( analyzer.HasFieldL( R_PHONEBOOK2_GENERAL_GEO_SELECTOR, + startIndex, + &iParams.iFields.ParentStoreContact() ) != KErrNotFound ) + { + result = ETrue; + } + } + + return result; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::AppendIconsToEndL +// Adds additional icons to the end. +// -------------------------------------------------------------------------- +// +inline void CPbk2FieldListBoxModel::AppendIconsToEndL + ( const CPbk2PresentationContactField& aField, + CPbk2FieldListBoxRow& aRow, TParams& aParams ) + { + if ( aParams.iFieldAnalyzer ) + { + // Check and add speed dial icon + if ( aParams.iFieldAnalyzer->HasSpeedDialL( aField.StoreField() ) ) + { + TBuf iconText; + iconText.Num( aParams.iIconArray. + FindIcon( TPbk2AppIconId( EPbk2qgn_indi_qdial_add ) ) ); + aRow.AppendColumnL( iconText ); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::DuplicatesExist +// Checks if row with the same content already exists. +// -------------------------------------------------------------------------- +// +inline TBool CPbk2FieldListBoxModel::DuplicatesExist( + TPtrC aContent ) + { + TBool ret = EFalse; + TInt rowsCount = iRows.Count(); + for( TInt i = 0; i < rowsCount && !ret; i++ ) + { + TInt columnsCount = iRows[i]->ColumnCount(); + for( TInt j = 0; j < columnsCount && !ret; j++ ) + { + if ( iRows[i]->At(j).CompareF( aContent ) == 0 ) + { + ret = ETrue; + } + } + } + + return ret; + } + +// -------------------------------------------------------------------------- +// CPbk2FieldListBoxModel::DuplicatesAddressExist +// Checks if row with the same content already exists. +// -------------------------------------------------------------------------- +// +inline TBool CPbk2FieldListBoxModel::DuplicatesAddressExist( + TPtrC aContent, TInt aIndex ) + { + TBool ret = EFalse; + TInt rowsCount = iRows.Count(); + for( TInt i = 0; i < rowsCount && !ret; i++ ) + { + if ( aIndex < iRows[i]->ColumnCount() ) + { + if ( iRows[i]->At( aIndex ).CompareF( aContent ) == 0 ) + { + ret = ETrue; + } + } + } + + return ret; + } + +// End of File