--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/uicontrols/src/CLmkAppLmSelectorImpl.cpp Tue Feb 02 00:16:03 2010 +0200
@@ -0,0 +1,1097 @@
+/*
+* Copyright (c) 2002-2006 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: This file contains the selector implementation for landmarks by
+* name view
+*
+*/
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include <AiwServiceHandler.h> // AIW
+#include <AiwCommon.hrh> // AIW
+#include <lbsfields.h>
+#include <aknsfld.h>
+#include <aknlists.h>
+#include <StringLoader.h>
+#include <EPos_CPosLmCategoryCriteria.h>
+#include <EPos_CPosLmCategoryManager.h>
+#include <AknWaitDialog.h>
+#include <lmkui.rsg>
+#include <Landmarks.rsg>
+#include <CLmkEditorDlg.h> // from system include!
+#include "clmkdbsearchutils.h"
+#include "LmkConsts.h"
+#include "landmarks.hrh"
+#include "CLmkDbUtils.h"
+#include "CLmkFields.h"
+#include "CLmkUiUtils.h"
+#include "CLmkEditorImpl.h"
+#include "LmkNotes.h"
+#include "CLmkSender.h"
+#include "LmkListProviderFactory.h"
+#include "CLmkLmItemListProvider.h"
+#include "CLmkDlgCategorySelectorImpl.h"
+#include "CLmkLmItemListMemento.h"
+#include "clmkgotourlcmd.h"
+#include "CLmkAppLmSelectorImpl.h"
+#include "MLmkMapAndNavigationObServer.h"
+#include "CLmkAOOperation.h"
+#include "MLmkMskObserver.h"
+#include "CLmkLocSettingLauncher.h"
+#include <lmkerrors.h>
+
+
+
+// CONSTANTS
+/// Unnamed namespace for local definitions
+namespace {
+//Below three flags are used only for category remove operation.
+//This one is used, when the remove operation starts
+const TInt KRemoveOperationStarted(2);
+//This one is used when, remove operation ends.
+const TInt KRemoveOperationCompleted(4);
+//This one is used, when the remove operation ends & the list box model
+//also is updated, after getting an event from database.
+const TInt KRremoveListBoxModUpdated(8);
+#if defined(_DEBUG)
+_LIT( KPanicMsg, "CLmkAppLmSelectorImpl" );
+
+void Panic( TPanicCode aReason )
+ {
+ User::Panic( KPanicMsg, aReason );
+ }
+#endif
+} // namespace
+
+_LIT(KWildCard, "*");
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::CLmkAppLmSelectorImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLmkAppLmSelectorImpl::CLmkAppLmSelectorImpl(
+ CPosLandmarkDatabase& aDb,
+ CLmkSender& aSender,
+ TBool aFindBox )
+ : CLmkAppLmItemSelectorImpl( aDb, aSender, aFindBox ),iIsDlgOpen(EFalse)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ConstructL()
+ {
+ CLmkAppLmItemSelectorImpl::BaseConstructL();
+ // Added for rel 3.1
+ iLmkCallCmd = CLmkCallCmd::NewL();
+ iDbSearchUtils = NULL;
+ // launching browser
+ iLmkGoToURLCmd = CLmkGoToURLCmd::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ConstructL(
+ const MLmkListMemento& aCategoryMemento )
+ {
+ // Listing contents of current category is implemented using category
+ // view's memento:
+ const CLmkLmItemListMemento& categoryMemento =
+ static_cast<const CLmkLmItemListMemento&>( aCategoryMemento );
+ TPosLmItemId categoryId = categoryMemento.MemorizedItemId();
+
+ if (categoryId == KPosLmNullItemId) // 'uncategorised' category
+ {
+ // set criteria for searchnig 'Uncategorised' landmarks
+ iCategoryName = StringLoader::LoadL(
+ R_LMK_LM_LIST_UNCATEGORISED, const_cast<CEikonEnv *>( iEnv ));
+ }
+ else
+ {
+ // Construction must fail if category has been deleted:
+ CPosLmCategoryManager* mgr = CPosLmCategoryManager::NewL( iDb );
+ CleanupStack::PushL( mgr );
+ // Leaves with KErrNotFound if category doesn't exist
+ CPosLandmarkCategory* category = mgr->ReadCategoryLC( categoryId );
+ TPtrC categoryName;
+ User::LeaveIfError(category->GetCategoryName(categoryName));
+ iCategoryName = categoryName.AllocL();
+ CleanupStack::PopAndDestroy( 2 ); // category, mgr
+ }
+
+ iCriteria = CPosLmCategoryCriteria::NewLC();
+ CleanupStack::Pop(); // iCriteria
+ iCriteria->SetCategoryItemId( categoryId );
+ iMarkedCatCountAdded = 0;
+ // Call "normal" ConstructL():
+ ConstructL();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkAppLmSelectorImpl* CLmkAppLmSelectorImpl::NewL(
+ CPosLandmarkDatabase& aDb,
+ CLmkSender& aSender,
+ TBool aFindBox )
+ {
+ CLmkAppLmSelectorImpl* self =
+ new( ELeave ) CLmkAppLmSelectorImpl( aDb, aSender, aFindBox );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkAppLmSelectorImpl* CLmkAppLmSelectorImpl::NewL(
+ CPosLandmarkDatabase& aDb,
+ const MLmkListMemento& aCategoryMemento,
+ CLmkSender& aSender,
+ TBool aFindBox )
+ {
+ CLmkAppLmSelectorImpl* self =
+ new( ELeave ) CLmkAppLmSelectorImpl( aDb, aSender, aFindBox );
+
+ CleanupStack::PushL( self );
+ self->ConstructL( aCategoryMemento );
+ CleanupStack::Pop();
+
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::~CLmkAppLmSelectorImpl
+// -----------------------------------------------------------------------------
+//
+CLmkAppLmSelectorImpl::~CLmkAppLmSelectorImpl()
+ {
+ delete iCriteria;
+ delete iCategoryName;
+ delete iLmkCallCmd;
+ delete iDbSearchUtils;
+ delete iLmkGoToURLCmd;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::CategoryNameL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TPtrC CLmkAppLmSelectorImpl::CategoryNameL()
+ {
+ return *iCategoryName;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::SetupListProviderL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::SetupListProviderL()
+ {
+ if ( !iListProvider )
+ {
+ if ( iCriteria )
+ {
+ iListProvider =
+ LmkListProviderFactory::CreateProviderL( iDb, *iCriteria );
+ }
+ else
+ {
+ iListProvider =
+ LmkListProviderFactory::CreateProviderL( iDb,
+ ELandmarkSelector );
+ }
+ iListProvider->AddObserverL( *this );
+ iListProvider->InitializeL();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ListProvider
+// -----------------------------------------------------------------------------
+//
+const CLmkListProviderBase& CLmkAppLmSelectorImpl::ListProvider() const
+ {
+ __ASSERT_DEBUG( iListProvider, Panic( KLmkPanicNullMember ) );
+ return *iListProvider;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::HandleCategorySearchNotifyL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::HandleCategorySearchNotifyL(RArray<TPosLmItemId> /*aArray*/)
+ {
+ // This search is not used
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::HandleLmkSearchNotifyL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::HandleLmkSearchNotifyL()
+ {
+ iWaitNote->ProcessFinishedL();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ProcessCommandL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ProcessCommandL( TInt aCommandId )
+ {
+ __ASSERT_DEBUG( iListProvider, Panic( KLmkPanicNullMember ) );
+ switch ( aCommandId )
+ {
+ case ELmkCmdEditLm:
+ {
+ if( iIsDlgOpen )
+ break;
+
+ EditLandmarkCmdL(CLmkEditorDlg::ELmkEditor);
+ iSearchBox->ResetL();
+
+ break;
+ }
+ case ELmkCmdOpenLm:
+ {
+ if( iIsDlgOpen )
+ break;
+
+ EditLandmarkCmdL(CLmkEditorDlg::ELmkViewer);
+ iSearchBox->ResetL();
+
+ #ifdef RD_SCALABLE_UI_V2
+ iSearchBox->DrawDeferred();
+ #endif// RD_SCALABLE_UI_V2
+ iListProvider->StartSearchingLandmarksL(KWildCard, EFalse);
+ break;
+ }
+ case ELmkCmdGoToUrl:
+ {
+ HBufC* lmkUrl = HBufC::NewL( KMaxBufferLen );
+ CleanupStack::PushL( lmkUrl );
+ if (GetPositionFieldForSelectedLmL(
+ ELmkPositionFieldWebAddress,
+ *lmkUrl ) == KErrNone)
+ {
+ if ( lmkUrl->Length() > 0 )
+ {
+ // Get the URL of the LM and launch browser
+ iLmkGoToURLCmd->LaunchBrowserL( *lmkUrl );
+ }
+ }
+ CleanupStack::PopAndDestroy( lmkUrl );
+ break;
+ }
+ case ELmkCmdCall:
+ {
+ // Create AIW interest
+ ExecuteAIWCallCmdL( aCommandId );
+ break;
+ }
+ case ELmkCmdDeleteLm:
+ {
+ DeleteLandmarksCmdL();
+ break;
+ }
+ case ELmkCmdChangeIcon:
+ {
+ ChangeIconCmdL();
+ break;
+ }
+ case ELmkCmdAddToCat:
+ {
+ AddToCatCmdL();
+ break;
+ }
+ case ELmkCmdSendVia1:
+ case ELmkCmdSendVia2:
+ case ELmkCmdSendVia3:
+ case ELmkCmdSendVia4:
+ case ELmkCmdSendVia5:
+ case ELmkCmdSendVia6:
+ case ELmkCmdSendVia7:
+ case ELmkCmdSendVia8:
+ case ELmkCmdSendVia9:
+ case ELmkCmdSendVia10:
+ case ELmkCmdSend:
+ {
+ RArray<TPosLmItemId>& markedIds = MarkedItemIdsL();
+ if(markedIds.Count() == 0)
+ {
+ CPosLandmark* landmark = iDb.ReadLandmarkLC(SelectedIdL());
+ iSender.SendSingleLandmarkL(*landmark);
+ CleanupStack::PopAndDestroy();//landmark
+ }
+ else
+ {
+ //Send multiple landmarks
+ TPtrC ptr;
+ RPointerArray<CLmkLandmark> lmkArray;
+ TRAPD( sendErr, iSender.PrepareMultipleLandmarkForSendL(lmkArray,markedIds) );
+ if(sendErr == KErrNone)
+ {
+ TRAP( sendErr, iSender.SendLandmarksL(aCommandId,ptr,lmkArray) );
+ }
+ lmkArray.ResetAndDestroy();
+ if(sendErr == KErrNoMemory)
+ {
+ User::LeaveNoMemory();
+ }
+ }
+ break;
+ }
+ case EAknCmdMark:
+ case EAknCmdUnmark:
+ case EAknMarkAll:
+ case EAknUnmarkAll:
+ {
+ if(iMskObserver)
+ {
+ iMskObserver->UpdateMskContainerL();
+ }
+ break;
+ }
+ case ELmkCmdLaunchPositionSettings:
+ {
+ LaunchPosSettingsL();
+ break;
+ }
+ case ELmkCmdFindBoxSearchAfresh:
+ case ELmkCmdFindBoxSearchInPreviousResults:
+ {
+ TInt searchTextLength = iSearchBox->TextLength();
+ const TInt KExtraChars = 2; // 2 chars wildcards
+ HBufC* filterBuf = HBufC::NewLC(searchTextLength + KExtraChars);
+ TPtr filter = filterBuf->Des();
+ iSearchBox->GetSearchText(filter);
+ filter.Append(KWildCard);
+ iListProvider->StartSearchingLandmarksL(filter, EFalse);
+ CleanupStack::PopAndDestroy( filterBuf );
+
+ break;
+ }
+ default:
+ {
+ CLmkAppLmItemSelectorImpl::ProcessCommandL( aCommandId );
+ break;
+ }
+ }
+ }
+
+EXPORT_C void CLmkAppLmSelectorImpl::StartSearchingLandmarksL(
+ const TDesC& /*aSearchPattern*/,
+ TBool /*aSearchOnlyInPreviousMatches*/)
+ {
+ iListProvider->InitializeL();
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::HandleOperationL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::HandleOperationL(
+ TOperationTypes aType,
+ TReal32 /*aProgress*/,
+ TInt aStatus )
+ {
+ TBool deleteNote = EFalse;
+ switch (aType)
+ {
+ case EDeleteLandmarks:
+ {
+ if (aStatus != KPosLmOperationNotComplete)
+ {
+ deleteNote = ETrue;
+ }
+ }
+ break;
+ case EAddToCategory:
+ {
+ if (iMarkedCatCountAdded ==1)
+ {
+ deleteNote = ETrue;
+ }
+ else if (iMarkedCatCountAdded > 1)
+ {
+ --iMarkedCatCountAdded;
+ }
+ }
+ break;
+ case ERemoveCategory:
+ {
+ if (iOperation && aStatus != KPosLmOperationNotComplete)
+ {
+ if((iCatRemoveFlag & KRremoveListBoxModUpdated) &&
+ (iCatRemoveFlag & KRemoveOperationStarted )&& iWaitNote)
+ {
+ //Since the operation is completed and listbox model
+ //is updated first, wait note can be closed now
+ CloseWaitNoteL();
+ iListBox->SetCurrentItemIndex(0);
+ //nullify all the flags
+ iCatRemoveFlag &= ~KRemoveOperationCompleted;
+ iCatRemoveFlag &= ~KRremoveListBoxModUpdated;
+ iCatRemoveFlag &= ~KRemoveOperationStarted;
+ }
+ else
+ {
+ //operation completed but cannot close the wait dialog
+ //since, the listbox model is not updated.Now , it will
+ //be closed in HandleEventListReadyL function.Set the operation
+ //completion flag
+ iCatRemoveFlag |= KRemoveOperationCompleted;
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ }
+
+ if (deleteNote && iWaitNote)
+ {
+ iWaitNote->ProcessFinishedL();
+ iWaitNote = NULL;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ChangeIconL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ChangeIconL(
+ TPosLmItemId aId,
+ TInt aIconIndex,
+ TInt aMaskIndex)
+ {
+ TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
+ iDbUtils->ChangeIconL( iDb, aId, ELmkItemTypeLandmark,
+ *iconFile, aIconIndex, aMaskIndex);
+ CleanupStack::PopAndDestroy();//iconFile
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ChangeIconsL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ChangeIconsL(
+ RArray<TPosLmItemId>& aIdArray,
+ TInt aIconIndex,
+ TInt aMaskIndex)
+ {
+ TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
+ iDbUtils->ChangeIconsL( aIdArray, ELmkItemTypeLandmark,
+ *iconFile, aIconIndex, aMaskIndex);
+ CleanupStack::PopAndDestroy();//iconFile
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::InitialLandmarkL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::InitialLandmarkL( CPosLandmark* aLandmark )
+ {
+ if ( iCriteria )
+ {// category is a valid category in the LM database (not 'uncategorised')
+ if (iCriteria->CategoryItemId() != KPosLmNullItemId)
+ {
+ aLandmark->AddCategoryL( iCriteria->CategoryItemId() );
+ }
+
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::EditLandmarkCmdL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::EditLandmarkCmdL(TLmkEditorMode aEditMode)
+ {
+ TLmkEditorAttributes attributeFlags( CLmkEditorDlg::ELmkAll );
+ TChar DriveName = 'c';
+ TInt BytesToWrite = 0;
+
+ DiskSpaceBelowCriticalLevelL(BytesToWrite, DriveName);
+ iNewLmkItemId = SelectedIdL();
+ if(iDlg)
+ {
+ iDlg = NULL;
+ }
+ iDlg = CLmkEditorImpl::NewL( iDb,
+ iSender,
+ attributeFlags,
+ aEditMode,
+ iNewLmkItemId );
+ iDlg->ExecuteLD();
+ iDlg = NULL;
+
+#ifdef RD_SCALABLE_UI_V2
+ TInt listProviderCount = LmItemListProvider().ItemCount();
+ TInt listBoxItemCount = iListBox->Model()->NumberOfItems();
+ TInt currentItemIndex = LmItemListProvider().SelectedIndex(iNewLmkItemId);// iListBox->CurrentItemIndex();
+ if (listProviderCount != listBoxItemCount)
+ {
+ iDeletionHelper.StoreListInformation( *iListBox, EFalse );
+ }
+
+ iDeletionHelper.UpdateListIfDeleteHappenedL();
+ if( currentItemIndex >= 0 && currentItemIndex < iListBox->Model()->NumberOfItems() )
+ {
+ iListBox->SetCurrentItemIndex(currentItemIndex);
+ }
+
+#endif // RD_SCALABLE_UI_V2
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::GetSelectedLandmarksL
+// -----------------------------------------------------------------------------
+//
+TInt CLmkAppLmSelectorImpl::GetSelectedLandmarksL(RPointerArray<CPosLandmark> &aArray)
+ {
+ if( ! iListBox->Model()->NumberOfItems() )
+ {
+ return KErrNotFound;
+ }
+
+ RArray<TPosLmItemId>& markedItemIds = MarkedItemIdsL();
+ TInt markedCount = markedItemIds.Count();
+ if ( markedCount == 0 )
+ {
+ TPosLmItemId itemId = SelectedIdL();
+ CPosLandmark *lmk = iDb.ReadLandmarkLC(itemId);
+ aArray.Append(lmk);
+ CleanupStack::Pop(); // ReadLandmarkLC
+ return KErrNone;
+ }
+ else
+ {
+ if(markedCount == 1)
+ {
+ // Donot request if only one landmark
+ TPosLmItemId itemId = markedItemIds[0];
+ CPosLandmark *lmk = iDb.ReadLandmarkLC(itemId);
+ aArray.Append(lmk);
+ CleanupStack::Pop(); // ReadLandmarkLC
+ return KErrNone;
+ }
+ RArray<TPosLmItemId> itemIds;
+ for(TInt index = 0;index < markedCount; index++)
+ {
+ TPosLmItemId itemId = markedItemIds[index];
+ itemIds.Append(itemId);
+ }
+ if(iDbSearchUtils == NULL)
+ {
+ iDbSearchUtils = CLmkDbSearchUtils::NewL();
+ }
+ iDbSearchUtils->GetLandmarksL(this, itemIds ,&aArray);
+ iWaitNote = new (ELeave) CAknWaitDialog(NULL, ETrue);
+ iWaitNote->ExecuteLD(R_LMKUI_PROCESSING_WAIT_NOTE);
+ iWaitNote = NULL;
+ return KErrNone;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::IsLandmarkDataEmptyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkAppLmSelectorImpl::IsLandmarkDataEmptyL(CPosLandmark* aLandmark)
+ {
+ // verify that destination landmark has coordinates
+ TLocality loc;
+ TBool isValid = (KErrNone == aLandmark->GetPosition( loc ) );
+ isValid &= !Math::IsNaN( loc.Latitude() ) && !Math::IsNaN( loc.Longitude() );
+ return isValid;
+
+/*
+ if ( !isValid )
+ {
+ // verify that destination landmark has address info
+ TPositionFieldId fieldId = aLandmark->FirstPositionFieldId();
+ while ( fieldId != EPositionFieldNone )
+ {
+ if ( fieldId > EPositionFieldAddressCapabilitiesBegin &&
+ fieldId < EPositionFieldBuildingTelephone)
+ {
+ TPtrC field;
+ aLandmark->GetPositionField( fieldId, field );
+ if ( field.Length() )
+ {
+ isValid = ETrue;
+ break;
+ }
+ }
+ fieldId = aLandmark->NextPositionFieldId( fieldId );
+ }
+ }
+ return !isValid;
+*/
+ }
+
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::DeleteLandmarksCmdL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::DeleteLandmarksCmdL()
+ {
+
+ if( ! iListBox->Model()->NumberOfItems() )
+ return;
+
+ RArray<TPosLmItemId>& markedItemIds = MarkedItemIdsL();
+ TInt markedCount = markedItemIds.Count();
+ if ( markedCount == 0 )
+ {
+ if ( LmkNotes::LandmarkConfirmationQueryL( iEnv, 1 ) )
+ {
+ iDeletionHelper.StoreListInformation( *iListBox, EFalse );
+ TPosLmItemId selectedId = SelectedIdL();
+ LmItemListProvider().RemoveItem( selectedId );
+ iDbUtils->DeleteLandmarkL( selectedId, iDb );
+ }
+
+ }
+ else
+ {
+ if ( LmkNotes::LandmarkConfirmationQueryL( iEnv, markedCount ) )
+ {
+ StoreIdTobeFocussedAfterDeletion( markedItemIds );
+ iDeletionHelper.StoreListInformation( *iListBox, ETrue );
+
+ if( markedCount == 1 )
+ {
+ LmItemListProvider().RemoveItem( markedItemIds[0] );
+ iDbUtils->DeleteLandmarkL( markedItemIds[0], iDb );
+ return;
+ }
+ // The 10 value is set as standard to remove the multiple landmarks and new procedure for operation
+ if( markedCount > 10)
+ {
+ LmItemListProvider().RemoveItemsL(markedItemIds,
+ MLmkAOOperationObserver::EDeleteLandmarks,
+ KPosLmNullItemId);
+ }
+ else
+ {
+ iDbUtils->DeleteLandmarksL( markedItemIds );
+
+ // wait note
+ iWaitNote = new (ELeave) CAknWaitDialog( NULL, ETrue );
+ if ( !iWaitNote->ExecuteLD( R_LMK_DELETING_WAIT_NOTE ) )
+ {
+ //making iWaitNote null, since framework destroys waitnote
+ //dialog on pressing cancel.
+ iWaitNote = NULL;
+ iDbUtils->CancelLmOperation();
+ }
+ }
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::AddToCatL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::AddToCatCmdL()
+ {
+ CLmkDlgCategorySelectorImpl* dlg =
+ CLmkDlgCategorySelectorImpl::NewL( iDb, ETrue, ETrue );
+ CleanupStack::PushL( dlg );
+ dlg->SetEmptyDlgLabel( R_LMK_EMPTY_NO_CATEGORIES ,R_LMK_GUIDE_CREATE_LANDMARK );
+ RArray<TPosLmItemId> categories;
+ CleanupClosePushL( categories );
+ if ( dlg->ExecuteL( categories ) )
+ {
+ RArray<TPosLmItemId>& markedLmIds = MarkedItemIdsL();
+ TInt markedLmCount = markedLmIds.Count();
+ TInt markedCatCount = categories.Count();
+ iMarkedCatCountAdded = markedCatCount;
+ if ( markedCatCount > 0 )
+ {
+ LmItemListProvider().SetOperationCmd( ELmkCmdAddToCat );
+ LmItemListProvider().SetSelectedItemsCount( markedCatCount );
+
+ if( markedLmCount == 0 )
+ markedLmIds.Append( SelectedIdL() );
+
+ iDbUtils->AddLmsToCategoriesL( markedLmIds, categories );
+
+ // wait note
+ iWaitNote = new (ELeave) CAknWaitDialog( NULL, ETrue );
+ if ( !iWaitNote->ExecuteLD( R_LMK_PROCESSING_WAIT_NOTE ) )
+ {
+ //making iWaitNote null, since framework destroys waitnote
+ //dialog on pressing cancel.
+ LmItemListProvider().SetSelectedItemsCount( 0 );
+ iWaitNote = NULL;
+ iDbUtils->CancelLmOperation();
+ }
+ iListBox->ClearSelection();
+ }
+
+ if( iMskObserver )
+ {
+ iMskObserver->UpdateMskContainerL();
+ }
+ }
+ CleanupStack::PopAndDestroy( 2 ); // categories, dlg
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::HandleEventListReadyL
+// -----------------------------------------------------------------------------
+//
+TBool CLmkAppLmSelectorImpl::HandleEventListReadyL()
+ {
+ // Possibly user-initiated delete finished --> if yes, update the list:
+ TBool retVal;
+ if( iNewListBoxItemAdded )
+ {
+ CAknFilteredTextListBoxModel* model = static_cast<CAknFilteredTextListBoxModel*>( iListBox->Model() );
+ CAknListBoxFilterItems* filter = static_cast<CAknListBoxFilterItems*>( model->Filter() );
+ filter->HandleItemArrayChangeL();
+
+ TInt listboxIndex = LmItemListProvider().SelectedIndex(iNewLmkItemId);
+
+ /* When the user tries to create a new landmark in category content view (catId = n)
+ * Chooses to deselect that category from multiple category selector
+ * The landmark gets added to either 'uncategorised' category or any other
+ * category than the current category -->n
+ */
+
+ if ( listboxIndex == KLmkInValidIndex )
+ {
+ retVal = EFalse;
+ return retVal;
+ }
+
+ if ( listboxIndex != KErrNotFound &&
+ listboxIndex < iListBox->Model()->NumberOfItems() )
+ {
+ iListBox->SetCurrentItemIndex(listboxIndex);
+ }
+ UpdateMarkIndexAfterAdditionL( listboxIndex );
+ iListBox->DrawDeferred();
+ iNewListBoxItemAdded = EFalse;
+ retVal = ETrue;
+ }
+ else // Either item is updated/deleted
+ {
+ /*Check if the database item count and list item count are same or not
+ *If there is a change, update the list box
+ *(The deletion of an item due to updates in landmark category info
+ *via category in selection via landmark editor or via 'Addtocategory'
+ *command from the Landmark App views)
+ */
+ if(iDlg)
+ {
+ TRAP_IGNORE(iDlg->UpdateViewDlgL());
+ }
+ TInt listProviderCount = LmItemListProvider().ItemCount();
+ TInt listBoxItemCount = iListBox->Model()->NumberOfItems();
+ if (listProviderCount != listBoxItemCount)
+ {
+ iDeletionHelper.StoreListInformation( *iListBox, EFalse );
+ }
+
+ retVal = iDeletionHelper.UpdateListIfDeleteHappenedL();
+
+ if( retVal)
+ {
+ SetFocusToItemAfterDeletionOfMarkedItems();
+ }
+ //
+ if( (iCatRemoveFlag & KRemoveOperationStarted) )
+ {
+ if((iCatRemoveFlag & KRemoveOperationCompleted) && iWaitNote)
+ {
+ CloseWaitNoteL();
+ iListBox->SetCurrentItemIndex(0);
+ iCatRemoveFlag &= ~KRremoveListBoxModUpdated;
+ iCatRemoveFlag &= ~KRemoveOperationCompleted;
+ iCatRemoveFlag &= ~KRemoveOperationStarted;
+ }
+ else
+ {
+ //operation completed but cannot close the wait dialog
+ //since, the operation is not yet completed , it will
+ //be closed in HandleOperationL function.
+ iCatRemoveFlag |= KRremoveListBoxModUpdated;
+ }
+ }
+ }
+ return retVal;
+ }
+
+// ----------------------------------------------------
+// CLmkAppLmSelectorImpl::AttachToAIWMenuL()
+// ----------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::AttachToAIWMenuL(
+ TInt aMenuResourceId,
+ TInt aInterestResourceId)
+ {
+ iLmkCallCmd->AttachMenuPaneL( aMenuResourceId, aInterestResourceId);
+ }
+
+// ----------------------------------------------------
+// CLmkAppLmSelectorImpl::InitializeMenuPaneL()
+// ----------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::InitializeMenuPaneL(
+ CEikMenuPane& aMenuPane,
+ TInt aMenuResourceId)
+ {
+ // Initialize the AIW menu service
+ iLmkCallCmd->InitializeMenuPaneL(
+ aMenuPane,
+ aMenuResourceId,
+ ELmkCmdLast // Must not overlap with the other menu ids!
+ );
+ }
+// ----------------------------------------------------
+// CLmkAppLmSelectorImpl::AttachInterestL()
+// ----------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::AttachInterestL (
+ TInt aInterestResourceId)
+ {
+ iLmkCallCmd->AttachInterestL(aInterestResourceId);
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ExecuteAIWCallCmdL()
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::ExecuteAIWCallCmdL(
+ TInt aCommandId )
+ {
+ HBufC* lmkPhoneNum = HBufC:: NewL( KMaxPhoneNumberFieldLen );
+ CleanupStack::PushL(lmkPhoneNum);
+
+ if ( (GetPositionFieldForSelectedLmL(
+ ELmkPositionFieldPhoneNumber,
+ *lmkPhoneNum ) == KErrNone) && (lmkPhoneNum->Des().Length() > 0) )
+ {
+ iLmkCallCmd->ExecuteAIWCallCmdL( aCommandId, *lmkPhoneNum );
+ }
+ else
+ {
+ // Info note here with landmark name
+ TPosLmItemId lmId = SelectedIdL();
+ CPosLandmark* landmark = iDb.ReadLandmarkLC(lmId);
+ // Get name
+ TPtrC lmkNamePtr;
+ if ( landmark->GetLandmarkName ( lmkNamePtr ) == KErrNone )
+ {
+ LmkNotes::InformationNotewithTextL( iEnv,
+ R_LMK_NOTE_NO_NUMBER_TO_NAME, lmkNamePtr);
+ }
+ CleanupStack::PopAndDestroy( landmark );
+ }
+ CleanupStack::PopAndDestroy(lmkPhoneNum);
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::GetPositionFieldForSelectedLmL()
+// -----------------------------------------------------------------------------
+//
+TInt CLmkAppLmSelectorImpl::GetPositionFieldForSelectedLmL(
+ TPositionFieldId aFieldId,
+ HBufC& aFieldValue )
+ {
+ TPosLmItemId lmId = SelectedIdL();
+ TPtrC tmpPtr;
+
+ CPosLandmark* landmark = iDb.ReadLandmarkLC(lmId);
+ TInt retVal (-1);
+ if ( landmark->IsPositionFieldAvailable( aFieldId ) )
+ {
+ retVal = landmark->GetPositionField( aFieldId, tmpPtr );
+ }
+ if ( aFieldValue.Des().MaxLength() >= tmpPtr.Length() )
+ {
+ aFieldValue.Des().Copy( tmpPtr );
+ }
+ CleanupStack::PopAndDestroy( landmark );
+ return retVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::IsThisLandmarkFieldDefined
+// -----------------------------------------------------------------------------
+//
+TBool CLmkAppLmSelectorImpl::IsLmWithThisFieldExistL ( TLmkAppCmdId aCmdId )
+ {
+
+ TBool lmkFieldExist = EFalse;
+ TPositionFieldId lmkPostionField (0);
+
+ if ( aCmdId == ELmkCmdCall )
+ {
+ lmkPostionField = ELmkPositionFieldPhoneNumber;
+ }
+ if ( aCmdId == ELmkCmdGoToUrl )
+ {
+ lmkPostionField = ELmkPositionFieldWebAddress;
+ }
+
+ HBufC* lmkField = HBufC::NewL( KMaxBufferLen );
+ CleanupStack::PushL( lmkField );
+
+ if ( (GetPositionFieldForSelectedLmL(
+ lmkPostionField,
+ *lmkField ) == KErrNone) &&
+ (lmkField->Des().Length() > 0) )
+ {
+ lmkFieldExist = ETrue;
+ }
+ CleanupStack::PopAndDestroy( lmkField );
+ return lmkFieldExist;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::HandleLmCreated
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::HandleLmCreated(TPosLmItemId aNewLmkItemId)
+ {
+ iNewLmkItemId = aNewLmkItemId;
+ iNewListBoxItemAdded = ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::RemoveLandmarksFromCategory
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CLmkAppLmSelectorImpl::RemoveLandmarksFromCategoryL()
+ {
+ if(iCriteria)
+ {
+ TPosLmItemId catId = iCriteria->CategoryItemId();
+ RArray<TPosLmItemId>& itemArray = MarkedItemIdsL();
+ LmItemListProvider().SetOperationCmd( ERemoveFromCat );
+ if (itemArray.Count() == 0)
+ {
+ TPosLmItemId id = SelectedIdL();
+ itemArray.AppendL(id);
+ }
+ // The 10 value is set as standard to remove the multiple landmarks and new procedure for operation
+ if( itemArray.Count() > 10)
+ {
+ LmItemListProvider().RemoveItemsL(itemArray,
+ MLmkAOOperationObserver::ERemoveCategory,
+ catId);
+ return;
+ }
+ else
+ {
+ CPosLmCategoryManager* mgr = CPosLmCategoryManager::NewL( iDb );
+ CleanupStack::PushL(mgr);
+ CPosLmOperation* operation = mgr->RemoveCategoryFromLandmarksL(catId,itemArray);
+ CleanupStack::PopAndDestroy();//mgr
+ if (iOperation)
+ {
+ delete iOperation;
+ iOperation = NULL;
+ }
+ iOperation = CLmkAOOperation::NewL(operation,
+ *this,MLmkAOOperationObserver::ERemoveCategory,ETrue);
+ iOperation->StartOperation();
+ }
+ }
+ iCatRemoveFlag |= KRemoveOperationStarted;
+ iWaitNote = new (ELeave) CAknWaitDialog(NULL, ETrue);
+ if(!iWaitNote->ExecuteLD(R_LMK_PROCESSING_WAIT_NOTE))
+ {
+ if (iOperation)
+ {
+ delete iOperation;
+ iOperation = NULL;
+ }
+ iWaitNote = NULL;
+ }
+ iCatRemoveFlag &= ~KRemoveOperationStarted;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::IsCriteriaUnCategorizedCat
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool CLmkAppLmSelectorImpl::IsCriteriaUnCategorizedCat()
+ {
+ TBool result = EFalse;
+ if (iCriteria && iCriteria->CategoryItemId() == KPosLmNullItemId)
+ {
+ result = ETrue;
+ }
+ return result;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::ServiceCmdByMenuCmd
+// -----------------------------------------------------------------------------
+//
+TInt CLmkAppLmSelectorImpl::ServiceCmdByMenuCmd( TInt aMenuCmd )
+ {
+ return iLmkCallCmd->ServiceCmdByMenuCmd( aMenuCmd );
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkAppLmSelectorImpl::CloseWaitNoteL
+// -----------------------------------------------------------------------------
+//
+void CLmkAppLmSelectorImpl::CloseWaitNoteL()
+ {
+ iWaitNote->ProcessFinishedL();
+ iWaitNote = NULL;
+ if (iOperation)
+ {
+ delete iOperation;
+ iOperation = NULL;
+ }
+ }
+
+// End of File
+