wvuing/wvuieng/EngSrc/CCAContactListModel.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/wvuieng/EngSrc/CCAContactListModel.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,599 @@
+/*
+* Copyright (c) 2002-2005 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:  Contact list model for UI
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "CCAContactListModel.h"
+#include    "impsbuilddefinitions.h"
+
+// storage includes
+#include    "CCAStorageManagerFactory.h"
+#include    "MCAStoredContacts.h"
+#include    "MCAStoredContact.h"
+#include    "MCAContactList.h"
+
+// engine includes
+#include    "MCASettings.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::CCAContactListModel
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CCAContactListModel::CCAContactListModel( MCASettings& aSettingsInterface )
+        : iSettings( aSettingsInterface )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::ConstructL()
+    {
+    iContacts = CCAStorageManagerFactory::ContactListInterfaceL();
+    iSettings.AddObserverL( this );
+    SetSort();
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CCAContactListModel* CCAContactListModel::NewL(
+    MCASettings& aSettingsInterface )
+    {
+    CCAContactListModel* self =
+        new( ELeave ) CCAContactListModel( aSettingsInterface );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// Destructor
+CCAContactListModel::~CCAContactListModel()
+    {
+    iSettings.RemoveObserver( this );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::Count
+// Returns item count
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactListModel::Count() const
+    {
+    // fetch contact list count from storage
+    // and add contact counts from expanded contact lists
+    TInt listCount( iContacts->ListCount() );
+    TInt itemCount( 0 );
+    for ( TInt i( 0 ); i < listCount; ++i )
+        {
+        MCAContactList& list = iContacts->ListAt( i );
+
+        TInt contactCount( list.FilteredCount( iFilter ) );
+
+        if ( !iSelectionMode )
+            {
+            // Empty contact lists are not shown in selection-mode
+            ++itemCount;
+            }
+
+        if ( contactCount > 0 ||
+             iFilter & TStorageManagerGlobals::EFilterAll )
+            {
+            // if we're showing all contacts or
+            // there are online contacts in this list,
+            // the list-item is shown => increase count
+            if ( iSelectionMode )
+                {
+                ++itemCount;
+                }
+
+            if ( !list.Collapsed() || iExpandAll )
+                {
+                // if list is expanded, add count of count of contacts
+                // in this list to item count
+                itemCount += contactCount;
+
+                // if list is expanded and the "all" item should
+                // be shown, increase counter
+                if ( iShowAll )
+                    {
+                    ++itemCount;
+                    }
+                }
+            }
+        }
+
+    //own data item should be also considered when not in selection-mode:
+    if ( !iSelectionMode && iContacts->OwnStatus().Identification().Length() )
+        {
+        ++itemCount;
+        }
+
+    return itemCount;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::Item
+// Returns item at given index
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+MCAContactListModel::SItem CCAContactListModel::Item( TInt aIndex  ) const
+    {
+    MCAContactListModel::SItem item;
+    item.iType = MCAContactListModel::EInvalid;
+    item.iContactList = NULL;
+    item.iContact = NULL;
+
+    MCAStoredContact& ownStatus = iContacts->OwnStatus();
+    TBool validOwnStatus( ownStatus.Identification().Length() > 0 );
+
+    //own data item should be also considered when not in selection-mode:
+    if ( !iSelectionMode && validOwnStatus )
+        {
+        if ( aIndex == 0 )
+            {
+            item.iType = MCAContactListModel::EOwnStatus;
+            item.iContact = &ownStatus;
+            return item;
+            }
+        aIndex--;
+        }
+
+    TInt count( 0 );
+    TInt listCount( iContacts->ListCount() );
+    for ( TInt i( 0 ); i < listCount; ++i )
+        {
+        MCAContactList& list = iContacts->ListAt( i );
+        item.iContactList = &list;
+
+        if ( !iSelectionMode )
+            {
+            // Empty contact lists are not shown in selection-mode
+            ++count;
+            if ( count > aIndex )
+                {
+                // there's a list in given index
+                item.iType = MCAContactListModel::EContactList;
+                return item;
+                }
+            }
+
+        TInt contactCount( list.FilteredCount( iFilter ) );
+
+        if ( contactCount > 0
+             || iFilter & TStorageManagerGlobals::EFilterAll )
+            {
+            // if we're showing all contacts or
+            // there are online contacts in this list,
+            // the list-item is shown => increase count
+            if ( iSelectionMode )
+                {
+                ++count;
+                if ( count > aIndex )
+                    {
+                    // there's a list in given index
+                    item.iType = MCAContactListModel::EContactList;
+                    return item;
+                    }
+                }
+
+            if ( !list.Collapsed() || iExpandAll )
+                {
+                if ( iShowAll )
+                    {
+                    // put "all" to beginning of list,
+                    // if wanted.
+                    ++count;
+                    if ( count > aIndex )
+                        {
+                        item.iType = MCAContactListModel::EAll;
+                        return item;
+                        }
+                    }
+
+                // list is expanded, consider also contacts in this list
+                if ( count + contactCount > aIndex )
+                    {
+                    // there's a contact in given index
+                    TInt contactIndex( aIndex - count );
+                    item.iType = MCAContactListModel::EContactItem;
+                    item.iContact =
+                        &list.FilteredContact( contactIndex, iFilter );
+                    return item;
+                    }
+                // add expanded list's contact count
+                count += contactCount;
+                }
+            }
+        }
+    // not found
+    return item;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetSelectionList
+// Sets the visibility of "all" item
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::ShowAll( TBool aShow )
+    {
+    iShowAll = aShow;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::HandleSettingsChangeL
+// Handles setting value change
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::HandleSettingsChangeL( TInt aChangedSettingEnum )
+    {
+    if ( aChangedSettingEnum == MCASettings::EFriendsListOrdering )
+        {
+        SetSort();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::MdcaCount
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactListModel::MdcaCount() const
+    {
+    return Count();
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::MdcaPoint
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TPtrC CCAContactListModel::MdcaPoint( TInt aIndex ) const
+    {
+    MCAContactListModel::SItem item = Item( aIndex );
+    switch ( item.iType )
+        {
+        case MCAContactListModel::EContactList:
+            {
+            return item.iContactList->DisplayName();
+            }
+
+        case MCAContactListModel::EOwnStatus:
+        case MCAContactListModel::EContactItem:   // fall through
+            {
+            return item.iContact->Identification();
+            }
+
+        case MCAContactListModel::EAll:
+            {
+            // These will be filtered out
+            return KNullDesC();
+            }
+
+        default:
+            {
+            // Should not be here.
+            break;
+            }
+        }
+
+    // We really should never reach this.
+    return KNullDesC();
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetSort
+// Sets the correct sorting method to storage
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::SetSort()
+    {
+    TInt value( iSettings.Value( MCASettings::EFriendsListOrdering ) );
+
+    if ( value == MCASettings::EPresence )
+        {
+        iContacts->SetSortAlgorithm( MCAStoredContact::ECompareByPresence );
+        iContacts->Sort();
+        }
+    else
+        {
+        iContacts->SetSortAlgorithm( MCAStoredContact::ECompareAlphabetically );
+        iContacts->Sort();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetSelectionMode
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::SetSelectionMode( TBool aSelectionMode )
+    {
+    iSelectionMode = aSelectionMode;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetPrimaryContactList
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::SetPrimaryContactLists( TBool aPrimaryInUse )
+    {
+    if ( aPrimaryInUse )
+        {
+        iContacts->SetContactListProperty( MCAStoredContacts::EPrimaryCollapseInUse );
+        }
+    else
+        {
+        iContacts->SetContactListProperty( MCAStoredContacts::ESecondaryCollapseInUse );
+        iContacts->ResetContactLists();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::ResetDefaultFilter
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::ResetDefaultFilter()
+    {
+    SetFilter( iDefaultFilter );
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetDefaultFilter
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::SetDefaultFilter(
+    TStorageManagerGlobals::TFilterType aFilter )
+    {
+    iDefaultFilter = aFilter;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::SetFilter
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::SetFilter(
+    TStorageManagerGlobals::TFilterType aFilter )
+    {
+    iFilter = aFilter;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::Filter
+// -----------------------------------------------------------------------------
+//
+TStorageManagerGlobals::TFilterType CCAContactListModel::Filter() const
+    {
+    return iFilter;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::ForceExpanded
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::ForceExpanded( TBool aAllExpanded )
+    {
+    iExpandAll = aAllExpanded;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::IsForceExpanded
+// -----------------------------------------------------------------------------
+//
+TBool CCAContactListModel::IsForceExpanded() const
+    {
+    return iExpandAll;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::MapContactListPositionsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCAContactListModel::MapContactListPositions(
+    RArray<TInt>& aPositionArray )
+    {
+    aPositionArray.Reset();
+    TInt listcount = iContacts->ListCount();
+    if ( listcount == 0 )
+        {
+        // no lists
+        return;
+        }
+
+    // Add own status
+    TBool validOwnStatus =
+        iContacts->OwnStatus().Identification().Length() > 0;
+    TInt itemCount = ( validOwnStatus && !iSelectionMode ) ? 1 : 0;
+
+    // first list
+    aPositionArray.Append( itemCount );
+
+    // Go through lists
+    for ( TInt i = 0; i < listcount - 1; ++i )
+        {
+        MCAContactList& list = iContacts->ListAt( i );
+        TInt contactCount( list.FilteredCount( iFilter ) );
+
+        // Add visible contacts between this list(i) and next list(i+1)
+        if ( contactCount > 0 || iFilter & TStorageManagerGlobals::EFilterAll )
+            {
+
+            if ( !list.Collapsed() || iExpandAll )
+                {
+                // if list is expanded, add count of count of contacts
+                // in this list to item count
+                itemCount += contactCount;
+
+                // if list is expanded and the "all" item should
+                // be shown, increase counter
+                if ( iShowAll )
+                    {
+                    ++itemCount;
+                    }
+                }
+
+            }
+
+        // Append next list's position to array
+        aPositionArray.Append( ++itemCount );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::IndexOfContact
+// Gets index of contact in list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactListModel::IndexOfContact( MCAStoredContact* aContact ) const
+    {
+    TInt listCount( iContacts->ListCount() );
+    MCAStoredContact& ownStatus = iContacts->OwnStatus();
+
+    // take own status in to account.
+    TInt itemCount( ( ownStatus.Identification().Length() > 0 ) ? 1 : 0 );
+
+    if ( aContact == ( &ownStatus ) && itemCount == 1 )
+        {
+        return 0;
+        }
+
+    // in selection mode empty contact lists are not displayed
+    TInt emptyList( iSelectionMode ? 0 : -1 );
+
+    for ( TInt i( 0 ); i < listCount; ++i )
+        {
+        MCAContactList& list = iContacts->ListAt( i );
+        TInt contactCount( list.FilteredCount( iFilter ) );
+
+        TInt indexOfContact = list.FindIndexOfContact( aContact, iFilter );
+
+        if ( contactCount > emptyList
+             || iFilter & TStorageManagerGlobals::EFilterAll )
+            {
+            // if we're showing all contacts or
+            // there are online contacts in this list,
+            // the list-item is shown => increase count
+            ++itemCount;
+
+            if ( indexOfContact == KErrNotFound )
+                {
+                if ( !list.Collapsed() || iExpandAll )
+                    {
+                    // if list is expanded, add count of count of contacts
+                    // in this list to item count
+                    itemCount += contactCount;
+
+                    // if list is expanded and the "all" item should
+                    // be shown, increase counter
+                    if ( iShowAll )
+                        {
+                        ++itemCount;
+                        }
+                    }
+                }
+            else // We found the contact
+                {
+                if ( list.Collapsed() && !iExpandAll )
+                    {
+                    // If the list is collapsed -> focus the list instead
+                    return itemCount - 1;
+                    }
+                // add earlier items to index.
+                return indexOfContact + itemCount;
+                }
+            }
+        }
+    return KErrNotFound;
+    }
+
+// -----------------------------------------------------------------------------
+// CCAContactListModel::IndexOfList
+// Gets index of contact in list
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCAContactListModel::IndexOfList( MCAContactList* aList,
+                                       TBool aIgnoreOwnItem /*= EFalse*/,
+                                       TBool aIgnoreEmptyLists /*= ETrue*/ ) const
+    {
+    TInt listCount( iContacts->ListCount() );
+    // take own status in to account.
+    TInt itemCount( ( iContacts->OwnStatus().Identification().Length() > 0
+                      && !aIgnoreOwnItem ) ? 1 : 0 );
+
+    // in selection mode empty contact lists are not displayed
+    TInt emptyList( iSelectionMode ? 0 : -1 );
+
+    for ( TInt i( 0 ); i < listCount; ++i )
+        {
+        MCAContactList& list = iContacts->ListAt( i );
+        if ( &list == aList )
+            {
+            return itemCount;
+            }
+
+        TInt contactCount( list.FilteredCount( iFilter ) );
+
+        if ( contactCount > emptyList ||
+             iFilter & TStorageManagerGlobals::EFilterAll ||
+             ( contactCount == 0 && !aIgnoreEmptyLists ) ) // show also empty lists.
+            {
+            // if we're showing all contacts or
+            // there are online contacts in this list,
+            // the list-item is shown => increase count
+            ++itemCount;
+
+            if ( !list.Collapsed() || iExpandAll )
+                {
+                // if list is expanded, add count of count of contacts
+                // in this list to item count
+                itemCount += contactCount;
+
+                // if list is expanded and the "all" item should
+                // be shown, increase counter
+                if ( iShowAll )
+                    {
+                    ++itemCount;
+                    }
+                }
+            }
+        }
+    return KErrNotFound;
+    }
+
+
+//  End of File