landmarksui/uicontrols/src/CLmkEditorImpl.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:16:03 +0200
changeset 0 522cd55cc3d7
child 3 3c271c9e6618
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2002-2010 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 methods implementing the core
*                functionality of landmarks editor
*
*/

// INCLUDE FILES
#include <AknSettingCache.h>
#include <AiwServiceHandler.h>      // AIW
#include <AiwCommon.hrh>            // AIW
#include <featmgr.h>
#include <aknlayoutscalable_avkon.cdl.h>
#include <layoutmetadata.cdl.h>
#include <aknmessagequerydialog.h>
#include <AknIconUtils.h>
#include <AknWaitDialog.h>
#include <aknlists.h>
#include <StringLoader.h>
#include <AknQueryDialog.h>
#include <eikcapc.h>
#include <eikmenup.h>
#include <hlplch.h>
#include <sendnorm.rsg> // R_SENDUI_MENU
#include <lmkui.rsg>
#include <CLmkEditorDlg.h>
#include <EPos_CPosLandmark.h>
#include <EPos_CPosLandmarkDatabase.h>
#include <epos_poslandmarkserialization.h>
#include <bldvariant.hrh>
#include <AknDef.h>
#include <sysutil.h>

#include <baclipb.h>                        // for CClipboard
#include <txtrich.h>
#include <txtetext.h>
#include <s32std.h>

#include "CLmkUiUtils.h"
#include "landmarks.hrh"
#include "LmkConsts.h"
#include "LmkUID.h"
#include "CLmkLocationService.h"
#include "CLmkDbUtils.h"
#include "CLmkEditorFieldArray.h"
#include "MLmkEditorField.h"
#include "LmkNotes.h"
#include "CLmkDlgCategorySelectorImpl.h"
#include <csxhelp/lm.hlp.hrh>
#include "CLmkSender.h"
#include "clmkgotourlcmd.h"
#include "clmkcallcmd.h"
#include "CLmkEditorImpl.h"
#include "CLmkEditorTextField.h"
#include "lmkicondialog.h"
#include "CLmkEditorListField.h"
#include "CLmkEditorCoordinateField.h"
#include <Landmarks.rsg>
#include <uriutils.h>
#include "LmkListProviderFactory.h"
#include "CLmkListProviderBase.h"
#include <locnotprefplugindomaincrkeys.h>
#include "clmkcentralrepository.h"
#include "CLmkEditorNumberField.h"
#include "lmkwaitdlglauncher.h" // Wait dialog launcher
#include "LmkEditorFieldFactory.h"
#include <locationvariationdomaincrkeys.h>
#include <lmkerrors.h>

// CONSTANTS
/// Unnamed namespace for local definitions
namespace {
 //const TInt KMaxCatCntForInfoPopUp (3);
 const TInt KHOffsetCatInfoPopup ( 100 );
 const TInt KVOffsetCatInfoPopup ( 30 );
 //const TInt KMinCatLenForInfoPopUp ( 11 );
 //const TInt KMaxCatSizeForInfoPopUp ( 135 );
 #if defined(_DEBUG)
_LIT( KPanicMsg, "CLmkEditorImpl");

void Panic( TPanicCode aReason )
    {
    User::Panic( KPanicMsg, aReason );
    }
 #endif
}  // namespace

// ================= LOCAL FUNCTIONS =======================
static void CleanupArray(TAny* aArray)
    {
    ( static_cast<RPointerArray<CPosLandmark>*>( aArray ) )->ResetAndDestroy();
    }
// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CLmkEditorImpl
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CLmkEditorImpl::CLmkEditorImpl(
    CPosLandmarkDatabase& aDb,
    CLmkSender& aSender,
    TLmkEditorMode aEditorMode )
    : iDb( aDb ),
      iSender( aSender ),
      iEditorMode( aEditorMode ),
      iIsEditing(EFalse),
      iResetWebAddrSize(ETrue),
      iIsCategorySelctorOpen(EFalse)
    {
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ConstructL(
    TPosLmItemId aLandmarkId,
    TLmkEditorAttributes aAttributes )
    {
    CommonConstructL(aAttributes);
    
    iLandmark = iDb.ReadLandmarkLC(aLandmarkId);  
    
    iLmkFields = CLmkFields::NewL( iLabelArray, 
                                   iDb,
                                   aAttributes,
                                   aLandmarkId, 
                                   iLandmark ,
                                   iJapaneseInputMode);  
    ChangeContextImageL();
    iEditorFieldArray = CLmkEditorFieldArray::NewL( *iLmkFields, *this );    
    CleanupStack::Pop(iLandmark);
    
    if(iLandmark)
    	{
    	iIsLmOwned = ETrue;
    	}
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ConstructL(
    CPosLandmark* aLandmark,
    TLmkEditorAttributes aAttributes )
    {
    CommonConstructL(aAttributes);

    iLmkFields = CLmkFields::NewL( iLabelArray,
                                   iDb,
                                   aAttributes,
                                   aLandmark->LandmarkId(),
                                   aLandmark,
                                   iJapaneseInputMode );
    iLandmark = aLandmark;

    ChangeContextImageL();
    iEditorFieldArray = CLmkEditorFieldArray::NewL( *iLmkFields, *this );
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ConstructL(
    TPosLmItemId* aLandmarkId,
    CPosLandmark* aLandmark,
    TLmkEditorAttributes aAttributes )
    {
    CommonConstructL(aAttributes);

    iLmkFields = CLmkFields::NewL( iLabelArray,
                                   iDb,
                                   aAttributes,
                                   *aLandmarkId,
                                   aLandmark,
                                   iJapaneseInputMode );
	iLandmarkItemId = aLandmarkId;
	iLandmark = aLandmark;
    ChangeContextImageL();
    iEditorFieldArray = CLmkEditorFieldArray::NewL( *iLmkFields, *this );
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CommonConstructL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CommonConstructL(TLmkEditorAttributes& aAttributes)
    {
	iLandmarkItemId = NULL; // Set to NULL by default. Use only where needed.
    iLmkUiUtils = CLmkUiUtils::NewL();
    iLmkUiUtils->ReadLmkUiResourceFileL();
    CAknForm::ConstructL( R_LMK_EDITOR_MENUBAR );

    iLmkUiUtils->StoreNaviPaneL(); // store old navi pane
    iLmkUiUtils->CreateDefaultNaviPaneL();
    // For setting Japanese input mode
    CAknSettingCache& cache = CAknEnv::Static()->SettingCache();
	TLanguage currentLanguage = cache.InputLanguage();
	if ( currentLanguage == ELangJapanese )
    	{
    	iJapaneseInputMode = ETrue;
    	}
    else
        {
        iJapaneseInputMode = EFalse;
        }
    CreateLabelArrayL();
    ConstructContextMenuL();

    // launching browser
    iLmkGoToURLCmd = CLmkGoToURLCmd::NewL();
    // Launching Call UI
    iLmkCallCmd = CLmkCallCmd::NewL();
    iLmkCallCmd->AttachMenuPaneL( R_LMK_EDITOR_CALL_SUBMENU, R_LMK_EDITOR_AIW_INTEREST);
	// Create AIW interest
	iLmkCallCmd->AttachInterestL( R_LMK_EDITOR_AIW_INTEREST );
	// By default enable map and navigation feature
    iMapNavFeature = ETrue;

    iMapNavInterface = CLmkMapNavigationInterface::NewL( iDb);
    iCatInfoPopupNote = NULL;
    iRepository = CLmkCentralRepository::NewL( KLocSystemofMeasurements,this);

    // Create the wait dialog launcher
    iWaitDialogLauncher = CLmkWaitDialogLauncher::NewL();
    iWaitDialogLauncher->SetObserver(this);

    iIsLmOwned = EFalse;
    
    // Check if the Coordinates has to be hidden
	CheckHideCoordinateL();
    
    if( iIsHideCoordinate )
        {
        aAttributes&= ~CLmkEditorDlg::ELmkLatitude;
        aAttributes&= ~CLmkEditorDlg::ELmkLongitude;
        aAttributes&= ~CLmkEditorDlg::ELmkPositionAccuracy;
        aAttributes&= ~CLmkEditorDlg::ELmkAltitude;
        aAttributes&= ~CLmkEditorDlg::ELmkAltitudeAccuracy;
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CLmkEditorImpl* CLmkEditorImpl::NewL(
    CPosLandmarkDatabase& aDb,
    CLmkSender& aSender,
    TLmkEditorAttributes aAttributes,
    TLmkEditorMode aEditorMode,
    TPosLmItemId aLandmarkId )
    {
    CLmkEditorImpl* self =
        new( ELeave ) CLmkEditorImpl( aDb, aSender, aEditorMode );

    CleanupStack::PushL( self );
    self->ConstructL( aLandmarkId, aAttributes );
    CleanupStack::Pop(); //self
    return self;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CLmkEditorImpl* CLmkEditorImpl::NewL(
    CPosLandmarkDatabase& aDb,
    CLmkSender& aSender,
    TLmkEditorAttributes aAttributes,
    TLmkEditorMode aEditorMode,
    CPosLandmark* aLandmark )
    {
    CLmkEditorImpl* self =
        new( ELeave ) CLmkEditorImpl( aDb, aSender, aEditorMode );

    CleanupStack::PushL( self );
    self->ConstructL( aLandmark, aAttributes );
    CleanupStack::Pop(); //self
    return self;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C CLmkEditorImpl* CLmkEditorImpl::NewL(
    CPosLandmarkDatabase& aDb,
    CLmkSender& aSender,
    TLmkEditorAttributes aAttributes,
    TLmkEditorMode aEditorMode,
    TPosLmItemId* aLandmarkId,
    CPosLandmark* aLandmark )
    {
    CLmkEditorImpl* self =
        new( ELeave ) CLmkEditorImpl( aDb, aSender, aEditorMode );

    CleanupStack::PushL( self );
    self->ConstructL( aLandmarkId, aLandmark, aAttributes );
    CleanupStack::Pop(); //self
    return self;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::~CLmkEditorImpl()
// -----------------------------------------------------------------------------
//
CLmkEditorImpl::~CLmkEditorImpl()
    {
    delete iWaitDialogLauncher;
		
	CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
	cba->RemoveCommandObserver(KMskCommandPos);
        
    if( iLmkUiUtils )
        {
        iLmkUiUtils->SetOldContextIcon();
        iLmkUiUtils->RestoreOldTitlePane();
        }

    delete iLmkUiUtils;
    delete iLmkFields;
    iLabelArray.ResetAndDestroy();
    iCategoryNames.Close();
    iLabelArray.Close();
    delete iEditorFieldArray;
    delete iLocationService;

    if (iContextMenuBar)
        {
        iEikonEnv->EikAppUi()->RemoveFromStack(iContextMenuBar);
        delete iContextMenuBar;
        }
    delete iLmkGoToURLCmd;
    delete iLmkCallCmd;
    iMapNavInterface->Release();
	delete iCatInfoPopupNote;
	delete iRepository;
	if(iIsLmOwned && iLandmark)
		delete iLandmark;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetMopParent
// -----------------------------------------------------------------------------
//
EXPORT_C void CLmkEditorImpl::SetMopParent(
    MObjectProvider* aParent )
    {
    CCoeControl::SetMopParent( aParent );
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetHelpContext
// -----------------------------------------------------------------------------
//
EXPORT_C void CLmkEditorImpl::SetHelpContext( TCoeHelpContext aContext )
    {
    iHelpContext = aContext;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ExecuteL
// -----------------------------------------------------------------------------
//
EXPORT_C TInt CLmkEditorImpl::ExecuteLD()
    {
    CleanupStack::PushL( this );
    AttachAIWMenuInterestL();
    CleanupStack::Pop();//this
    if (iEditorMode == CLmkEditorDlg::ELmkEditor)
		{
		iIsEditing = ETrue;
		return CAknForm::ExecuteLD( R_LMK_EDITOR_DIALOG );
		}
    else // viewer/receive state of editor
	    {
		iIsEditing = EFalse;
		return CAknForm::ExecuteLD( R_LMK_VIEWER_DIALOG );
	    }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DisableMapAndNavigationMenuOptions
// -----------------------------------------------------------------------------
//
EXPORT_C void CLmkEditorImpl::DisableMapAndNavigationMenuOptions()
	{
	iMapNavFeature = EFalse;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DynInitMenuPaneL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DynInitMenuPaneL(
    TInt aResourceId,
    CEikMenuPane* aMenuPane )
    {
    switch( aResourceId )
        {
        case R_AVKON_FORM_MENUPANE:
            {
            CAknForm::DynInitMenuPaneL( aResourceId, aMenuPane );
            TBool isLandmarkDataEmpty = EFalse;
            TBool dimClearPos = ETrue;

            // Disable Map and Navigation feature when opted not to show	
		    if( !iMapNavFeature )
		    	{		    	
		    	isLandmarkDataEmpty = ETrue;
		    	}	
		    else	    
	        	{
	        	isLandmarkDataEmpty = ArePositionFieldEmptyL();
	        	}
	                    
            if( isLandmarkDataEmpty )
            	{
		    	// delete the show on map & Navigate To options
		    	aMenuPane->DeleteMenuItem( ELmkShowOnMapPlaceHolder );
            	aMenuPane->DeleteMenuItem( ELmkNavigateToPlaceHolder );
            	}
            else if( IsEditable() )
            	{
		    	// delete the Navigate To option for editor
            	aMenuPane->DeleteMenuItem( ELmkNavigateToPlaceHolder );
            	}

		    if( IsEditable() )
		    	{
		    	dimClearPos = ArePositionFieldEmptyL();
		    	}
    
            if( dimClearPos || iIsHideCoordinate)
	            {
	            aMenuPane->SetItemDimmed( ELmkCmdClearPosInfo, ETrue );
	            }

            if( iMapNavFeature )
            	{
            	iMapNavInterface->AttachMenuPaneL( aMenuPane, R_LMK_EDITOR_MENU, ELmkCmdMnNav );
            	}

            // Send menu is handled by the sender:
            if ( FeatureManager::FeatureSupported( KFeatureIdLandmarksConverter ) )
				{
				aMenuPane->SetItemDimmed(ELmkCmdSendDummy, EFalse);
				iSender.DisplaySendMenuL( *aMenuPane, 1 );
				}
			else
				{
				aMenuPane->SetItemDimmed(ELmkCmdSendDummy, ETrue);
				}

			if ( FeatureManager::FeatureSupported( KFeatureIdLocationFrameworkCore ))
				{
				aMenuPane->SetItemDimmed( ELmkCmdCurrentLocation,!IsEditable());
				}
			else
				{
				aMenuPane->SetItemDimmed( ELmkCmdCurrentLocation, ETrue );
				}

			if ( FeatureManager::FeatureSupported( KFeatureIdHelp )&&
                        !iIsHideHelp )
				{
				aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
				}
			else
				{
				aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
				}

            //only in edit mode
            aMenuPane->SetItemDimmed( ELmkCmdSelectCategories, !IsEditable() );
            aMenuPane->SetItemDimmed( ELmkCmdChangeIcon, !IsEditable() );


            //additional commands always dimmed in this class:
            aMenuPane->SetItemDimmed( ELmkCmdSaveLm, ETrue );
            // Only in view mode
            aMenuPane->SetItemDimmed( ELmkCmdEditLm, IsEditable() );
             //allways dimmed
            aMenuPane->SetItemDimmed( EAknFormCmdEdit, ETrue );
		    aMenuPane->SetItemDimmed( EAknFormCmdSave, ETrue );
		    aMenuPane->SetItemDimmed( EAknFormCmdLabel, ETrue );
		    aMenuPane->SetItemDimmed( EAknFormCmdAdd, ETrue );
		    aMenuPane->SetItemDimmed( EAknFormCmdDelete, ETrue );
            aMenuPane->SetItemDimmed( ELmkCmdCategories, ETrue );
			aMenuPane->SetItemDimmed( ELmkCmdEditTextLm, ETrue );

			if(IsEditable())
				{
				aMenuPane->SetItemDimmed( ELmkCmdCall, ETrue );
				aMenuPane->SetItemDimmed( ELmkCmdGoToUrl, ETrue );
				}
			else
				{
				MLmkFieldData* field = iLmkFields->GetField(EPhoneNumber);
				if(field)
					{
	    			TInt id = field->UniqueFieldIdentity();
					MLmkEditorField* control = iEditorFieldArray->Find( id );
					if ((!control) || GetFieldTextLengthL( *control ) <= 0 )
						{
						aMenuPane->SetItemDimmed( ELmkCmdCall, ETrue );
						}
					
					MLmkFieldData* field2 = iLmkFields->GetField(EWebAddress);
					if( field2 )
                        {
                        TInt id2 = field2->UniqueFieldIdentity();
                        control = iEditorFieldArray->Find( id2 );
                        if ( (!control) || GetFieldTextLengthL( *control ) <= 0 )
                            {
                            aMenuPane->SetItemDimmed( ELmkCmdGoToUrl, ETrue );
                            }
                        }
					}
				}
            break;
            }
        case R_SENDUI_MENU: // Dynamically created send ui menu
            {
            // Send menu is handled by the sender:
            if ( FeatureManager::FeatureSupported( KFeatureIdLandmarksConverter ) )
				{
				iSender.DisplaySendCascadeMenuL( *aMenuPane );
				}
            break;
            }
		case R_LMK_EDITOR_CONTEXT_MENU:
			{
			MLmkEditorField* field =
			iEditorFieldArray->Find( IdOfFocusControl() );
			TUint type = field->LandmarkItemField().FieldType();

			if ( type != EPhoneNumber )
				{
				aMenuPane->SetItemDimmed( ELmkEditMenuAiwId, ETrue );
				}
			if ( type != EWebAddress )
				{
				aMenuPane->SetItemDimmed( ELmkCmdGoToUrl, ETrue );
				}

			if ( type == EPhoneNumber )
				{
				if ( GetFieldTextLengthL( *field ) <= 0 )
					{
					aMenuPane->SetItemDimmed( ELmkEditMenuAiwId, ETrue );
					}
				}
			if ( type == EWebAddress )
				{
				if ( GetFieldTextLengthL( *field ) <= 0 )
					{
					aMenuPane->SetItemDimmed( ELmkCmdGoToUrl, ETrue );
					}
				}
			break;
			}
        case R_LMK_EDITOR_CALL_SUBMENU:
        	{
        	// Initialize the AIW menu service
        	iLmkCallCmd->InitializeMenuPaneL(
                 *aMenuPane,
                 aResourceId,
                 ELmkCmdLast // Must not overlap with the other menu ids!
                 );
            break;
        	}
        default:
            {
            break;
            }
        }
    iMapNavInterface->HandleMenuOperationL(aResourceId, aMenuPane, ELmkCmdMnNav);
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsLandmarkDataEmptyL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::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;*/
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ProcessCommandL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ProcessCommandL( TInt aCommandId )
    {
    // Hide the context sensitive menu here
    HideMenu();
    iContextMenuBar->StopDisplayingMenuBar();

    CAknDialog::ProcessCommandL( aCommandId );
    TInt aiwCmd = iMapNavInterface->GetServiceCmdByMenuCmd(aCommandId);

    // Handles Map and Navigation commands
    if(KAiwCmdNone != aiwCmd)
    	{
    	// Landmark array to pass to M&N interface
    	RPointerArray<CPosLandmark> lmkArray;
    	switch(aiwCmd)
    		{
    		case KAiwCmdMnShowMap:
    			{
    			CPosLandmark* landmark = GetCurrentEditedLandmarkL();
    		    lmkArray.Append(landmark);
			    CleanupStack::PushL( TCleanupItem( CleanupArray, &lmkArray ) );
				iMapNavInterface->ShowLandmarksOnMapL(lmkArray, aCommandId,
				 									 CLmkMapNavigationInterface::EByLmkView);
				CleanupStack::PopAndDestroy(); //lmkArray
    			break;
    			}
    		case KAiwCmdMnNavigateTo:
    			{
    			CPosLandmark* landmark = GetCurrentEditedLandmarkL();
				lmkArray.Append(landmark);
	    		CleanupStack::PushL( TCleanupItem( CleanupArray, &lmkArray ) );
	    		iMapNavInterface->NavigateToLandmarkL(lmkArray[0],aCommandId);
	    		CleanupStack::PopAndDestroy(); //lmkArray
    			break;
    			}
    		}
    	lmkArray.Reset();
    	return;
    	}
    switch ( aCommandId )
        {
        case EAknCmdHelp:
            {
            HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
                static_cast<CAknAppUi*>(
                    iCoeEnv->AppUi() )->AppHelpContextL() );
            break;
            }
        // these all are same: save & exit
        case EAknSoftkeyBack:
        case EAknSoftkeyExit:
        case EEikCmdExit:
        case EAknCmdExit:
            {
            CAknForm::OkToExitL( aCommandId );
            iLmkUiUtils->RestoreOldNaviPaneL();
            CEikAppUi* appUi = iEikonEnv->EikAppUi();
            // Close this dialog first
            delete this;
            // Exit application
            static_cast<MEikCommandObserver*>(appUi)->ProcessCommandL(aCommandId);
            break;
            }
        case ELmkCmdDeleteLm:
            {
            if ( LmkNotes::LandmarkConfirmationQueryL( iEikonEnv ) )
                {
                iLmkFields->DeleteLandmarkL();
                iLmkUiUtils->RestoreOldNaviPaneL();
                iIsEditing = EFalse;
                delete this;                
                }
            break;
            }
        case ELmkCmdSelectCategories:
            {
			if(!iIsCategorySelctorOpen)
				{
				iIsCategorySelctorOpen = ETrue;
				SelectCategoriesCmdL();
				}
            break;
            }
        case ELmkCmdChangeIcon:
            {
            ChangeIconCmdL();
            break;
            }
        case ELmkCmdCurrentLocation:
            {
            CurrentLocationCmdL();
            break;
            }
        case ELmkCmdSendVia1:
        case ELmkCmdSendVia2:
        case ELmkCmdSendVia3:
        case ELmkCmdSendVia4:
        case ELmkCmdSendVia5:
        case ELmkCmdSendVia6:
        case ELmkCmdSendVia7:
        case ELmkCmdSendVia8:
        case ELmkCmdSendVia9:
        case ELmkCmdSendVia10:
        case ELmkCmdSend:
            {
            if ( !IsNameFieldEmptyL() )
                {
                // Obtain the current landmark object
                CPosLandmark* lmk = GetCurrentEditedLandmarkL();
                CleanupStack::PushL( lmk );
                iSender.SendSingleLandmarkL(*lmk);
                CleanupStack::PopAndDestroy( lmk );
                }
            else
                {
                DoNotSaveFormDataL();
                }
            break;
            }
        case ELmkCmdGoToUrl:
			{
			// Get URL field
			MLmkFieldData* field = iLmkFields->GetField(EWebAddress);
			if(field)
				{
				TInt id = field->UniqueFieldIdentity();
				MLmkEditorField* control = iEditorFieldArray->Find( id );
				if(control)
					{
					HBufC* fieldText =  control->ControlTextL();
					CleanupStack::PushL( fieldText );
					TPtr urlPtr = fieldText->Des();
					if ( urlPtr.Length() > 0 )
						{
						iLmkGoToURLCmd->LaunchBrowserL( urlPtr );
						}
					CleanupStack::PopAndDestroy( fieldText );
					}
				}
			break;
			}
        case ELmkCmdEditLm:
	        {
	        if(!iIsEditing)
	        	{
	        	LaunchLmkEditorL();
	        	}
	        break;
	        }
        case ELmkCmdCall:
	    case ELmkCmdLast:
		    {
			MLmkFieldData* field = iLmkFields->GetField(EPhoneNumber);
			if(field)
				{
				TInt id = field->UniqueFieldIdentity();
				MLmkEditorField* control = iEditorFieldArray->Find( id );
				if(control)
					{
					HBufC* fieldText = control->ControlTextL();
					CleanupStack::PushL( fieldText );
		            if ( fieldText && fieldText->Length() > 0 )
		                {
						//Check if any active character or not
						TPtr ptr = fieldText->Des();
						ptr.Trim();
						if (ptr.Length() > 0)
							{
							//modified for 3.2, since   command is not coming
							//from menu item, hence need to pass diff command.
							//this code needs some more modification to make it
						 	//genericly work for all the commands.
						    iLmkCallCmd->ExecuteAIWCallCmdL( ELmkCmdCall, ptr );
							}
						}
	            	CleanupStack::PopAndDestroy( fieldText );
					}
			    }
			break;
		    }
        case ELmkCmdShow:
	        {
	        MLmkEditorField* field =
			iEditorFieldArray->Find( IdOfFocusControl() );
			TUint type = field->LandmarkItemField().FieldType();
			if (type == ECategories )
				{
				if(iCalegorySelectionFlag) // Receive mode
					{
					CategoriesCmdFromXmlL();
					}
				else
					{
					CategoriesCmdL();		// View mode
					}
				}
			break;
	        }
        case ELmkCmdClearPosInfo:
        	{
        	ClearPositionInfoL();
        	break;
        	}        	
        default:
            {
            CAknForm::ProcessCommandL( aCommandId );
            break;
            }
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleControlStateChangeL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleControlStateChangeL( TInt aControlId )
    {
    MLmkEditorField* changedField = iEditorFieldArray->Find( aControlId );
    if ( changedField )
        {
        if ( changedField->LandmarkItemField().IsTitleField() )
            {
            HBufC* title = changedField->ControlTextL();
            CleanupStack::PushL( title );
            if ( !title )
                {
                title = HBufC::New(0);
                }
            iLmkUiUtils->ChangeTitlePaneL( title );
            CleanupStack::Pop(); //title
            }
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DoNotSaveFormDataL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DoNotSaveFormDataL()
    {
    if ( !iIsEndKey )
		{
	  	LmkNotes::InformationNoteL( iEikonEnv, R_LMK_EMPTY_LANDMARK_NAME_NOTE );
	    }
    MLmkFieldData* field = iLmkFields->GetField(EName);
    if( field )
        {
        TInt id = field->UniqueFieldIdentity();
        TryChangeFocusL(id);        
        }    
    CAknForm::SetInitialCurrentLine();
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::GetHelpContext
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::GetHelpContext( TCoeHelpContext& aContext ) const
    {
    if ( iHelpContext.iContext.Length() > 0 )
        {
        aContext.iContext = iHelpContext.iContext;
        aContext.iMajor = iHelpContext.iMajor;
        }
    else if ( iEditorMode == CLmkEditorDlg::ELmkViewer )
        {
        aContext.iContext = KLM_HLP_LM_VIEWER;
        aContext.iMajor = TUid::Uid( KLmkAppUID3 );
        }
    else
        {
        aContext.iContext = KLM_HLP_LM_EDITOR;
        aContext.iMajor = TUid::Uid( KLmkAppUID3 );
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::OfferKeyEventL
// -----------------------------------------------------------------------------
//
TKeyResponse CLmkEditorImpl::OfferKeyEventL( const TKeyEvent& aKeyEvent,
                                             TEventCode aType )
    {
   /**
    * By def, dialog opens in view mode
    * selecting 'edit' option from (either from context menu/options menu)
    * to edit landmark fields
    *
    */
    if (IsEditable())
    	{
    	//always dimmed for the editor
		DimmMiddleSoftKey();
    	}
	if ( aKeyEvent.iCode == EKeyOK )
		{
		MLmkEditorField* field =
		iEditorFieldArray->Find( IdOfFocusControl() );
		TUint type = field->LandmarkItemField().FieldType();
		// check the editor mode
		if (IsEditable()) // edit mode
			{
			if ( type == ECategory || type == ECategories )
				{
				if(!iIsCategorySelctorOpen)
					{
					iIsCategorySelctorOpen = ETrue;
					SelectCategoriesCmdL();
					}

				return EKeyWasConsumed;
				}
			}
		else
			{// view or receive mode
			if ( type == ECategory || type == ECategories )
				{
				if(iCalegorySelectionFlag) // Receive mode
					{
					CategoriesCmdFromXmlL();
					return EKeyWasConsumed;
					}
				else
					{
					CategoriesCmdL();		// View mode
					return EKeyWasConsumed;
					}
				}
			else // focus is on any other landmark field
				{
				if ( !iCalegorySelectionFlag )// No context menu for receive mode
					{
		            if(!iIsEditing)
		                {
		                LaunchLmkEditorL();
		                return EKeyWasConsumed;
		                }
/*					
					//Launch context sensitive menu bar here
					if ( iContextMenuBar )
						{
						iContextMenuBar->TryDisplayMenuBarL();
						return EKeyWasConsumed;
						}
*/						
					}
				}
			}
		}
	else if( aKeyEvent.iCode == EKeyBackspace )
		{
		if( !IsEditable() && iIsLmkReceiveMode == EFalse )
			{
			ProcessCommandL( ELmkCmdDeleteLm );
			return EKeyWasConsumed;
			}
		}
	else if ( aKeyEvent.iCode == EKeyPhoneEnd )
			{
			iIsEndKey = ETrue;
			OkToExitL(EAknSoftkeyDone);
			}
	else // for 'sendkey' handling
		{
		if ( aKeyEvent.iCode == EKeyPhoneSend &&  (!IsEditable()) && (!Layout_Meta_Data::IsPenEnabled()) )
			{
			// Get Landmark's telephone number
			TPosLmItemId lmId = iLmkFields->LandmarkId();
			CPosLandmark* landmark = iDb.ReadLandmarkLC(lmId);
			// Get phone num field
			if (landmark->IsPositionFieldAvailable(
			              ELmkPositionFieldPhoneNumber) )
				{
				TPtrC telnumPtr;
				if ( (landmark->GetPositionField(
				                ELmkPositionFieldPhoneNumber,
				                telnumPtr ) == KErrNone) && (telnumPtr.Length() > 0 ))
					{
					iLmkCallCmd->ExecuteAIWCallCmdL( ELmkCmdCall,telnumPtr );
					}
				else
					{
					// Get name
					TPtrC lmkNamePtr;
					if ( landmark->GetLandmarkName ( lmkNamePtr ) == KErrNone )
						{
						LmkNotes::InformationNotewithTextL( iEikonEnv,
						                 R_LMK_NOTE_NO_NUMBER_TO_NAME,
						                 lmkNamePtr);
						}
					}
				}
			CleanupStack::PopAndDestroy(landmark);
			}
		}

	if ( aType == EEventKey && ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter ))
		{
		TBool isCategoryField = EFalse;
		MLmkEditorField* field = iEditorFieldArray->Find( IdOfFocusControl() );
		TUint type = field->LandmarkItemField().FieldType();

		if ( type == ECategory || type == ECategories )
			isCategoryField = ETrue;

		// check the editor mode and category field focus
		if ( IsEditable() == EFalse || isCategoryField )
			{
			TKeyEvent enterKeyEvent( aKeyEvent );
			enterKeyEvent.iCode = EKeyOK;
			CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
			return cba->OfferKeyEventL( enterKeyEvent, aType );
			}
		}

    TKeyResponse response= CAknForm::OfferKeyEventL( aKeyEvent, aType );
    return response;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::NotifyL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::NotifyL( const TInt aStatus )
	{
    // Stop the running wait dialog
 	TInt buttonId = iWaitDialogLauncher->StopWaitDialogL();
 	if( EEikBidCancel != buttonId )
 	    {
	    switch( aStatus )
    		{
            case KErrNone:
            case KPositionPartialUpdate:
                {
                if(iLocationService)
                	{
                	TPosition position = iLocationService->CurrentPosition();
			    	SetCurrentLocationL( position );
                	}
                break;
                }
            default:
                {
                break;
                }
    		}
 	    }
    delete iLocationService;
    iLocationService = NULL;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::NotifyErrorL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::NotifyErrorL( TInt aErrorCode )
    {

    // Stop the running wait dialog
 	TInt buttonId = iWaitDialogLauncher->StopWaitDialogL();

    delete iLocationService;
    iLocationService = NULL;

 	if( EEikBidCancel != buttonId )
 	    {
	    switch( aErrorCode )
    		{
	        case KPositionQualityLoss:
    		case KErrTimedOut:
    		case KErrNotFound: // No PSY selected.
    		case KErrUnknown:
    		case KErrCancel:
    		case KErrArgument:
    		default:
    		    // The above errors are because of location request failures
		        // Ask user to retry location request
    			{
    			if ( LmkNotes::MessageQueryWithLinkL(iEikonEnv,R_LMK_MSG_QUERY_HEADING_PANE_TEXT,
    												R_LMK_CONF_RETRY_LOCATION_REQUEST,R_LMK_REQUEST_FAIL_MORE_INFO,
    												MessageQueryCallBack) )
    				{
    				if( iLocationService )
    					{
    					delete iLocationService;
    					iLocationService = NULL;
    					}
    				CurrentLocationCmdL();
    				}
    			}
    		}
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateCustomControlL
// -----------------------------------------------------------------------------
//
SEikControlInfo CLmkEditorImpl::CreateCustomControlL( TInt /*aControlType*/ )
    {
    SEikControlInfo ctrl;
    ctrl.iControl = NULL;
    ctrl.iTrailerTextId = 0;
    ctrl.iFlags = 0;
    /*switch( aControlType )
        {
        case EDistanceEditorType:
            {
            ctrl.iControl = new(ELeave) CLmkDistanceEditor();
            break;
            }
        default:
            {
            break;
            }
        }*/
    return ctrl;
    }

// ----------------------------------------------------
// CLmkEditorImpl::ConvertCustomControlTypeToBaseControlType
// ----------------------------------------------------
//
MEikDialogPageObserver::TFormControlTypes
CLmkEditorImpl::ConvertCustomControlTypeToBaseControlType(
    TInt aControlType ) const
    {
    switch( aControlType )
        {
        case EDistanceEditorType:
            {
            return MEikDialogPageObserver::EMfneDerived;
            //break;
            }
        default:
            {
            return MEikDialogPageObserver::EUnknownType;
            //break;
            }
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::PreLayoutDynInitL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::PreLayoutDynInitL()
    {
    CAknForm::PreLayoutDynInitL();

    // When adding fields the form must be editable:
    //SetEditableL(ETrue);
    if (iCalegorySelectionFlag && iCategoryNames.Count() >= 1)
        iEditorFieldArray->SetCategoryName(iCategoryNames[0]);
    iEditorFieldArray->CreateFieldsFromLmkL();
    //SetEditableL(EFalse);
    //CAknForm::SetInitialCurrentLine();
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::PostLayoutDynInitL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::PostLayoutDynInitL()
    {
    CAknForm::PostLayoutDynInitL();

    MLmkFieldData* fields = iLmkFields->GetField( EName );
    if ( fields )
        {
        TPtrC name =  fields->TextData();

        //ChangeTitle
        HBufC* title = name.Alloc();
        CleanupStack::PushL( title );
        iLmkUiUtils->StoreTitlePaneL(); // save old title pane
        iLmkUiUtils->ChangeTitlePaneL( title ); //take ownership
        CleanupStack::Pop( title ); //title
        }

    SetEditableL(  iEditorMode == CLmkEditorDlg::ELmkEditor );
    CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
    cba->UpdateCommandObserverL(KMskCommandPos,*this);
    if (!IsEditable())
	    {
	    AddMskCommandL(R_LM_MSK_EDIT,ELmkCmdEditLm);
	    }
	else
		{
		//only for editor
		DimmMiddleSoftKey();
		if (iFieldTypeToFocus == ECategory || iFieldTypeToFocus == ECategories)
			{
			AddMskCommandL(R_LM_MSK_EDIT,ELmkCmdSelectCategories);
			}
		}
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::OkToExitL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::OkToExitL( TInt aKeyCode )
    {
    TBool ret = EFalse;
    switch ( aKeyCode )
        {
	    case EAknSoftkeyDone:
		    {
            if ( IsEditable() )
                {
                if ( iEditorFieldArray->AreAllFieldsEmptyL() )
                    {
                    
                    if( iLandmark && iIsHideCoordinate )
                    	{
                    	TLocality locality;
                    	iLandmark->GetPosition( locality ); 
                    	if( !Math::IsNaN( locality.Latitude() ))                        		
                    		{
					        DoNotSaveFormDataL(); 
					        iIsEndKey = EFalse;
                        	// Stay back in the editor mode
                    		break;
                    		}
                    	}
                    	
                    TRAPD(err,CPosLandmark* landmark = iDb.ReadLandmarkLC(iLmkFields->LandmarkId());CleanupStack::PopAndDestroy( landmark ));
                    if (err == KErrNotFound)
                        {
						// The Landmark is not in the database.Dont save the 
						// landmark. Just return
						// Don't save when all landmark fields are empty 
						iLmkUiUtils->RestoreOldNaviPaneL();                     
						ret = ETrue;                       	
                        }
                    else
                        {
                        // The landmark is in the database. Hence, confirm
                        // from the user whether he wants to delete the
                        // landmark
                        if ( LmkNotes::LandmarkConfirmationQueryL( iEikonEnv ) )
                            {
                            iLmkFields->DeleteLandmarkL();
                            iLmkUiUtils->RestoreOldNaviPaneL();
                            ret = ETrue;
                            }
                        else
                            {
                            // Stay back in the editor mode
                            ret = EFalse;
                            }
                        }

                    }
                else
                    {
                    if(!ValidateContentL())
                    	{
                    	ret = EFalse;
                        return ret;
                    	}
                    else
                        {
                        /**
                        * Do not save landmark if disc space is not
                        * enough
                        */
                        TRAPD( err, iEditorFieldArray->SaveFieldsL() );
                        if ( err == KErrDiskFull )
                            {
                            ret = EFalse;
                            LmkNotes::OutOfMemoryNoteL( iEikonEnv );
                            delete this;
                            return ret;
                            }

                        if ( iLandmarkItemId )
                        	{
                        	*iLandmarkItemId = iLmkFields->LandmarkId();
                        	}
                        iLmkUiUtils->RestoreOldNaviPaneL();
                        ret = ETrue;
                        }
                    }
                }
            else
                {
                iLmkUiUtils->RestoreOldNaviPaneL();
                ret = ETrue;
                }
            break;
            }
        default:
            break;
        }
    if ( !ret )
        {
        ret = CAknForm::OkToExitL( aKeyCode );
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateLineL
// -----------------------------------------------------------------------------
//
CCoeControl* CLmkEditorImpl::CreateLineL(
    const TDesC& aCaption,
	TInt aControlId,
	TInt aControlType )
	{
	return CreateLineByTypeL(
			aCaption, aControlId, aControlType, NULL );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::LineControl
// -----------------------------------------------------------------------------
//
CEikCaptionedControl* CLmkEditorImpl::LineControl( TInt aControlId ) const
	{
	return Line( aControlId );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DeleteControl
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DeleteControl( TInt aControlId )
	{
	DeleteLine( aControlId );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::TryChangeFocusL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::TryChangeFocusL( TInt aControlId )
	{
	if ( ControlOrNull( aControlId ) )
		{
		TryChangeFocusToL( aControlId );
		}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetCurrentLineCaptionL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::SetCurrentLineCaptionL(
    TInt aControlId,
    const TDesC& aText )
	{
	CEikCaptionedControl* ctl = Line(aControlId);
	if (ctl)
	    {
	    ctl->SetCaptionL(aText);
	    ctl->DrawDeferred();
	    }
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::Control
// -----------------------------------------------------------------------------
//
CCoeControl* CLmkEditorImpl::Control( TInt aControlId ) const
	{
	return ControlOrNull( aControlId );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetEditableL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::SetEditableL( TBool aState )
	{
    CAknForm::SetEditableL( aState );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::Database
// -----------------------------------------------------------------------------
//
CPosLandmarkDatabase& CLmkEditorImpl::Database()
    {
    return iDb;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::GetCurrentEditedLandmarkL
// -----------------------------------------------------------------------------
//
CPosLandmark* CLmkEditorImpl::GetCurrentEditedLandmarkL()
	{
	iEditorFieldArray->SaveFieldsToBufferL();
	CArrayPtrFlat<MLmkFieldData>& fieldArray = iLmkFields->Fields();
	TInt count( fieldArray.Count() );
	CPosLandmark* lmk = NULL;
	if( iLandmark )
		{
		HBufC8* lmBuf = PosLandmarkSerialization::PackL( *iLandmark );
		CleanupStack::PushL( lmBuf );
		lmk = PosLandmarkSerialization::UnpackL( lmBuf->Des() );
		CleanupStack::PopAndDestroy( lmBuf );
		}
	else
		{
		lmk = CPosLandmark::NewL();
		}

	TBool isPosFieldPresent=EFalse;
	
	TLocationData locationData; // to store editor position data

    //Position data
	TLocality locality = TLocality(); // empty locality

	locationData.iLatitude             = locality.Latitude();
	locationData.iLongitude            = locality.Longitude();
	locationData.iAltitude             = locality.Altitude();
	locationData.iHorizontalAccuracy   = locality.HorizontalAccuracy();
	locationData.iVerticalAccuracy     = locality.VerticalAccuracy();
		
    for ( TInt i = 0; i < count; i++ )
        {
        switch( fieldArray[i]->FieldType() )
            {
            case EName:
                {
                lmk->SetLandmarkNameL( fieldArray[i]->TextData() );
                HBufC* path = fieldArray[i]->IconPath();
                if ( path && path->Length() > 0 &&
                    fieldArray[i]->IconId() != KErrNotFound )
                    {
                    // Get the default Mask index
                    lmk->SetIconL( *path, fieldArray[i]->IconId() , KLmkDefaultId+1);
                    }

                break;
                }
            case ECategory:
            case ECategories:
                {
                //Add categories to landmark
                RArray<TPosLmItemId>& categories =
                    fieldArray[i]->Categories();
                TInt Tcount( categories.Count() );
                for ( TInt j=0; j < Tcount; j++ )
                    {
                    lmk->AddCategoryL( categories[j] );
                    }
                break;
                }
			case EDescription:
				{
				lmk->SetLandmarkDescriptionL( fieldArray[i]->TextData() );
				break;
				}
            //these all are same
            case EStreet:
            case EPostCode:
            case ECity:
            case EStateProvince:
            case ECountry:
			case EPhoneNumber:
			case EWebAddress:
                {
                lmk->SetPositionFieldL(
                        fieldArray[i]->PositionFieldId(),
                        fieldArray[i]->TextData() );
                break;
                }
            case ELatitude:
                {
                isPosFieldPresent = ETrue;
                locationData.iLatitude = fieldArray[i]->DoubleData();
                break;
                }
            case ELongitude:
                {
                isPosFieldPresent = ETrue;
                locationData.iLongitude = fieldArray[i]->DoubleData();
                break;
                }
            case EPositionAccuracy:
                {
                locationData.iHorizontalAccuracy =
                    fieldArray[i]->FloatData();
                break;
                }
            case EAltitude:
                {
                locationData.iAltitude = fieldArray[i]->FloatData();
                break;
                }
            case EAltitudeAccuracy:
                {
                locationData.iVerticalAccuracy = fieldArray[i]->FloatData();
                break;
                }
            default:
                {
                break;
                }
            }
        }

    if( isPosFieldPresent )
        {
        // remove the old values to set new values       
        lmk->RemoveLandmarkAttributes(CPosLandmark::EPosition);

    	if (!Math::IsNaN(locationData.iLatitude) &&
        	!Math::IsNaN(locationData.iLongitude))
            {
            if (!Math::IsNaN(locationData.iAltitude))
                {
                locality.SetCoordinate(
                    locationData.iLatitude,
                    locationData.iLongitude,
                    locationData.iAltitude);

                if (!Math::IsNaN(locationData.iVerticalAccuracy))
                    {
                    if( locationData.iVerticalAccuracy > 0 )
                        locality.SetVerticalAccuracy(locationData.iVerticalAccuracy);
                    }
                }
            else
                {
                locality.SetCoordinate(
                    locationData.iLatitude,
                    locationData.iLongitude);
                }

            if (!Math::IsNaN(locationData.iHorizontalAccuracy))
                {
                if( locationData.iHorizontalAccuracy > 0 )
                    locality.SetHorizontalAccuracy(locationData.iHorizontalAccuracy);
                }
            // save position if at least lat/lon are entered
            lmk->SetPositionL(locality);            
            }
        }

    return lmk;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateLabelArrayL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CreateLabelArrayL()
    {

    if ( iJapaneseInputMode )
		{
		// Display in Japanese order
	    CreateLabelArrayForJapaneseModeL();
		}
	else
		{ // Normal mode
		CreateLabelArrayForNormalModeL();
		}
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateLabelArrayForNormalModeL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CreateLabelArrayForNormalModeL()
	{
    CreateLabelL( R_LMK_NAME_LABEL, EName );
    CreateLabelL( R_LMK_CATEGORY_LABEL, ECategory );
    CreateLabelL( R_LMK_CATEGORIES_LABEL, ECategories );
    CreateLabelL( R_LMK_DESCRIPTION_LABEL, EDescription );
    CreateLabelL( R_LMK_STREET_LABEL, EStreet );
    CreateLabelL( R_LMK_POST_CODE_LABEL, EPostCode );
    CreateLabelL( R_LMK_CITY_LABEL, ECity );
    CreateLabelL( R_LMK_STATE_PROVINCE_LABEL, EStateProvince );
    CreateLabelL( R_LMK_COUNTRY_LABEL, ECountry );
    CreateLabelL( R_LMK_PHONE_NUMBER_LABEL, EPhoneNumber  );
    CreateLabelL( R_LMK_WEB_ADDRESS_LABEL, EWebAddress );
    CreateLabelL( R_LMK_LATITUDE_LABEL, ELatitude );
    CreateLabelL( R_LMK_LONGITUDE_LABEL, ELongitude );
    CreateLabelL( R_LMK_POSITION_ACCURACY_LABEL, EPositionAccuracy );
    CreateLabelL( R_LMK_ALTITUDE_LABEL, EAltitude );
    CreateLabelL( R_LMK_ALTITUDE_ACCURACY_LABEL, EAltitudeAccuracy );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateLabelArrayForJapaneseModeL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CreateLabelArrayForJapaneseModeL()
	{
	CreateLabelL( R_LMK_NAME_LABEL, ENameJapaneseMode);
	CreateLabelL( R_LMK_CATEGORY_LABEL, ECategoryJapaneseMode );
	CreateLabelL( R_LMK_CATEGORIES_LABEL, ECategoriesJapaneseMode );
	CreateLabelL( R_LMK_DESCRIPTION_LABEL, 	EDescriptionJapaneseMode );
	CreateLabelL( R_LMK_POST_CODE_LABEL, EPostCodeJapaneseMode );
	CreateLabelL( R_LMK_STATE_PROVINCE_LABEL, EStateProvinceJapaneseMode );
	CreateLabelL( R_LMK_CITY_LABEL, ECityJapaneseMode );
	CreateLabelL( R_LMK_STREET_LABEL, EStreetJapaneseMode );
	CreateLabelL( R_LMK_COUNTRY_LABEL, ECountryJapaneseMode );
	CreateLabelL( R_LMK_PHONE_NUMBER_LABEL, EPhoneNumberJapaneseMode );
    CreateLabelL( R_LMK_WEB_ADDRESS_LABEL, EWebAddressJapaneseMode );
	CreateLabelL( R_LMK_LATITUDE_LABEL, ELatitudeJapaneseMode );
	CreateLabelL( R_LMK_LONGITUDE_LABEL, ELongitudeJapaneseMode );
	CreateLabelL( R_LMK_POSITION_ACCURACY_LABEL, EPositionAccuracyJapaneseMode );
	CreateLabelL( R_LMK_ALTITUDE_LABEL, EAltitudeJapaneseMode );
	CreateLabelL( R_LMK_ALTITUDE_ACCURACY_LABEL, EAltitudeAccuracyJapaneseMode );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CreateLabelL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CreateLabelL( TInt iResourceId, TInt iPos )
    {
    HBufC* label = iCoeEnv->AllocReadResourceL( iResourceId );
    CleanupStack::PushL( label );
    User::LeaveIfError( iLabelArray.Insert( label, iPos ) );
    CleanupStack::Pop(); //label
    }


// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsNameFieldEmptyL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::IsNameFieldEmptyL()
    {
    const MLmkEditorField* field = &iEditorFieldArray->FieldAt( 0 );
    HBufC* fieldText = field->ControlTextL();
    TBool ret( ETrue );
    if ( fieldText && fieldText->Length() > 0 )
        {
		//Check if any active character or not
		TPtr16 ptr = fieldText->Des();
		ptr.Trim();
		if (ptr.Length() == 0)
		 	{
		 	ret = ETrue;
		 	}
		 	else
		 	{
		 	ret = EFalse;
		 	}
        }
    delete fieldText;
    return ret;
    }


// -----------------------------------------------------------------------------
// CLmkEditorImpl::ValidateContentL()
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::ValidateContentL()
    {
    TBool result = ETrue;
    if(IsFieldEmptyL( ELatitude ) && !IsFieldEmptyL( ELongitude ))
   		{
        LmkNotes::InformationNoteL( iEikonEnv,R_LMK_ERROR_CHECK_NOTE );
        DoNotSaveDataL(ELatitude);
		result = EFalse;
   		}
    else if (!IsFieldEmptyL( ELatitude ) && IsFieldEmptyL( ELongitude ))
   		{
        LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_CHECK_NOTE );
        DoNotSaveDataL(ELongitude);
	  	result = EFalse;
   		}
    else if(IsFieldEmptyL( ELatitude ) && !IsFieldEmptyL( EPositionAccuracy ))
	    {
	    LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_POS_ACC_CHECK_NOTE );
	    DoNotSaveDataL(ELatitude);
    	result = EFalse;
	    }
	else if (IsFieldEmptyL( ELongitude ) && !IsFieldEmptyL( EPositionAccuracy ))
   		{
        LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_POS_ACC_CHECK_NOTE );
	    DoNotSaveDataL(ELongitude);
    	result = EFalse;
   		}
	else if (IsFieldEmptyL( EAltitude ) && !IsFieldEmptyL( EAltitudeAccuracy ))
   		{
        LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_ALT_ACC_CHECK_NOTE );
        DoNotSaveDataL(EAltitude);
    	result = EFalse;
   		}
	else if ((IsFieldEmptyL( ELatitude ) || IsFieldEmptyL( ELongitude )) && !IsFieldEmptyL( EAltitude ))
   		{
        LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_ALTITUDE_CHECK_NOTE );
        DoNotSaveDataL(ELatitude);
    	result = EFalse;
   		}
    else if (IsInvalidUriL())
   		{
        LmkNotes::InformationNoteL( iEikonEnv, R_LMK_ERROR_URL_ILLEGAL_NOTE );
        DoNotSaveDataL(EWebAddress);
    	result = EFalse;
   		}
    else if ( IsNameFieldEmptyL() )
        {
        DoNotSaveFormDataL();
        iIsEndKey = EFalse;
        result = EFalse;
        }
    return result;

    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsFieldEmptyL()
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::IsFieldEmptyL(const TUint16 aFieldType)
	{
	TInt fldId;
	MLmkFieldData* field = iLmkFields->GetField(aFieldType);
	if(field)
	    {
	    fldId = field->UniqueFieldIdentity();
	    }
    else
        {
        return EFalse;
        }

	MLmkEditorField* fld = iEditorFieldArray->Find(fldId );
	if(!fld)
		{
		return ETrue;
		}
	
	TReal val;
	switch(aFieldType)
		{
		case ELatitude:
		case ELongitude:
			{
			val = fld->FieldValue();
			}
		break;
		case EPositionAccuracy:
		case EAltitudeAccuracy:
		case EAltitude:
			{
			val = fld->FieldValue();
			}
		break;
		}
	return Math::IsNaN(val);
	}


// -----------------------------------------------------------------------------
// CLmkEditorImpl::DoNotSaveDataL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DoNotSaveDataL(const TUint16 aFieldType)
	{
	if( iIsEditing )
		{
		MLmkFieldData* fields = iLmkFields->GetField(aFieldType);
		if(fields)
			{
			TInt id = fields->UniqueFieldIdentity();
			TryChangeFocusL(id);
			}
		}
    }
// -----------------------------------------------------------------------------
// CLmkEditorImpl::OkToExitL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::OkToExitL()
    {
    TBool result = ETrue;

    if ( iEditorFieldArray->AreAllFieldsEmptyL() )
        {
        iLmkFields->DeleteLandmarkL();
        }
    else
        {
        if ( IsNameFieldEmptyL() )
            {
            DoNotSaveFormDataL();
            result = EFalse;
            }
        else
            {
            TRAPD( err, iEditorFieldArray->SaveFieldsL() );
            if ( err == KErrDiskFull )
                {
                result = EFalse;
                LmkNotes::OutOfMemoryNoteL( iEikonEnv );
                delete this;
                return result;
                }
            if ( iLandmarkItemId )
            	{
            	*iLandmarkItemId = iLmkFields->LandmarkId();
            	}
            }
        }

    return result;
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SelectCategoriesCmdL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::SelectCategoriesCmdL()
    {
    if(iCatInfoPopupNote)
		 {
		 iCatInfoPopupNote->HideInfoPopupNote();
		 }
    MLmkFieldData* fields = iLmkFields->GetField( ECategory );
    if ( !fields )
        {
        fields = iLmkFields->GetField( ECategories );
        }

    if ( fields )
        {
        CLmkDlgCategorySelectorImpl* dlg = CLmkDlgCategorySelectorImpl::NewL(
                                    iDb, ETrue );
        CleanupStack::PushL( dlg );
        dlg->SetEmptyDlgLabel(R_LMK_EMPTY_NO_CATEGORIES ,R_LMK_GUIDE_CREATE_LANDMARK);
        RArray<TPosLmItemId>& categories = fields->Categories();
        if ( dlg->ExecuteL( categories ) )
            {
            iEditorFieldArray->UpdateFieldsL( ECategory );
            iEditorFieldArray->UpdateFieldsL( ECategories );
            }
        CleanupStack::PopAndDestroy( dlg );
        iIsCategorySelctorOpen = EFalse;
        DrawNow();
       // ShowMultipleCategoriesInfoPopupL(ETrue);
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CurrentLocationCmdL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CurrentLocationCmdL()
    {
    if(ShowQueryIfLocationFieldsAlreadyFilledL())
    	{
    	return;
    	}
    HBufC* srvName = StringLoader::LoadLC(
                      R_LMK_SERVICE_RULE_NAME,
                      const_cast< CCoeEnv *>( iCoeEnv ));
    iLocationService = CLmkLocationService::NewL(*srvName);
    CleanupStack::PopAndDestroy( srvName ); //srvName
    iLocationService->SetObserver( *this );
    iLocationService->LocationRequestL();

    TRAPD( error, iWaitDialogLauncher->StartWaitDialogL());
    if( error )
        {
        delete iLocationService;
        iLocationService = NULL;

        User::Leave( error );
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ChangeIconCmdL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ChangeIconCmdL()
    {
    TInt lSelectedIconIndex(0);
    CLmkIconMapDialog* dialog = new(ELeave) CLmkIconMapDialog( lSelectedIconIndex );
    MLmkFieldData* nameField;
    if (dialog->ExecuteLD(R_LMK_ICON_TABLE_DIALOG) )
        {
        // icon file also contains masks, therefore 2*
        TInt iconIndex =  2*lSelectedIconIndex;
	    RFs fs;
	    User::LeaveIfError(fs.Connect());
	    CleanupClosePushL( fs );

	    if ( SysUtil::DiskSpaceBelowCriticalLevelL( &fs, sizeof( CPosLandmark ), EDriveC ) )
	        {
	        CleanupStack::PopAndDestroy(); // fs
	        User::LeaveNoMemory();
	        }
		else
			{            
            nameField = iLmkFields->GetField( EName );
            TFileName* iconFile = CLmkUiUtils::LmkUiIconFileLC();
            if( nameField && iconFile )                
                {                
                nameField->SetIconId( iconIndex + EMbmLmkuiQgn_prop_lm_transport);
                nameField->SetIconPathL( *iconFile );
        
                //Update context icon
                CEikImage* image = new(ELeave) CEikImage();
                CleanupStack::PushL( image );
                image->CreatePictureFromFileL( *iconFile,
                                               nameField->IconId(),
                                               iconIndex + EMbmLmkuiQgn_prop_lm_transport_mask);
        
                iLmkUiUtils->UpdateContextIconL( image );
        
                // Added for appending Icon to Name label
                CLmkUiUtils::ChangeLmNameLabelIconL (*this, *nameField);
                CleanupStack::Pop(); //image
                CleanupStack::PopAndDestroy();//iconFile
                DrawNow();
                }
			}
		CleanupStack::PopAndDestroy(); // fs
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CategoriesCmdL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CategoriesCmdL()
    {
    MLmkFieldData* categoryField = iLmkFields->GetField( ECategories );
    if ( !categoryField )
        {
        categoryField = iLmkFields->GetField( ECategory );
        if ( !categoryField )
            {
            return;
            }
        }
    else    
        {
        RArray<TPosLmItemId> categories = categoryField->Categories();
        TInt count( categories.Count() );

        // Do not launch the popup for displaying one category name
        if (count <=1 )
            {
            //Launch context sensitive menu bar here
            if ( iContextMenuBar )
                {
                iContextMenuBar->TryDisplayMenuBarL();
                }
            return;
            }

        HBufC* catName;
        // show the category list in a message query
        HBufC* message = HBufC::NewLC( (KPosLmMaxCategoryNameLength * count) + 1);
        TPtr msgPtr = message->Des();
        CDesC16ArrayFlat* desArr = new (ELeave) CDesC16ArrayFlat(count);
        CleanupStack::PushL(desArr);
        // fill up the array with category´s names from the engine.
        for ( TInt i = 0; i < count; i++ )
            {
            catName = CLmkDbUtils::CategoryNameL( iDb, categories[i] );
            CleanupStack::PushL( catName );
            desArr->AppendL(catName->Des());
            CleanupStack::PopAndDestroy( catName ); //name
            }
            desArr->Sort();
            for ( TInt i = 0; i < count; i++ )
            {
            msgPtr.Append((*desArr)[i]);
            if ( i != ( count - 1 ) )
                {
                msgPtr.Append(_L("\n"));
                }
            }
        LmkNotes::MessageQueryL(  iEikonEnv, msgPtr, count );
        CleanupStack::Pop();//desArr
        delete  desArr;
        CleanupStack::PopAndDestroy( message ); //message
        }
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetCurrentLocationL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::SetCurrentLocationL( const TPosition& aPosition )
    {
    MLmkFieldData* latitude = iLmkFields->GetField( ELatitude );
    if(latitude)
	    {
	    latitude->SetTReal( aPosition.Latitude() );

	    MLmkFieldData* longitude = iLmkFields->GetField( ELongitude );
	    if(longitude)
	        longitude->SetTReal( aPosition.Longitude() );
	    }

    MLmkFieldData* altitude = iLmkFields->GetField( EAltitude );
    if(altitude)
	    {
	    altitude->SetTReal( aPosition.Altitude() );
	    }

    MLmkFieldData* horizontalAccuracy =
                        iLmkFields->GetField( EPositionAccuracy );
    if(horizontalAccuracy)
	    {
	    horizontalAccuracy->SetTReal( aPosition.HorizontalAccuracy() );
	    }

    MLmkFieldData* verticalAccuracy =
                        iLmkFields->GetField( EAltitudeAccuracy );
    if(verticalAccuracy)
	    {
	    verticalAccuracy->SetTReal( aPosition.VerticalAccuracy() );
	    }
	
	TRAP_IGNORE(iLandmark->SetPositionL(aPosition));    
	    
    iEditorFieldArray->UpdateFieldsL( EAllEditorItems );
    
    DrawNow();
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ChangeContextImageL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ChangeContextImageL()
    {
    MLmkFieldData* nameField = iLmkFields->GetField( EName );
    if( nameField )
        {
        CEikImage* image = new(ELeave) CEikImage();
        CleanupStack::PushL( image );
        TFileName* defaultIconFile = CLmkUiUtils::LmkUiIconFileLC();
        // No need to add iconFile to cleanupstack since it is a member variable from CLmkFieldData class
        HBufC *iconFile = nameField->IconPath();
        TInt err = KErrNotFound;
        CFbsBitmap* bitmap;
        CFbsBitmap* mask;
        if ( nameField->IconId() != KErrNotFound )
            {
            TRAP(err,AknIconUtils::CreateIconL( bitmap, mask,
                                   *iconFile, nameField->IconId(),
                                   nameField->IconId()+1 ););
            }
        // If the Icon File doesn't exist the CreateIconL in the if statement above will
        // Leave with KErrNotFound in which case the default Icon should be loaded.
        // Also when the Landmarks itself doesn't have a valid Icon, the default Icon is
        // loaded.
        if ( err != KErrNone )
            {
            AknIconUtils::CreateIconL( bitmap, mask,
                                   *defaultIconFile, KLmkDefaultId,
                                   KLmkDefaultId+1 );
            }
        image->SetBitmap( bitmap );
        image->SetMask( mask );
        iLmkUiUtils->SwapNewContextIconL( image );
        CleanupStack::PopAndDestroy(); //defaultIconFile
        CleanupStack::Pop(); //image
        }
    }

// ----------------------------------------------------------------------------
// CLmkEditorImpl::AttachAIWMenuInterestL
// ----------------------------------------------------------------------------
//
void CLmkEditorImpl::AttachAIWMenuInterestL()
	{
	if(iMapNavFeature)
		{
		iMapNavInterface->AttachAIWInterestL(R_LMK_EDITOR_MENU, R_LMK_EDITOR_AIW_INTEREST_SHOWONMAP);
		if (iEditorMode != CLmkEditorDlg::ELmkEditor)
			{
			iMapNavInterface->AttachAIWInterestL(R_LMK_EDITOR_MENU, R_LMK_EDITOR_AIW_INTEREST_NAVIGATETO);
			}
		}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleResourceChange()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleResourceChange (TInt aType)
	{	
	CAknForm::HandleResourceChange(aType);
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::CategoriesCmdFromXmlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::CategoriesCmdFromXmlL()
    {
    TInt count = iCategoryNames.Count();
    if ( count <= 1 )
        {
        return;
        }
    CDesC16ArrayFlat* desArr = new (ELeave) CDesC16ArrayFlat(count);
    CleanupStack::PushL(desArr);
	// fill up the array with category´s names from the engine.
	for ( TInt i = 0; i < count; i++ )
        {
	    desArr->AppendL(iCategoryNames[i]);
		}

	desArr->Sort();
	// show the category list in a message query
	HBufC* message = HBufC::NewLC((KPosLmMaxCategoryNameLength * iCategoryNames.Count()) + 1);
	TPtr msgPtr = message->Des();
	for ( TInt i = 0; i < count; i++ )
		{
        msgPtr.Append((*desArr)[i]);
		if ( i != ( count - 1 ))
    		{
    		msgPtr.Append(_L("\n"));
    		}
		}
    LmkNotes::MessageQueryL( iEikonEnv, msgPtr, count );
    CleanupStack::PopAndDestroy( 2 ); //message ,desArr
    }

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ConstructContextMenuL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ConstructContextMenuL()
    {
	CEikMenuBar* newMenuBar = new(ELeave) CEikMenuBar();
	CleanupStack::PushL(newMenuBar);
	newMenuBar->ConstructL(this, NULL, R_LMK_EDITOR_CONTEXT_MENUBAR);
	iEikonEnv->EikAppUi()->AddToStackL(newMenuBar, ECoeStackPriorityMenu, ECoeStackFlagRefusesFocus);
	iContextMenuBar = newMenuBar;
	CleanupStack::Pop(newMenuBar);
    }

// -----------------------------------------------------------------------------
//  CLmkEditorImpl::GetFieldTextLengthL
// -----------------------------------------------------------------------------
//
TInt  CLmkEditorImpl::GetFieldTextLengthL( MLmkEditorField& afield)
	{
	HBufC* fieldText =  afield.ControlTextL();
	TInt fieldLen (0);
	if ( fieldText )
		{
		if ( fieldText->Length() > 0)
			{// Remove any blank spaces if any
			TPtr16 ptr = fieldText->Des();
			ptr.Trim();
			fieldLen = ptr.Length();
			}
		}
	delete fieldText;
	return fieldLen;
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateViewDlgL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateViewDlgL()
	{

	CPosLandmark* landmark;
	TInt id = iLmkFields->LandmarkId();
	landmark = iDb.ReadLandmarkLC(id);
	TLocality locality;
	landmark->GetPosition(locality);
    TRAP_IGNORE(iLandmark->SetPositionL(locality));
	CArrayPtrFlat<MLmkFieldData>& fieldArray =  iLmkFields->Fields();
	CArrayPtrFlat<MLmkEditorField>& editorFieldArray =
									iEditorFieldArray->GetFieldArray();
	TInt count = fieldArray.Count();
	TInt postn = KErrNotFound;
	TInt ctrlid = KErrNotFound;
	for (TInt i(0);i<count;i++)
		{
		TUint fieldType = fieldArray[i]->FieldType();
		MLmkEditorField* fld = iEditorFieldArray->Find(fieldArray[i]->UniqueFieldIdentity(),&postn,&ctrlid);

		switch(fieldType)
			{
	        case EName:
	            {
	            UpdateNameEditorControlL(fld,landmark,fieldArray[i]);
	            break;
	            }
	        case ECategory:
	        case ECategories:
	            {
	            UpdateCategoryEditorControlL( fld, fieldArray[i],ctrlid,postn,*landmark);
	            break;
	            }
			case EDescription:
				{
				UpdateDesEditorControlL(fld,landmark,fieldArray[i],ctrlid,postn);
				break;
				}
	        //these all are same
	        case EStreet:
	        case EPostCode:
	        case ECity:
	        case EStateProvince:
	        case ECountry:
			case EPhoneNumber:
			case EWebAddress:
	            {
	            UpdateTextEditorControlL(fld,landmark,fieldArray[i],
	            						fieldType,ctrlid,postn);
	            break;
	            }
	        case ELatitude:
	            {
	        	UpdateCoordinateEditorControlL(fld,fieldArray[i],
	        								   locality.Latitude(),
	        								   ctrlid,postn);
	            break;
	            }
	        case ELongitude:
	            {
	        	UpdateCoordinateEditorControlL(fld,fieldArray[i],
	        								   locality.Longitude(),
	        								   ctrlid,postn);
	            break;
	            }
	        case EPositionAccuracy:
	            {
	            UpdateNumberEditorControlL(fld,fieldArray[i],
	        								   locality.HorizontalAccuracy(),ctrlid,postn);
	            break;
	            }
	        case EAltitude:
	            {
	        	UpdateNumberEditorControlL(fld,fieldArray[i],
	        								   locality.Altitude(),ctrlid,postn);
	            break;
	            }
	        case EAltitudeAccuracy:
	            {
	            UpdateNumberEditorControlL(fld,fieldArray[i],
	        								   locality.VerticalAccuracy(),ctrlid,postn);
	            break;
	            }
	        default:
	            {
	            break;
	            }
			}
		}
	iEditorFieldArray->UpdateFieldsL();
	CleanupStack::PopAndDestroy( landmark );
	DrawNow();
	if(!IsEditable())
		{
		//only for landmarks viewer
		UpdateMskOnArrowMoveForViewerL();
		//ShowMultipleCategoriesInfoPopupL(ETrue);
		}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::ActivateL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ActivateL()
	{
	if (iEditorMode == CLmkEditorDlg::ELmkEditor
		&& iIsEditing)
		{
    	MLmkFieldData* fields = iLmkFields->GetField(iFieldTypeToFocus);
    	if(fields)
	    	{
	    	TInt id = fields->UniqueFieldIdentity();
	    	TryChangeFocusL(id);	    	
			if (iFieldTypeToFocus == ECategories || iFieldTypeToFocus == ECategory)
		    	{
		    	// ShowMultipleCategoriesInfoPopupL(EFalse);	
		    	}	
	    	}
	    }
	CCoeControl::ActivateL();
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateTextEditorControlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateTextEditorControlL
										(MLmkEditorField* aEditorField,
										CPosLandmark*	aLandmark,
										MLmkFieldData*  fieldData,
										TUint aFiledType,
										TInt aPrevControlId,
							   			TInt aPos
										)
	{

	TPositionFieldId fieldId = EPositionFieldNone;
	switch(aFiledType)
	{
	case EStreet:
	fieldId = EPositionFieldStreet;
	break;
    case EPostCode:
    fieldId = EPositionFieldPostalCode ;
    break;
    case ECity:
    fieldId = EPositionFieldCity;
    break;
    case EStateProvince:
    fieldId = EPositionFieldState;
    break;
    case ECountry:
    fieldId = EPositionFieldCountry;
    break;
	case EPhoneNumber:
	fieldId = ELmkPositionFieldPhoneNumber;
	break;
	case EWebAddress:
	fieldId = ELmkPositionFieldWebAddress;
	break;
	}
	TPtrC text;
	if ( aLandmark->GetPositionField(
    		fieldId, text ) == KErrNone )
		{
	   	if (IsEditable() && text.Length() == 0 && aFiledType == EWebAddress)
	   		{
	   		//return if web address field and field is empty and its an editor
	   		return;
	   		}
	   	fieldData->SetTextL(text);
	   	if(!IsEditable())
			{
			aEditorField = AddOrDeleteLineL( aEditorField,fieldData,aPrevControlId,
			 								 fieldData->UniqueFieldIdentity(), aPos);
			}
		if(aEditorField)
			{
			//now modify the text for display
	   	CLmkEditorTextField* field =	static_cast<CLmkEditorTextField*>(aEditorField);
	   	HBufC* buff = HBufC::NewLC(text.Length());
	   	TPtr dispTxt = buff->Des();
	    if(!IsEditable())
		    {
		    TPtr des1 = CLmkFields::RemoveEnterCharacter( text );
			dispTxt.Copy(des1);
		    }
	    else
		    {
			dispTxt.Copy(text);
		    }
		if(aFiledType == EWebAddress)
			{
			TInt position;
			if((position =  field->IsWebUrlProtocolPreFixedL(dispTxt))!=
				KErrNotFound)
				{
				field->TrimPrefixesFromWebUrlL( dispTxt, position +1 );
				}
			}
		   	TPtrC ptr;
		   	ptr.Set(dispTxt);
		   	field->SetControlTextL(ptr);
		   	CleanupStack::PopAndDestroy( buff );
			}

		}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateDesEditorControlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateDesEditorControlL
										(MLmkEditorField* aEditorField,
										CPosLandmark*	aLandmark,
										MLmkFieldData*  fieldData,
										TInt aPrevControlId,
							   			TInt aPos
										)
	{
		TPtrC text;
        aLandmark->GetLandmarkDescription(text);
        fieldData->SetTextL(text);
        TPtrC dispTxt;
	    if(!IsEditable())
		    {
		    TPtr des1 = CLmkFields::RemoveEnterCharacter( text );
			dispTxt.Set(des1);
			aEditorField = AddOrDeleteLineL( aEditorField,fieldData,aPrevControlId,
		 								 fieldData->UniqueFieldIdentity(), aPos);
		    }
	    else
		    {
			dispTxt.Set(text);
		    }
		CLmkEditorTextField* field =	static_cast<CLmkEditorTextField*>(aEditorField);
		if(aEditorField)
			{
			field->Control()->SetTextL(&dispTxt);
			field->Control()->DrawDeferred();
			}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateCategoryEditorControlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateCategoryEditorControlL
							(
							MLmkEditorField* aEditorField,
							MLmkFieldData*  fieldData,
							TInt aPrevControlId,
							TInt aPos,
						    CPosLandmark&	aLandmark
						    )
	{
	RArray<TPosLmItemId>& categories = fieldData->Categories();
    aLandmark.GetCategoriesL(categories);
  	TInt count( categories.Count() );

    if ( count  <= 1 )
        {
        fieldData->SetFieldType( ECategory );
        }
    else
        {
        fieldData->SetFieldType( ECategories );
        }
    if(!IsEditable())
		{
		aEditorField = AddOrDeleteLineL( aEditorField,fieldData,aPrevControlId,
		 								 fieldData->UniqueFieldIdentity(), aPos);
		}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateCoordinateEditorControlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateCoordinateEditorControlL
							  (
							  MLmkEditorField* aEditorField,
							   MLmkFieldData*  fieldData,
							   TReal aValue,
							   TInt aPrevControlId,
							   TInt aPos
							  )
	{
	fieldData->SetTReal( aValue );
	if(!IsEditable())
		{
		aEditorField = AddOrDeleteLineL( aEditorField,fieldData,aPrevControlId,
		 								 fieldData->UniqueFieldIdentity(), aPos);
		}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateNumberEditorControlL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateNumberEditorControlL
							  (
							  MLmkEditorField* aEditorField,
							   MLmkFieldData*  fieldData,
							   TReal32 aValue,
							   TInt aPrevControlId,
							   TInt aPos
							   )
	{
	fieldData->SetTReal( aValue );

	if(!IsEditable())
		{
		aEditorField = AddOrDeleteLineL( aEditorField,fieldData,aPrevControlId,
		 								 fieldData->UniqueFieldIdentity(), aPos);
		}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateNameEditorControl
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateNameEditorControlL
							  (
							  MLmkEditorField* aEditorField,
							  CPosLandmark*	aLandmark,
							  MLmkFieldData*  fieldData
							  )
	{
	
	if( aEditorField && aLandmark && fieldData )
	    {
	    //name field icon updation
	    TInt iconIden = -1;
	    TInt iconMaskIndex = -1;
	    TPtrC iconFile;
	    CLmkEditorTextField* field = static_cast<CLmkEditorTextField*>(aEditorField);
	    if( aLandmark->GetIcon( iconFile, iconIden, iconMaskIndex ) && field )
	        {
	        if( iconIden > 0 )
	            {
	            fieldData->SetIconId( iconIden );
	            fieldData->SetIconPathL( iconFile );
	            CEikImage* image = new( ELeave ) CEikImage();
	            CleanupStack::PushL( image );
	            image->CreatePictureFromFileL( iconFile,
	                               iconIden, iconMaskIndex );
	            iLmkUiUtils->UpdateContextIconL( image );
	            CLmkUiUtils::ChangeLmNameLabelIconL ( *this, *fieldData );
	            CleanupStack::Pop(); //image
	            field->CaptionedControl()->DrawDeferred();
	            }
	        //text control updation
	        TPtrC text;
	        aLandmark->GetLandmarkName( text );
	        TPtrC dispTxt;
	        if( !IsEditable() )
	            {
	            TPtr des1 = CLmkFields::RemoveEnterCharacter( text );
	            dispTxt.Set(des1);
	            }
	        else
	            {
	            dispTxt.Set(text);
	            }
	        field->Control()->SetTextL( &dispTxt );
	        fieldData->SetTextL( text );
	        HBufC* buff = dispTxt.AllocL();
	        iLmkUiUtils->ChangeTitlePaneL( buff );
	        field->Control()->DrawDeferred();
	        }
	    }
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetFieldTypeToFocusInEditMode
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::SetFieldTypeToFocusInEditMode(TUint aFieldType)
	{
		iFieldTypeToFocus = aFieldType;
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsDlgEditing
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::IsDlgEditing()
	{
	return iIsEditing;
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetDlgEditing
// -----------------------------------------------------------------------------
//
void  CLmkEditorImpl::SetDlgEditing(TBool aEditing)
	{
	iIsEditing = aEditing;
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::SetDlgEditing
// -----------------------------------------------------------------------------
//
TInt CLmkEditorImpl::EditMode()
    {
    return iEditorMode;
    }
// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateMskOnArrowMoveForViewerL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateMskOnArrowMoveForViewerL()
	{
	TBool cmdAdded = EFalse;
    MLmkEditorField* field =
	iEditorFieldArray->Find( IdOfFocusControl() );
	TUint type = field->LandmarkItemField().FieldType();
	switch(type)
		{
		case ECategories:
			{
			AddMskCommandL(R_LM_MSK_SHOW,ELmkCmdShow);
			cmdAdded = ETrue;
			break;
			}
		case EPhoneNumber:
			{
			HBufC* fieldText = field->ControlTextL();
			CleanupStack::PushL( fieldText );
            if ( fieldText && fieldText->Length() > 0 )
	            {
	            AddMskCommandL(R_LM_MSK_CALL,ELmkCmdLast);
	            cmdAdded = ETrue;
	            }
	        CleanupStack::PopAndDestroy( fieldText );
			break;
			}
		case EWebAddress:
			{
			HBufC* fieldText =  field->ControlTextL();
			CleanupStack::PushL( fieldText );
			if ( fieldText && fieldText->Length() > 0 )
				{
				AddMskCommandL(R_LM_MSK_BROWSE,ELmkCmdGoToUrl);
				cmdAdded = ETrue;
				}
			CleanupStack::PopAndDestroy( fieldText );
			break;
			}
		default:
			{
			//nothing
			break;
			}
		}
		if (!cmdAdded)
			{
			AddMskCommandL(R_LM_MSK_EDIT,ELmkCmdEditLm);
			}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::AddMskCommandL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::AddMskCommandL(TInt aResourceId,
								   TLmkAppCmdId aCommandId)
	{

	HBufC* mskTxt = NULL;
	mskTxt = StringLoader::LoadLC( aResourceId, iEikonEnv );
	CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
	cba->RemoveCommandFromStack(KMskCommandPos,iMskCmdId);
	iMskCmdId = aCommandId;
	iCurrentResourceId = aResourceId;
	cba->AddCommandToStackL(KMskCommandPos,iMskCmdId,mskTxt->Des());
	cba->MakeCommandVisible(iMskCmdId,ETrue);
	CleanupStack::PopAndDestroy( mskTxt );
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::AddMskCommandL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DimmMiddleSoftKey()
	{
	/*This is required, since there was an error,
	where the menu item appears if there are not items
	in the lis, after pressing the middle key.Hence, if
	dummy msk is added to the resource, it fixes the error,
	now this dummy button needs to be disabled.Check the
	dialog resource in editor.rss*/
	CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
	cba->MakeCommandVisible(EAknSoftkeyContextOptions,EFalse);
	}


// -----------------------------------------------------------------------------
// CLmkEditorImpl::ShowMultipleCategoriesInfoPopupL
// -----------------------------------------------------------------------------
//
 /*void CLmkEditorImpl::ShowMultipleCategoriesInfoPopupL(TBool aRefresh)
    {
    if (iCatInfoPopupNote && aRefresh)
	    {
	    delete iCatInfoPopupNote;
	    iCatInfoPopupNote = NULL;
	    }

    if (!iCatInfoPopupNote)
	    {

	    if(!IsCategoryField())
		    {
		    return;
		    }
	    MLmkFieldData* categoryField = iLmkFields->GetField( ECategories );
	    if ( !categoryField )
	        {
	        categoryField = iLmkFields->GetField( ECategory );
	        if ( !categoryField )
	            {
	            return;
	            }
	        }
	    RArray<TPosLmItemId> categories = categoryField->Categories();
	    
	    // This function is also called from message viewer, where the
	    // landmarks object is populated from xml file instead of db,
	    // hence the category id's will be dummy and must not be used,
	    // to get the category name, instead, get the category names
	    // from the xml file (iCategoryNames).
	    
	    TInt count( categories.Count() );
	    TBool isNotFromMessageViewer(EFalse);
	    count = iCategoryNames.Count();
	    if ( count == 0  ) // hack to determine from where the call coming.
	    	{
	    	//not called from message viewer
	    	isNotFromMessageViewer = ETrue;
	    	count = categories.Count();
	    	}
	    // Do not launch the popup for displaying one category name
		if (count <=1 )
		    {
			return;
		    }
   
		// ====================================================================	
		// Get Font for Formatting the infoPopUp strings 						
		// ====================================================================	

		// Get parameter and table limits for popup preview text window
		TAknLayoutScalableParameterLimits limits =
							AknLayoutScalable_Avkon::popup_preview_text_window_ParamLimits();

		TAknLayoutScalableTableLimits tableLimits =
							AknLayoutScalable_Avkon::popup_preview_text_window_t_Limits();

		// Get layout rects
		TRect rectScreen = iAvkonAppUi->ApplicationRect();
		TInt mainPaneVariety = Layout_Meta_Data::IsLandscapeOrientation() ? 4 : 1;

		TAknWindowLineLayout lineLayout =
							AknLayoutScalable_Avkon::main_pane( mainPaneVariety ).LayoutLine();
		TAknLayoutRect layoutRect;
		layoutRect.LayoutRect(rectScreen, lineLayout);
		TRect rectMainPane = layoutRect.Rect();

		// Use first variety to be able to get the font for text parsing
		TInt index = 0;
		if ( Layout_Meta_Data::IsLandscapeOrientation() )
			{
			index += 5;
			}
		TInt firstVariety = Min( Max( index, limits.FirstVariety() ), limits.LastVariety() );

		TAknWindowLineLayout lineLayout2 =
							AknLayoutScalable_Avkon::main_pane( mainPaneVariety ).LayoutLine();
		TAknLayoutRect layoutRect2;
		layoutRect2.LayoutRect(rectScreen, lineLayout2);
		TRect rectPopupWindow = layoutRect2.Rect();

		TInt firstIndex = tableLimits.FirstIndex();
		TInt firstLineVariety = AknLayoutScalable_Avkon::
		popup_preview_text_window_t_ParamLimits( firstIndex ).FirstVariety();

		TAknTextLineLayout popupTextLayout =
		AknLayoutScalable_Avkon::popup_preview_text_window_t(
		firstIndex, firstLineVariety );

		TAknLayoutText layoutText;
		layoutText.LayoutText( rectPopupWindow, popupTextLayout );
		TRect rectText = layoutText.TextRect();

		TInt infoPopupWidth = KMaxCatSizeForInfoPopUp;
		TInt infoPopupLength = KMinCatLenForInfoPopUp;

		if(rectText.Height() > 25)
			{
			infoPopupWidth = KMaxCatSizeForInfoPopUp + 80;
			}
		else if(rectText.Height() > 23)
			{
			infoPopupWidth = KMaxCatSizeForInfoPopUp + 55;
			}
		else if(rectText.Height() > 16)
			{
			infoPopupWidth = KMaxCatSizeForInfoPopUp + 10;
			infoPopupLength++;
			}

		// Prepare font to format the popupInfo string
		const CFont *font = layoutText.Font();

       	// =================================================================== 
       	// =================================================================== 

	    HBufC* catName = NULL;
	    // show the category list in a message query
		HBufC* message = HBufC::NewLC( (KPosLmMaxCategoryNameLength * count) + 1);
		TPtr msgPtr = message->Des();
	    CDesC16ArrayFlat* desArr = new (ELeave) CDesC16ArrayFlat(count);
	    CleanupStack::PushL(desArr);
		// fill up the array with category´s names from the engine.
		for ( TInt i = 0; i < count; i++ )
	        {
	        if ( !isNotFromMessageViewer )
	        	{
	        	catName = HBufC::NewL( KPosLmMaxCategoryNameLength + 1);
	        	catName->Des().Copy(iCategoryNames[i]);
	        	}
	        else
	        	{
	        	catName = CLmkDbUtils::CategoryNameL( iDb, categories[i] );
	        	}
	        CleanupStack::PushL( catName );

			TPtr des = catName->Des();

			TInt textWidth = font->TextWidthInPixels( des );
	        TInt textLength = des.Length();

	        // check the length of category name string to format for InfoPopUp.
			if(textLength > infoPopupLength && textWidth > infoPopupWidth)
				{

				// set the string as per KMinCatLenForInfoPopUp
				if(textLength > infoPopupLength + 9)
					{
					textLength = infoPopupLength + 9;
					des = des.Mid(0, textLength);
					}

	    		textWidth = font->TextWidthInPixels( des );

	    		for(TInt ctr=textLength; ctr >= (infoPopupLength-1);ctr--)
	    			{
	    			des = des.Mid(0, ctr);
	    			textWidth = font->TextWidthInPixels( des );
	    			if(textWidth <= infoPopupWidth)
	    				{
	    				break;
	    				}
	    			}

				// loading the "..." string
				HBufC* endString =  StringLoader::LoadLC(R_LM_EDITOR_MANY_CATEGORIES);

				// appending the "..." string at end
				des.Append(endString->Des());

				// appendig formatted string into category string array
				desArr->AppendL(des);
				CleanupStack::PopAndDestroy(endString); // endString
				}
			else
				{
		    	desArr->AppendL(des);
				}
	        CleanupStack::PopAndDestroy( catName ); //name
			}
		desArr->Sort();
		HBufC* catTxt = NULL;

		for ( TInt i = 0; i < desArr->Count(); i++ )
	        {
	        if (i <KMaxCatCntForInfoPopUp)
	            {
                msgPtr.Append((*desArr)[i]);
                if ( i != ( count - 1 ) )
                    {
                    msgPtr.Append(_L("\n"));
                    }
	            }
			}

		if (count > KMaxCatCntForInfoPopUp)
			{

			catTxt = StringLoader::LoadLC( R_LM_EDITOR_MANY_CATEGORIES, iEikonEnv );
            msgPtr.Append(catTxt->Des());
            CleanupStack::PopAndDestroy(catTxt );//catTxt
			}
		TPoint pt1;
		iCatInfoPopupNote = LmkNotes::ShowDelayedInfoPopupL(msgPtr,pt1);
		UpdateCatInfoNotePosition();
		iCatInfoPopupNote->ShowInfoPopupNote();
		CleanupStack::Pop();//desArr
	    delete	desArr;
		CleanupStack::PopAndDestroy( message ); //message
	    }
	else
	    {
	    UpdateCatInfoNotePosition();
	    iCatInfoPopupNote->ShowInfoPopupNote();
	    }
    }
*/

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ShowQueryIfLocationFieldsAlreadyFilledL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::ShowQueryIfLocationFieldsAlreadyFilledL()
  	{
  	TBool result = EFalse;
    TRealX lati;
    lati.SetNaN();
    TRealX longi;
    longi.SetNaN();

    MLmkFieldData* lat = iLmkFields->GetField(ELatitude);
	if(lat)
		{
        //get latitude control id
        TInt id = lat->UniqueFieldIdentity();
        MLmkEditorField* latcontrol = iEditorFieldArray->Find( id );
        //get latitude control current text
        lati = static_cast<CLmkEditorCoordinateField*>(latcontrol)->FieldValue();
        
        MLmkFieldData* lon = iLmkFields->GetField(ELongitude);
        if(lon)
            {
            //get longitude control id
            id = lon->UniqueFieldIdentity();
            MLmkEditorField* longcontrol = iEditorFieldArray->Find( id );
            //get longitude control current text
            longi = static_cast<CLmkEditorCoordinateField*>(longcontrol)->FieldValue();         
    		}
        
        if ( (!lati.IsNaN()) && (!longi.IsNaN()))
            {
            if ( !LmkNotes::ShowOwerriteLocationQueryL( iEikonEnv ) )
                {
                result = ETrue;
                }
            }
		}
	return result;
  	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsInvalidUriL
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::IsInvalidUriL()
	{
	TBool ret = EFalse;
	MLmkFieldData* fields = iLmkFields->GetField( EWebAddress );
	if(fields)
		{
		MLmkEditorField* fld = iEditorFieldArray->Find(fields->UniqueFieldIdentity());
		if(fld)
			{
			HBufC* webaddr = HBufC::NewLC(KMaxBufferLen);
			CLmkEditorTextField* field =	static_cast<CLmkEditorTextField*>(fld);
			TPtr ptr = webaddr->Des();
			field->Control()->GetText(ptr);
			ret = UriUtils::HasInvalidChars(ptr);
			CleanupStack::PopAndDestroy();//webaddr
			}
		}
	return ret;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleListProviderEvent
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleListProviderEvent(TLmkListProviderEventType /*aEvent*/ )
	{
	TRAPD(err,CPosLandmark* landmark = iDb.ReadLandmarkLC(iLmkFields->LandmarkId());CleanupStack::PopAndDestroy( landmark ));
    if (err == KErrNotFound)
        {
        TRAP_IGNORE(DeleteSelfL());
        }
     else
     	{
     	//update the landmark viewer/editor
     	TRAP_IGNORE(UpdateViewDlgL());
     	}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleListProviderError
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleListProviderError( TInt /*aError*/ )
	{
	//if error do nothing
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::LaunchLmkEditorL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::LaunchLmkEditorL()
	{
	CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
	cba->RemoveCommandFromStack( KMskCommandPos, iMskCmdId );
    // Launch editor
   TLmkEditorAttributes attributeFlags( CLmkEditorDlg::ELmkAll );
   // Check if the Landmark is alreayd present in the database. Incase,
   // a landmark is associated with the editor and if it is not
   // added to the Database, then the viewer would be launched with
   // the lanmark content
    if( KPosLmNullItemId == iLmkFields->LandmarkId() && iLandmark )
        {
        iEditor = CLmkEditorImpl::NewL( iDb,
                                    iSender,
                                    attributeFlags,
                                    CLmkEditorDlg::ELmkEditor,
                                    iLandmark );
        }
    else
        {
        iEditor = CLmkEditorImpl::NewL( iDb,
                                    iSender,
                                    attributeFlags,
                                    CLmkEditorDlg::ELmkEditor,
                                    iLmkFields->LandmarkId() );
        }


	MLmkEditorField* field = iEditorFieldArray->Find( IdOfFocusControl() );
	iFieldTypeToFocus = field->LandmarkItemField().FieldType();
    iEditor->SetFieldTypeToFocusInEditMode( iFieldTypeToFocus );
    iEditor->SetDlgEditing( ETrue );
    iIsEditing = ETrue;
    if( !iMapNavFeature )
	    {
	    iEditor->DisableMapAndNavigationMenuOptions();
	    }
    iEditor->ExecuteLD();
    iEditor->SetDlgEditing( EFalse );
    iIsEditing = EFalse;
    TInt err = KErrNone;
    TRAP( err, CPosLandmark* landmark = iDb.ReadLandmarkLC( iLmkFields->LandmarkId() ); CleanupStack::PopAndDestroy( landmark ) );
    if (err == KErrNotFound)
        {
        iLmkUiUtils->RestoreOldNaviPaneL();
        delete this;
        return;
        }
    AddMskCommandL( iCurrentResourceId, iMskCmdId );
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DeleteSelfL
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DeleteSelfL()
	{
	iLmkUiUtils->RestoreOldNaviPaneL();
    if(iEditor)
    	{
    	//delete only editor,if editor instance is present,
    	//viewer will be deleted in ProcessCommandL, where
    	//editor was created.
    	delete iEditor;
    	iEditor = NULL;
    	}
    else
    	{
    	delete this;
    	}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleCentralRepositoryChangeL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleCentralRepositoryChangeL()
	{
	//change unit for position accuracy
	MLmkFieldData* fldData = iLmkFields->GetField( EPositionAccuracy );
	if(fldData)
		{
		TInt id1 = fldData->UniqueFieldIdentity();
		CLmkEditorNumberField* field = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id1 ));
		if(field)
			field->HandleUnitChangeL();
		}

	//change altitude unit
	MLmkFieldData* fldData1 = iLmkFields->GetField( EAltitude );
	if(fldData1)
		{
		TInt id2 = fldData1->UniqueFieldIdentity();
		CLmkEditorNumberField* field1 = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id2 ));
		if(field1)
			field1->HandleUnitChangeL();
		}

	//change altitude accuracy unit
	MLmkFieldData* fldData2 = iLmkFields->GetField( EAltitudeAccuracy );
	if(fldData2)
		{
		TInt id3 = fldData2->UniqueFieldIdentity();
		CLmkEditorNumberField* field2 = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id3 ));
		if(field2)
			field2->HandleUnitChangeL();
		}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::UpdateCatInfoNotePosition()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::UpdateCatInfoNotePosition()
	{
	//this is only to set the position of the
	//cat info note.
	if(iCatInfoPopupNote && IsCategoryField())
		{
		CEikCaptionedControl* tmpline = CurrentLine();
		TPoint pt1 = tmpline->PositionRelativeToScreen();
		pt1.iX+=KHOffsetCatInfoPopup;
		pt1.iY+=KVOffsetCatInfoPopup;
		iCatInfoPopupNote->SetPositionAndAlignment(pt1,EHLeftVTop);
		}
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::IsCategoryField()
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::IsCategoryField()
	{
	//to check whether the current focussed field is a
	//category field.
	TBool result = ETrue;
	MLmkEditorField* field =
			iEditorFieldArray->Find( IdOfFocusControl() );
	TUint type = field->LandmarkItemField().FieldType();
    if(type != ECategories && type != ECategory)
	    {
	    result = EFalse;
	    }
	return result;
	}


#ifdef RD_SCALABLE_UI_V2
// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleDialogPageEventL
// -----------------------------------------------------------------------------
//

void CLmkEditorImpl::HandleDialogPageEventL(TInt /*aEventID*/)
	{
    /*
	if(IsEditable())
		{
		//editor
		HandleEditorCommandL();
		}
	*/	
	}

#endif //RD_SCALABLE_UI_V2

// -----------------------------------------------------------------------------
// CLmkEditorImpl::LineChangedL
// -----------------------------------------------------------------------------
//

void CLmkEditorImpl::LineChangedL(TInt /*aControlId*/)
	{

	//hide the category info pop-up if active
    if(iCatInfoPopupNote)
		{
		iCatInfoPopupNote->HideInfoPopupNote();
		}
	MLmkEditorField* field = iEditorFieldArray->Find( IdOfFocusControl() );
	__ASSERT_DEBUG( field, Panic( KLmkPanicNullMember ) );
	TUint type = field->LandmarkItemField().FieldType();
   	if (IsEditable())
    	{
    	//editor
    	if ( type == ECategory || type == ECategories )
			 {
			 AddMskCommandL(R_LM_MSK_EDIT,ELmkCmdSelectCategories);
			 }
		 else
			 {
			 CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
			 cba->MakeCommandVisible(iMskCmdId,EFalse);
			 }
    	}
    else
        {
        //viewer
        UpdateMskOnArrowMoveForViewerL();
        }
   	if ( type == ECategory || type == ECategories )
    	{
    	// ShowMultipleCategoriesInfoPopupL(IdOfFocusControl());
    	}

	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ClearPositionInfoL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::ClearPositionInfoL()
	{
	//clear latitude
	MLmkFieldData* lat = iLmkFields->GetField(ELatitude);
	if(lat)
		{
		TInt id = lat->UniqueFieldIdentity();
		MLmkEditorField* latcontrol = iEditorFieldArray->Find( id );
		if(latcontrol)
			{
			latcontrol->ResetL();
			}
		}
	//clear longitude
	MLmkFieldData* lon = iLmkFields->GetField(ELongitude);
	if(lon)
		{
		TInt id = lon->UniqueFieldIdentity();
		MLmkEditorField* longcontrol = iEditorFieldArray->Find( id );
		if(longcontrol)
			{
			longcontrol->ResetL();
			}
		}
	//clear position accuracy
	MLmkFieldData* fldData = iLmkFields->GetField( EPositionAccuracy );
	if(fldData)
		{
		TInt id1 = fldData->UniqueFieldIdentity();
		CLmkEditorNumberField* field = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id1 ));
		if(field)
			{
			field->ResetL();
			}
		}
	//clear altitude
	MLmkFieldData* fldData1 = iLmkFields->GetField( EAltitude );
	if(fldData1)
		{
		TInt id2 = fldData1->UniqueFieldIdentity();
		CLmkEditorNumberField* field1 = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id2 ));
		if(field1)
			{
			field1->ResetL();
			}
		}
	//clear altitude accuracy
	MLmkFieldData* fldData2 = iLmkFields->GetField( EAltitudeAccuracy );
	if(fldData2)
		{
		TInt id3 = fldData2->UniqueFieldIdentity();
		CLmkEditorNumberField* field2 = static_cast<CLmkEditorNumberField*>(iEditorFieldArray->Find( id3 ));
			if(field2)
			{
			field2->ResetL();
			}
		}
		
	DrawNow();
	
	}	

// -----------------------------------------------------------------------------
// CLmkEditorImpl::ArePositionFieldEmptyL()
// -----------------------------------------------------------------------------
//
TBool CLmkEditorImpl::ArePositionFieldEmptyL()
	{
	return  (IsFieldEmptyL( ELatitude ) && IsFieldEmptyL( ELongitude ) && IsFieldEmptyL( EAltitude )
			  && IsFieldEmptyL( EAltitudeAccuracy ) && IsFieldEmptyL( EPositionAccuracy)) ? ETrue : EFalse;
	}

#ifdef RD_SCALABLE_UI_V2
// -----------------------------------------------------------------------------
// CLmkEditorImpl::HandleEditorCommandL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleEditorCommandL()
	{
	MLmkEditorField* field = iEditorFieldArray->Find( IdOfFocusControl() );
	__ASSERT_DEBUG( field, Panic( KLmkPanicNullMember ) );

	TUint type = field->LandmarkItemField().FieldType();
	switch(type)
		{
		case ECategories:
		case ECategory:
			{
			ProcessCommandL( ELmkCmdSelectCategories );
			break;
			}
		}
	}
#endif //RD_SCALABLE_UI_V2

// -----------------------------------------------------------------------------
// CLmkAppLmItemSelectorImpl::HandleDialogDismissed
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::HandleDialogDismissed( TInt aButtonId )
	{
	if( EEikBidCancel == aButtonId )
		{
		delete iLocationService;
    	iLocationService = NULL;
		}
	}
// -----------------------------------------------------------------------------
// CLmkEditorImpl::InsertLineL()
// -----------------------------------------------------------------------------
//
MLmkEditorField* CLmkEditorImpl::InsertLineL(  MLmkFieldData*  aFieldData,
								   TInt aPrevControlId)
	{
	MLmkEditorField* editorField = NULL;
	//data present, but control not present
	TryChangeFocusL(aPrevControlId);
	editorField = LmkEditorFieldFactory::CreateFieldL(
	                                        *aFieldData, *this );
    CleanupStack::PushL( editorField );
    if ( editorField )
        {
        editorField->SetEditableL(EFalse);
        iEditorFieldArray->GetFieldArray().AppendL( editorField );
        editorField->ActivateL();
        }
    CleanupStack::Pop(); //editorField
    return editorField;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::DeleteLineL()
// -----------------------------------------------------------------------------
//
void CLmkEditorImpl::DeleteLineL( MLmkEditorField* aEditorField,
								  TInt aCtrlId , TInt aPos)
	{
	//data not present but control present
	//iEditorFieldArray->GetFieldArray().Delete( aPos-1 );
	iEditorFieldArray->GetFieldArray().Delete( aPos );
	delete aEditorField;
	aEditorField=NULL;
	DeleteLine(aCtrlId);
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::AddOrDeleteLineL()
// -----------------------------------------------------------------------------
//
MLmkEditorField* CLmkEditorImpl::AddOrDeleteLineL( MLmkEditorField* aEditorField,
												   MLmkFieldData*  aFieldData ,
												   TInt aPrevControlId,
								  				   TInt aCtrlId , TInt aPos)
	{
	TBool valPresent = iEditorFieldArray->CheckIfFieldIsEmpty(*aFieldData);

	if(valPresent && !aEditorField)
		{
		aEditorField = InsertLineL( aFieldData, aPrevControlId);
		}
	else if(!valPresent && aEditorField)
		{
		DeleteLineL(aEditorField, aCtrlId,aPos);
		aEditorField = NULL;
		}
	return aEditorField;
	}

// -----------------------------------------------------------------------------
// CLmkEditorImpl::MessageQueryCallBack()
// -----------------------------------------------------------------------------
//
TInt CLmkEditorImpl::MessageQueryCallBack( TAny* /*aPtr*/ )
	{
	TInt result = KErrNone;
	CEikonEnv* env = CEikonEnv::Static();
	TRAP_IGNORE(result = LmkNotes::GenericMessageQueryL(env,R_LMK_REQUEST_FAIL_INFO_TEXT,
									R_LMK_MSG_QUERY_HEADING_PANE_TEXT));
	return result;
	}

// ---------------------------------------------------------
// CLmkEditorImpl::CheckHideCoordinateL()
// ---------------------------------------------------------
//
void CLmkEditorImpl::CheckHideCoordinateL()
	{
    TInt coordinateSettingValue = ELocCoordinatesNotHidden;
    TInt helpSettingValue = ELocHelpNotHidden;
    CRepository* repository = CRepository::NewL( TUid::Uid( KCRUidLocLocalVariation) );
    CleanupStack::PushL( repository );
    User::LeaveIfError( repository->Get( KLocHideCoordinates,
                                              coordinateSettingValue ));  
    User::LeaveIfError( repository->Get( KLocHideHelp,
                                              helpSettingValue ));  
    CleanupStack::PopAndDestroy( repository );
	
	if( ELocCoordinatesHidden == coordinateSettingValue )
		iIsHideCoordinate = ETrue;
	else
		iIsHideCoordinate = EFalse;
	
	if( ELocHelpHidden == helpSettingValue )
		iIsHideHelp = ETrue;
	else
		iIsHideHelp = EFalse;
	
	}

// ---------------------------------------------------------
// CLmkEditorImpl::HandlePointerEventL()
// ---------------------------------------------------------
//
void CLmkEditorImpl::HandlePointerEventL(const TPointerEvent& aPointerEvent)
    {
    if (aPointerEvent.iType == TPointerEvent::EButton1Up && iIsDragging
            == EFalse)
        {
        MLmkEditorField* field = iEditorFieldArray->Find(IdOfFocusControl());
        TUint type = field->LandmarkItemField().FieldType();

        // check the editor mode
        if (IsEditable()) // edit mode
            {
            if (type == ECategory || type == ECategories)
                {
                if (!iIsCategorySelctorOpen)
                    {
                    iIsCategorySelctorOpen = ETrue;
                    SelectCategoriesCmdL();
                    }
                }
            }
        else
            {// view or receive mode
            if (type == ECategory || type == ECategories)
                {
                if (iCalegorySelectionFlag) // Receive mode
                    {
                    CategoriesCmdFromXmlL();
                    }
                else
                    {
                    CategoriesCmdL(); // View mode
                    }
                }
            else // focus is on any other landmark field
                {
                if (!iCalegorySelectionFlag)// No context menu for receive mode
                    {
                    if (!iIsEditing)
                        {
                        LaunchLmkEditorL();
                        }
                    }
                }
            }
        }
    else
        {
        CAknForm::HandlePointerEventL(aPointerEvent);

        if (aPointerEvent.iType == TPointerEvent::EButton1Down)
            {
            iIsDragging = EFalse;
            }

        if (aPointerEvent.iType == TPointerEvent::EDrag)
            {
            iIsDragging = ETrue;
            }
        }
    }

//  End of File