meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp
branchRCL_3
changeset 64 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,905 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+ *  Description : ESMR location field implementation
+ *  Version     : %version: e002sa32#53.1.3 %
+ *
+ */
+
+
+#include "cesmrlocationfield.h"
+#include "esmrfieldbuilderdef.h"
+#include "cesmreditor.h"
+#include "cesmrfeaturesettings.h"
+#include "esmrhelper.h"
+#include "mesmrfieldevent.h"
+#include "cesmrgenericfieldevent.h"
+#include "cesmrglobalnote.h"
+#include "cmrbutton.h"
+#include "cmrlabel.h"
+#include "cmrimage.h"
+#include "nmrlayoutmanager.h"
+#include "nmrbitmapmanager.h"
+#include "cmrstyluspopupmenu.h"
+#include "mesmrlistobserver.h"
+
+#include <calentry.h>
+#include <StringLoader.h>
+#include <esmrgui.rsg>
+#include <data_caging_path_literals.hrh>
+#include <AknsBasicBackgroundControlContext.h>
+#include <eikmfne.h>
+#include <aknbutton.h>
+
+#include "emailtrace.h"
+#include "esmrconfig.hrh"
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRLocationField* CESMRLocationField::NewL()
+    {
+    FUNC_LOG;
+    CESMRLocationField* self = new (ELeave) CESMRLocationField;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::CESMRLocationField
+// ---------------------------------------------------------------------------
+//
+CESMRLocationField::CESMRLocationField()
+    {
+    FUNC_LOG;
+    SetFieldId( EESMRFieldLocation );
+    SetFocusType( EESMRHighlightFocus );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::ConstructL()
+    {
+    FUNC_LOG;
+
+    iFieldButton = CMRButton::NewL( NMRBitmapManager::EMRBitmapLocation );
+    iFieldButton->SetParent( this );
+
+    iTitle = CMRLabel::NewL();
+    iTitle->SetParent( this );
+    HBufC* title = StringLoader::LoadLC(
+            R_MEET_REQ_OPTIONS_ADD_LOCATION,
+            iCoeEnv );
+    iTitle->SetTextL( *title );
+    CleanupStack::PopAndDestroy( title );
+
+    iLocation = CESMREditor::NewL( this,
+                                   1,
+                                   KMaxTextLength, //from ICAL spec.
+                                   // do not change. other text fields do not
+                                   // have this limitation
+                                   CEikEdwin::EResizable |
+                                   CEikEdwin::EAvkonEditor );
+
+    CESMRField::ConstructL( iLocation ); //ownership transfered
+
+    iLocation->SetEdwinSizeObserver( this );
+    iLocation->SetEdwinObserver( this );
+    iLocation->SetParent( this );
+
+    HBufC* buf = StringLoader::LoadLC( R_QTN_MEET_REQ_LOCATION_FIELD, iCoeEnv );
+    iLocation->SetDefaultTextL( buf ); // ownership is transferred
+    CleanupStack::Pop( buf );
+
+    // Setting background instead of theme skin
+    NMRBitmapManager::TMRBitmapStruct bitmapStruct;
+    bitmapStruct = NMRBitmapManager::GetBitmapStruct( NMRBitmapManager::EMRBitmapInputCenter );
+
+    TRect initialisationRect( 0, 0, 0, 0 );
+    iBgControlContext = CAknsBasicBackgroundControlContext::NewL(
+                bitmapStruct.iItemId,
+                initialisationRect,
+                EFalse );
+
+    iLocation->SetSkinBackgroundControlContextL( iBgControlContext );
+    }
+
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::~CESMRLocationField
+// ---------------------------------------------------------------------------
+//
+CESMRLocationField::~CESMRLocationField()
+    {
+    FUNC_LOG;
+    delete iFieldButton;
+    delete iWaypointIcon;
+    delete iFeatures;
+    delete iLocationText;
+    delete iBgControlContext;
+    delete iMenu;
+    delete iTitle;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::MinimumSize
+// ---------------------------------------------------------------------------
+//
+TSize CESMRLocationField::MinimumSize()
+    {
+    TRect parentRect( Parent()->Rect() );
+
+    TRect richTextRect =
+       NMRLayoutManager::GetFieldLayoutRect( parentRect, 1 ).Rect();
+
+    TRect textRect( NMRLayoutManager::GetLayoutText(
+            richTextRect,
+       NMRLayoutManager::EMRTextLayoutTextEditor ).TextRect() );
+
+    // Adjust field size so that there's room for expandable editor.
+    richTextRect.Resize( 0, iSize.iHeight - textRect.Height() );
+
+    // Add title area to the required size
+    TSize titleSize( CESMRField::MinimumSize() );
+
+    TSize completeFieldSize( titleSize );
+    completeFieldSize.iHeight += richTextRect.Height();
+
+    return completeFieldSize;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::InitializeL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::InitializeL()
+    {
+    FUNC_LOG;
+    // Do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::InternalizeL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::InternalizeL( MESMRCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    CCalEntry& entry = aEntry.Entry();
+    HBufC* location = entry.LocationL().AllocLC();
+
+    // if there is no text available, don't overwrite the default text
+    // with empty descriptor.
+    if ( location->Length() > 0 )
+        {
+        iLocation->ClearSelectionAndSetTextL( *location );
+        }
+
+    CleanupStack::PopAndDestroy( location );
+
+    // If the geo value has been set, the waypoint icon has to be shown on right
+    // side of the location field
+    CCalGeoValue* geoValue = aEntry.Entry().GeoValueL();
+    TReal dummy;
+    SetWaypointIconL( geoValue && geoValue->GetLatLong( dummy, dummy ) );
+
+    // this is needed to be re-called here, otherwise the CEikEdwin
+    // does not get correctly instantiated with default text
+    iLocation->FocusChanged( EDrawNow );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ExternalizeL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::ExternalizeL( MESMRCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    HBufC* loc = iLocation->GetTextInHBufL( );
+
+    if ( loc )
+        {
+        CleanupStack::PushL( loc );
+
+        // externalize the text only if it differs from the
+        // default text. In other words, default text is not
+        // externalized.
+        HBufC* defaultText = StringLoader::LoadLC(
+                R_QTN_MEET_REQ_LOCATION_FIELD,
+                iCoeEnv );
+        if ( defaultText->Compare( *loc ) != 0 )
+            {
+            CCalEntry& entry = aEntry.Entry();
+            entry.SetLocationL( *loc );
+            }
+        else if ( !iWaypointIcon )
+            {
+            aEntry.Entry().ClearGeoValueL();
+            }
+
+        CleanupStack::PopAndDestroy( defaultText );
+        CleanupStack::PopAndDestroy( loc );
+        }
+    else
+        {
+        CCalEntry& entry = aEntry.Entry();
+        entry.SetLocationL( KNullDesC );
+        entry.ClearGeoValueL();
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::SetOutlineFocusL( TBool aFocus )
+    {
+    FUNC_LOG;
+    CESMRField::SetOutlineFocusL ( aFocus );
+
+    if ( FeaturesL().FeatureSupported(
+            CESMRFeatureSettings::EESMRUILocationFeatures ) )
+        {
+        if ( aFocus )
+            {
+            ChangeMiddleSoftKeyL( EAknSoftkeyContextOptions, R_QTN_MSK_OPEN );
+            }
+        else
+            {
+            if ( iLocationText )
+                {
+                delete iLocationText;
+                iLocationText = NULL;
+                }
+            iLocationText = iLocation->GetTextInHBufL();
+
+            HBufC* defaultText = StringLoader::LoadLC(
+                    R_QTN_MEET_REQ_LOCATION_FIELD,
+                    iCoeEnv );
+
+            if ( iLocationText && iLocationText->Compare( *defaultText ) != 0 )
+                {
+                // Create field change event
+                CESMRGenericFieldEvent* event = CESMRGenericFieldEvent::NewLC(
+                        this,
+                        MESMRFieldEvent::EESMRFieldChangeEvent );
+
+                // Add this field as parameter
+                TInt fieldId = iFieldId;
+                CESMRFieldEventValue* field = CESMRFieldEventValue::NewLC(
+                        MESMRFieldEventValue::EESMRInteger,
+                        &fieldId );
+                event->AddParamL( field );
+                CleanupStack::Pop( field );
+
+                // Add new value as parameter
+                CESMRFieldEventValue* value = CESMRFieldEventValue::NewLC(
+                        CESMRFieldEventValue::EESMRString,
+                        iLocationText );
+                iLocationText = NULL; // Ownership transferred to value
+                // Encapsulate value, so receiver gets the field value type
+                event->AddParamL( value, ETrue );
+                CleanupStack::Pop( value );
+
+                // Send event
+                NotifyEventAsyncL( event );
+                CleanupStack::Pop( event );
+                }
+            CleanupStack::PopAndDestroy( defaultText );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandleEdwinSizeEventL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRLocationField::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
+        TEdwinSizeEvent /*aType*/, TSize aSize )
+    {
+    FUNC_LOG;
+    TBool reDraw( EFalse );
+
+    if( iSize != aSize )
+        {
+        // Let's save the required size for the iLocation
+        iSize = aSize;
+
+        if ( iObserver && aEdwin == iLocation )
+           {
+           iObserver->ControlSizeChanged( this );
+           reDraw = ETrue;
+           }
+
+        if( iLocation->LineCount() != iLineCount )
+            {
+            // Line count has changed, the whole component needs
+            // to be redrawn
+            DrawDeferred();
+            iLineCount = iLocation->LineCount();
+            }
+        }
+
+    return reDraw;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandleEdwinEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::HandleEdwinEventL(CEikEdwin* aEdwin, TEdwinEvent aEventType)
+    {
+    FUNC_LOG;
+    if ( aEdwin == iLocation && aEventType == EEventTextUpdate )
+        {
+        TInt textLength( iLocation->TextLength() );
+
+        if ( iLocation->GetLimitLength() <= textLength )
+            {
+            NotifyEventAsyncL( EESMRCmdSizeExceeded );
+            }
+        else if ( iWaypointIcon && textLength == 0 )
+            {
+            SetWaypointIconL( EFalse );
+            NotifyEventL( EESMRCmdDisableWaypointIcon );
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::GetCursorLineVerticalPos
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::GetCursorLineVerticalPos(TInt& aUpper, TInt& aLower)
+    {
+    aLower = iLocation->CurrentLineNumber() * iLocation->RowHeight();
+    aUpper = aLower - iLocation->RowHeight();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ListObserverSet
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::ListObserverSet()
+    {
+    FUNC_LOG;
+    iLocation->SetListObserver( iObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ListObserverSet
+// ---------------------------------------------------------------------------
+//
+CESMRFeatureSettings& CESMRLocationField::FeaturesL()
+    {
+    FUNC_LOG;
+    if ( !iFeatures )
+        {
+        iFeatures = CESMRFeatureSettings::NewL();
+        }
+
+    return *iFeatures;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::SetWaypointIconL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::SetWaypointIconL( TBool aEnabled )
+    {
+    delete iWaypointIcon;
+    iWaypointIcon = NULL;
+
+    if ( aEnabled )
+        {
+        iWaypointIcon = CMRImage::NewL(
+                NMRBitmapManager::EMRBitmapLocationWaypoint,
+                this,
+                ETrue );
+        }
+
+    SizeChanged();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CESMRLocationField::CountComponentControls( ) const
+    {
+    FUNC_LOG;
+    TInt count( 0 );
+    if( iFieldButton )
+        {
+        ++count;
+        }
+
+    if ( iTitle )
+        {
+        ++count;
+        }
+
+    if( iLocation )
+        {
+        ++count;
+        }
+
+    if( iWaypointIcon )
+        {
+        ++count;
+        }
+
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CESMRLocationField::ComponentControl( TInt aInd ) const
+    {
+    FUNC_LOG;
+
+    switch ( aInd )
+        {
+        case 0:
+            return iFieldButton;
+        case 1:
+            return iTitle;
+        case 2:
+            return iLocation;
+        case 3:
+            return iWaypointIcon;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::SizeChanged()
+    {
+    FUNC_LOG;
+    TRect rect( Rect() );
+
+    TAknLayoutRect firstRowLayoutRect(
+            NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) );
+    TRect firstRowRect( firstRowLayoutRect.Rect() );
+
+    TRect secondRowRect( firstRowRect );
+    secondRowRect.Move( 0, firstRowRect.Height() );
+
+    // Layout field button
+    if( iFieldButton )
+        {
+        TAknWindowComponentLayout buttonLayout(
+                NMRLayoutManager::GetWindowComponentLayout(
+                    NMRLayoutManager::EMRLayoutTextEditorIcon ) );
+        AknLayoutUtils::LayoutControl(
+                iFieldButton, firstRowRect, buttonLayout );
+        }
+
+    // Layout field title
+    if( iTitle )
+        {
+        TAknTextComponentLayout editorLayout =
+                NMRLayoutManager::GetTextComponentLayout(
+                        NMRLayoutManager::EMRTextLayoutTextEditor );
+
+        AknLayoutUtils::LayoutLabel( iTitle, firstRowRect, editorLayout );
+        }
+
+    TRect editorRect( 0, 0, 0, 0 );
+
+    // Layout field editor
+    if( iLocation )
+        {
+        TAknLayoutText editorLayoutText;
+
+        if( iWaypointIcon )
+           {
+           editorLayoutText = NMRLayoutManager::GetLayoutText(
+                   secondRowRect,
+                   NMRLayoutManager::EMRTextLayoutSingleRowEditorText );
+           }
+        else
+           {
+           editorLayoutText = NMRLayoutManager::GetLayoutText(
+                   secondRowRect,
+                   NMRLayoutManager::EMRTextLayoutTextEditor );
+           }
+
+        editorRect = editorLayoutText.TextRect();
+
+        // Resize height according to actual height required by edwin.
+        editorRect.Resize( 0, iSize.iHeight - editorRect.Height() );
+
+        iLocation->SetRect( editorRect );
+
+        // Try setting font. Failures are ignored.
+        TRAP_IGNORE( iLocation->SetFontL( editorLayoutText.Font() ) );
+        }
+
+    // Layout the waypoint icon
+    if ( iWaypointIcon )
+        {
+        TAknWindowComponentLayout iconLayout(
+                NMRLayoutManager::GetWindowComponentLayout(
+                    NMRLayoutManager::EMRLayoutSingleRowDColumnGraphic ) );
+        AknLayoutUtils::LayoutImage( iWaypointIcon, secondRowRect, iconLayout );
+        }
+
+    // Layout field focus
+    if( iLocation )
+        {
+        // Layouting focus for rich text editor area
+        TRect bgRect( iLocation->Rect() );
+
+        // Move focus rect so that it's relative to field's position.
+        bgRect.Move( -Position() );
+        SetFocusRect( bgRect );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandleFieldEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::HandleFieldEventL( const MESMRFieldEvent& aEvent )
+    {
+    FUNC_LOG;
+    if ( aEvent.Type() == MESMRFieldEvent::EESMRFieldCommandEvent )
+        {
+        TInt* command = static_cast< TInt* >( aEvent.Param( 0 ) );
+
+        switch ( *command )
+            {
+            case EESMRCmdDisableWaypointIcon:
+            case EESMRCmdEnableWaypointIcon:
+                {
+                SetWaypointIconL( *command == EESMRCmdEnableWaypointIcon );
+                break;
+                }
+            default:
+                {
+                break;
+                }
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ExecuteGenericCommandL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRLocationField::ExecuteGenericCommandL(
+        TInt aCommand )
+    {
+    FUNC_LOG;
+    TBool isUsed( EFalse );
+    switch(aCommand)
+        {
+        case EESMRCmdSizeExceeded:
+            {
+            CESMRGlobalNote::ExecuteL(
+                    CESMRGlobalNote::EESMRCannotDisplayMuchMore );
+
+            HBufC* text = iLocation->GetTextInHBufL();
+            CleanupDeletePushL( text );
+            if ( text )
+                {
+                TInt curPos = iLocation->CursorPos();
+                if ( curPos > iLocation->GetLimitLength() - 1 )
+                    curPos = iLocation->GetLimitLength() - 1;
+                HBufC* newText =
+                    text->Mid( 0, iLocation->GetLimitLength() - 1 ).AllocLC();
+
+                iLocation->SetTextL ( newText );
+                CleanupStack::PopAndDestroy( newText );
+                newText = NULL;
+
+                iLocation->SetCursorPosL( curPos, EFalse );
+                iLocation->HandleTextChangedL();
+                iLocation->UpdateScrollBarsL();
+                SetFocus( ETrue );
+                }
+            CleanupStack::PopAndDestroy( text );
+            isUsed = ETrue;
+            break;
+            }
+        default:
+            break;
+        }
+    return isUsed;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandleSingletapEventL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRLocationField::HandleSingletapEventL( const TPoint& aPosition )
+    {
+    FUNC_LOG;
+    TBool ret( EFalse );
+
+    if( iTitle->Rect().Contains( aPosition ) ||
+            iFieldButton->Rect().Contains( aPosition ) )
+        {
+		HandleTactileFeedbackL();
+        NotifyEventL( EAknSoftkeyContextOptions );
+        ret = ETrue;
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandleLongtapEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::HandleLongtapEventL( const TPoint& aPosition )
+    {
+    FUNC_LOG;
+
+    if ( iLocation->Rect().Contains( aPosition ) )
+        {
+        if ( !iMenu )
+            {
+            iMenu = CMRStylusPopupMenu::NewL( *this );
+            }
+        RArray<CMRStylusPopupMenu::TMenuItem> items;
+        CleanupClosePushL( items );
+
+        HBufC* maps= NULL;
+        HBufC* myLocations = NULL;
+
+        if ( FeaturesL().FeatureSupported(
+                CESMRFeatureSettings::EESMRUIMnFwIntegration ) )
+            {
+            maps = StringLoader::LoadLC(
+                    R_MEET_REQ_OPTIONS_ASSIGN_FROM_MAP,
+                    iCoeEnv );
+            CMRStylusPopupMenu::TMenuItem mapsItem(
+                    *maps,
+                    EESMRCmdAssignFromMap );
+            items.AppendL( mapsItem );
+            }
+
+//#ifdef RD_USE_MYLOCATIONUI
+
+        myLocations = StringLoader::LoadLC(
+                R_MEET_REQ_OPTIONS_MY_LOCATIONS,
+                iCoeEnv );
+
+        CMRStylusPopupMenu::TMenuItem myLocationsItem(
+                *myLocations,
+                EMRCommandMyLocations );
+
+        items.AppendL( myLocationsItem );
+
+//#endif //RD_USE_MYLOCATIONUI
+
+        if ( items.Count() == 1 )
+            {
+            // Only one option. Issue command directly
+            NotifyEventL( items[ 0 ].iCommandId );
+            }
+        else if ( items.Count() > 1 )
+            {
+            iMenu->LaunchPopupL( items.Array(), aPosition );
+            iMenuIsShown = ETrue;
+            }
+
+        if (myLocations )
+            {
+            CleanupStack::PopAndDestroy( myLocations );
+            }
+
+        if ( maps )
+            {
+            CleanupStack::PopAndDestroy( maps );
+            }
+
+        CleanupStack::PopAndDestroy( &items );
+        }
+
+    if( iTitle->Rect().Contains( aPosition ) ||
+            iFieldButton->Rect().Contains( aPosition ) )
+        {
+		HandleTactileFeedbackL();
+        NotifyEventL( EAknSoftkeyContextOptions );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::DynInitMenuPaneL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::DynInitMenuPaneL(
+        TInt aResourceId,
+        CEikMenuPane* aMenuPane )
+    {
+    FUNC_LOG;
+
+    if ( aResourceId == R_MR_EDITOR_ORGANIZER_MENU)
+        {
+        // Init assign options
+        TInt numOptions( 1 ); // My Locations
+
+        if ( FeaturesL().FeatureSupported(
+                CESMRFeatureSettings::EESMRUIMnFwIntegration ) )
+            {
+            ++numOptions;
+            }
+
+        #ifndef RD_USE_MYLOCATIONUI
+        // Disable My Locations
+        --numOptions;
+        #endif // RD_USE_MYLOCATIONUI
+
+        switch ( numOptions )
+            {
+            case 0:
+                {
+                aMenuPane->SetItemDimmed( EESMRCmdAddLocation, ETrue );
+                break;
+                }
+
+            case 1:
+                {
+                // Replace Add location with actual command
+                TInt pos( 0 );
+                CEikMenuPaneItem* item =
+                        aMenuPane->ItemAndPos( EESMRCmdAddLocation, pos );
+
+                item->iData.iCascadeId = 0;
+
+                if ( FeaturesL().FeatureSupported(
+                        CESMRFeatureSettings::EESMRUIMnFwIntegration ) )
+                    {
+                    item->iData.iCommandId = EESMRCmdAssignFromMap;
+                    StringLoader::Load(item->iData.iText,
+                            R_MEET_REQ_OPTIONS_ASSIGN_FROM_MAP, iCoeEnv );
+                    }
+
+#ifdef RD_USE_MYLOCATIONUI
+                else
+                    {
+                    item->iData.iCommandId = EMRCommandMyLocations;
+                    StringLoader::Load( item->iData.iText,
+                            R_MEET_REQ_OPTIONS_MY_LOCATIONS, iCoeEnv );
+                    }
+#endif //RD_USE_MYLOCATIONUI
+
+                aMenuPane->SetItemDimmed( item->iData.iCommandId, EFalse );
+                break;
+                }
+            default:
+                {
+                aMenuPane->SetItemDimmed( EESMRCmdAddLocation, EFalse );
+                break;
+                }
+            }
+        // Init Show/Search options
+        TBool showOnMap( EFalse );
+        TBool searchFromMap( EFalse );
+
+        if ( iWaypointIcon )
+            {
+            // Coordinates available -> show on map
+            showOnMap = ETrue;
+            }
+        else
+            {
+            HBufC* text = iLocation->GetTextInHBufL();
+            if ( text && *text != iLocation->DefaultText() )
+                {
+                // Edited text in field -> enable search from map
+                searchFromMap = ETrue;
+                }
+            delete text;
+            }
+
+        aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap );
+        aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, !searchFromMap );
+        }
+    else if ( aResourceId == R_MR_EDITOR_LOCATION_MENU )
+        {
+        if ( !FeaturesL().FeatureSupported(
+                CESMRFeatureSettings::EESMRUIMnFwIntegration ) )
+            {
+            aMenuPane->SetItemDimmed( EESMRCmdAssignFromMap, ETrue );
+            }
+#ifndef RD_USE_MYLOCATIONUI
+        aMenuPane->SetItemDimmed( EMRCommandMyLocations, ETrue );
+#endif //RD_USE_MYLOCATIONUI
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::SetContainerWindowL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::SetContainerWindowL(
+        const CCoeControl& aContainer )
+    {
+    FUNC_LOG;
+    CCoeControl::SetContainerWindowL( aContainer );
+
+    iLocation->SetContainerWindowL( aContainer );
+    iLocation->SetParent( this );
+
+    iTitle->SetContainerWindowL( aContainer );
+    iTitle->SetParent( this );
+
+    iFieldButton->SetContainerWindowL(aContainer);
+    iFieldButton->SetParent(this);
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::OfferKeyEventL()
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRLocationField::OfferKeyEventL(
+        const TKeyEvent& aEvent,
+        TEventCode aType )
+    {
+    FUNC_LOG;
+    TKeyResponse response( EKeyWasNotConsumed );
+    response = iLocation->OfferKeyEventL ( aEvent, aType );
+
+    if ( aType == EEventKey &&
+         ( aEvent.iScanCode != EStdKeyUpArrow &&
+           aEvent.iScanCode != EStdKeyDownArrow ))
+        {
+        iLocation->DrawDeferred();
+        }
+
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::HandlePointerEventL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRLocationField::HandleRawPointerEventL( const TPointerEvent &aPointerEvent )
+    {
+    if ( !iMenuIsShown )
+        {
+        CCoeControl::HandlePointerEventL( aPointerEvent );
+        }
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRLocationField::ProcessCommandL
+// ---------------------------------------------------------------------------
+//
+void CESMRLocationField::ProcessCommandL( TInt aCommandId )
+    {
+    NotifyEventL( aCommandId );
+
+    iMenuIsShown = EFalse;
+    }
+// EOF