diff -r 1fc85118c3ae -r 870918037e16 landmarksui/engine/src/CLmkCategoryListProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkCategoryListProvider.cpp Wed Sep 01 12:31:27 2010 +0100 @@ -0,0 +1,490 @@ +/* +* 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: Category List info provider for listbox model +* +*/ + + + + +// INCLUDE FILES + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "LmkConsts.h" +#include "CLmkAOOperation.h" +#include "CLmkCategoryUiItem.h" +#include "MLmkSelectorIconMgr.h" +#include "CLmkCategoryListProvider.h" +#include + +#if defined(_DEBUG) +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CLmkCategoryListProvider" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +} // namespace +#endif +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::CLmkCategoryListProvider +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkCategoryListProvider::CLmkCategoryListProvider( + CPosLandmarkDatabase& aDb, + TLmkProviderType aShowType ) + : CLmkLmItemListProvider( aDb ), + iShowType( aShowType ), + iAreUncategorisedItems( EFalse ) + { + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLmkCategoryListProvider::ConstructL() + { + // base class 2nd phase constructor + CLmkLmItemListProvider::BaseConstructL(); + iCategoryMgr = CPosLmCategoryManager::NewL( iDb ); + iSearch = CPosLandmarkSearch::NewL( iDb ); + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CLmkCategoryListProvider* CLmkCategoryListProvider::NewL( + CPosLandmarkDatabase& aDb, + TLmkProviderType aShowType ) + { + CLmkCategoryListProvider* self = + new ( ELeave ) CLmkCategoryListProvider( aDb, aShowType ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::~CLmkCategoryListProvider +// ----------------------------------------------------------------------------- +// +CLmkCategoryListProvider::~CLmkCategoryListProvider() + { + delete iCategoryMgr; + delete iSearch; + if( iSearchAO ) + { + delete iSearchAO; + } + delete iCriteria; + iUsageArray.Close(); + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::ItemAtL +// ----------------------------------------------------------------------------- +// +CLmkUiItemBase* CLmkCategoryListProvider::ItemAtL( TInt aIndex ) + { + __ASSERT_DEBUG( iIconMgr, Panic( KLmkPanicNullMember ) ); + CLmkCategoryUiItem* uiItem = NULL; + + if (iIdArray[aIndex] != KPosLmNullItemId) + { + CPosLandmarkCategory* category = + iCategoryMgr->ReadCategoryLC( iIdArray[aIndex] ); + + TPtrC mbmFile; + TInt iconFileIndex = -1; + TInt iconListIndex = -1; + + TInt iconMaskIndex = -1; + TInt result = category->GetIcon( mbmFile, iconFileIndex ,iconMaskIndex); + if ( result == KErrNone ) + { + TRAPD(err, iconListIndex = + iIconMgr->GetIconL( mbmFile, iconFileIndex ) ); + if ( err == KErrNotFound ) // icon file not found -> fallback to default + { + iconListIndex = iIconMgr->GetDefaultIconL( + MLmkSelectorIconMgr::ECategoryDefaultIcon ); + } + } + else + { + iconListIndex = iIconMgr->GetDefaultIconL( + MLmkSelectorIconMgr::ECategoryDefaultIcon ); + } + + switch( iShowType ) + { + //these are same + case ELmkNotShowEmptyCategories: + case ELmkShowEmptyCategories: + { + uiItem = + CLmkCategoryUiItem::NewL( category, iconListIndex ); + break; + } + case ELmkShowExtendedCategories: + { + uiItem = + CLmkCategoryUiItem::NewL( category, iconListIndex ); + uiItem->SetExtensionInt( IsUsedL( *category) ); + break; + } + default: + { + break; + } + } + } + else // if category id is 'uncategorised' + { + CPosLandmarkCategory* category = CPosLandmarkCategory::NewL(); + CleanupStack::PushL( category); + + // Set category name + CEikonEnv* env = CEikonEnv::Static(); + HBufC* catNameText = NULL; + catNameText = StringLoader::LoadLC( R_LMK_LM_LIST_UNCATEGORISED, env ); + TPtrC categoryName; + categoryName.Set(*catNameText); + category->SetCategoryNameL(categoryName); + CleanupStack::PopAndDestroy( catNameText ); + TInt iconListIndex = -1; + iconListIndex + = iIconMgr->GetDefaultIconL( + MLmkSelectorIconMgr::ECategoryDefaultIcon ); + uiItem = CLmkCategoryUiItem::NewL( category, iconListIndex ); + } + CleanupStack::Pop(); // category, ownership transferred + return uiItem; + } + +// --------------------------------------------------------- +// CLmkCategoryListProvider::ReadItemsToArrayL +// --------------------------------------------------------- +// +void CLmkCategoryListProvider::ReadItemsToArrayL() + { + // Update the IdArray to have 'uncategorised' category Id + CPosLmItemIterator* lmIterator = iSearch->MatchIteratorL(); + CleanupStack::PushL( lmIterator ); + TInt lmCount = lmIterator->NumOfItemsL(); + CleanupStack::PopAndDestroy( lmIterator ); + if ( lmCount > 0 ) + { + // There is atleast 'one' landmark which is 'uncategorised' + // can only be called if there are some items + // Append 'uncategorised' category ID to the idArray + iIdArray.Append(KPosLmNullItemId); + iAreUncategorisedItems = ETrue; + if(iCount == -1 ) + { + NotifyObservers( ELmkEventItemAdditionComplete ); + } + else + { + NotifyObservers( ELmkEventListReady ); + } + iSearchAO->StopOperation(); + iCount = 1; + } + } + +// --------------------------------------------------------- +// CLmkCategoryListProvider::HandleOperationL +// --------------------------------------------------------- +// +void CLmkCategoryListProvider::HandleOperationL( + TOperationTypes aType, + TReal32 aProgress, + TInt aStatus ) + { + if ( aType == MLmkAOOperationObserver::ESearch ) + { + if( iCount < 1 ) + { + ReadItemsToArrayL(); + } + if ( aStatus == KErrNone ) + { + if(iCount == 0) + { + NotifyObservers( ELmkEventListReady ); + } + delete iSearchAO; + iSearchAO = NULL; + iCount = 0; + } + } + else + { // This is not this classes' operation + CLmkLmItemListProvider::HandleOperationL( aType, aProgress, aStatus); + } + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::PrepareListL +// ----------------------------------------------------------------------------- +// +void CLmkCategoryListProvider::PrepareListL() + { + if ( iListAllItemsInDb ) + { + CPosLmItemIterator* iterator = NULL; + + switch( iShowType ) + { + case ELmkNotShowEmptyCategories: + { + iCount = 0; + iIdArray.Reset(); + + // Query for 'referenced categories' from Category manager here + CPosLmItemIterator* categoryIterator = iCategoryMgr->ReferencedCategoryIteratorL( + CPosLmCategoryManager::ECategorySortOrderNameAscending ); + CleanupStack::PushL( categoryIterator ); + TUint categoryCount = categoryIterator->NumOfItemsL(); + + if ( categoryCount > 0 ) + { // can only be called if there are some items + categoryIterator->GetItemIdsL( iIdArray, 0, categoryCount ); + if( iAreUncategorisedItems ) + { + iIdArray.Append(KPosLmNullItemId); + } + NotifyObservers( ELmkEventListReady ); + iCount = -1; + } + CleanupStack::PopAndDestroy( categoryIterator ); + + if( iAreUncategorisedItems ) + { + if( iIdArray.Count() == 0) + { + iIdArray.Append(KPosLmNullItemId); + } + NotifyObservers( ELmkEventListReady ); + return; + } + + // Set criteria parameters here -- for uncategorised landmarks + if (iCriteria) + { + delete iCriteria; + iCriteria = NULL; + } + iCriteria = CPosLmCategoryCriteria::NewLC(); + CleanupStack::Pop( iCriteria ); + iCriteria->SetCategoryItemId(KPosLmNullItemId); + + TPosLmSortPref sortOrder( CPosLandmark::ELandmarkName, + TPosLmSortPref::EAscending ); + + + CPosLmOperation* operation = + iSearch->StartLandmarkSearchL( *iCriteria , sortOrder ); + CleanupStack::PushL( operation ); + delete iSearchAO; // cancel possibly pending operation + iSearchAO = NULL; + iSearchAO = CLmkAOOperation::NewL( operation, + *this, + MLmkAOOperationObserver::ESearch, + iOperationNotInUse ); + + CleanupStack::Pop( operation ); // ownership transferred + iSearchAO->StartOperation(); + return; + } + case ELmkShowEmptyCategories: + { + iterator = iCategoryMgr->CategoryIteratorL( + CPosLmCategoryManager::ECategorySortOrderNameAscending ); + CleanupStack::PushL( iterator ); + break; + } + case ELmkShowExtendedCategories: + { + iterator = iCategoryMgr->CategoryIteratorL( + CPosLmCategoryManager::ECategorySortOrderNameAscending ); + CleanupStack::PushL( iterator ); + PrepareCategoryUsageListL(); + break; + } + default: + { + break; + } + } + + if( iterator ) + { + TUint count = iterator->NumOfItemsL(); + iIdArray.Reset(); + if ( count > 0 ) + { // can only be called if there are some items + iterator->GetItemIdsL( iIdArray, 0, count ); + } + CleanupStack::PopAndDestroy( iterator ); + } + } + + NotifyObservers( ELmkEventListReady ); + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::PrepareListL +// ----------------------------------------------------------------------------- +// +TBool CLmkCategoryListProvider::PrepareListL(const TDesC& /*aSearchPattern*/, + TBool /*aSearchOnlyInPreviousMatches*/) + { + // not preparing the new list based on search criteria, + // as using the avkon's search api + return EFalse; + } + +// --------------------------------------------------------- +// CLmkCategoryListProvider::RemoveLandmarksL +// --------------------------------------------------------- +// +void CLmkCategoryListProvider::RemoveLandmarksL(const RArray& /*aSelectedItems*/ ) + { + // no implementation required + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::HandleDatabaseEvent +// ----------------------------------------------------------------------------- +// +void CLmkCategoryListProvider::HandleDatabaseEvent( TPosLmEvent& aEvent ) + { + TBool needRefresh = EFalse; + + switch ( aEvent.iEventType ) + { + case EPosLmEventLandmarkUnknownChanges: + case EPosLmEventLandmarkDeleted: + case EPosLmEventLandmarkUpdated: + case EPosLmEventUnknownChanges: + { + iAreUncategorisedItems = EFalse; + needRefresh = ETrue; + break; + } + case EPosLmEventLandmarkCreated: + case EPosLmEventCategoryUnknownChanges: + case EPosLmEventCategoryCreated: + case EPosLmEventCategoryDeleted: + case EPosLmEventCategoryUpdated: + { + needRefresh = ETrue; + break; + } + default: + { + // Not interesting event for this provider + break; + } + } + + if( needRefresh ) + { + TRAPD( err, PrepareListL() ); + if ( err ) + { + HandleError( err ); + } + } + + // Remember to call base class observer method too + CLmkLmItemListProvider::HandleDatabaseEvent( aEvent ); + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::PrepareCategoryUsageListL +// ----------------------------------------------------------------------------- +// +void CLmkCategoryListProvider::PrepareCategoryUsageListL() + { + iUsageArray.Reset(); + iUsageIndex = 0; + CPosLmItemIterator* iterator = iCategoryMgr->ReferencedCategoryIteratorL( + CPosLmCategoryManager::ECategorySortOrderNameAscending ); + + CleanupStack::PushL( iterator ); + TUint count = iterator->NumOfItemsL(); + if ( count > 0 ) + { // can only be called if there are some items + iterator->GetItemIdsL( iUsageArray, 0, count ); + } + CleanupStack::PopAndDestroy( iterator ); + } + +// ----------------------------------------------------------------------------- +// CLmkCategoryListProvider::IsUsedL +// ----------------------------------------------------------------------------- +// +TBool CLmkCategoryListProvider::IsUsedL( CPosLandmarkCategory& aCategory ) + { + TBool result( EFalse ); + + TInt count( iUsageArray.Count() ); + CPosLandmarkCategory* usageCat = NULL; + + for ( TInt i=0; iReadCategoryLC( iUsageArray[i] ); + + if ( aCategory.CategoryId() == usageCat->CategoryId() ) + { + result = ETrue; + CleanupStack::PopAndDestroy(); + break; + } + CleanupStack::PopAndDestroy(); + } + return result; + } + + + +// End of File