phonebookui/Phonebook2/ccapplication/ccamycardplugin/src/ccappmycardlistboxmodel.cpp
changeset 0 e686773b3f54
child 3 04ab22b956c2
--- /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 <TPbk2StoreContactAnalyzer.h>
+#include <Pbk2UIControls.rsg>
+#include <Pbk2PresentationUtils.h>
+#include <CPbk2PresentationContact.h>
+#include <CPbk2PresentationContactField.h>
+#include <CPbk2PresentationContactFieldCollection.h>
+#include <CPbk2IconArray.h>
+#include <MPbk2FieldProperty.h>
+
+#include <CVPbkContactManager.h>
+#include <MVPbkFieldType.h>
+#include <MVPbkContactFieldTextData.h>
+#include <MVPbkContactFieldUriData.h>
+#include <MVPbkContactFieldDateTimeData.h>
+#include <MVPbkContactFieldData.h>
+#include <VPbkUtils.h>
+#include <VPbkEng.rsg>
+
+#include <aknlists.h>
+#include <avkon.rsg>
+
+#include "ccappmycardcommon.h"
+#include "ccappmycardlistboxmodel.h"
+#include "ccappmycardlistboxrow.h"
+#include <ccappmycardpluginrsc.rsg>
+
+
+/// 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<CAknFormDoubleGraphicStyleListBox*> (&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