diff -r d189ee25cf9d -r 3533d4323edc emailcontacts/contactactionmenu/src/cfsccontactactionmenumodelimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailcontacts/contactactionmenu/src/cfsccontactactionmenumodelimpl.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,335 @@ +/* +* Copyright (c) 2008 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: Implementation of the class CFscContactActionMenuModelImpl. +* +*/ + + +// INCUDES +// +#include "emailtrace.h" +#include "cfsccontactactionservice.h" +#include "mfsccontactaction.h" +// + +#include "cfsccontactactionmenumodelimpl.h" +#include "cfsccontactactionmenuitemimpl.h" +#include "cfsccontactactionmenucasitemimpl.h" +#include "fsccontactactionmenudefines.h" + +// ======== LOCAL FUNCTIONS ======== + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::NewL +// --------------------------------------------------------------------------- +// +CFscContactActionMenuModelImpl* CFscContactActionMenuModelImpl::NewL( + CFscContactActionService& aService ) + { + FUNC_LOG; + + CFscContactActionMenuModelImpl* self = + new (ELeave) CFscContactActionMenuModelImpl( aService ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::~CFscContactActionMenuModelImpl +// --------------------------------------------------------------------------- +// +CFscContactActionMenuModelImpl::~CFscContactActionMenuModelImpl() + { + FUNC_LOG; + iMenuItems.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::NewMenuItemL +// --------------------------------------------------------------------------- +// +CFscContactActionMenuItem* CFscContactActionMenuModelImpl::NewMenuItemL( + const TDesC& aMenuText, const CGulIcon* aIcon, TInt aPriority, + TBool aStatic, TUid aUid ) + { + FUNC_LOG; + + CFscContactActionMenuItemImpl* newItem = + CFscContactActionMenuItemImpl::NewL( + aMenuText, aIcon, aPriority, aStatic, aUid ); + + return newItem; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::AddItemL +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuModelImpl::AddItemL( + CFscContactActionMenuItem* aItem ) + { + FUNC_LOG; + + // Check that item uid is unique + TBool found = EFalse; + TInt itemCount = iMenuItems.Count(); + for ( TInt i = 0; i < itemCount; i++ ) + { + if ( iMenuItems[i]->ImplementationUid() == aItem->ImplementationUid() ) + { + found = ETrue; + break; + } + } + + if ( found ) + { + User::Leave( KErrAlreadyExists ); + } + + TLinearOrder order( PriorityCompare ); + iMenuItems.InsertInOrderAllowRepeatsL( aItem, order ); + + TInt position = iMenuItems.Find( aItem ); + return position; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::CasQueryResults +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuModelImpl::AddPreQueriedCasItemsL() + { + FUNC_LOG; + + const CFscContactActionList& results = Service()->QueryResults(); + + // Remove old non-static items + RemoveAll(); + + // Add actions to the menu + for ( TInt i = 0; i < results.Count(); i++ ) + { + CFscContactActionMenuItem* newItem = + CFscContactActionMenuCasItemImpl::NewLC( results[i] ); + TLinearOrder order( PriorityCompare ); + iMenuItems.InsertInOrderAllowRepeatsL( newItem, order ); + CleanupStack::Pop( newItem ); + } + + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::RemoveItemL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuModelImpl::RemoveItemL( TInt aIndex ) + { + FUNC_LOG; + + if ( aIndex < 0 || aIndex >= iMenuItems.Count() ) + { + User::Leave( KErrArgument ); + } + delete iMenuItems[aIndex]; + iMenuItems.Remove( aIndex ); + + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::RemoveAll +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuModelImpl::RemoveAll( TBool aStaticAlso ) + { + FUNC_LOG; + + if ( aStaticAlso ) + { + iMenuItems.ResetAndDestroy(); + } + else + { + for ( TInt i = iMenuItems.Count() - 1; i >= 0; i-- ) + { + // CAS items are always deleted even if client had changed + // them to statics + CFscContactActionMenuCasItemImpl* temp = + dynamic_cast( + iMenuItems[i] ); + if ( !iMenuItems[i]->Static() || + temp != NULL ) + { + delete iMenuItems[i]; + iMenuItems.Remove( i ); + } + } + } + + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::ItemL +// --------------------------------------------------------------------------- +// +CFscContactActionMenuItem& CFscContactActionMenuModelImpl::ItemL( TInt aIndex ) + { + FUNC_LOG; + + if ( aIndex < 0 || aIndex >= iMenuItems.Count() ) + { + User::Leave( KErrArgument ); + } + + return *iMenuItems[aIndex]; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::ItemCount +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuModelImpl::ItemCount() + { + FUNC_LOG; + TInt itemCount = iMenuItems.Count(); + return itemCount; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::VisibleItemL +// --------------------------------------------------------------------------- +// +CFscContactActionMenuItem& CFscContactActionMenuModelImpl::VisibleItemL( + TInt aIndex ) + { + FUNC_LOG; + + CFscContactActionMenuItem* foundItem = NULL; + TInt itemCount = iMenuItems.Count(); + TInt visibleIndex = KErrNotFound; + for ( TInt i = 0; i < itemCount; i++ ) + { + CFscContactActionMenuItem& item = *iMenuItems[i]; + if ( IsVisible( item ) ) + { + visibleIndex++; + } + if ( visibleIndex == aIndex ) + { + foundItem = iMenuItems[i]; + break; + } + } + + if ( foundItem == NULL ) + { + User::Leave( KErrArgument ); + } + + return *foundItem; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::VisibleItemCount +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuModelImpl::VisibleItemCount() + { + FUNC_LOG; + TInt itemCount = iMenuItems.Count(); + TInt visibleCount = 0; + for ( TInt i = 0; i < itemCount; i++ ) + { + CFscContactActionMenuItem& item = *iMenuItems[i]; + if ( IsVisible( item ) ) + { + visibleCount++; + } + } + return visibleCount; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::ServiceL +// --------------------------------------------------------------------------- +// +CFscContactActionService* CFscContactActionMenuModelImpl::Service() + { + FUNC_LOG; + + return &iCas; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::CFscContactActionMenuModelImpl +// --------------------------------------------------------------------------- +// +CFscContactActionMenuModelImpl::CFscContactActionMenuModelImpl( + CFscContactActionService& aService ) + : iCas( aService ) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::ConstructL +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuModelImpl::ConstructL() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::SortMenuItems +// --------------------------------------------------------------------------- +// +void CFscContactActionMenuModelImpl::SortMenuItems() + { + FUNC_LOG; + TLinearOrder order( PriorityCompare ); + iMenuItems.Sort( order ); + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::IsVisible +// --------------------------------------------------------------------------- +// +TBool CFscContactActionMenuModelImpl::IsVisible( + const CFscContactActionMenuItem& aItem ) + { + FUNC_LOG; + TBool result = ( aItem.Icon() != NULL && + !aItem.Dimmed() && !aItem.Hidden() ); + return result; + } + +// --------------------------------------------------------------------------- +// CFscContactActionMenuModelImpl::PriorityCompare +// --------------------------------------------------------------------------- +// +TInt CFscContactActionMenuModelImpl::PriorityCompare( + const CFscContactActionMenuItem& aItem1, + const CFscContactActionMenuItem& aItem2 ) + { + FUNC_LOG; + TInt result = aItem2.Priority() - aItem1.Priority(); + return result; + } +