diff -r 5b6f26637ad3 -r f4a778e096c2 predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAdaptiveGrid.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/predictivesearch/PcsAlgorithm/Algorithm1/src/CPcsAdaptiveGrid.cpp Wed Sep 01 12:29:52 2010 +0100 @@ -0,0 +1,216 @@ +/* +* Copyright (c) 2010 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: Utility class to hold a single item for Adaptive Grid. +* Used to provide quickly to client applications (Phonebook) +* The Adaptive Grid for the full list of contacts, which is +* the one that is displayed when the Find Box is empty. +*/ + + +// INCLUDE FILES +#include "CPcsDebug.h" +#include "CPcsAdaptiveGridItem.h" +#include "CPcsAdaptiveGrid.h" + + + +// ============================== MEMBER FUNCTIONS ============================ + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::NewL +// Two Phase Construction +// ---------------------------------------------------------------------------- +CPcsAdaptiveGrid* CPcsAdaptiveGrid::NewL( ) +{ + return new ( ELeave ) CPcsAdaptiveGrid(); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::CPcsAdaptiveGrid +// Constructor +// ---------------------------------------------------------------------------- +CPcsAdaptiveGrid::CPcsAdaptiveGrid( ) +{ + iAdaptiveGrid.ResetAndDestroy(); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::~CPcsAdaptiveGrid +// Destructor +// ---------------------------------------------------------------------------- +CPcsAdaptiveGrid::~CPcsAdaptiveGrid( ) +{ + iAdaptiveGrid.ResetAndDestroy(); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::Count +// +// ---------------------------------------------------------------------------- +TInt CPcsAdaptiveGrid::Count( ) +{ + return iAdaptiveGrid.Count(); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::GetAdaptiveGridItemIndex +// +// ---------------------------------------------------------------------------- +TInt CPcsAdaptiveGrid::GetAdaptiveGridItemIndex( const TChar& aChar ) +{ + TChar aUpperChar = User::UpperCase( aChar ); + + TInt retValue = KErrNotFound; + + // The Grid items are sorted alphabetically, anyway the number of items in the + // array is small so we do linear search + for ( TInt i=0; i < iAdaptiveGrid.Count(); i++ ) + { + if ( iAdaptiveGrid[i]->Character( ) == aUpperChar ) + { + retValue = i; + break; + } + } + + return retValue; +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::GetAdaptiveGridItemPtr +// +// ---------------------------------------------------------------------------- +CPcsAdaptiveGridItem* CPcsAdaptiveGrid::GetAdaptiveGridItemPtr( const TChar& aChar ) +{ + CPcsAdaptiveGridItem* retValue = NULL; + + TInt gridItemIndex = GetAdaptiveGridItemIndex( aChar ); + + if ( gridItemIndex != KErrNotFound ) + { + retValue = iAdaptiveGrid[gridItemIndex]; + } + + return retValue; +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::IncrementRefCounter +// +// ---------------------------------------------------------------------------- +void CPcsAdaptiveGrid::IncrementRefCounterL( const TChar& aChar, const TUint aSelector ) +{ + CPcsAdaptiveGridItem* gridItem = GetAdaptiveGridItemPtr( aChar ); + + if ( gridItem == NULL ) + { + TLinearOrder rule( CPcsAdaptiveGridItem::CompareByCharacter ); + + CPcsAdaptiveGridItem* newGridItem = CPcsAdaptiveGridItem::NewL( aChar ); + newGridItem->IncrementRefCounter( aSelector ); + iAdaptiveGrid.InsertInOrder(newGridItem, rule); + } + else + { + gridItem->IncrementRefCounter( aSelector ); + } + + PRINT2 ( _L("CPcsAdaptiveGrid::IncrementRefCounterL: Char='%c', Selector=%d"), + (TUint) aChar, aSelector ); + // PrintAdatptiveGrid( ); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::DecrementRefCounter +// +// ---------------------------------------------------------------------------- +void CPcsAdaptiveGrid::DecrementRefCounter( const TChar& aChar, const TUint aSelector ) +{ + TInt gridItemIndex = GetAdaptiveGridItemIndex( aChar ); + + if ( gridItemIndex != KErrNotFound ) + { + CPcsAdaptiveGridItem* gridItem = iAdaptiveGrid[gridItemIndex]; + + gridItem->DecrementRefCounter( aSelector ); + + // Remove the Grid item, if there is no reference to it anymore + if ( gridItem->AreRefCountersZero( ) ) + { + iAdaptiveGrid.Remove( gridItemIndex ); + delete gridItem; + } + } + + PRINT2 ( _L("CPcsAdaptiveGrid::DecrementRefCounter: Char='%c', Selector=%d"), + (TUint) aChar, aSelector ); + // PrintAdatptiveGrid( ); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::GetAdaptiveGrid +// +// ---------------------------------------------------------------------------- +void CPcsAdaptiveGrid::GetAdaptiveGrid( const TBool aCompanyName, TDes& aGrid ) +{ + aGrid.Zero(); + TInt gridCharCount = 0; + for ( TInt i=0; i < iAdaptiveGrid.Count(); i++ ) + { + if ( iAdaptiveGrid[i]->IsRefCounterNonZero( aCompanyName ) ) + { + aGrid.Append( iAdaptiveGrid[i]->Character() ); + gridCharCount++; + if ( gridCharCount == KPsAdaptiveGridStringMaxLen ) + { + break; + } + } + } +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::PrintAdatptiveGrid +// +// ---------------------------------------------------------------------------- +void CPcsAdaptiveGrid::PrintAdatptiveGrid( ) +{ + PRINT ( _L("CPcsAdaptiveGrid::PrintAdatptiveGrid: ----------------------------------------") ); + PRINT1 ( _L("CPcsAdaptiveGrid::PrintAdatptiveGrid: Adaptive Grid (%d items)"), iAdaptiveGrid.Count() ); + PRINT ( _L("CPcsAdaptiveGrid::PrintAdatptiveGrid: ----------------------------------------") ); + + for ( TInt i=0; i < iAdaptiveGrid.Count(); i++ ) + { + CPcsAdaptiveGridItem* gridItem = iAdaptiveGrid[i]; + + PRINT5 ( _L("CPcsAdaptiveGrid::PrintAdatptiveGrid: Grid[%d].Character=%c, RefCounters[%d,%d,%d]"), + i, (TUint) iAdaptiveGrid[i]->Character(), + iAdaptiveGrid[i]->GetRefCounter(CPcsAdaptiveGridItem::EFirstNameLastName), + iAdaptiveGrid[i]->GetRefCounter(CPcsAdaptiveGridItem::EUnnamedCompanyName), + iAdaptiveGrid[i]->GetRefCounter(CPcsAdaptiveGridItem::ECompanyName) ); + } + + PRINT ( _L("CPcsAdaptiveGrid::PrintAdatptiveGrid: ----------------------------------------") ); +} + +// ---------------------------------------------------------------------------- +// CPcsAdaptiveGrid::Reset +// +// ---------------------------------------------------------------------------- +void CPcsAdaptiveGrid::Reset() + { + iAdaptiveGrid.ResetAndDestroy(); + } + +// End of file