--- /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