--- /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 <EPos_CPosLandmarkDatabase.h>
+#include <EPos_CPosLmOperation.h>
+#include <EPos_CPosLmCategoryManager.h>
+#include <AknWaitDialog.h>
+
+// USER INCLUDES
+#include "CLmkLmItemListProvider.h"
+#include "MLmkListProviderObserver.h"
+#include "CLmkDbUtils.h"
+#include "CLmkDbInitializer.h"
+#include "CLmkEventListenerSingleton.h"
+#include "CLmkAOOperation.h"
+#include "LmkConsts.h"
+#include <lmkerrors.h>
+
+// 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<CPosLandmark>;
+ // 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<TInt>* CLmkLmItemListProvider::SelectedIndexesL(
+ const RArray<TPosLmItemId>& aSelectedItems ) const
+ {
+ CArrayFix<TInt>* array = NULL;
+ TInt count = aSelectedItems.Count();
+ if ( count < KLmkMultiSelectionGranularity )
+ { // decent minimum granularity because of possible user selections
+ array =
+ new ( ELeave ) CArrayFixFlat<TInt>( KLmkMultiSelectionGranularity );
+ }
+ else
+ {
+ array = new ( ELeave ) CArrayFixFlat<TInt>( aSelectedItems.Count() );
+ }
+ CleanupStack::PushL( array );
+
+ GetSelectedIndexesL( *array, aSelectedItems );
+
+ CleanupStack::Pop( array );
+ return array;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkLmItemListProvider::GetSelectedIndexesL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkLmItemListProvider::GetSelectedIndexesL(
+ CArrayFix<TInt>& aSelectedIndexes,
+ const RArray<TPosLmItemId>& 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<TPosLmItemId>& aSelectedItems,
+ const CArrayFix<TInt>& 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<TPosLmItemId>& 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<TPosLmItemId>& 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<TPosLmItemId> 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