emailuis/emailui/src/ncscomposeviewcontainer.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/src/ncscomposeviewcontainer.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,1968 @@
+/*
+* Copyright (c) 2007 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:  compose view container
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "emailtrace.h"
+#include <s32mem.h>
+#include <txtrich.h>
+#include <AknIconUtils.h>
+#include <StringLoader.h>
+#include <avkon.hrh>
+#include <AknsDrawUtils.h>
+#include <aknview.h>
+#include <AknUtils.h>
+#include <FreestyleEmailUi.rsg>
+#include <eikclbd.h>
+#include <aknViewAppUi.h>
+#include <aknnotewrappers.h> //CAknInformationNote
+#include <txtetext.h>
+#include <aknphysics.h>
+
+#include "ncscomposeviewcontainer.h"
+#include "ncsheadercontainer.h"
+#include "ncsaddressinputfield.h"
+#include "ncssubjectfield.h"
+#include "ncsconstants.h"
+#include "ncseditor.h"
+#include "ncspopuplistbox.h"
+#include "ncscomposeview.h"
+#include "ncsutility.h"
+#include "ncsemailaddressobject.h"
+#include "FreestyleEmailUiUtilities.h"
+#include "FreestyleEmailUiConstants.h"
+#include "FreestyleEmailUiSendAttachmentsListControl.h"
+#include "FreestyleEmailUiSendAttachmentsListVisualiser.h"
+#include "FreestyleEmailUiSendAttachmentsListModel.h"
+#include "FreestyleEmailUi.hrh"
+#include "FSAutoSaver.h"
+#include "FreestyleEmailUiCLSItem.h"
+
+
+// ========================= MEMBER FUNCTIONS ==================================
+
+// ---------------------------------------------------------------------------
+// constructor
+// ---------------------------------------------------------------------------
+//
+CNcsComposeViewContainer::CNcsComposeViewContainer(
+    CNcsComposeView& aView,
+    CFsAutoSaver& aAutoSaver,
+	CFSMailBox& aMailBox ):
+	iView( aView ), iAmountMesFieldMovedUp( 0 ),
+	iAutoSaver( aAutoSaver ), iMailBox( aMailBox )
+    {
+    FUNC_LOG;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::NewL()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CNcsComposeViewContainer* CNcsComposeViewContainer::NewL( CNcsComposeView& aView,
+    const TRect& aRect, CFSMailBox& aMailBox, CFsAutoSaver& aAutoSaver,
+    TInt aFlags )
+    {
+    FUNC_LOG;
+
+    CNcsComposeViewContainer* self = new ( ELeave ) CNcsComposeViewContainer(
+        aView, aAutoSaver, aMailBox );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect, aFlags );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::ConstructL()
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::ConstructL( const TRect& aRect, TInt aFlags )
+    {
+    FUNC_LOG;
+
+    SetMopParent( &iView );
+    CreateWindowL();
+	// <cmail>
+    // iApplicationRect = aRect;
+	// </cmail>
+
+    // Setup the control array
+    InitComponentArrayL();
+    CCoeControlArray& controls = Components();
+    controls.SetControlsOwnedExternally( ETrue );
+
+    // Create the header field
+    iHeader = CNcsHeaderContainer::NewL( *this, iMailBox, aFlags );
+    controls.AppendLC( iHeader );
+    CleanupStack::Pop( iHeader );
+
+    // Create 'message body' field, default text is empty for that field
+    iMessageField = new ( ELeave ) CNcsEditor( this, EFalse, ENcsEditorBody );
+    iMessageField->SetContainerWindowL( *this );
+    iMessageField->ConstructL( this, 0, 0 );
+    iMessageField->SetAlignment( EAknEditorAlignBidi );
+    iMessageField->SetAknEditorInputMode( EAknEditorTextInputMode );
+    controls.AppendLC( iMessageField );
+    CleanupStack::Pop( iMessageField );
+
+    // <cmail> Platform layout change
+    iMessageField->SetNcsFontType( NcsUtility::ENcsBodytextFont );
+    // </cmail>
+
+    // Listen edwin events and size events from message body field
+    iMessageField->AddEdwinObserverL( this );
+    iMessageField->SetEdwinSizeObserver( this );
+
+    // Create read-only field to be used for original message quote when
+    // protocol doesn't allow editing the original message
+    iReadOnlyQuoteField = new( ELeave ) CNcsEditor( this, EFalse );
+    iReadOnlyQuoteField->SetContainerWindowL( *this );
+    iReadOnlyQuoteField->ConstructL( this, 0, 0 );
+    iReadOnlyQuoteField->SetAlignment( EAknEditorAlignBidi );
+    iReadOnlyQuoteField->SetReadOnly( ETrue );
+    controls.AppendLC( iReadOnlyQuoteField );
+    CleanupStack::Pop( iReadOnlyQuoteField );
+
+    // Listen edwin events and size events from smart quote field
+    iReadOnlyQuoteField->AddEdwinObserverL( this );
+    iReadOnlyQuoteField->SetEdwinSizeObserver( this );
+
+    // Create the scroll bar
+    iScrollBar = new( ELeave ) CAknDoubleSpanScrollBar( this );
+    iScrollBar->ConstructL( this, this, CEikScrollBar::EVertical, aRect.Height() );
+    iScrollBar->MakeVisible( ETrue );
+    iScrollBar->SetModelL( &iScrollBarModel );
+
+    iMessageField->SetupEditorL();
+    iReadOnlyQuoteField->SetupEditorL();
+
+    SetRect( aRect );
+
+    //<cmail> S60 skin support
+    iBgContext = CAknsBasicBackgroundControlContext::NewL(
+        KAknsIIDQsnBgAreaMain, Rect(), EFalse );
+    // <cmail>
+	//iMessageField->SetSkinBackgroundControlContextL( iBgContext );
+	// </cmail>
+    iLongTapDetector = CAknLongTapDetector::NewL( this );
+    //</cmail>
+
+    UpdateScrollBarL();
+
+    ActivateL();
+
+    // activate auto save functionality
+    iAutoSaver.Enable( ETrue );
+
+    if ( CAknPhysics::FeatureEnabled() )
+        {
+        iPhysics = CAknPhysics::NewL( *this, this );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CNcsComposeViewContainer::~CNcsComposeViewContainer
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CNcsComposeViewContainer::~CNcsComposeViewContainer()
+    {
+    FUNC_LOG;
+    if ( iContactHandler )
+        {
+        iContactHandler->ClearObservers();
+        }
+	delete iHeader;
+    delete iScrollBar;
+    delete iMessageField;
+    // <cmail>
+    delete iBgContext;
+	delete iLongTapDetector;
+    // </cmail>
+    delete iReadOnlyQuoteField;
+    delete iReadOnlyQuote;
+
+    delete iPhysics;
+    iPhysics = NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::FocusChanged
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::FocusChanged(TDrawNow aDrawNow)
+    {
+    FUNC_LOG;
+
+	if ( iFocused != iHeader &&
+	     iFocused != iMessageField &&
+	     iFocused != iReadOnlyQuoteField )
+        {
+		iFocused = iHeader;
+        }
+	iFocused->SetFocus( ETrue, aDrawNow );
+	// <cmail>
+	iView.HandleContainerChangeRequiringToolbarRefresh();
+	// </cmail>
+	if ( aDrawNow )
+	    {
+		DrawNow();
+	    }
+
+    }
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetMskL()
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetMskL()
+    {
+    FUNC_LOG;
+    iHeader->SetMskL();
+    }
+
+//<cmail>
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandlePointerEventL()
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+    {
+	FUNC_LOG;
+
+    CCoeControl::HandlePointerEventL( aPointerEvent );
+
+    if ( iHeader->NeedsLongTapL( aPointerEvent.iPosition ) )
+        {
+    	iLongTapDetector->PointerEventL( aPointerEvent );
+        }
+	   
+    switch( aPointerEvent.iType )
+    	{
+    	case TPointerEvent::EButton1Down:
+    		{
+            // Save current and original position so that those can be used in
+            // drag/scrolling calculations
+            iPreviousPosition = iOriginalPosition = aPointerEvent.iParentPosition;
+            iIsDragging = EFalse;
+            iIsFlicking = EFalse;
+
+            if( iPhysics )
+                {
+                iPhysics->StopPhysics();
+                iPhysics->ResetFriction();
+                iStartTime.HomeTime();
+                UpdatePhysicsL();
+                }            
+
+            
+			//Closes the attachment action menu, if it is open.
+			//Otherwise does nothing
+			iView.DismissAttachmentActionMenuL();
+
+            if ( iHeader->Rect().Contains(aPointerEvent.iPosition) )
+                {
+                if (iFocused == iMessageField)
+                    {
+                    iFocused = iHeader;
+                    iHeader->SetFocus( ETrue,EDrawNow );
+                    iMessageField->SetFocus( EFalse, EDrawNow );
+                    iHeader->MakeVisible( ETrue );
+                    CommitL(EBodyField);
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                else if (iFocused == iReadOnlyQuoteField)
+                    {
+                    iFocused = iMessageField;
+                    iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow );
+                    iHeader->SetFocus( ETrue, EDrawNow );
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                }
+            else if (iReadOnlyQuoteField->Rect().Contains(aPointerEvent.iPosition))
+                {
+                if (iFocused == iMessageField)
+                    {
+                    iFocused = iReadOnlyQuoteField;
+                    iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow );
+                    iMessageField->SetFocus( EFalse, EDrawNow );
+                    iReadOnlyQuoteField->SetCursorPosL( 0, EFalse );
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                else if (iFocused == iHeader)
+                    {
+                    iFocused = iReadOnlyQuoteField;
+                    iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow );
+                    iHeader->SetFocus( EFalse, EDrawNow );
+                    iReadOnlyQuoteField->SetCursorPosL( 0, EFalse );
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                }
+            else 
+                {
+                if (iFocused == iHeader)
+                    {
+                    iFocused = iMessageField;
+                    iHeader->SetFocus( EFalse, EDrawNow );
+                    iMessageField->SetFocus( ETrue, EDrawNow );
+                    //iMessageField->SetCursorPosL( iMessageField->TextLength(), EFalse );
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                else if (iFocused == iReadOnlyQuoteField)
+                    {
+                    iFocused = iMessageField;
+                    iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow );
+                    iMessageField->SetFocus( ETrue, EDrawNow );
+                    iView.HandleContainerChangeRequiringToolbarRefresh();
+                    }
+                else 
+                    {
+                    //iMessageField->SetCursorPosL( iMessageField->TextLength(), EFalse );
+                    const TRect messageFieldRect(iMessageField->Rect());
+                    if (!messageFieldRect.Contains(aPointerEvent.iPosition) && 
+                            aPointerEvent.iPosition.iY >= messageFieldRect.iTl.iY ) 
+                        {
+                        iMessageField->OpenVirtualKeyBoardL();
+                        }
+                    }
+                }
+
+			break;
+    		}
+    	
+    	case TPointerEvent::EButton1Up:    		
+    		{
+            if( iIsDragging && iPhysics )
+                {
+                TPoint drag(iOriginalPosition - aPointerEvent.iParentPosition);
+                iPhysics->StartPhysics(drag, iStartTime);
+                iIsFlicking = ETrue;
+                iIsDragging = EFalse;
+                }
+    		break;
+    		}
+    	
+    	case TPointerEvent::EDrag:
+    		{
+    		// Get current pointer position
+    		TPoint position = aPointerEvent.iParentPosition;
+
+    		// If user started dragging, cancel hotspot actions
+            iIsDragging = ETrue;
+
+           if( iPhysics )
+                {
+                TPoint delta( 0, iPreviousPosition.iY - position.iY );
+                iPhysics->RegisterPanningPosition( delta );
+                }
+            else
+                {
+    			TInt topPosition( -iHeader->Position().iY );
+    						
+    			TInt totalHeight( ContentTotalHeight() );
+
+    			TInt areaHeight( Rect().Size().iHeight );
+    			TInt scrollOffset( 0 );
+    			
+				if( totalHeight > areaHeight )
+					{
+					// Calculate new scroll offset based on current and previous Y-positions
+					scrollOffset = topPosition + ( iPreviousPosition.iY - position.iY );
+					// Ensure that thumb position is in correct range
+					scrollOffset = Max( scrollOffset, 0 );
+					scrollOffset = Min( scrollOffset, totalHeight - areaHeight );
+					}
+
+				ScrollL( scrollOffset );
+				}
+           
+			// Save current position as previous pos for future calculations
+			iPreviousPosition = position;  
+			
+			break;
+    		}
+    		
+    	default:
+    		{
+    		// unknown event, ignored
+    		break;
+    		}
+    	}
+    
+    }
+
+//</cmail>
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::OfferKeyEventL()
+// Handles key events
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CNcsComposeViewContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType )
+    {
+    FUNC_LOG;
+
+    if( iPhysics )
+        {
+        iPhysics->StopPhysics();
+        iPhysics->ResetFriction();
+        }
+
+    TKeyResponse ret( EKeyWasNotConsumed );
+
+    //<cmail>
+    //we are allowing to change MSK label 
+    SwitchChangeMskOff(EFalse);
+    //</cmail>
+    
+    if ( aKeyEvent.iCode == EKeyYes )
+        {
+        // check that at least one of the address fields has an address
+        if ( !iHeader->AreAddressFieldsEmpty() )
+            {
+            iView.HandleCommandL( ENcsCmdSend );
+            }
+        else
+            {
+            AppendAddressesL();
+            }
+        ret = EKeyWasConsumed;
+        }
+    else if ( aKeyEvent.iCode == EKeyOK )
+    	{
+        if ( iHeader->IsPopupActive() )
+            {
+            DoPopupSelectL();
+            ret = EKeyWasConsumed;
+            }
+        else if ( AppendAddressesL() )
+            {
+            ret = EKeyWasConsumed;
+            }
+        }
+    else if ( aKeyEvent.iScanCode == 'S' &&
+              aKeyEvent.iModifiers & EModifierCtrl &&
+              aType == EEventKey )
+        {
+        iView.HandleCommandL( ENcsCmdSaveDraft );
+        ret = EKeyWasConsumed;
+        }
+    else if ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow )
+        {
+        ret = iFocused->OfferKeyEventL( aKeyEvent, aType );
+
+        if ( ret == EKeyWasNotConsumed )
+            {
+            ret = ChangeFocusL( aKeyEvent );
+            }
+
+        if ( ret != EKeyWasConsumed )
+            {
+        	DrawNow();
+            }
+        }
+
+    if ( ret == EKeyWasNotConsumed )
+        {
+        ret = iFocused->OfferKeyEventL( aKeyEvent, aType );
+
+        // Report user activity to auto saver if editor field handled the
+        // event. In case of message field (body text), EKeyWasConsumed
+        // condition does not come true because AknFep consumes EKeyEvent
+        // and calls HandleEdwinEventL. This OfferKeyEventL gets only
+        // EEventKeyUp and EEventKeyDown events. Thus, when typing body text,
+        // autosaver is notified in HandleEdwinEventL()
+        if ( ( ret == EKeyWasConsumed ) && ( iFocused != iMessageField ) )
+            {
+            iView.HandleContainerChangeRequiringToolbarRefresh();
+            iAutoSaver.ReportActivity();
+            }
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::UpdateScreenPositionL()
+// If the user scrolled down in the message field
+// we want to scroll up the header and grow the message field.
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::UpdateScreenPositionL( const TUint& /*aKeyCode*/ )
+    {
+    FUNC_LOG;
+
+    // get screen rectangle
+    const TRect screenRect( Rect() );
+
+    TPoint msgPos( iMessageField->Position() );
+    TPoint quotePos( iReadOnlyQuoteField->Position() );
+
+    // find out cursor position in absolute coordinates
+    TRect lineRect;
+    if ( iFocused == iMessageField )
+        {
+        iMessageField->GetLineRectL( lineRect );
+        lineRect.Move( msgPos );
+        }
+    else if ( iFocused == iReadOnlyQuoteField )
+        {
+        iReadOnlyQuoteField->GetLineRectL( lineRect );
+        lineRect.Move( quotePos );
+        }
+    else
+        {
+        // This function should be used only when focus is in body or read-only quote
+        return;
+        }
+    TPoint linePos = lineRect.iTl;
+
+    TInt minTargetY = lineRect.Height();
+    TInt maxTargetY = screenRect.Height() - lineRect.Height() * 2;
+
+    TInt moveY = 0;
+    // if cursor goes out of screen then move the controls
+    if ( linePos.iY > maxTargetY )
+        {
+        moveY = maxTargetY - linePos.iY;
+        }
+    else if ( linePos.iY < minTargetY )
+        {
+        moveY = minTargetY - linePos.iY;
+        }
+
+    // Check we don't scroll too low
+    if ( quotePos.iY + moveY + iReadOnlyQuoteField->Size().iHeight < screenRect.Height() )
+        {
+        moveY = screenRect.Height() - quotePos.iY - iReadOnlyQuoteField->Size().iHeight;
+        }
+
+    // Check we don't scroll too high
+    TPoint headerPos = iHeader->Position();
+    if ( headerPos.iY + moveY > 0 )
+        {
+        moveY = -headerPos.iY;
+        }
+
+    if ( moveY )
+        {
+        headerPos.iY += moveY;
+        iHeader->SetPosition( headerPos );
+
+        msgPos.iY += moveY;
+        iMessageField->SetPosition( msgPos );
+
+        quotePos.iY += moveY;
+        iReadOnlyQuoteField->SetPosition( quotePos );
+
+        iSeparatorLineYPos += moveY;
+        UpdateScrollBarL();
+
+        //DrawDeferred();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::UpdateFieldPosition
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::UpdateFieldPosition(CCoeControl* aAnchor)
+    {
+    FUNC_LOG;
+
+	// We may not be completely constructed
+	if ( iHeader && iMessageField && iReadOnlyQuoteField )
+	    {
+	    // First, move all the controls in the header
+	    iHeader->UpdateFieldPosition(aAnchor);
+
+	    // Then, move the body field below the header
+	    TRect headerRect = iHeader->Rect();
+	            
+		const TSize separatorSize( NcsUtility::SeparatorSizeInThisResolution() );
+		iSeparatorLineYPos = headerRect.iBr.iY;
+			
+		TPoint bodyPos( iMessageField->Position() );
+		bodyPos.iY = iSeparatorLineYPos + separatorSize.iHeight;
+		iMessageField->SetPosition( bodyPos );
+		
+		TPoint quotePos( iReadOnlyQuoteField->Position() );
+		quotePos.iY = iMessageField->Rect().iBr.iY;
+		iReadOnlyQuoteField->SetPosition( quotePos );
+
+	    TRAP_IGNORE(UpdateScrollBarL());
+
+	    DrawDeferred();
+	    }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::ChangeFocusL()
+// Handles key events
+// -----------------------------------------------------------------------------
+//
+
+TKeyResponse CNcsComposeViewContainer::ChangeFocusL( const TKeyEvent& aKeyEvent )
+    {
+    FUNC_LOG;
+
+    TKeyResponse ret( EKeyWasNotConsumed );
+
+    if ( iFocused == iReadOnlyQuoteField && aKeyEvent.iCode == EKeyUpArrow )
+        {
+        iFocused = iMessageField;
+        iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow );
+        iMessageField->SetFocus( ETrue, EDrawNow );
+        ret = EKeyWasConsumed;
+        }
+    else if ( iFocused == iMessageField )
+	    {
+	    if ( aKeyEvent.iCode == EKeyUpArrow )
+	        {
+            iFocused = iHeader;
+    		iHeader->SetFocus( ETrue,EDrawNow );
+    		iMessageField->SetFocus( EFalse, EDrawNow );
+    		iHeader->MakeVisible( ETrue );
+            CommitL(EBodyField);
+            ret = EKeyWasConsumed;
+	        }
+	    else if ( aKeyEvent.iCode == EKeyDownArrow && iReadOnlyQuoteField->TextLength() )
+	        {
+	        // Focus move to read-only quote only if there is some text in it.
+	        iFocused = iReadOnlyQuoteField;
+	        iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow );
+	        iMessageField->SetFocus( EFalse, EDrawNow );
+	        iReadOnlyQuoteField->SetCursorPosL( 0, EFalse );
+	        ret = EKeyWasConsumed;
+	        }
+        }
+	else if ( iFocused == iHeader && aKeyEvent.iCode == EKeyDownArrow )
+        {
+		iFocused = iMessageField;
+		iHeader->SetFocus( EFalse, EDrawNow );
+		iMessageField->SetFocus( ETrue, EDrawNow );
+        iMessageField->SetCursorPosL( 0, EFalse );
+        ret = EKeyWasConsumed;
+        }
+
+    if ( ret == EKeyWasConsumed )
+        {
+        UpdateScreenPositionL( aKeyEvent.iCode );
+        }
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::UpdateFieldSizeL()
+// This is called through MNcsFieldSizeObserver when the rects have changed
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::UpdateFieldSizeL()
+    {
+    FUNC_LOG;
+
+	// We may not have finished construction
+	if ( iHeader && iMessageField && iReadOnlyQuoteField )
+	    {
+	    SizeChanged();
+	    DrawDeferred();
+	    }
+
+	return EFalse;
+    }
+
+// <cmail> Platform layout changes
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SizeChanged()
+// set size
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SizeChanged()
+    {
+    FUNC_LOG;
+
+    const TRect rect( Rect() );
+    iScrollBar->SetRect( NcsUtility::ListCmailScrollbarRect( rect ) );
+    TRect cmailPaneRect( NcsUtility::ListCmailPaneRect( rect ) );
+
+    const TInt headerLineCount( iHeader->LayoutLineCount() );
+    const TPoint headerPos( NcsUtility::HeaderControlPosition( cmailPaneRect, 0 ) );
+    cmailPaneRect.Move( 0, iHeader->Position().iY - headerPos.iY );
+
+    NcsUtility::LayoutHeaderControl( iHeader, cmailPaneRect, 0, headerLineCount );
+
+    // do not used stored headerLineCount, because relayout above may grow or
+    // shrink edit fields
+    TRAP_IGNORE( iMessageField->FormatAllTextNowL() );
+    NcsUtility::LayoutBodyEdwin( iMessageField, cmailPaneRect, iHeader->LayoutLineCount(), iMessageField->LineCount(),
+            iSeparatorLineYPos );
+
+    iMessageField->UpdateFontSize();
+
+    TInt readOnlyQuoteFieldHeight( 0 );
+    if ( iReadOnlyQuoteField->TextLength() )
+        {
+        TInt dummySeparatorPos;
+        NcsUtility::LayoutBodyEdwin( iReadOnlyQuoteField, cmailPaneRect, headerLineCount + iMessageField->LineCount(), iReadOnlyQuoteField->LineCount(), 
+        		dummySeparatorPos );
+        iReadOnlyQuoteField->UpdateFontSize();
+        readOnlyQuoteFieldHeight = iReadOnlyQuoteField->Rect().Height();
+        }
+
+    if ( iBgContext )
+        {
+        iBgContext->SetRect( Rect() );
+        }  
+    iMessageField->SetRealRect( Rect() );
+    iReadOnlyQuoteField->SetRealRect( Rect() );
+    
+    TInt messageLineHeigth = NcsUtility::HeaderCaptionPaneRect( cmailPaneRect ).Height();
+    iMessageEditorMinHeigth = cmailPaneRect.Height() - iHeader->Size().iHeight -
+                              NcsUtility::SeparatorSizeInThisResolution().iHeight -
+                              readOnlyQuoteFieldHeight;
+    
+    iMessageEditorMinHeigth -= iMessageEditorMinHeigth % messageLineHeigth;
+    if ( iMessageEditorMinHeigth > messageLineHeigth )
+        {
+        TSize newSize( iMessageField->Size().iWidth,
+                       Max( iMessageField->Size().iHeight, iMessageEditorMinHeigth ));
+            
+        iMessageField->SetSize( newSize );
+        }
+    else
+        {
+        iMessageEditorMinHeigth = messageLineHeigth;
+        }
+
+    TRAP_IGNORE( UpdateScrollBarL() );
+    DrawNow();
+    
+    }
+// </cmail> Platform layout changes
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::Draw() const
+// Draws the display
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::Draw( const TRect& /*aRect*/ ) const
+    {
+    FUNC_LOG;
+	// <cmail> S60 skin support
+	if ( iBgContext )
+	    {
+    	CWindowGc& gc = SystemGc();
+
+    	MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+    	if ( skin )
+    		{
+    		AknsDrawUtils::Background( skin, iBgContext, this, gc, Rect() );
+    		}
+	    }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetBodyContentL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetBodyContentL( const TDesC& aMessage,
+    const TDesC& aReadOnlyQuote )
+    {
+    FUNC_LOG;
+    delete iReadOnlyQuote;
+    iReadOnlyQuote = NULL;
+    if ( aReadOnlyQuote.Length() )
+        {
+        iReadOnlyQuote = aReadOnlyQuote.AllocL();
+        }
+
+    RMemReadStream inputStream( aMessage.Ptr(), aMessage.Size() );
+    CleanupClosePushL( inputStream );
+    iMessageField->RichText()->ImportTextL( 0, inputStream,
+        CPlainText::EOrganiseByParagraph );
+    CleanupStack::PopAndDestroy( &inputStream );
+
+    // Activating the field will set the control to the end of the text
+    iMessageField->ActivateL();
+    iMessageField->SetCursorPosL(0,EFalse);
+
+    inputStream.Open( aReadOnlyQuote.Ptr(), aReadOnlyQuote.Size() );
+    CleanupClosePushL( inputStream );
+    iReadOnlyQuoteField->RichText()->ImportTextL( 0, inputStream,
+        CPlainText::EOrganiseByParagraph );
+    CleanupStack::PopAndDestroy( &inputStream );
+
+    // Activating the field will set the control to the end of the text
+    iReadOnlyQuoteField->ActivateL();
+    iReadOnlyQuoteField->SetCursorPosL(0,EFalse);
+
+    // Recalculate the size of the body field
+    SizeChanged();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetBodyContentLC()
+// -----------------------------------------------------------------------------
+//
+HBufC* CNcsComposeViewContainer::GetBodyContentLC()
+    {
+    FUNC_LOG;
+    HBufC* body = NULL;
+
+    TInt messageLength = iMessageField->TextLength();
+    HBufC* message = HBufC::NewLC( messageLength );
+    TPtr messagePtr = message->Des();
+    iMessageField->GetText( messagePtr );
+    NcsUtility::ConvertLineEndingsL( message );
+    CleanupStack::Pop();
+    CleanupStack::PushL( message );
+    messageLength = message->Length();
+
+    // Append read-only quote if present
+    if ( iReadOnlyQuote )
+        {
+        TInt quoteLength = iReadOnlyQuote->Length();
+        TInt length = messageLength + KIMSLineFeed().Length() + quoteLength;
+        body = message->ReAllocL( length );
+        CleanupStack::Pop( message );
+        CleanupStack::PushL( body );
+
+        TPtr bodyPtr = body->Des();
+        bodyPtr.Append( KIMSLineFeed() );
+        bodyPtr.Append( *iReadOnlyQuote );
+        }
+    else
+        {
+        body = message;
+        }
+
+    return body;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::BodyText()
+// -----------------------------------------------------------------------------
+//
+CRichText& CNcsComposeViewContainer::BodyText()
+    {
+    FUNC_LOG;
+    return *iMessageField->RichText();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleScrollEventL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandleScrollEventL( CEikScrollBar* aScrollBar, TEikScrollEvent /*aEventType*/ )
+    {
+    // <cmail> Platform layout change
+    FUNC_LOG;
+    
+    if( iPhysics )
+        {
+        iPhysics->StopPhysics();
+        iPhysics->ResetFriction();
+        }
+
+    ScrollL( aScrollBar->ThumbPosition() );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::OperationCompleteL
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::OperationCompleteL( TContactHandlerCmd /*aCmd*/,
+    const RPointerArray<CFSEmailUiClsItem>& aContacts )
+	{
+    FUNC_LOG;
+	if ( aContacts.Count() )
+		{
+		RPointerArray<CNcsEmailAddressObject> ncsObjects;
+		CleanupResetAndDestroyClosePushL( ncsObjects );
+
+		for ( TInt i = 0 ; i < aContacts.Count() ; i++ )
+			{
+			CNcsEmailAddressObject* object = CNcsEmailAddressObject::NewL( aContacts[i]->DisplayName(),
+					aContacts[i]->EmailAddress() );
+			if ( aContacts[i]->MultipleEmails() )
+				{
+
+				object->SetDisplayFull( ETrue );
+				}
+			CleanupStack::PushL( object );
+			ncsObjects.AppendL( object );
+			CleanupStack::Pop( object );
+			}
+
+		if ( iAppendAddresses == EAppendTo )
+			{
+			AppendToFieldAddressesL( ncsObjects );
+			}
+		// if Cc field is focused insert addresses in there
+		else if ( iAppendAddresses == EAppendCc )
+			{
+			AppendCcFieldAddressesL( ncsObjects );
+			}
+		// if Bcc field is focused insert addresses in there
+		else if ( iAppendAddresses == EAppendBcc )
+			{
+			AppendBccFieldAddressesL( ncsObjects );
+			}
+
+		CleanupStack::PopAndDestroy( &ncsObjects );
+		}
+	iView.HandleContainerChangeRequiringToolbarRefresh();
+	}
+
+void CNcsComposeViewContainer::OperationErrorL( TContactHandlerCmd, TInt /*aError*/ )
+	{
+    FUNC_LOG;
+	//Nothing to do
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleEdwinEventL
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandleEdwinEventL( CEikEdwin* aEdwin,
+    TEdwinEvent aEventType )
+    {
+    FUNC_LOG;
+    if ( aEdwin == iMessageField || aEdwin == iReadOnlyQuoteField )
+        {
+        if ( aEventType == MEikEdwinObserver::EEventTextUpdate ||
+             aEventType == MEikEdwinObserver::EEventNavigation )
+            {
+            iAutoSaver.ReportActivity();
+
+            // Update screen position and scroll bar when text changed or cursor moved
+            UpdateScreenPositionL();
+            UpdateScrollBarL();
+            DrawDeferred();
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleEdwinSizeEventL
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::HandleEdwinSizeEventL( CEikEdwin* aEdwin,
+        TEdwinSizeEvent /*aEventType*/, TSize aDesirableEdwinSize )
+    {
+    FUNC_LOG;
+    TBool ret = ETrue;
+    
+    const TRect rect( Rect() );
+    TRect cmailPaneRect( NcsUtility::ListCmailPaneRect( rect ) );
+
+    if ( aDesirableEdwinSize.iHeight < iPrevDesiredHeigth )
+        {
+        if ( aDesirableEdwinSize.iHeight < iMessageEditorMinHeigth )
+            {
+            ScrollL( 0 );
+            }
+        }
+
+    if ( aEdwin == iMessageField ) 
+        {
+        if ( aDesirableEdwinSize.iHeight >= iMessageEditorMinHeigth )
+            {
+            aEdwin->SetSize( aDesirableEdwinSize );
+            }        
+        }
+    else
+        {
+        aEdwin->SetSize( aDesirableEdwinSize );
+        }
+    if ( aEdwin == iMessageField )
+        {
+        // move the quote field below the body field
+        TPoint quotePos = iMessageField->Position();
+        quotePos.iY += iMessageField->Size().iHeight;
+        iReadOnlyQuoteField->SetPosition( quotePos );
+		UpdateScreenPositionL(); 
+        }
+
+    iPrevDesiredHeigth = aDesirableEdwinSize.iHeight;
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::MopSupplyObject
+// From CCoeControl.
+// -----------------------------------------------------------------------------
+//
+TTypeUid::Ptr CNcsComposeViewContainer::MopSupplyObject( TTypeUid aId )
+    {
+    FUNC_LOG;
+    return CCoeControl::MopSupplyObject( aId );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::UpdateScrollBarL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::UpdateScrollBarL()
+	{
+    FUNC_LOG;
+
+    TRect headerRect = iHeader->Rect();
+    TRect bodyRect = iMessageField->Rect();
+    TRect quoteRect = iReadOnlyQuoteField->Rect();
+    const TSize separatorSize( NcsUtility::SeparatorSizeInThisResolution() );
+
+    TInt totalComposerHeight = headerRect.Height() + separatorSize.iHeight*2 + 
+							   bodyRect.Height() + quoteRect.Height();
+    
+    TInt visibleAreaHeight = Rect().Height();
+    TInt visiblePosition = -headerRect.iTl.iY;
+
+    iScrollBarModel.SetScrollSpan( totalComposerHeight );
+    iScrollBarModel.SetWindowSize( visibleAreaHeight );
+    iScrollBarModel.SetFocusPosition( visiblePosition );
+
+    iScrollBar->SetModelL( &iScrollBarModel );
+    iScrollBar->DrawNow();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetApplicationRect()
+// -----------------------------------------------------------------------------
+//
+// <cmail>
+/*
+void CNcsComposeViewContainer::SetApplicationRect( TRect aRect )
+	{
+    FUNC_LOG;
+
+	iApplicationRect = aRect;
+
+	}
+*/
+// </cmail>
+
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetFocusToMessageFieldL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetFocusToMessageFieldL()
+    {
+    FUNC_LOG;
+
+    if( iFocused != iMessageField )
+        {
+        iHeader->SetFocus( EFalse, ENoDrawNow );
+        iMessageField->SetCursorPosL( 0, EFalse );
+        iMessageField->SetFocus( ETrue, EDrawNow );
+        iFocused = iMessageField;
+        UpdateScreenPositionL();
+        DrawDeferred();
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AddQuickTextL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::AddQuickTextL( const TDesC& aText )
+    {
+    FUNC_LOG;
+
+	TInt pos = iMessageField->CursorPos();
+	TCursorSelection selIns( pos, pos );
+	iMessageField->InsertDeleteCharsL( pos, aText, selIns );
+	DrawDeferred();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SelectAllToFieldTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SelectAllToFieldTextL()
+	{
+    FUNC_LOG;
+
+	iHeader->SelectAllToFieldTextL();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SelectAllCcFieldTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SelectAllCcFieldTextL()
+	{
+    FUNC_LOG;
+
+	iHeader->SelectAllCcFieldTextL();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SelectAllBccFieldTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SelectAllBccFieldTextL()
+	{
+    FUNC_LOG;
+
+	iHeader->SelectAllBccFieldTextL();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SelectAllSubjectFieldTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SelectAllSubjectFieldTextL()
+	{
+    FUNC_LOG;
+
+	iHeader->SelectAllSubjectFieldTextL();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsSubjectFieldEmpty
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsSubjectFieldEmpty()
+    {
+    FUNC_LOG;
+    return iHeader->IsSubjectFieldEmpty();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AppendAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::AppendAddressesL()
+	{
+    FUNC_LOG;
+
+    iContactHandler = CFsDelayedLoader::InstanceL()->GetContactHandlerL();
+    if ( iContactHandler )
+        {
+        iContactHandler->GetAddressesFromPhonebookL( this );
+        }
+    
+	if ( IsFocusCc() )
+		{
+		iAppendAddresses = EAppendCc;
+		}
+	else if ( IsFocusBcc() )
+		{
+		iAppendAddresses = EAppendBcc;
+		}
+	else
+		{
+		iAppendAddresses = EAppendTo;
+		}
+
+    return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleAttachmentsOpenCommand
+// If attachment header field is focused and open key is pressed
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandleAttachmentsOpenCommandL()
+	{
+    FUNC_LOG;
+
+	iView.HandleCommandL( EFsEmailUiCmdOpenAttachment );
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::LaunchAttachmentActionMenuL
+// Called when right-click happens in the attahcments field
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::LaunchAttachmentActionMenuL()
+    {
+    FUNC_LOG;
+    iView.LaunchAttachmentActionMenuL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetToFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+const RPointerArray<CNcsEmailAddressObject>& CNcsComposeViewContainer::GetToFieldAddressesL( TBool aParseNow )
+    {
+    return iHeader->GetToFieldAddressesL( aParseNow );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetCcFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+const RPointerArray<CNcsEmailAddressObject>& CNcsComposeViewContainer::GetCcFieldAddressesL( TBool aParseNow )
+    {
+    return iHeader->GetCcFieldAddressesL( aParseNow );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetBccFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+const RPointerArray<CNcsEmailAddressObject>& CNcsComposeViewContainer::GetBccFieldAddressesL( TBool aParseNow )
+    {
+    return iHeader->GetBccFieldAddressesL( aParseNow );
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetSubjectLC
+//
+// -----------------------------------------------------------------------------
+//
+HBufC* CNcsComposeViewContainer::GetSubjectLC() const
+    {
+    FUNC_LOG;
+	return iHeader->GetSubjectLC();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsBccFieldVisible
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsBccFieldVisible() const
+    {
+    FUNC_LOG;
+    return iHeader->IsBccFieldVisible();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsCcFieldVisible
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsCcFieldVisible() const
+    {
+    FUNC_LOG;
+    return iHeader->IsCcFieldVisible();
+    }
+
+// <cmail> Removed unneeded IsFocusAif
+// </cmail>
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsFocusAttachments
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsFocusAttachments() const
+    {
+    FUNC_LOG;
+    return iHeader->IsFocusAttachments();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsFocusTo
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsFocusTo() const
+    {
+    FUNC_LOG;
+    return iHeader->IsFocusTo();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsFocusCc
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsFocusCc() const
+    {
+    FUNC_LOG;
+    return iHeader->IsFocusCc();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IsFocusBcc
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::IsFocusBcc() const
+    {
+    FUNC_LOG;
+    return iHeader->IsFocusBcc();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetCcFieldLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetCcFieldLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetCcFieldLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetBccFieldLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetBccFieldLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetBccFieldLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetToFieldLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetToFieldLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetToFieldLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetSubjectFieldLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetSubjectFieldLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetSubjectFieldLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetMessageFieldLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetMessageFieldLength() const
+    {
+    FUNC_LOG;
+	return iMessageField->TextLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetAttachmentCount
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetAttachmentCount() const
+    {
+    FUNC_LOG;
+    TInt count = iView.AttachmentsListControl()->Model()->Count();
+	return count;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HasRemoteAttachments
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::HasRemoteAttachments() const
+    {
+    FUNC_LOG;
+    TBool ret = iView.AttachmentsListControl()->Model()->HasRemoteAttachments();
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetLookupTextLC
+//
+// -----------------------------------------------------------------------------
+//
+HBufC* CNcsComposeViewContainer::GetLookupTextLC() const
+    {
+    FUNC_LOG;
+	return iHeader->GetLookupTextLC();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetToFieldSelectionLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetToFieldSelectionLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetToFieldSelectionLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetCcFieldSelectionLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetCcFieldSelectionLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetCcFieldSelectionLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::GetBccFieldSelectionLength
+//
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::GetBccFieldSelectionLength() const
+    {
+    FUNC_LOG;
+	return iHeader->GetBccFieldSelectionLength();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetMenuBar
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetMenuBar( CEikButtonGroupContainer* aMenuBar )
+    {
+    FUNC_LOG;
+
+	iHeader->SetMenuBar(aMenuBar);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetToFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetToFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddress )
+    {
+    FUNC_LOG;
+
+    iHeader->SetToFieldAddressesL(aAddress);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetCcFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetCcFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddress )
+    {
+    FUNC_LOG;
+
+    iHeader->SetCcFieldAddressesL( aAddress );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetBccFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetBccFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddress )
+    {
+    FUNC_LOG;
+
+    iHeader->SetBccFieldAddressesL( aAddress );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AppendToFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::AppendToFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddresses )
+    {
+    FUNC_LOG;
+
+    iHeader->AppendToFieldAddressesL(aAddresses);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AppendCcFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::AppendCcFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddress )
+    {
+    FUNC_LOG;
+
+    iHeader->AppendCcFieldAddressesL( aAddress );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AppendBccFieldAddressesL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::AppendBccFieldAddressesL( RPointerArray<CNcsEmailAddressObject>& aAddress )
+    {
+    FUNC_LOG;
+
+    iHeader->AppendBccFieldAddressesL( aAddress );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetSubjectL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetSubjectL( const TDesC& aSubject )
+    {
+    FUNC_LOG;
+
+    iHeader->SetSubjectL( aSubject );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetAttachmentLabelTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetAttachmentLabelTextL( const TDesC& aText )
+    {
+    FUNC_LOG;
+
+	iHeader->SetAttachmentLabelTextL( aText );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetAttachmentLabelTextL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetAttachmentLabelTextL( const TDesC& aAttachmentName,
+                                                        const TDesC& aAttachmentSizeDesc )
+    {
+    FUNC_LOG;
+
+    iHeader->SetAttachmentLabelTextL( aAttachmentName, aAttachmentSizeDesc );
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HideAttachmentLabel
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HideAttachmentLabel()
+    {
+    FUNC_LOG;
+
+	iHeader->HideAttachmentLabel();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetCcFieldVisibleL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetCcFieldVisibleL( TBool aVisible, TBool aFocus )
+	{
+    FUNC_LOG;
+
+	if ( aFocus )
+		{
+		iMessageField->SetCursorPosL( 0,EFalse );
+		iMessageField->SetFocus( EFalse );
+		iHeader->MakeVisible( ETrue );
+		iHeader->SetFocus( ETrue );
+		iFocused = iHeader;
+		}
+	iHeader->SetCcFieldVisibleL( aVisible, EDrawNow, aFocus );
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetBccFieldVisibleL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetBccFieldVisibleL( TBool aVisible, TBool aFocus )
+	{
+    FUNC_LOG;
+
+	if ( aFocus )
+		{
+		iMessageField->SetCursorPosL( 0, EFalse );
+		iMessageField->SetFocus( EFalse );
+		iHeader->MakeVisible( ETrue );
+		iHeader->SetFocus( ETrue );
+		iFocused = iHeader;
+		}
+	iHeader->SetBccFieldVisibleL( aVisible, EDrawNow, aFocus );
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IncludeAddressL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::IncludeAddressL(const CNcsEmailAddressObject& eml)
+    {
+    FUNC_LOG;
+
+	iHeader->IncludeAddressL(eml);
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::IncludeAddressL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::IncludeAddressL()
+    {
+    FUNC_LOG;
+
+	iHeader->IncludeAddressL();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::ClosePopupContactListL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::ClosePopupContactListL()
+    {
+    FUNC_LOG;
+
+	iHeader->ClosePopupContactListL();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::DeleteSelectionL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::DeleteSelectionL()
+    {
+    FUNC_LOG;
+
+	iHeader->DeleteSelectionL();
+
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetFocusToToField
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetFocusToToField()
+	{
+    FUNC_LOG;
+
+	iHeader->FocusToField();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SetFocusToAttachmentField
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::SetFocusToAttachmentField()
+	{
+    FUNC_LOG;
+
+	if ( iFocused == iMessageField )
+    	{
+		iFocused = iHeader;
+		iHeader->SetFocus( ETrue, EDrawNow );
+		iMessageField->SetFocus( EFalse, EDrawNow );
+		iHeader->MakeVisible( ETrue );
+    	}
+
+	iHeader->FocusAttachmentField();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::AreAddressFieldsEmpty
+//
+// -----------------------------------------------------------------------------
+//
+TBool CNcsComposeViewContainer::AreAddressFieldsEmpty()
+	{
+    FUNC_LOG;
+	return iHeader->AreAddressFieldsEmpty();
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::DoPopupSelectL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::DoPopupSelectL()
+	{
+    FUNC_LOG;
+
+	iHeader->DoPopupSelectL();
+
+	}
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleLayoutChangeL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandleLayoutChangeL()
+    {
+    FUNC_LOG;
+    // <cmail> Platform layout change
+    const TRect rect( NcsUtility::ListscrollPaneRect() );
+    SetRect( rect );
+    // </cmail> Platform layout change
+    if ( iHeader )
+        {
+        iHeader->HandleDynamicVariantSwitchL();
+        }
+    // <cmail> Platform layout change
+    //TRect rect = iView.ClientRect();
+    //SetApplicationRect( rect );
+    //SetRect( rect );
+	//UpdateScreenPositionL();
+    // </cmail> Platform layout change
+    UpdateScrollBarL();
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::HandleSkinChangeL
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::HandleSkinChangeL()
+    {
+    FUNC_LOG;
+    if ( iHeader )
+        {
+        iHeader->HandleDynamicVariantSwitchL();
+        }
+
+// <cmail>
+    if ( iMessageField )
+        {
+        iMessageField->UpdateFontSize();
+        }
+
+    if ( iScrollBar )
+        {
+        iScrollBar->HandleResourceChange( KAknsMessageSkinChange );
+        iScrollBar->DrawNow();
+        }
+// </cmail>
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::ContentTotalHeight
+// Return the total height of the components shown in the view
+// -----------------------------------------------------------------------------
+//
+TInt CNcsComposeViewContainer::ContentTotalHeight()
+    {
+    FUNC_LOG;
+    const TSize separatorSize( NcsUtility::SeparatorSizeInThisResolution() );
+	
+	TInt totalHeight( iHeader->Size().iHeight + 
+					  separatorSize.iHeight*2 + iMessageField->Size().iHeight );
+
+	if( iReadOnlyQuoteField->IsVisible() )
+		{
+		totalHeight += iReadOnlyQuoteField->Size().iHeight;
+		}	
+	
+	return totalHeight;
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::CommitL()
+//
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::CommitL( TFieldToCommit aFieldToCommit )
+    {
+    FUNC_LOG;
+    iView.CommitL(ETrue,aFieldToCommit);
+    iView.HandleContainerChangeRequiringToolbarRefresh();
+    }
+
+//<cmail>
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::SwitchChangeMskOff
+//sets up iSwitchChangeMskOff falg, which disables changes of MSK label if any popup dialog is open
+// -----------------------------------------------------------------------------
+void CNcsComposeViewContainer::SwitchChangeMskOff(TBool aTag)
+    {
+    FUNC_LOG;
+    iHeader->SwitchChangeMskOff(aTag);
+    }
+//</cmail>
+
+//<cmail>
+// -----------------------------------------------------------------------------
+// CNcsHeaderContainer::HandleLongTapEventL()
+// Handles key events
+// -----------------------------------------------------------------------------
+void CNcsComposeViewContainer::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /*aPenEventScreenLocation*/ )
+    {
+    FUNC_LOG;
+    iHeader->HandleLongTapL( aPenEventLocation );
+    }
+//</cmail>
+
+
+//<cmail>
+void CNcsComposeViewContainer::FixSemicolonL()
+	{
+    FUNC_LOG;
+	iHeader->FixSemicolonInAddressFieldsL();
+	}
+//</cmail>
+
+// ---------------------------------------------------------------------------
+// CNcsComposeViewContainer::UpdatePhysicsL()
+// ---------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::UpdatePhysicsL()
+    {
+    FUNC_LOG;
+    if ( iPhysics )
+        {
+        const TSize viewSize( Rect().Size() );
+        // We must ensure that world size is at least the size of the view
+        const TSize worldSize( viewSize.iWidth, 
+                Max(ContentTotalHeight(), viewSize.iHeight) );
+        iPhysics->InitPhysicsL( worldSize, viewSize, EFalse );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CNcsComposeViewContainer::ScrollL()
+// -----------------------------------------------------------------------------
+//
+void CNcsComposeViewContainer::ScrollL( TInt aTargetPos )
+	{
+    FUNC_LOG;
+	TPoint headerPos( iHeader->Position() );
+	
+	aTargetPos = Max( 0, Min(aTargetPos, ContentTotalHeight() - Rect().Height()) );
+	
+	TInt moveY = -headerPos.iY - aTargetPos;
+	
+	if( moveY )
+		{
+		headerPos.iY += moveY;
+		iHeader->SetPosition( headerPos );
+		
+		TPoint msgPos( iMessageField->Position() );
+		msgPos.iY += moveY;
+		iMessageField->SetPosition( msgPos );
+		
+		if( iReadOnlyQuoteField->IsVisible() )
+			{
+			TPoint readOnlyPos( iReadOnlyQuoteField->Position() );
+			readOnlyPos.iY += moveY;
+			iReadOnlyQuoteField->SetPosition( readOnlyPos );
+			}
+		
+		iSeparatorLineYPos += moveY;
+	
+		UpdateScrollBarL();
+		DrawNow();
+		}
+	}
+
+/**
+ * @see MAknPhysicsObserver::ViewPositionChanged
+ */
+void CNcsComposeViewContainer::ViewPositionChanged(
+        const TPoint& aNewPosition,
+        TBool /*aDrawNow*/,
+        TUint /*aFlags*/ )
+    {
+    FUNC_LOG;
+	if( iIsFlicking )
+		{
+		TInt scrollOffset = aNewPosition.iY - Rect().Size().iHeight / 2;
+
+		TRAP_IGNORE( ScrollL( scrollOffset ) );
+		}
+	}
+
+/**
+ * @see MAknPhysicsObserver::PhysicEmulationEnded
+ */
+void CNcsComposeViewContainer::PhysicEmulationEnded()
+    {
+    FUNC_LOG;
+    iIsFlicking = EFalse;
+    }
+
+/**
+ * @see MAknPhysicsObserver::ViewPosition
+ */
+TPoint CNcsComposeViewContainer::ViewPosition() const
+    {
+    FUNC_LOG;
+    return TPoint(0, -iHeader->Position().iY + Rect().Size().iHeight / 2 );
+    }
+
+
+TBool CNcsComposeViewContainer::IsRemoteSearchInprogress() const
+    {
+    FUNC_LOG;
+    return iHeader->IsRemoteSearchInprogress();
+    }