diff -r 1fc85118c3ae -r 870918037e16 landmarksui/engine/src/CLmkLmItemListProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkLmItemListProvider.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,418 @@ +/* +* Copyright (c) 2002-2009 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: Base class landmarks list provider for listbox model +* +*/ + + +// SYSTEM INCLUDES +#include +#include +#include +#include + +// USER INCLUDES +#include "CLmkLmItemListProvider.h" +#include "MLmkListProviderObserver.h" +#include "CLmkDbUtils.h" +#include "CLmkDbInitializer.h" +#include "CLmkEventListenerSingleton.h" +#include "CLmkAOOperation.h" +#include "LmkConsts.h" +#include + +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CLmkLmItemListProvider" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +} // namespace + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::CLmkLmItemListProvider +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkLmItemListProvider::CLmkLmItemListProvider( + CPosLandmarkDatabase& aDb ) + : iDb( aDb ), + iListAllItemsInDb( ETrue ), + iIdArray( KLmItemArrayGranularity ), + iSelectedItemsCount( 0 ), iCount( 0 ), + iRequestFromFindBox(EFalse), + iOperationNotInUse( ETrue ), + iOperationCmd( ELmkCmdStopOperation ), //temp default value + iSelectedForDelete(KLmItemArrayGranularity), + iItemsToDelete( 0 ), + iItemsDeleted( 0 ), + iIsRemoveLandmarks( EFalse ), + iCategoryId(KPosLmNullItemId) + { + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::BaseConstructL() + { + // Create db utils, request callback only when operations completed: + iDbUtils = CLmkDbUtils::NewL( iDb, *this, EFalse ); + //Create landmark array, which will hold all those landmarks, which belong + //to one category and needs icon change. + iIconChangeLmkArray = new(ELeave) RPointerArray; + // base class 2nd phase constructor + CLmkListProviderBase::BaseConstructL(); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::~CLmkLmItemListProvider +// ----------------------------------------------------------------------------- +// +CLmkLmItemListProvider::~CLmkLmItemListProvider() + { + if ( iWaitNote ) + { + TRAPD( err, iWaitNote->ProcessFinishedL() ); + if (err != KErrNone) + { + delete iWaitNote; + iWaitNote = NULL; + } + } + // Stop db event observing: + CLmkEventListenerSingleton::RemoveObserver( *this ); + if (iIconChangeLmkArray) + { + iIconChangeLmkArray->ResetAndDestroy(); + delete iIconChangeLmkArray; + } + delete iInitializer; + delete iDbUtils; + + iSelectedForDelete.Close(); + iIdArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::SelectedIndexesL +// ----------------------------------------------------------------------------- +// +EXPORT_C CArrayFix* CLmkLmItemListProvider::SelectedIndexesL( + const RArray& aSelectedItems ) const + { + CArrayFix* array = NULL; + TInt count = aSelectedItems.Count(); + if ( count < KLmkMultiSelectionGranularity ) + { // decent minimum granularity because of possible user selections + array = + new ( ELeave ) CArrayFixFlat( KLmkMultiSelectionGranularity ); + } + else + { + array = new ( ELeave ) CArrayFixFlat( aSelectedItems.Count() ); + } + CleanupStack::PushL( array ); + + GetSelectedIndexesL( *array, aSelectedItems ); + + CleanupStack::Pop( array ); + return array; + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::GetSelectedIndexesL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::GetSelectedIndexesL( + CArrayFix& aSelectedIndexes, + const RArray& aSelectedItems ) const + { + aSelectedIndexes.Reset(); + TInt count = aSelectedItems.Count(); + for ( TInt i( 0 ); i < count; ++i ) + { + TInt index = iIdArray.Find( aSelectedItems[i] ); + if ( index >= 0 ) + { // item found --> append it's index + aSelectedIndexes.AppendL( index ); + } + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::GetSelectedItemIdsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::GetSelectedItemIdsL( + RArray& aSelectedItems, + const CArrayFix& aSelectedIndexes ) const + { + aSelectedItems.Reset(); + TInt itemCount = iIdArray.Count(); + TInt selectionCount = aSelectedIndexes.Count(); + + for ( TInt i( 0 ); i < selectionCount; ++i ) + { + TInt index = aSelectedIndexes[i]; + __ASSERT_ALWAYS( index >= 0 && index < itemCount, + Panic( KLmkPanicInvalidIndex ) ); + + User::LeaveIfError( aSelectedItems.Append( iIdArray[index] ) ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::GetAllItemIdsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::GetAllItemIdsL( + RArray& aSelectedItems ) const + { + aSelectedItems.Reset(); + TInt itemCount = iIdArray.Count(); + + for ( TInt i( 0 ); i < itemCount; ++i ) + { + User::LeaveIfError( aSelectedItems.Append( iIdArray[i] ) ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::SelectedIndex +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CLmkLmItemListProvider::SelectedIndex( + TPosLmItemId aSelectedItem ) const + { + return iIdArray.Find( aSelectedItem ); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::GetSelectedItemId +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::GetSelectedItemId( + TPosLmItemId& aSelected, + TInt aIndex ) const + { + __ASSERT_ALWAYS( aIndex >= 0 && aIndex < iIdArray.Count(), + Panic( KLmkPanicInvalidIndex ) ); + + aSelected = iIdArray[aIndex]; + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::SetSelectedItemsCount +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::SetSelectedItemsCount( TInt aSelectedItemsCount ) + { + iSelectedItemsCount = aSelectedItemsCount; + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::RemoveItem +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::RemoveItem( TPosLmItemId aItemId ) + { + TInt index = iIdArray.Find(aItemId); + if( index != KErrNotFound && index < iIdArray.Count()) + { + iIdArray.Remove(index); + NotifyObservers( ELmkEventListReady ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::RemoveItemsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::RemoveItemsL( + const RArray& aSelectedItems, + MLmkAOOperationObserver::TOperationTypes aType, + TPosLmItemId aCategoryId ) + { + iCategoryId = aCategoryId; + iType = aType; + RemoveLandmarksL(aSelectedItems); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::SetOperationCmd +// ----------------------------------------------------------------------------- +// +EXPORT_C void CLmkLmItemListProvider::SetOperationCmd( TLmkAppCmdId aOperationCmd ) + { + iOperationCmd = aOperationCmd; + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::InitializeL +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::InitializeL() + { + __ASSERT_DEBUG( !iInitializer, Panic( KLmkPanicIllegalMethodCall ) ); + // We don't want intermediate callbacks -> 3rd parameter EFalse + iInitializer = CLmkDbInitializer::NewL( iDb, *this, EFalse ); + iInitializer->StartInitAndCompactL(); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::StartSearchingLandmarksL() +// ----------------------------------------------------------------------------- +// +TBool CLmkLmItemListProvider::StartSearchingLandmarksL( + const TDesC& aSearchPattern, + TBool aSearchOnlyInPreviousMatches) + { + iRequestFromFindBox = ETrue; + return PrepareListL(aSearchPattern, aSearchOnlyInPreviousMatches); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::ItemCount +// ----------------------------------------------------------------------------- +// +TInt CLmkLmItemListProvider::ItemCount() const + { + return iIdArray.Count(); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::HandleOperationL +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::HandleOperationL( + TOperationTypes /*aType*/, + TReal32 /*aProgress*/, + TInt aStatus ) + { + __ASSERT_DEBUG( aStatus != KPosLmOperationNotComplete, + Panic( KLmkPanicIntermediateCallback ) ); + + // init and compact completed, delete unnecessary helper object: + delete iInitializer; + iInitializer = NULL; + + TInt err( aStatus ); + + if ( aStatus == KErrNone ) + { + TRAP( err, HandleDatabaseInitializedL() ); + } + + if ( err != KErrNone ) + { // Error already in aStatus or within this method + HandleError( err ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::HandleDatabaseInitializedL +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::HandleDatabaseInitializedL() + { + // Start db event observing: + CLmkEventListenerSingleton::AddObserverL( *this, iDb ); + + iRequestFromFindBox = EFalse; + + // Call provider-specific templated method for preparing list: + PrepareListL(); + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::HandleError +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::HandleError( TInt aError ) + { + if ( aError != KErrNone ) + { + NotifyError( aError ); + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::HandleDatabaseEvent +// ----------------------------------------------------------------------------- +// +void CLmkLmItemListProvider::HandleDatabaseEvent( TPosLmEvent& aEvent ) + { + switch ( aEvent.iEventType ) + { + case EPosLmEventNewDefaultDatabaseLocation: + case EPosLmEventMediaRemoved: + { + //TODO: + break; + } + default: + { + //TODO: + // not interesting event for this class + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CLmkLmItemListProvider::GetLandmarkLC +// ----------------------------------------------------------------------------- +// +CPosLandmark* CLmkLmItemListProvider::GetLandmarkLC(TInt aIndex) + { + RArray itemArray; + CPosLandmark* landmark = iDb.ReadPartialLandmarkLC( iIdArray[aIndex] ); + //check whether landmark is associated with more than one cat. + landmark->GetCategoriesL(itemArray); + if (itemArray.Count() == 1) + { + //if associated with one cat, check if the icon is not set by the + //user explicitly + TPtrC iconPath; + TInt iconId; + TInt iconMaskIndex; + if (landmark->GetIcon(iconPath,iconId, iconMaskIndex)) + { + //lmk has one cat & icon is not set by the user: + CPosLmCategoryManager* categoryMgr = CPosLmCategoryManager::NewL(iDb); + CleanupStack::PushL( categoryMgr ); + CPosLandmarkCategory* category = categoryMgr->ReadCategoryLC( itemArray[0] ); + //get the cat icon and set it as landmark icon only for display + if (category->GetIcon(iconPath,iconId, iconMaskIndex) == KErrNone ) + { + landmark->SetIconL(iconPath,iconId,iconMaskIndex); + } + CleanupStack::PopAndDestroy();//category + CleanupStack::PopAndDestroy();//categoryMgr + } + } + itemArray.Close(); + return landmark; + } +// End of File