diff -r 000000000000 -r 522cd55cc3d7 landmarksui/engine/src/CLmkSearchedLmListProvider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/landmarksui/engine/src/CLmkSearchedLmListProvider.cpp Tue Feb 02 00:16:03 2010 +0200 @@ -0,0 +1,619 @@ +/* +* 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: Filtered landmarks list provider +* +*/ + + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// USER INCLUDES +#include "CLmkSearchedLmListProvider.h" +#include "CLmkLandmarkUiItem.h" +#include "CLmkAOOperation.h" +#include "MLmkSelectorIconMgr.h" +#include + +// CONSTANTS +_LIT(KSpaceTextCriteria,"* "); +_LIT(KDefaultTextCriteria,"*"); + +#if defined(_DEBUG) +// CONSTANTS +/// Unnamed namespace for local definitions +namespace { + +_LIT( KPanicMsg, "CLmkSearchedLmListProvider" ); + +void Panic( TPanicCode aReason ) + { + User::Panic( KPanicMsg, aReason ); + } +} // namespace +#endif +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CLmkSearchedLmListProvider::CLmkSearchedLmListProvider +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CLmkSearchedLmListProvider::CLmkSearchedLmListProvider( + CPosLandmarkDatabase& aDb, + CPosLmSearchCriteria& aCriteria ) + : CLmkLmItemListProvider( aDb ), + iCriteria( aCriteria ), + iIsSecondSearchStarted(EFalse) + { + } + +// ----------------------------------------------------------------------------- +// CLmkSearchedLmListProvider::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CLmkSearchedLmListProvider::ConstructL() + { + // base class 2nd phase constructor + CLmkLmItemListProvider::BaseConstructL(); + + iReadParams = CPosLmPartialReadParameters::NewLC(); + CleanupStack::Pop(); // iReadParams + iReadParams->SetRequestedAttributes( CPosLandmark::ELandmarkName | + CPosLandmark::EIcon | CPosLandmark::ECategoryInfo); + + iSearch = CPosLandmarkSearch::NewL( iDb ); + } + +// ----------------------------------------------------------------------------- +// CLmkSearchedLmListProvider::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CLmkSearchedLmListProvider* CLmkSearchedLmListProvider::NewL( + CPosLandmarkDatabase& aDb, + CPosLmSearchCriteria& aCriteria ) + { + CLmkSearchedLmListProvider* self = + new ( ELeave ) CLmkSearchedLmListProvider( aDb, aCriteria ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::~CLmkSearchedLmListProvider +// --------------------------------------------------------- +// +CLmkSearchedLmListProvider::~CLmkSearchedLmListProvider() + { + delete iReadParams; + delete iSearch; + if (iSearchAO) + { + iSearchAO->StopOperation(); + } + delete iSearchAO; + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::ItemAtL +// --------------------------------------------------------- +// +CLmkUiItemBase* CLmkSearchedLmListProvider::ItemAtL( TInt aIndex ) + { + __ASSERT_DEBUG( iIconMgr, Panic( KLmkPanicNullMember ) ); + //landmark with updated icon, if associated with one cat. + CPosLandmark* landmark = GetLandmarkLC(aIndex); + TPtrC mbmFile; + TInt iconFileIndex = -1; + TInt iconListIndex = -1; + TInt iconMasktIndex = -1; + TInt result = landmark->GetIcon( mbmFile, iconFileIndex, iconMasktIndex ); + if ( result == KErrNone ) + { + TRAPD(err, iconListIndex = + iIconMgr->GetIconL( mbmFile, iconFileIndex ) ); + if ( err == KErrNotFound ) // icon file not found -> fallback to default + { + iconListIndex = iIconMgr->GetDefaultIconL( + MLmkSelectorIconMgr::ELandmarkDefaultIcon ); + } + } + else + { + iconListIndex = iIconMgr->GetDefaultIconL( + MLmkSelectorIconMgr::ELandmarkDefaultIcon ); + } + + CLmkLandmarkUiItem* uiItem = + CLmkLandmarkUiItem::NewL( landmark, iconListIndex ); + CleanupStack::Pop(); // landmark, ownership transferred + return uiItem; + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::PrepareListL +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::PrepareListL() + { + iCount = 0; + + iDb.SetPartialReadParametersL( *iReadParams ); + + TPosLmSortPref sortOrder( CPosLandmark::ELandmarkName, + TPosLmSortPref::EAscending ); + CPosLmOperation* operation = + iSearch->StartLandmarkSearchL( iCriteria, sortOrder ); + CleanupStack::PushL( operation ); + if (iSearchAO) + { + iSearchAO->StopOperation(); + delete iSearchAO; // cancel possibly pending operation + iSearchAO = NULL; + } + iSearchAO = CLmkAOOperation::NewL( operation, + *this, + MLmkAOOperationObserver::ESearch, + iOperationNotInUse ); + iOperationNotInUse = ETrue; + CleanupStack::Pop( operation ); // ownership transferred + iSearchAO->StartOperation(); + } + +// ----------------------------------------------------------------------------- +// CLmkSearchedLmListProvider::PrepareListL +// ----------------------------------------------------------------------------- +// +TBool CLmkSearchedLmListProvider::PrepareListL(const TDesC& aSearchPattern, + TBool aSearchOnlyInPreviousMatches) + { + iCount = 0; + iRequestFromFindBox = ETrue; + iOperationNotInUse = ETrue; + iIsSecondSearchStarted = EFalse; + + if( aSearchPattern.Compare( KDefaultTextCriteria ) == 0 + || aSearchPattern.Length() <= 0 ) + { + PrepareListL(); + iRequestFromFindBox = EFalse; + return ETrue; + } + + // We need to cancel if we are searching/reading landmarks. + if (iSearchAO) + { + iSearchAO->StopOperation(); + delete iSearchAO; // cancel possibly pending operation + iSearchAO = NULL; + } + + // Create the composite criterion + CPosLmCompositeCriteria* compCrit = CPosLmCompositeCriteria::NewLC( + CPosLmCompositeCriteria::ECompositionOR ); + + // Create the text search criterion and add it to composite + CPosLmTextCriteria* textCrit1 = CPosLmTextCriteria::NewLC(); + + const TInt KExtraChars = 3; // 2 chars wildcards + HBufC* filterBuf = HBufC::NewLC(aSearchPattern.Length() + KExtraChars); + TPtr filter = filterBuf->Des(); + filter.Copy(KSpaceTextCriteria); + filter.Append(aSearchPattern); + + textCrit1->SetTextL( filter ); + textCrit1->SetAttributesToSearch(CPosLandmark::ELandmarkName); + + User::LeaveIfError( compCrit->AddArgument( textCrit1 ) ); + // Ownership of the text criterion has been passed to the composite + CleanupStack::PopAndDestroy( filterBuf ); + CleanupStack::Pop( textCrit1 ); + + // Create the text search criterion and add it to composite + CPosLmTextCriteria* textCrit2 = CPosLmTextCriteria::NewLC(); + textCrit2->SetTextL( aSearchPattern ); + textCrit2->SetAttributesToSearch(CPosLandmark::ELandmarkName); + + User::LeaveIfError( compCrit->AddArgument( textCrit2 ) ); + // Ownership of the text criterion has been passed to the composite + CleanupStack::Pop( textCrit2 ); + + iDb.SetPartialReadParametersL( *iReadParams ); + + TPosLmSortPref sortOrder( CPosLandmark::ELandmarkName, + TPosLmSortPref::EAscending ); + // Start the search + // Create search operation + CPosLmOperation* operation = iSearch->StartLandmarkSearchL( + *compCrit, sortOrder, aSearchOnlyInPreviousMatches ); + + CleanupStack::PopAndDestroy( compCrit ); + CleanupStack::PushL( operation ); + + iSearchAO = CLmkAOOperation::NewL( operation, + *this, + MLmkAOOperationObserver::ESearch, + ETrue ); + CleanupStack::Pop( operation ); // ownership transferred + + iSearchAO->StartOperation(); + + return ETrue; + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::StartSecondSearchL +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::StartSecondSearchL() + { + // Create the composite criterion + CPosLmCompositeCriteria* compCrit = CPosLmCompositeCriteria::NewLC( + CPosLmCompositeCriteria::ECompositionAND ); + + // Create the category search criterion and add it to composite + CPosLmCategoryCriteria* catCrit = CPosLmCategoryCriteria::NewLC(); + catCrit->SetCategoryItemId( (static_cast(iCriteria)).CategoryItemId() ); + + User::LeaveIfError( compCrit->AddArgument( catCrit ) ); + // Ownership of the category criterion has been passed to the composite + CleanupStack::Pop( catCrit ); + + // Create the text search criterion and add it to composite + CPosLmIdListCriteria* idListCrit = CPosLmIdListCriteria::NewLC(); + idListCrit->SetLandmarkIdsL( iIdArray ); + + User::LeaveIfError( compCrit->AddArgument( idListCrit ) ); + // Ownership of the text criterion has been passed to the composite + CleanupStack::Pop( idListCrit ); + + iDb.SetPartialReadParametersL( *iReadParams ); + + TPosLmSortPref sortOrder( CPosLandmark::ELandmarkName, + TPosLmSortPref::EAscending ); + // Start the search + // Create search operation + CPosLmOperation* operation = iSearch->StartLandmarkSearchL( *compCrit, sortOrder ); + + CleanupStack::PopAndDestroy( compCrit ); + CleanupStack::PushL( operation ); + + iSearchAO = CLmkAOOperation::NewL( operation, + *this, + MLmkAOOperationObserver::ESearch, + ETrue ); + CleanupStack::Pop( operation ); // ownership transferred + + iIsSecondSearchStarted = EFalse; + iSearchAO->StartOperation(); + + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::HandleOperationL +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::HandleOperationL( + TOperationTypes aType, + TReal32 aProgress, + TInt aStatus ) + { + if ( aType == MLmkAOOperationObserver::EDeleteLandmarks ) + { + return; + } + if ( aType == MLmkAOOperationObserver::ERemoveCategory ) + { + return; + } + if ( aType == MLmkAOOperationObserver::ESearch ) + { + ReadItemsToArrayL(); + if ( aStatus == KErrNone ) + { + if( iSearchAO ) + { + iSearchAO->StopOperation(); + delete iSearchAO; + iSearchAO = NULL; + } + + // reset operation values + iOperationCmd = ELmkCmdStopOperation;//temp default value + iCount = 0; + + if( iIsSecondSearchStarted ) + { + StartSecondSearchL(); + } + + if(iOperationNotInUse == EFalse ) + { + NotifyObservers( ELmkEventItemAdditionComplete ); + } + else + { + if (iRequestFromFindBox) + { + NotifyObservers( ELmkEventFindListReady ); + } + else + { + NotifyObservers( ELmkEventListReady ); + } + } + + iOperationNotInUse = ETrue; + + if ( iCatDelete ) + { + NotifyObservers( ELmkEventCategoryDeleted ); + iCatDelete = EFalse; + } + else if(iCatUpdate) + { + NotifyObservers( ELmkEventCategoryUpdated ); + iCatUpdate = EFalse; + } + + if(iItemsDeleted < iItemsToDelete) + { + PrepareForDeleteL(); + } + else + { + if(iWaitNote) + { + iWaitNote->ProcessFinishedL(); + iWaitNote = NULL; + } + } + return; + } // end of if ( aStatus == KErrNone ) + + if ( iCount == ELmkStepOne || iCount == ELmkStepTwo ) + { + if (iOperationNotInUse == EFalse ) + { + NotifyObservers( ELmkEventItemAdditionComplete ); + } + else + { + if (iRequestFromFindBox) + { + NotifyObservers( ELmkEventFindListReady ); + } + else + { + NotifyObservers( ELmkEventListReady ); + } + } + iOperationNotInUse = EFalse; + } + } + else + { // This is not this classes' operation + CLmkLmItemListProvider::HandleOperationL( aType, aProgress, aStatus); + } + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::HandleDatabaseEvent +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::HandleDatabaseEvent( TPosLmEvent& aEvent ) + { + iCatDelete = EFalse; + + TBool needRefresh = ETrue; + + // check any items are selected to do operations like iconchanges or add to category. + if( iSelectedItemsCount > 0 + && iOperationCmd != ELmkCmdAddToCat + && iOperationCmd != ERemoveFromCat ) + { + iCount++; + if( iSelectedItemsCount == iCount ) + { + iSelectedItemsCount = 0; + iCount = 0; + } + needRefresh = EFalse; + } + + switch ( aEvent.iEventType ) + { + case EPosLmEventLandmarkUpdated: // lm icon changes, lm renaming + case EPosLmEventLandmarkUnknownChanges: // lm multiple deletion, lm add to category + case EPosLmEventUnknownChanges: + case EPosLmEventLandmarkCreated: + case EPosLmEventCategoryDeleted: + case EPosLmEventCategoryUpdated: + { + iOperationNotInUse = EFalse; + if (aEvent.iEventType == EPosLmEventCategoryDeleted ) + { + iCatDelete = ETrue; + } + if (aEvent.iEventType == EPosLmEventCategoryUpdated ) + { + iCatUpdate = ETrue; + } + + if( needRefresh ) + { + if( iSearchAO ) + { + iSearchAO->StopOperation(); + delete iSearchAO; + iSearchAO = NULL; + } + iOperationNotInUse = EFalse; + TInt err = KErrNone; + do + { + TRAP( err, PrepareListL() ); + }while(err == KErrLocked); + if ( err ) + { + HandleError( err ); + } + } + else + { + NotifyObservers( ELmkEventListReady ); + } + break; + } + case EPosLmEventLandmarkDeleted: + { + TInt index = iIdArray.Find( aEvent.iLandmarkItemId ); + if( index != KErrNotFound && index < iIdArray.Count()) + { + iIdArray.Remove(index); + NotifyObservers( ELmkEventListReady ); + } + break; + } + default: + { // Not interesting event for this provider + break; + } + } + // Remember to call base class observer method too + CLmkLmItemListProvider::HandleDatabaseEvent( aEvent ); + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::ReadItemsToArrayL +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::ReadItemsToArrayL() + { + iIdArray.Reset(); + CPosLmItemIterator* iterator = iSearch->MatchIteratorL(); + CleanupStack::PushL( iterator ); + iCount = iterator->NumOfItemsL(); + if ( iCount > 0 ) + { // can only be called if there are some items + iterator->GetItemIdsL( iIdArray, 0, iCount ); // array is first reseted + } + CleanupStack::PopAndDestroy( iterator ); + } + +// --------------------------------------------------------- +// CLmkSearchedLmListProvider::RemoveLandmarksL +// --------------------------------------------------------- +// +void CLmkSearchedLmListProvider::RemoveLandmarksL(const RArray& aSelectedItems ) + { + iItemsToDelete = aSelectedItems.Count(); + iSelectedForDelete.Reset(); + for(TInt i=0;i lmItemsChunk; + TInt count = iItemsDeleted; + if(iItemsToDelete > (iItemsDeleted + 10)) + { + iItemsDeleted = iItemsDeleted + 10; + } + else + { + iItemsDeleted = iItemsDeleted + (iItemsToDelete - iItemsDeleted); + } + + for(TInt i=count;iRemoveCategoryFromLandmarksL( iCategoryId, lmItemsChunk ); + CleanupStack::PopAndDestroy();//mgr + } + User::LeaveIfNull( operation ); + + CleanupStack::PushL( operation ); + iSearchAO = CLmkAOOperation::NewL( operation, + *this, + iType, + EFalse ); + CleanupStack::Pop( operation ); // ownership transferred + + if( iSearchAO ) + { + iSearchAO->StartOperation(); + + if(!iWaitNote) + { + iWaitNote = new (ELeave) CAknWaitDialog(NULL, ETrue); + if(!iWaitNote->ExecuteLD(R_LMK_PROCESSING_WAIT_NOTE)) + { + iSearchAO->StopOperation(); + delete iSearchAO; + iSearchAO = NULL; + iWaitNote = NULL; + } + } + } + + lmItemsChunk.Close(); + } + +// End of File