diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIControls/src/cpbk2filteredviewstackelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/cpbk2filteredviewstackelement.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,487 @@ +/* +* Copyright (c) 2006-2007 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: Phonebook 2 view stack element. +* +*/ + + +#include "cpbk2filteredviewstackelement.h" + +// Virtual Phonebook +#include +#include +#include + +// Debugging headers +#include + +/// Unnamed namespace for local definitions +namespace { + +#ifdef _DEBUG +enum TPanicCode + { + EPreCond_CreateViewL = 1, + EBaseViewHasNoFilter, + EViewAlreadyExists, + EPreCond_UpdateFilterL, + EPreCond_SetUnderDestruction, + EPreCond_FindMustBeDigraphicL + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbk2FilteredViewStackElement"); + User::Panic(KPanicText, aReason); + } + +#endif // _DEBUG + +} /// namespace + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::CPbk2FilteredViewStackBaseElement +// -------------------------------------------------------------------------- +// +inline CPbk2FilteredViewStackBaseElement::CPbk2FilteredViewStackBaseElement( + MVPbkContactViewBase& aBaseView ) : + iBaseView( aBaseView ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::NewL +// -------------------------------------------------------------------------- +// +CPbk2FilteredViewStackBaseElement* CPbk2FilteredViewStackBaseElement::NewL( + MVPbkContactViewBase& aBaseView ) + { + CPbk2FilteredViewStackBaseElement* self = + new ( ELeave ) CPbk2FilteredViewStackBaseElement( aBaseView ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::CreateViewL +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackBaseElement::CreateViewL( + MVPbkContactViewBase& /*aBaseView*/, + MVPbkContactViewBase& /*aParentView*/, + MVPbkContactViewObserver& /*aObserver*/ ) + { + // Base element gets the view in constructor + __ASSERT_DEBUG( EFalse, Panic( EViewAlreadyExists ) ); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::View +// -------------------------------------------------------------------------- +// +MVPbkContactViewBase* CPbk2FilteredViewStackBaseElement::View() const + { + return &iBaseView; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::FindArray +// -------------------------------------------------------------------------- +// +const MDesCArray& CPbk2FilteredViewStackBaseElement::FindArray() const + { + CDesCArray* nil = NULL; + return *nil; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::Level +// -------------------------------------------------------------------------- +// +TInt CPbk2FilteredViewStackBaseElement::Level() const + { + // Level is always zero for base element + return 0; + } + +// -------------------------------------------------------------------------- +// CPbk2ViewStackBaseElement::AlwaysIncluded +// -------------------------------------------------------------------------- +// +const MVPbkContactBookmarkCollection* + CPbk2FilteredViewStackBaseElement::AlwaysIncluded() const + { + return NULL; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::IsSame +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackBaseElement::IsSame( + const MPbk2FilteredViewStackElement& aOther ) const + { + // For all contacts view element it enough to compare levels + return aOther.Level() == Level(); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::UpdateFilterL +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackBaseElement::UpdateFilterL( + MVPbkContactViewBase& /*aBaseView*/, + MVPbkContactViewObserver& /*aObserver*/, + const MDesCArray& /*aSearchLevelArray*/, + const MVPbkContactBookmarkCollection* /*aAlwaysIncluded*/ ) + { + __ASSERT_DEBUG( EFalse, Panic( EBaseViewHasNoFilter ) ); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::ViewState +// -------------------------------------------------------------------------- +// +MPbk2FilteredViewStackElement::TViewState + CPbk2FilteredViewStackBaseElement::ViewState() const + { + return iState; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::SetViewState +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackBaseElement::SetViewState( TViewState aState ) + { + iState = aState; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::UnderDestruction +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackBaseElement::UnderDestruction() const + { + // Base element can not be under destruction + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackBaseElement::SetUnderDestruction +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackBaseElement::SetUnderDestruction() + { + __ASSERT_DEBUG( EFalse, Panic( EPreCond_SetUnderDestruction ) ); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::CPbk2FilteredViewStackElement +// -------------------------------------------------------------------------- +// +inline CPbk2FilteredViewStackElement::CPbk2FilteredViewStackElement( + MVPbkContactFindPolicy& aFindPolicy, + const MVPbkContactBookmarkCollection* aAlwaysIncluded, + const MDesCArray* aSearchLevelArray ) + : iFindPolicy( aFindPolicy ), + iAlwaysIncluded( aAlwaysIncluded ), + iSearchLevelArray( aSearchLevelArray ) + { + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::ConstructL +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackElement::ConstructL() + { + iLengthOfSearchArray = CountLengthOfStrings( *iSearchLevelArray ); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::NewL +// -------------------------------------------------------------------------- +// +CPbk2FilteredViewStackElement* CPbk2FilteredViewStackElement::NewL( + MVPbkContactFindPolicy& aFindPolicy, + const MDesCArray* aSearchLevelArray, + const MVPbkContactBookmarkCollection* aAlwaysIncluded ) + { + CPbk2FilteredViewStackElement* self = + new ( ELeave ) CPbk2FilteredViewStackElement( aFindPolicy, + aAlwaysIncluded, aSearchLevelArray ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::~CPbk2FilteredViewStackElement +// -------------------------------------------------------------------------- +// +CPbk2FilteredViewStackElement::~CPbk2FilteredViewStackElement() + { + delete iView; + delete iSearchLevelArray; //from FilteredViewStack + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::CreateViewL +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackElement::CreateViewL( + MVPbkContactViewBase& aBaseView, + MVPbkContactViewBase& aParentView, + MVPbkContactViewObserver& aObserver ) + { + __ASSERT_DEBUG( !iView && aParentView.ViewFiltering(), + Panic ( EPreCond_CreateViewL ) ); + + if( FindMustBeDigraphicL() ) + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING + ("FilteredViewStackElement::CreateViewL: Ortographic") ); + // Use base view as the filtering view. + // This is needed to prevent accidentally filtering out contacts + // that include diraphic characters. For example with Croatian + // locale a contact name beginning with "nj" character would + // be filtered out with the (parent) find filter "n" and it would + // not be shown with find filter "nj". + iView = aBaseView.ViewFiltering()->CreateFilteredViewLC( + aObserver, *iSearchLevelArray, iAlwaysIncluded ); + } + else + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING + ("FilteredViewStackElement::CreateViewL: No ortographic") ); + iView = aParentView.ViewFiltering()->CreateFilteredViewLC( + aObserver, *iSearchLevelArray, iAlwaysIncluded ); + } + + CleanupStack::Pop(); // iView + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::View +// -------------------------------------------------------------------------- +// +MVPbkContactViewBase* CPbk2FilteredViewStackElement::View() const + { + return iView; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::FindArray +// -------------------------------------------------------------------------- +// +const MDesCArray& CPbk2FilteredViewStackElement::FindArray() const + { + return *iSearchLevelArray; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::FindMustBeDigraphicL +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackElement::FindMustBeDigraphicL() const + { + __ASSERT_DEBUG( iSearchLevelArray, Panic( EPreCond_FindMustBeDigraphicL ) ); + + TBool isDigraphic( EFalse ); + + // Go through the find string tokens one-by-one and check if they + // include digraphs + for ( TInt i(0); i < iSearchLevelArray->MdcaCount(); i++ ) + { + TPtrC findStringToken = iSearchLevelArray->MdcaPoint( i ); + const TInt KDigraphLength(2); + const TInt tokenLength( findStringToken.Length() ); + // No need to check single character find strings + if( tokenLength >= KDigraphLength ) + { + TPtrC substring = findStringToken.Left( tokenLength - 1 ); + if( !iFindPolicy.MatchRefineL( findStringToken, substring ) ) + { + // The substring did not match the characters of the find + // string token -> the find string token must include digraphs + // For example with Croatian locale the find string "nj" does + // not include the substring "n" because "nj" is a digraph + isDigraphic = ETrue; + break; + } + } + } + + return isDigraphic; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::Level +// -------------------------------------------------------------------------- +// +TInt CPbk2FilteredViewStackElement::Level() const + { + return iLengthOfSearchArray; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::AlwaysIncluded +// -------------------------------------------------------------------------- +// +const MVPbkContactBookmarkCollection* + CPbk2FilteredViewStackElement::AlwaysIncluded() const + { + return iAlwaysIncluded; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::IsSame +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackElement::IsSame( + const MPbk2FilteredViewStackElement& aOther ) const + { + // Elements are same if: + // 1) Filter level is same + // 2) Find texts match + return ( aOther.Level() == Level() && + Match( aOther.FindArray(), FindArray() ) ); + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::UpdateFilterL +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackElement::UpdateFilterL( + MVPbkContactViewBase& aBaseView, + MVPbkContactViewObserver& aObserver, + const MDesCArray& aSearchLevelArray, + const MVPbkContactBookmarkCollection* aAlwaysIncluded ) + { + __ASSERT_DEBUG( iView, Panic( EPreCond_UpdateFilterL ) ); + + // update find text, first copy it to new array + TInt count = aSearchLevelArray.MdcaCount(); + CDesCArrayFlat* temp = new ( ELeave ) CDesCArrayFlat( count ); + + for ( TInt i = 0; i < count; ++i ) + { + temp->AppendL( aSearchLevelArray.MdcaPoint( i ) ); + } + + delete iSearchLevelArray; + iSearchLevelArray = temp; + + if( FindMustBeDigraphicL() ) + { + delete iView; + iView = 0; + iView = aBaseView.ViewFiltering()->CreateFilteredViewLC( + aObserver, *iSearchLevelArray, iAlwaysIncluded ); + CleanupStack::Pop(); // iView + } + else + { + iView->ViewFiltering()->UpdateFilterL( + *iSearchLevelArray, aAlwaysIncluded ); + iState = EUpdating; + } + } + + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::ViewState +// -------------------------------------------------------------------------- +// +MPbk2FilteredViewStackElement::TViewState + CPbk2FilteredViewStackElement::ViewState() const + { + return iState; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::SetViewState +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackElement::SetViewState( TViewState aState ) + { + iState = aState; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::UnderDestruction +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackElement::UnderDestruction() const + { + return iUnderDestruction; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::SetUnderDestruction +// -------------------------------------------------------------------------- +// +void CPbk2FilteredViewStackElement::SetUnderDestruction() + { + iUnderDestruction = ETrue; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::Match +// -------------------------------------------------------------------------- +// +TBool CPbk2FilteredViewStackElement::Match( const MDesCArray& aArray1, + const MDesCArray& aArray2 ) const + { + TBool isMatch = EFalse; + TInt count = aArray1.MdcaCount(); + if ( count == aArray2.MdcaCount() ) + { + for ( TInt i = 0; i < count; ++i ) + { + if ( aArray1.MdcaPoint( i ).CompareC( + aArray2.MdcaPoint( i ) ) == 0 ) + { + isMatch = ETrue; + } + else + { + isMatch = EFalse; + break; + } + } + } + return isMatch; + } + +// -------------------------------------------------------------------------- +// CPbk2FilteredViewStackElement::CountLengthOfStrings +// Counts characters of array of strings +// -------------------------------------------------------------------------- +// +TInt CPbk2FilteredViewStackElement::CountLengthOfStrings( const MDesCArray& + aStringArray ) const + { + TInt stringCount = aStringArray.MdcaCount(); + TInt totalLength = 0; + for ( TInt i = 0; i < stringCount; ++i ) + { + totalLength += aStringArray.MdcaPoint( i ).Length(); + } + + return totalLength; + } + +// End of File