diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/ncscomposeviewcontainer.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //CAknInformationNote +#include +#include + +#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(); + // + // iApplicationRect = aRect; + // + + // 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 ); + + // Platform layout change + iMessageField->SetNcsFontType( NcsUtility::ENcsBodytextFont ); + // + + // 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 ); + + // S60 skin support + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMain, Rect(), EFalse ); + // + //iMessageField->SetSkinBackgroundControlContextL( iBgContext ); + // + iLongTapDetector = CAknLongTapDetector::NewL( this ); + // + + 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; + // + delete iBgContext; + delete iLongTapDetector; + // + 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 ); + // + iView.HandleContainerChangeRequiringToolbarRefresh(); + // + if ( aDrawNow ) + { + DrawNow(); + } + + } +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::SetMskL() +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::SetMskL() + { + FUNC_LOG; + iHeader->SetMskL(); + } + +// + +// ----------------------------------------------------------------------------- +// 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; + } + } + + } + +// + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::OfferKeyEventL() +// Handles key events +// ----------------------------------------------------------------------------- +// +TKeyResponse CNcsComposeViewContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + FUNC_LOG; + + if( iPhysics ) + { + iPhysics->StopPhysics(); + iPhysics->ResetFriction(); + } + + TKeyResponse ret( EKeyWasNotConsumed ); + + // + //we are allowing to change MSK label + SwitchChangeMskOff(EFalse); + // + + 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; + } + +// 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(); + + } +// Platform layout changes + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::Draw() const +// Draws the display +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::Draw( const TRect& /*aRect*/ ) const + { + FUNC_LOG; + // 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*/ ) + { + // Platform layout change + FUNC_LOG; + + if( iPhysics ) + { + iPhysics->StopPhysics(); + iPhysics->ResetFriction(); + } + + ScrollL( aScrollBar->ThumbPosition() ); + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::OperationCompleteL +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::OperationCompleteL( TContactHandlerCmd /*aCmd*/, + const RPointerArray& aContacts ) + { + FUNC_LOG; + if ( aContacts.Count() ) + { + RPointerArray 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() +// ----------------------------------------------------------------------------- +// +// +/* +void CNcsComposeViewContainer::SetApplicationRect( TRect aRect ) + { + FUNC_LOG; + + iApplicationRect = aRect; + + } +*/ +// + + +// ----------------------------------------------------------------------------- +// 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& CNcsComposeViewContainer::GetToFieldAddressesL( TBool aParseNow ) + { + return iHeader->GetToFieldAddressesL( aParseNow ); + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::GetCcFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +const RPointerArray& CNcsComposeViewContainer::GetCcFieldAddressesL( TBool aParseNow ) + { + return iHeader->GetCcFieldAddressesL( aParseNow ); + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::GetBccFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +const RPointerArray& 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(); + } + +// Removed unneeded IsFocusAif +// + +// ----------------------------------------------------------------------------- +// 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& aAddress ) + { + FUNC_LOG; + + iHeader->SetToFieldAddressesL(aAddress); + + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::SetCcFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::SetCcFieldAddressesL( RPointerArray& aAddress ) + { + FUNC_LOG; + + iHeader->SetCcFieldAddressesL( aAddress ); + + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::SetBccFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::SetBccFieldAddressesL( RPointerArray& aAddress ) + { + FUNC_LOG; + + iHeader->SetBccFieldAddressesL( aAddress ); + + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::AppendToFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::AppendToFieldAddressesL( RPointerArray& aAddresses ) + { + FUNC_LOG; + + iHeader->AppendToFieldAddressesL(aAddresses); + + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::AppendCcFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::AppendCcFieldAddressesL( RPointerArray& aAddress ) + { + FUNC_LOG; + + iHeader->AppendCcFieldAddressesL( aAddress ); + + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::AppendBccFieldAddressesL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::AppendBccFieldAddressesL( RPointerArray& 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; + // Platform layout change + const TRect rect( NcsUtility::ListscrollPaneRect() ); + SetRect( rect ); + // Platform layout change + if ( iHeader ) + { + iHeader->HandleDynamicVariantSwitchL(); + } + // Platform layout change + //TRect rect = iView.ClientRect(); + //SetApplicationRect( rect ); + //SetRect( rect ); + //UpdateScreenPositionL(); + // Platform layout change + UpdateScrollBarL(); + } + +// ----------------------------------------------------------------------------- +// CNcsComposeViewContainer::HandleSkinChangeL +// +// ----------------------------------------------------------------------------- +// +void CNcsComposeViewContainer::HandleSkinChangeL() + { + FUNC_LOG; + if ( iHeader ) + { + iHeader->HandleDynamicVariantSwitchL(); + } + +// + if ( iMessageField ) + { + iMessageField->UpdateFontSize(); + } + + if ( iScrollBar ) + { + iScrollBar->HandleResourceChange( KAknsMessageSkinChange ); + iScrollBar->DrawNow(); + } +// + } + +// ----------------------------------------------------------------------------- +// 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(); + } + +// +// ----------------------------------------------------------------------------- +// 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); + } +// + +// +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::HandleLongTapEventL() +// Handles key events +// ----------------------------------------------------------------------------- +void CNcsComposeViewContainer::HandleLongTapEventL( const TPoint& aPenEventLocation, const TPoint& /*aPenEventScreenLocation*/ ) + { + FUNC_LOG; + iHeader->HandleLongTapL( aPenEventLocation ); + } +// + + +// +void CNcsComposeViewContainer::FixSemicolonL() + { + FUNC_LOG; + iHeader->FixSemicolonInAddressFieldsL(); + } +// + +// --------------------------------------------------------------------------- +// 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(); + }