diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/ccapplication/ccamycardplugin/src/ccappmycardlistboxmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/ccapplication/ccamycardplugin/src/ccappmycardlistboxmodel.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,495 @@ +/* + * Copyright (c) 2009 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: Listbox model for MyCard details list + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "ccappmycardcommon.h" +#include "ccappmycardlistboxmodel.h" +#include "ccappmycardlistboxrow.h" +#include + + +/// Granularity of the row array +const TInt KRowArrayGranularity = 4; + +/// Initial buffer size for temporary text buffers +const TInt KBufferSize = 256; + +/// Disallowed characters in column text +_LIT( KCharsToReplace, "\t" ); + +/// Replacement character for invalid or graphical column characters +_LIT( KReplacementChars, " " ); +const TText KReplacedChars = ' '; + +/// Content colum index +const TInt KContentColumnIndex = 2; + +/// Column separator +const TText KColumnSeparator = '\t'; + + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::NewL +// --------------------------------------------------------------------------- +// +CCCAppMyCardListBoxModel* CCCAppMyCardListBoxModel::NewL(CCCAppMyCard& aMyCard, + CCoeEnv& aCoeEnv, CEikListBox& aListBox, CPbk2IconArray& aIconArray) + { + CCA_DP(KMyCardLogFile, CCA_L("->CCCAppMyCardListBoxModel::NewL()") ); + + CCCAppMyCardListBoxModel* self = new (ELeave) CCCAppMyCardListBoxModel( + aMyCard, aCoeEnv, aListBox, aIconArray); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + CCA_DP(KMyCardLogFile, CCA_L("<-CCCAppMyCardListBoxModel::NewL()") ); + return self; + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::~CCCAppMyCardListBoxModel +// --------------------------------------------------------------------------- +// +CCCAppMyCardListBoxModel::~CCCAppMyCardListBoxModel() + { + CCA_DP(KMyCardLogFile, + CCA_L("->CCCAppMyCardListBoxModel::~CCCAppMyCardListBoxModel()") ); + + iRows.ResetAndDestroy(); + delete iLineBuf; + delete iColumnBuf; + iInxToPresentationIdx.Close(); + + CCA_DP(KMyCardLogFile, + CCA_L("<-CCCAppMyCardListBoxModel::~CCCAppMyCardListBoxModel()") ); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::CCCAppMyCardListBoxModel +// --------------------------------------------------------------------------- +// +CCCAppMyCardListBoxModel::CCCAppMyCardListBoxModel( + CCCAppMyCard& aMyCard, + CCoeEnv& aCoeEnv, + CEikListBox& aListBox, + CPbk2IconArray& aIconArray ) : + iCoeEnv(aCoeEnv), + iMyCard(aMyCard), + iListBox(aListBox), + iIconArray(aIconArray), + iRows(KRowArrayGranularity) + { + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::ConstructL +// --------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::ConstructL() + { + iLineBuf = HBufC::NewL(KBufferSize); + iColumnBuf = HBufC::NewL(KBufferSize); + + iMyCard.AddObserverL(this); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::MyCardEventL +// --------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::MyCardEventL(TEvent aEvent) + { + if( aEvent == MMyCardObserver::EEventContactLoaded) + { + CCA_DP( KMyCardLogFile, + CCA_L("->CCCAppMyCardListBoxModel::MyCardEventL EEventContactLoaded") ); + + iPresentationContact = &iMyCard.PresentationContactL(); + AddDataL(); + } + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::MdcaCount +// --------------------------------------------------------------------------- +// +TInt CCCAppMyCardListBoxModel::MdcaCount() const + { + return iRows.Count(); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::MdcaPoint +// --------------------------------------------------------------------------- +// +TPtrC CCCAppMyCardListBoxModel::MdcaPoint(TInt aIndex) const + { + TPtr rowText( iLineBuf->Des() ); + rowText.Zero(); + + const CCCAppMyCardListBoxRow& row = *iRows[aIndex]; + const TInt columnCount = row.ColumnCount(); + TInt fieldCount = iPresentationContact->PresentationFields().FieldCount(); + + for( TInt index = 0; index < columnCount; ++index ) + { + TPtr columnText( iColumnBuf->Des() ); + columnText.Copy( row.At(index) ); + + // Clip the column if required + if( index == KContentColumnIndex && + row.IsClipRequired() && + aIndex < fieldCount ) + { + ClipFromBeginning( columnText, aIndex, index ); + } + + // Append the column and separator to the formatted row + rowText.Append( columnText ); + rowText.Append( KColumnSeparator ); + } + + return rowText; + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::FieldIndex +// --------------------------------------------------------------------------- +// +TInt CCCAppMyCardListBoxModel::FieldIndex( TInt aIndex ) + { + TInt* index = iInxToPresentationIdx.Find( aIndex ); + + if( index && *index >= 0 ) + { + return iPresentationContact->PresentationFields().StoreIndexOfField( *index ); + } + return KErrNotFound; + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::AddDataL +// -------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::AddDataL() + { + CCA_DP(KMyCardLogFile, CCA_L("->CCCAppMyCardListBoxModel::AddDataL()") ); + + iRows.ResetAndDestroy(); + iInxToPresentationIdx.Close(); + + TInt listIdx = -1; + + TInt fieldCount = iPresentationContact->PresentationFields().FieldCount(); + for (TInt index = 0; index < fieldCount; index++) + { + CPbk2PresentationContactField& field = + iPresentationContact->PresentationFields().At(index); + + // Get master field type list and match field's type against it + const MVPbkFieldType* fieldType = VPbkUtils::MatchFieldType( + iMyCard.ContactManager().FieldTypes(), field ); + + if( field.IsEditable() && fieldType && !IsHiddenField(fieldType) ) + { + HBufC* label = GetLabelLC( field ); + + if( label->Length() ) + { + CCCAppMyCardListBoxRow* row = + CCCAppMyCardListBoxRow::NewL(); + CleanupStack::PushL(row); + + const MVPbkContactFieldData& fieldData = field.FieldData(); + + // Add icon + TBuf<20> buffer; // 20 should be enough for icon index + TInt iconIndex = iIconArray.FindIcon( + field.FieldProperty().IconId() ); + if( iconIndex != KErrNotFound) + { + buffer.AppendNum(iconIndex); + } + row->AppendColumnL(buffer); + + // add label. + row->AppendColumnL(*label); + + // Add current index to Presentation Contact index array + // to estimate the text is needed to clip or not. + iInxToPresentationIdx.InsertL(++listIdx, index); + + // add field content. + switch (fieldData.DataType() ) + { + case EVPbkFieldStorageTypeText: + { + HandleTextTypeFieldL(index, fieldData, row); + break; + } + case EVPbkFieldStorageTypeDateTime: + { + HandleDateTimeTypeFieldL(fieldData, row); + break; + } + case EVPbkFieldStorageTypeUri: + { + HandleUriTypeFieldL(index, fieldData, row); + break; + } + } + + // Expand row formatting buffer if required + ExpandBuffersL(row); + + // Add the row if data ok to show to user. + iRows.AppendL(row); + CleanupStack::Pop(row); + } + + CleanupStack::PopAndDestroy(label); + } + } // for + + iListBox.HandleItemAdditionL(); + + CCA_DP(KMyCardLogFile, CCA_L("<-CCCAppMyCardListBoxModel::AddDataL()") ); + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::IsHiddenField +// -------------------------------------------------------------------------- +// +TBool CCCAppMyCardListBoxModel::IsHiddenField(const MVPbkFieldType* aFieldType) + { + TInt resId = aFieldType->FieldTypeResId(); + return ( resId == R_VPBK_FIELD_TYPE_SYNCCLASS || + resId == R_VPBK_FIELD_TYPE_CALLEROBJIMG ); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::FieldAtLC +// --------------------------------------------------------------------------- +// +MVPbkBaseContactField* CCCAppMyCardListBoxModel::FieldAtLC(TInt aIndex) + { + TInt *presentationIdx = iInxToPresentationIdx.Find(aIndex); + + if( !presentationIdx) + { + return NULL; + } + + TInt index = iPresentationContact->PresentationFields().StoreIndexOfField( + *presentationIdx); + + if( index != KErrNotFound) + { + // Use FieldAtLC to avoid the unvalidity of the field after new + // FieldAt call. + return iMyCard.StoreContact().Fields().FieldAtLC(index); + } + + return NULL; + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::IsFieldTypeL +// --------------------------------------------------------------------------- +// +TBool CCCAppMyCardListBoxModel::IsFieldTypeL( + TInt aIndex, TInt aSelectorResId ) + { + TBool ret = EFalse; + MVPbkBaseContactField* field = FieldAtLC(aIndex); + + if( field ) + { + TPbk2StoreContactAnalyzer analyzer( iMyCard.ContactManager(), NULL ); + ret = analyzer.IsFieldTypeIncludedL( *field, aSelectorResId ); + CleanupStack::PopAndDestroy(field); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::HandleTextTypeFieldL +// --------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::HandleTextTypeFieldL( + TInt aIndex, + const MVPbkContactFieldData& aFieldData, + CCCAppMyCardListBoxRow* aRow ) + { + const TDesC& fieldText = MVPbkContactFieldTextData::Cast(aFieldData).Text(); + + // Check if clipping is required + if( IsFieldTypeL( aIndex, R_MYCARD_CLIP_FIELD_SELECTOR ) ) + { + aRow->SetClipRequired( ETrue ); + } + + TPtr columnBuf( iColumnBuf->Des() ); + columnBuf.Set( ExpandColumnBufferL( fieldText.Length() ) ); + columnBuf.Zero(); + + // replace listbox separator characters. + Pbk2PresentationUtils::AppendAndReplaceChars( columnBuf, fieldText, + KCharsToReplace, KReplacementChars ); + + // Replace characters that can not be displayed correctly. + Pbk2PresentationUtils::ReplaceNonGraphicCharacters( columnBuf, KReplacedChars ); + + aRow->AppendColumnL( columnBuf ); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::HandleDateTimeTypeFieldL +// --------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::HandleDateTimeTypeFieldL( + const MVPbkContactFieldData& aFieldData, CCCAppMyCardListBoxRow* aRow) + { + const MVPbkContactFieldDateTimeData& date = + MVPbkContactFieldDateTimeData::Cast(aFieldData); + + HBufC* dateFormat = + iCoeEnv.AllocReadResourceLC( R_QTN_DATE_USUAL_WITH_ZERO ); + + TLocale locale; + TBuf<64> dateBuffer; + TTime time( date.DateTime() ); + time.FormatL( dateBuffer, *dateFormat, locale ); + CleanupStack::PopAndDestroy( dateFormat ); + + aRow->AppendColumnL( dateBuffer ); + } + +// --------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::HandleUriTypeFieldL +// --------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::HandleUriTypeFieldL(TInt /*aIndex*/, + const MVPbkContactFieldData& aFieldData, CCCAppMyCardListBoxRow* aRow) + { + const MVPbkContactFieldUriData& uri = + MVPbkContactFieldUriData::Cast( aFieldData ); + + HBufC* tempBuf = uri.Text().AllocLC(); + TPtr text = tempBuf->Des(); + // Replace characters that can not be displayed correctly. + Pbk2PresentationUtils::ReplaceNonGraphicCharacters( text, KReplacedChars ); + + aRow->AppendColumnL( text ); + CleanupStack::PopAndDestroy( tempBuf ); + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::ClipFromBeginning +// -------------------------------------------------------------------------- +// +TBool CCCAppMyCardListBoxModel::ClipFromBeginning(TDes& aBuffer, + TInt aItemIndex, TInt aSubCellNumber) const + { + // TODO: This could be better. Model should not care about the + // type of the listbox. + CAknFormDoubleGraphicStyleListBox* listbox = + static_cast (&iListBox); + + return AknTextUtils::ClipToFit( aBuffer, AknTextUtils::EClipFromBeginning, + listbox, aItemIndex, aSubCellNumber ); + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::ExpandBuffersL +// -------------------------------------------------------------------------- +// +void CCCAppMyCardListBoxModel::ExpandBuffersL(CCCAppMyCardListBoxRow* 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() ); + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::ExpandColumnBufferL +// -------------------------------------------------------------------------- +// +TPtr CCCAppMyCardListBoxModel::ExpandColumnBufferL(TInt aRequiredLength) + { + if( aRequiredLength > iColumnBuf->Des().MaxLength() ) + { + iColumnBuf = iColumnBuf->ReAllocL(aRequiredLength); + } + + return iColumnBuf->Des(); + } + +// -------------------------------------------------------------------------- +// CCCAppMyCardListBoxModel::GetLabelLC +// -------------------------------------------------------------------------- +// +HBufC* CCCAppMyCardListBoxModel::GetLabelLC( + const CPbk2PresentationContactField& aField) + { + TPtr columnBuf( iColumnBuf->Des() ); + columnBuf.Set( ExpandColumnBufferL(aField.FieldLabel().Length() ) ); + columnBuf.Zero(); + + // replace listbox separator characters. + Pbk2PresentationUtils::AppendAndReplaceChars( columnBuf, + aField.FieldLabel(), KCharsToReplace, KReplacementChars ); + + // Replace characters that can not be displayed correctly + Pbk2PresentationUtils::ReplaceNonGraphicCharacters( + columnBuf, KReplacedChars ); + + HBufC* data = HBufC::NewLC( columnBuf.Length() ); + data->Des().Append( columnBuf ); + + return data; + } + +// End of File