landmarksui/uicontrols/src/CLmkAppLmSelectorImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 19 Aug 2010 09:48:36 +0300
branchRCL_3
changeset 16 8173571d354e
parent 5 41042d2af523
permissions -rw-r--r--
Revision: 201030 Kit: 201033

/*
* 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
   TRAPD(err,CPosLandmark* landmark = iDb.ReadLandmarkLC(iNewLmkItemId);CleanupStack::PopAndDestroy( landmark ));
   if (err == KErrNotFound)
       {
       LmItemListProvider().RemoveItem( iNewLmkItemId );
       }      
    }

// -----------------------------------------------------------------------------
// 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