diff -r 000000000000 -r ff3acec5bc43 mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainerfilteredlist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpxplugins/viewplugins/views/commoncontainer/src/mpxcommoncontainerfilteredlist.cpp Thu Dec 17 08:45:05 2009 +0200 @@ -0,0 +1,261 @@ +/* +* 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: Class for providing list filtering. +* +*/ + + +#include +#include +#include +#include "mpxcommoncontainerfilteredlist.h" + +// CONSTANTS + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMPXCommonContainerFilteredList* CMPXCommonContainerFilteredList::NewL() + { + CMPXCommonContainerFilteredList* self = + CMPXCommonContainerFilteredList::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMPXCommonContainerFilteredList* CMPXCommonContainerFilteredList::NewLC() + { + CMPXCommonContainerFilteredList* self = + new (ELeave) CMPXCommonContainerFilteredList(); + CleanupStack::PushL( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMPXCommonContainerFilteredList::CMPXCommonContainerFilteredList() + : iFiltering( EFalse ) + { + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +CMPXCommonContainerFilteredList::~CMPXCommonContainerFilteredList() + { + iFilteredMediaList.Reset(); + delete iFilteringWord; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMPXCommonContainerFilteredList::ReplaceMediaListL( const CMPXMediaArray& aMediaList ) + { + iMediaList = const_cast(&aMediaList); + + if ( iFiltering ) + { + HBufC* tempWord = iFilteringWord; + CleanupStack::PushL( tempWord ); + iFilteringWord = NULL; + + ReAdjustFilteringL( *tempWord ); + + CleanupStack::PopAndDestroy( tempWord ); + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMPXCommonContainerFilteredList::SetFilteringWordL( const TDesC& aWord ) + { + if ( aWord.Length() > 0 ) + { + if ( HasMediaList() ) + { + ReAdjustFilteringL( aWord ); + iFiltering = ETrue; + } + } + else + { + iFilteredMediaList.Reset(); + delete iFilteringWord; + iFilteringWord = NULL; + iFiltering = EFalse; + } + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMPXCommonContainerFilteredList::IsFiltering() + { + return iFiltering; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMPXCommonContainerFilteredList::HasMediaList() + { + return iMediaList != NULL; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMPXCommonContainerFilteredList::FilteredCount() + { + if ( HasMediaList() ) + { + if ( iFiltering ) + { + return iFilteredMediaList.Count(); + } + else + { + return iMediaList->Count(); + } + } + + return 0; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TBool CMPXCommonContainerFilteredList::IsFilteredIndexValid( TInt aFilteredIndex ) + { + if ( HasMediaList() && aFilteredIndex >= 0 ) + { + if ( iFiltering ) + { + if ( aFilteredIndex < iFilteredMediaList.Count() ) + { + return ETrue; + } + } + else + { + if ( aFilteredIndex < iMediaList->Count() ) + { + return ETrue; + } + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +TInt CMPXCommonContainerFilteredList::FilteredIndexToRealIndex( TInt aFilteredIndex ) + { + TInt realIndex( KErrNotFound ); + + if ( HasMediaList() ) + { + if ( iFiltering ) + { + if ( aFilteredIndex < iFilteredMediaList.Count() ) + { + realIndex = iFilteredMediaList[aFilteredIndex]; + } + } + else + { + if ( aFilteredIndex < iMediaList->Count() ) + { + realIndex = aFilteredIndex; + } + } + } + + return realIndex; + } + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +void CMPXCommonContainerFilteredList::ReAdjustFilteringL( const TDesC& aWord ) + { + CMPXMedia* media = NULL; + + // If user added more letters to filtering, update from existing set. + if ( iFilteringWord && + iFilteringWord->Length() < aWord.Length() ) + { + TInt ri( KErrNotFound ); + + for ( TInt fi = 0; fi < iFilteredMediaList.Count(); fi++ ) + { + ri = iFilteredMediaList[fi]; + if ( ri < iMediaList->Count() ) + { + media = (*iMediaList)[ri]; + + if ( media->IsSupported( KMPXMediaGeneralTitle ) ) + { + if ( media->ValueText( KMPXMediaGeneralTitle ).FindF( aWord ) == KErrNotFound ) + { + iFilteredMediaList.Remove( fi ); + fi--; + } + } + } + } + } + // If there is no filtering, or user removed letters, create a new filtering set. + else + { + iFilteredMediaList.Reset(); + + for ( TInt ri = 0; ri < iMediaList->Count(); ri++ ) + { + media = (*iMediaList)[ri]; + + if ( media->IsSupported( KMPXMediaGeneralTitle ) ) + { + if ( media->ValueText( KMPXMediaGeneralTitle ).FindF( aWord ) != KErrNotFound ) + { + iFilteredMediaList.AppendL( ri ); + } + } + } + } + + delete iFilteringWord; + iFilteringWord = NULL; + iFilteringWord = aWord.AllocL(); + }