meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp
branchRCL_3
changeset 12 4ce476e64c59
child 13 8592a65ad3fb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,1040 @@
+/*
+* 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:  MR attahcment field implementation
+ *
+ */
+#include "cmrattachmentsfield.h"
+
+#include "mesmrlistobserver.h"
+#include "mesmrmeetingrequestentry.h"
+#include "cmrlabel.h"
+#include "nmrlayoutmanager.h"
+#include "nmrbitmapmanager.h"
+#include "cmrimage.h"
+#include "cesmrrichtextviewer.h"
+#include "cesmreditor.h"
+#include "cesmrrichtextlink.h"
+#include "cmrattachmentcommandhandler.h"
+
+#include <aknsbasicbackgroundcontrolcontext.h>
+#include <calentry.h>
+#include <calattachment.h>
+#include <stringloader.h>
+#include <esmrgui.rsg>
+#include <gulicon.h>
+#include <ct/rcpointerarray.h>
+#include <aknbiditextutils.h>
+
+// DEBUG
+#include "emailtrace.h"
+
+
+// unnamed namespace for local definitions
+namespace { // codescanner::namespace
+//CONSTANTS
+
+// TODO: Read default text from resource
+_LIT( KAddAttachment, "Add attachment" );
+_LIT( KNewLine, "\f" );
+
+const TInt KOneKiloByte( 1024 );
+const TInt KOneMegaByte( 1048576 ); // (1024^2 or 2^20):
+const TInt KMargin = 5;
+
+/**
+ * Checks that command is valid attachment viewer command.
+ * @param aCommmand Command ID
+ */
+TBool IsValidAttachmentEditorCommand( TInt aCommand )
+    {
+    TBool ret( EFalse );
+
+    switch( aCommand )
+        {
+        case EESMREditorOpenAttachment:
+        case EESMREditorRemoveAttachment:
+        case EESMREditorRemoveAllAttachments:
+        case EESMREditorAddAttachment:
+            ret = ETrue;
+            break;
+
+        default:
+            ret = EFalse;
+            break;
+        }
+
+    return ret;
+    }
+
+}//namespace
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::CMRAttachmentsField
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentsField::CMRAttachmentsField()
+    {
+    FUNC_LOG;
+    SetFocusType( EESMRHighlightFocus );
+    SetFieldId( EESMRFieldAttachments );
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::~CMRAttachmentsField
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentsField::~CMRAttachmentsField( )
+    {
+    FUNC_LOG;
+    delete iBgCtrlContext;
+    delete iFieldIcon;
+    delete iTitle;
+    delete iAttCommandHandler;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::NewL
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentsField* CMRAttachmentsField::NewL()
+    {
+    FUNC_LOG;
+    CMRAttachmentsField* self = new( ELeave )CMRAttachmentsField();
+    CleanupStack::PushL ( self );
+    self->ConstructL();
+    CleanupStack::Pop ( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::ConstructL()
+    {
+    FUNC_LOG;
+
+    SetComponentsToInheritVisibility( ETrue );
+
+    iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAttachment );
+    iFieldIcon->SetParent( this );
+
+    iTitle = CMRLabel::NewL();
+    iTitle->SetParent( this );
+
+    iRichTextViewer = CESMRRichTextViewer::NewL( this );
+    CESMRField::ConstructL( iRichTextViewer ); // ownership transferred
+    iRichTextViewer->SetEdwinSizeObserver ( this );
+    iRichTextViewer->SetLinkObserver (this );
+    iRichTextViewer->SetParent( this );
+
+    // TODO: read from resource
+    iTitle->SetTextL( KAddAttachment );
+
+    // Draw bg instead of using skin bg
+    TRect tempRect( 0, 0, 0, 0 );
+    NMRBitmapManager::TMRBitmapStruct bitmapStruct;
+    bitmapStruct = NMRBitmapManager::GetBitmapStruct(
+            NMRBitmapManager::EMRBitmapInputCenter );
+
+    iBgCtrlContext = CAknsBasicBackgroundControlContext::NewL(
+                bitmapStruct.iItemId,
+                tempRect,
+                EFalse );
+
+    iRichTextViewer->SetSkinBackgroundControlContextL( iBgCtrlContext );
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::MinimumSize
+// ---------------------------------------------------------------------------
+//
+TSize CMRAttachmentsField::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, iRichTextSize.iHeight - textRect.Height() );
+
+    // Add title area to the required size
+    TSize titleSize( CESMRField::MinimumSize() );
+
+    TSize completeFieldSize( titleSize );
+    if( iAttachmentCount )
+        {
+        completeFieldSize.iHeight += richTextRect.Height();
+        }
+
+    return completeFieldSize;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::InitializeL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::InitializeL()
+    {
+    FUNC_LOG;
+    TAknLayoutText layoutText =
+        NMRLayoutManager::GetLayoutText( Rect(),
+                NMRLayoutManager::EMRTextLayoutTextEditor );
+    iRichTextViewer->SetFontL( layoutText.Font() );
+    if( iAttachmentCount > 1 )
+        {
+        iRichTextViewer->SetLineSpacingL( LineSpacing() );
+        }
+    iRichTextViewer->ApplyLayoutChangesL();
+
+    //wake up current contact menu selection by calling this
+    iRichTextViewer->FocusChanged( ENoDrawNow );
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::InternalizeL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::InternalizeL( MESMRCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    iEntry = &aEntry;
+
+    if ( aEntry.SupportsCapabilityL( MESMRCalEntry::EMRCapabilityAttachments ) )
+        {
+        UpdateAttachmentsListL();
+
+        //wake up current contact menu selection by calling this
+        iRichTextViewer->FocusChanged( ENoDrawNow );
+
+        iDisableRedraw = ETrue;
+        }
+    else
+        {
+        // Field does not support attachments --> Remove field from UI.
+        iObserver->HideControl( EESMRFieldAttachments );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::ExternalizeL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::ExternalizeL( MESMRCalEntry& /*aEntry*/ )
+    {
+    FUNC_LOG;
+    // No implementation
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::CountComponentControls
+// ---------------------------------------------------------------------------
+//
+TInt CMRAttachmentsField::CountComponentControls( ) const
+    {
+    FUNC_LOG;
+    TInt count( 0 );
+    if ( iFieldIcon )
+        {
+        ++count;
+        }
+
+    if ( iRichTextViewer )
+        {
+        ++count;
+        }
+    if ( iTitle )
+        {
+        ++count;
+        }
+
+    return count;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::ComponentControl
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CMRAttachmentsField::ComponentControl( TInt aInd ) const
+    {
+    FUNC_LOG;
+    switch ( aInd )
+        {
+        case 0:
+            return iRichTextViewer;
+        case 1:
+            return iFieldIcon;
+        case 2:
+            return iTitle;
+        default:
+            return NULL;
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::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( iFieldIcon )
+        {
+        TAknWindowComponentLayout iconLayout(
+                NMRLayoutManager::GetWindowComponentLayout(
+                    NMRLayoutManager::EMRLayoutTextEditorIcon ) );
+        AknLayoutUtils::LayoutControl(
+                iFieldIcon, firstRowRect, iconLayout );
+        }
+
+    // Layout field title
+    if( iTitle )
+        {
+        TAknLayoutText labelLayout(
+                NMRLayoutManager::GetLayoutText(
+                        firstRowRect,
+                            NMRLayoutManager::EMRTextLayoutTextEditor ) );
+
+        iTitle->SetRect( labelLayout.TextRect() );
+
+        // Setting font also for the label. Failures are ignored.
+        TRAP_IGNORE( iTitle->SetFont( labelLayout.Font() ) );
+        }
+
+    TRect edwinRect( 0, 0, 0, 0 );
+
+    // Layout field editor
+    if( iRichTextViewer )
+        {
+        TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText(
+                secondRowRect,
+                NMRLayoutManager::EMRTextLayoutTextEditor );
+
+        edwinRect = layoutText.TextRect();
+
+        // Resize height according to actual height required by edwin.
+        edwinRect.Resize( 0, iRichTextSize.iHeight - edwinRect.Height() );
+
+        iRichTextViewer->SetRect( edwinRect );
+
+        // Try setting font. Failures are ignored.
+        TRAP_IGNORE(
+                iRichTextViewer->SetFontL( layoutText.Font() );
+                if( iAttachmentCount > 1 )
+                    {
+                    iRichTextViewer->SetLineSpacingL( LineSpacing() );
+                    }
+                iRichTextViewer->ApplyLayoutChangesL();
+                );
+        }
+
+    // Layouting focus
+    TRect bgRect( 0, 0, 0, 0 );
+    // No attachments -> Focus to the title
+    if( iAttachmentCount == 0 )
+        {
+        TAknLayoutRect bgLayoutRect =
+            NMRLayoutManager::GetLayoutRect(
+                    firstRowRect, NMRLayoutManager::EMRLayoutTextEditorBg );
+        bgRect = bgLayoutRect.Rect();
+        }
+    // One attachment -> Focus to the attachment according to layout data
+    if( iAttachmentCount == 1 )
+        {
+        TAknLayoutRect bgLayoutRect =
+            NMRLayoutManager::GetLayoutRect(
+                    secondRowRect, NMRLayoutManager::EMRLayoutTextEditorBg );
+        bgRect = bgLayoutRect.Rect();
+        }
+    // More than one attachements -> Focus calculated manually
+    if( iAttachmentCount > 1 )
+        {
+        bgRect.SetRect(
+                TPoint( edwinRect.iTl.iX,
+                        edwinRect.iTl.iY - FocusMargin() ),
+                TPoint( edwinRect.iBr.iX,
+                        edwinRect.iBr.iY + FocusMargin() ) );
+        }
+
+    // Move focus rect so that it's relative to field's position.
+    bgRect.Move( -Position() );
+    SetFocusRect( bgRect );
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CMRAttachmentsField::OfferKeyEventL(
+        const TKeyEvent& aEvent,
+        TEventCode aType )
+    {
+    FUNC_LOG;
+    TKeyResponse response( EKeyWasNotConsumed );
+
+    if( iAttachmentCount == 0 )
+        {
+        response = iTitle->OfferKeyEventL( aEvent, aType );
+        }
+
+    if( iAttachmentCount > 0 )
+        {
+        response = iRichTextViewer->OfferKeyEventL( aEvent, aType );
+        }
+
+    if ( aType == EEventKey &&
+            ( aEvent.iScanCode != EStdKeyUpArrow &&
+              aEvent.iScanCode != EStdKeyDownArrow ))
+        {
+        iTitle->DrawDeferred(); // ??
+        }
+    return response;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::SetContainerWindowL()
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::SetContainerWindowL( const CCoeControl& aControl )
+    {
+    FUNC_LOG;
+    CESMRField::SetContainerWindowL( aControl );
+    iRichTextViewer->SetContainerWindowL( aControl );
+    iRichTextViewer->SetParent( this );
+    iTitle->SetContainerWindowL( aControl );
+    iTitle->SetParent( this );
+    iFieldIcon->SetContainerWindowL( aControl );
+    iFieldIcon->SetParent( this );
+
+    iButtonGroupContainer = CEikButtonGroupContainer::Current();
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::HandleEdwinSizeEventL
+// ---------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
+        TEdwinSizeEvent /*aType*/, TSize aSize )
+    {
+    FUNC_LOG;
+    TBool reDraw( EFalse );
+
+    if( iRichTextSize.iHeight != aSize.iHeight && iAttachmentCount > 0 )
+        {
+        // Let's save the required size of the rich text viewer
+        iRichTextSize = aSize;
+
+        if ( iObserver && aEdwin == iRichTextViewer )
+           {
+           iObserver->ControlSizeChanged( this );
+           reDraw = ETrue;
+           }
+        }
+
+    return reDraw;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::ListObserverSet
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::ListObserverSet()
+    {
+    FUNC_LOG;
+    iRichTextViewer->SetListObserver( iObserver );
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::ExecuteGenericCommandL
+// ---------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::ExecuteGenericCommandL( TInt aCommand )
+    {
+    FUNC_LOG;
+    // TODO: Changes from other fields have to be implemented here
+    TBool handled( EFalse );
+
+    // From cesmrattachmentfield
+    if( aCommand == EAknCmdOpen )
+        {
+        handled = ETrue;
+		HandleTactileFeedbackL();
+        }
+    else if ( aCommand == EESMREditorAddAttachment )
+        {
+        handled = AddAttachmentL();
+        if( handled )
+        	{
+			HandleTactileFeedbackL();
+        	}
+        }
+
+    else if ( IsValidAttachmentEditorCommand(aCommand) &&
+            iAttCommandHandler )
+        {
+        const CESMRRichTextLink* currentLink = iRichTextViewer->GetSelectedLink();
+
+        ASSERT( currentLink );
+
+        iAttCommandHandler->HandleAttachmentCommandL(
+                aCommand,
+                *currentLink );
+        
+		HandleTactileFeedbackL();
+
+        handled = ETrue;
+
+        if( aCommand == EESMREditorRemoveAttachment ||
+                aCommand == EESMREditorRemoveAllAttachments )
+            {
+            // Attachment list needs to be updated after removing
+            // attachment(s)
+            UpdateAttachmentsListL();
+
+            //wake up current contact menu selection by calling this
+            iRichTextViewer->FocusChanged( ENoDrawNow );
+
+            if( iAttachmentCount == 0 )
+                {
+                // If no attachments are present anymore, let's hide the
+                // whole rich text viewer.
+                iRichTextViewer->MakeVisible( EFalse );
+
+                // Because rich text part is removed from the UI,
+                // we need to inform the parent, to re-size the
+                // field container and re-initialize the physics
+                // world size
+                iObserver->ControlSizeChanged( this );
+                }
+            }
+        }
+
+    return handled;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::SetOutlineFocusL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::SetOutlineFocusL( TBool aFocus )
+    {
+    FUNC_LOG;
+    CESMRField::SetOutlineFocusL( aFocus );
+
+    if ( aFocus )
+        {
+        if ( iAttachmentCount )
+            {
+            ChangeMiddleSoftKeyL(
+                    EAknSoftkeyContextOptions,
+                    R_QTN_MSK_OPEN );
+            }
+        else
+            {
+            ChangeMiddleSoftKeyL(
+                    EESMREditorAddAttachment,
+                    R_QTN_MSK_ADD );
+
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentsField::HandleRichTextLinkSelection
+// -----------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::HandleRichTextLinkSelection(
+        const CESMRRichTextLink* aLink )
+    {
+    FUNC_LOG;
+    TBool ret( EFalse );
+
+    // Open context menu in editor and viewer modes with link selection
+    if ( aLink->Type() == CESMRRichTextLink::ETypeAttachment )
+        {
+        TRAP_IGNORE( NotifyEventL( EMRLaunchAttachmentContextMenu ));
+        ret = ETrue;
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentsField::UpdateAttachmentsListL
+// -----------------------------------------------------------------------------
+//
+void CMRAttachmentsField::UpdateAttachmentsListL()
+    {
+    FUNC_LOG;
+
+    RBuf buffer; // codescanner::resourcenotoncleanupstack
+    buffer.CleanupClosePushL();
+
+    RCPointerArray<CESMRRichTextLink> attachmentLinks;
+    CleanupClosePushL( attachmentLinks );
+
+    iAttachmentCount = iEntry->Entry().AttachmentCountL();
+
+    TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText(
+            Rect(),
+            NMRLayoutManager::EMRTextLayoutTextEditor );
+
+    attachmentLinks.ReserveL( iAttachmentCount );
+    for ( TInt i = 0; i < iAttachmentCount; ++i )
+        {
+        CCalAttachment* att = iEntry->Entry().AttachmentL( i ); // Ownership not gained
+
+        // Reducing space required by file size information from
+        // max line width, so that file name can be trimmed to correct
+        // length
+        TInt maxLineWidth = MinimumSize().iWidth;
+        const CFont* font = layoutText.Font();
+
+        HBufC* attachmentSize = AttachmentNameAndSizeL( KNullDesC(), *att );
+        TInt attachmentSizeLength = attachmentSize->Length();
+        maxLineWidth -= font->TextWidthInPixels( *attachmentSize );
+        delete attachmentSize;
+        attachmentSize = NULL;
+
+        // TODO: correct icon zise to correct one. Ask from UI specifier.
+        TSize iconSize( 20, 20);
+        maxLineWidth -= iconSize.iWidth;
+
+        // Trimming file name to fit to one line
+        TPtrC text = att->Label();
+        HBufC* clippedTextHBufC = ClipTextLC( text, *font, maxLineWidth );
+        TPtr clippedText = clippedTextHBufC->Des();
+        clippedText.Trim();
+
+        if ( clippedText.Length() > 0 )
+            {
+            // Creating rich text link
+            CESMRRichTextLink* link = CESMRRichTextLink::NewL(
+                    buffer.Length(),
+                    clippedText.Length() + attachmentSizeLength,
+                    text,
+                    CESMRRichTextLink::ETypeAttachment,
+                    CESMRRichTextLink::ETriggerKeyRight );
+            CleanupStack::PushL( link );
+            attachmentLinks.AppendL( link );
+            CleanupStack::Pop( link );
+
+            HBufC* buf = AttachmentNameAndSizeL( clippedText, *att );
+            CleanupStack::PushL( buf );
+
+            // Append attachment name and size with line feed to buffer
+            buffer.ReAllocL( buffer.Length() +
+                             clippedText.Length() +
+                             buf->Length() +
+                             KNewLine().Length() );
+
+            buffer.Append( buf->Des() );
+            buffer.Append( KNewLine );
+
+            CleanupStack::PopAndDestroy( buf );
+            }
+
+        CleanupStack::PopAndDestroy( clippedTextHBufC );
+        }
+
+    // Remove unnecessary new line from the end of buffer.
+    if ( buffer.Length() >= KNewLine().Length() )
+        {
+        buffer.SetLength( buffer.Length() - KNewLine().Length() );
+        }
+
+    // Adding all rich text links to the rich text viewer
+    if ( buffer.Length() > 0 )
+        {
+        iRichTextViewer->SetTextL( &buffer );
+        iRichTextViewer->SetFontL( layoutText.Font() );
+        if( iAttachmentCount > 1 )
+            {
+            iRichTextViewer->SetLineSpacingL( LineSpacing() );
+            }
+        iRichTextViewer->ApplyLayoutChangesL();
+        iRichTextViewer->SetMargins( KMargin ); // What's this?
+        iRichTextViewer->HandleTextChangedL();
+
+        while ( attachmentLinks.Count() > 0 )
+            {
+            CESMRRichTextLink* link = attachmentLinks[0];
+            CleanupStack::PushL( link );
+            attachmentLinks.Remove( 0 );
+            iRichTextViewer->AddLinkL( link );
+            CleanupStack::Pop( link );
+            }
+        }
+
+    CleanupStack::PopAndDestroy( &attachmentLinks );
+    CleanupStack::PopAndDestroy( &buffer );
+
+    if ( iAttachmentCount )
+        {
+        iRichTextViewer->MakeVisible( ETrue );
+
+        iObserver->ControlSizeChanged( this );
+
+        ChangeMiddleSoftKeyL(
+                EAknSoftkeyContextOptions,
+                R_QTN_MSK_OPEN );
+
+        delete iAttCommandHandler;
+        iAttCommandHandler = NULL;
+
+        iAttCommandHandler =
+                CMRAttachmentCommandHandler::NewL(
+                        iEntry->Entry(),
+                        *iEventQueue );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentsField::ClipTextLC
+// -----------------------------------------------------------------------------
+//
+HBufC* CMRAttachmentsField::ClipTextLC(
+        const TDesC& aText, const CFont& aFont, TInt aWidth )
+    {
+    FUNC_LOG;
+    HBufC* text = HBufC::NewLC( aText.Length() + KAknBidiExtraSpacePerLine );
+    TPtr textPtr = text->Des();
+    AknBidiTextUtils::ConvertToVisualAndClip(
+            aText, textPtr, aFont, aWidth, aWidth );
+    return text;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::AttachmentOperationCompleted
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::AttachmentOperationCompleted(
+        MDesC16Array& /*aArray*/ )
+    {
+    TRAPD( error, UpdateAttachmentsListL() );
+    if( error != KErrNone )
+        {
+        // Error occured, could not update the field
+        iCoeEnv->HandleError( error );
+        }
+
+    delete iAttachmentUi;
+    iAttachmentUi = NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::AttachmentNameAndSizeL
+// ---------------------------------------------------------------------------
+//
+HBufC* CMRAttachmentsField::AttachmentNameAndSizeL(
+        const TDesC& aDes,
+        const CCalAttachment& aAttachment )
+    {
+    HBufC* stringholder;
+
+    CDesCArrayFlat* attachmentStrings =
+        new(ELeave)CDesCArrayFlat( 1 );
+    CleanupStack::PushL( attachmentStrings );
+
+    CArrayFixFlat<TInt>* integers =
+        new (ELeave) CArrayFixFlat<TInt>(1);
+    CleanupStack::PushL( integers );
+
+    TInt attachmentSize = aAttachment.FileAttachment()->Size();
+
+    if ( attachmentSize >= KOneMegaByte )
+        {
+        attachmentStrings->AppendL( aDes );
+
+        integers->AppendL( attachmentSize / KOneMegaByte );
+
+        stringholder = StringLoader::LoadLC(
+                R_MEET_REQ_ATTACHMENT_FILE_MEGABYTE,
+                *attachmentStrings,
+                *integers );
+        }
+    else if (( attachmentSize < KOneKiloByte ) && (attachmentSize != 0))
+        {
+        attachmentStrings->AppendL( aDes );
+
+        stringholder = StringLoader::LoadLC(
+                R_MEET_REQ_ATTACHMENT_FILE_LESS_THAN_KILOBYTE,
+                *attachmentStrings);
+        }
+    else
+        {
+        attachmentStrings->AppendL( aDes );
+
+        integers->AppendL( attachmentSize / KOneKiloByte );
+
+        stringholder = StringLoader::LoadLC(
+                R_MEET_REQ_ATTACHMENT_FILE_KILOBYTE,
+                *attachmentStrings,
+                *integers );
+        }
+
+    CleanupStack::Pop( stringholder );
+    CleanupStack::PopAndDestroy( integers );
+    CleanupStack::PopAndDestroy( attachmentStrings );
+
+    return stringholder;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::AddAttachmentL
+// ---------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::AddAttachmentL()
+    {
+    TBool ret( EFalse );
+
+    if( iEntry )
+        {
+        if ( !iAttachmentUi )
+            {
+            iAttachmentUi = CMRAttachmentUi::NewL();
+            }
+
+        iAttachmentUi->SetObserver( *this );
+        TInt error( iAttachmentUi->LaunchFetchUi( *iEntry ) );
+        ret = ETrue;
+        if( error != KErrNone )
+            {
+            iCoeEnv->HandleError( error );
+            ret = EFalse;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::HandleSingletapEventL
+// ---------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::HandleSingletapEventL( const TPoint& aPosition )
+    {
+    FUNC_LOG;
+    TBool ret( EFalse );
+
+    // When there are no attachments, the whole field area
+    // will execute single tap the action
+    if( iAttachmentCount == 0 )
+        {
+        if( Rect().Contains( aPosition ) )
+            {
+            ret = AddAttachmentL();
+            if( ret )
+            	{
+				HandleTactileFeedbackL();
+            	}
+            }
+        }
+    // Otherwise only the title and the fieldIcon will
+    // execute the single tap action
+    else
+        {
+        if( iTitle->Rect().Contains( aPosition ) ||
+                iFieldIcon->Rect().Contains( aPosition ) )
+            {
+            ret = AddAttachmentL();
+            if( ret )
+            	{
+				HandleTactileFeedbackL();
+            	}
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::HandleLongtapEventL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::HandleLongtapEventL( const TPoint& aPosition )
+    {
+    // When there are no attachments, the whole field area
+    // will execute long tap the action
+    if( iAttachmentCount == 0 )
+        {
+        if( Rect().Contains( aPosition ) )
+            {
+            if( AddAttachmentL() )
+            	{
+				HandleTactileFeedbackL();
+            	}
+            }
+        }
+    else
+        {
+        if ( iRichTextViewer->Rect().Contains( aPosition ) )
+            {
+            if( iRichTextViewer->LinkSelectedL() )
+            	{
+				HandleTactileFeedbackL();
+            	}
+            }
+
+        if( iTitle->Rect().Contains( aPosition ) ||
+                iFieldIcon->Rect().Contains( aPosition ) )
+            {
+            if( AddAttachmentL() )
+            	{
+				HandleTactileFeedbackL();
+            	}
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::HandleRawPointerEventL
+// ---------------------------------------------------------------------------
+//
+TBool CMRAttachmentsField::HandleRawPointerEventL(
+        const TPointerEvent& aPointerEvent )
+    {
+    FUNC_LOG;
+    TBool ret( EFalse );
+
+    if( iAttachmentCount > 0 &&
+        aPointerEvent.iType == TPointerEvent::EButton1Up )
+        {
+        if( iRichTextViewer->Rect().Contains( aPointerEvent.iPosition ) )
+            {
+            iRichTextViewer->HandlePointerEventL( aPointerEvent );
+            ret = ETrue;
+            }
+        }
+
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::DynInitMenuPaneL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentsField::DynInitMenuPaneL(
+             TInt aResourceId,
+             CEikMenuPane* aMenuPane )
+    {
+    FUNC_LOG;
+
+    if ( R_MR_EDITOR_ATTACHMENT_MENU == aResourceId )
+        {
+        if ( !iAttachmentCount )
+            {
+            aMenuPane->SetItemDimmed(
+                    EESMREditorOpenAttachment,
+                    ETrue );
+
+            aMenuPane->SetItemDimmed(
+                    EESMREditorRemoveAttachment,
+                    ETrue );
+
+            aMenuPane->SetItemDimmed(
+                    EESMREditorRemoveAllAttachments,
+                    ETrue );
+            }
+        else if ( iAttachmentCount == 1 )
+            {
+            aMenuPane->SetItemDimmed(
+                    EESMREditorRemoveAllAttachments,
+                    ETrue );
+
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::LineSpacing
+// ---------------------------------------------------------------------------
+//
+TInt CMRAttachmentsField::LineSpacing()
+    {
+    FUNC_LOG;
+    // Calculates the line spacing based on default one line layout data
+    TInt lineSpacing( 0 );
+
+    TRect rect( Rect() );
+
+    TAknLayoutRect rowLayoutRect =
+        NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 );
+    TRect rowRect = rowLayoutRect.Rect();
+
+    TAknLayoutText labelLayout =
+     NMRLayoutManager::GetLayoutText(
+             rect, NMRLayoutManager::EMRTextLayoutTextEditor );
+
+    TRect defaultTextRect = labelLayout.TextRect();
+
+    TInt difference = rowRect.Height() - defaultTextRect.Height();
+
+    lineSpacing = difference * 2;
+
+    return lineSpacing;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentsField::FocusMargin
+// ---------------------------------------------------------------------------
+//
+TInt CMRAttachmentsField::FocusMargin()
+    {
+    FUNC_LOG;
+    // Calculates focus margin based on default one line layout data
+    TInt focusMagin( 0 );
+
+    TRect rect( Rect() );
+
+    TAknLayoutRect rowLayoutRect =
+        NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 );
+    TRect rowRect = rowLayoutRect.Rect();
+
+    TAknLayoutText labelLayout =
+     NMRLayoutManager::GetLayoutText(
+             rect, NMRLayoutManager::EMRTextLayoutTextEditor );
+
+    TRect defaultTextRect = labelLayout.TextRect();
+
+    TAknLayoutRect bgLayoutRect =
+        NMRLayoutManager::GetLayoutRect(
+                rect, NMRLayoutManager::EMRLayoutTextEditorBg );
+    TRect defaultBgRect( bgLayoutRect.Rect() );
+
+    TInt difference = defaultBgRect.Height() - defaultTextRect.Height();
+
+    focusMagin = TReal( difference / 2 );
+
+    return focusMagin;
+    }
+
+//EOF