diff -r 000000000000 -r 8466d47a6819 emailuis/emailui/src/ncsheadercontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/src/ncsheadercontainer.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,1971 @@ +/* +* 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 : email header container +* +*/ + + + +#include "emailtrace.h" +#include +#include +#include //CAknInformationNote +#include +// +#include "CFSMailBox.h" +#include + +#include "cpbkxremotecontactlookupserviceuicontext.h" +// + +#include "FSEmailBuildFlags.h" +#include "ncsheadercontainer.h" +#include "ncscomposeviewcontainer.h" +#include "ncsemailaddressobject.h" +#include "ncsutility.h" +#include "FreestyleEmailUiUtilities.h" +#include "FreestyleEmailUiAppui.h" +#include "FSEmail.pan" +#include "ncsattachmentfield.h" +#include "ncssubjectfield.h" +#include "ncspopuplistbox.h" + +_LIT( KAddressDelimeterSemiColon, ";" ); + + +// --------------------------------------------------------------------------- +// ToNcsControl +// --------------------------------------------------------------------------- +// +static MNcsControl* ToNcsControl( CCoeControlArray::TCursor cur ) + { + FUNC_LOG; + CCoeControl* coe = cur.Control(); + return dynamic_cast(coe); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::NewL +// --------------------------------------------------------------------------- +// +CNcsHeaderContainer* CNcsHeaderContainer::NewL( CCoeControl& aParent, + CFSMailBox& aMailBox, TInt aFlags ) + { + FUNC_LOG; + CNcsHeaderContainer* self = new ( ELeave ) CNcsHeaderContainer( aParent, aMailBox ); + CleanupStack::PushL( self ); + self->ConstructL( aFlags ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::CNcsHeaderContainer +// --------------------------------------------------------------------------- +// +CNcsHeaderContainer::CNcsHeaderContainer( + CCoeControl& aParent, + CFSMailBox& aMailBox ): + iParent(aParent), + // Platform layout change + iFieldSizeObserver( static_cast< CNcsComposeViewContainer& >( aParent ) ), + // Platform layout change + iMailBox( aMailBox ), + iLongTapEventConsumed(EFalse) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ConstructL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ConstructL( TInt aFlags ) + { + FUNC_LOG; + + SetContainerWindowL(iParent); + + CFreestyleEmailUiAppUi* fsAppUi = static_cast( ControlEnv()->AppUi() ); + // + //fsAppUi->FsTextureManager()->ProvideBitmapL( EViewerTextureHeaderBackGround, iBackgroundBitmap, iBackgroundMask ); + // + + // Platform layout change + // Create 'To' field + iToField = CNcsAddressInputField::NewL( + R_NCS_TO_FIELD_TEXT, + CNcsAddressInputField::EInputFieldTo, + &iFieldSizeObserver, + this, this ); + + // Create 'Cc' field + iCcField = CNcsAddressInputField::NewL( + R_NCS_CC_FIELD_TEXT, + CNcsAddressInputField::EInputFieldCc, + &iFieldSizeObserver, + this, this ); + iCcField->MakeVisible( aFlags&ECcFieldVisible ); + + // Create 'Bcc' field + iBccField = CNcsAddressInputField::NewL( + R_NCS_BCC_FIELD_TEXT, + CNcsAddressInputField::EInputFieldBcc, + &iFieldSizeObserver, + this, this ); + iBccField->MakeVisible( aFlags&EBccFieldVisible ); + + // Create 'subject' field + iSubjectField = CNcsSubjectField::NewL( R_FSE_EDITOR_HEADER_SUBJECT, + &iFieldSizeObserver, this ); + + iAttachmentField = CNcsAttachmentField::NewL( R_NCS_ATTACHMENT_LABEL_TEXT, + &iFieldSizeObserver, this ); + // Platform layout change + + // Setup the control array + // Add all of them now so the container and parent is set correctly + InitComponentArrayL(); + CCoeControlArray& controls = Components(); + controls.SetControlsOwnedExternally( ETrue ); + + controls.AppendLC( iToField ); + CleanupStack::Pop( iToField ); + controls.AppendLC( iCcField ); + CleanupStack::Pop( iCcField ); + controls.AppendLC( iBccField ); + CleanupStack::Pop( iBccField ); + controls.AppendLC( iSubjectField ); + CleanupStack::Pop( iSubjectField ); + controls.AppendLC( iAttachmentField ); + CleanupStack::Pop( iAttachmentField ); + + iToField->SetFocus( ETrue ); + + if ( !(aFlags&ECcFieldVisible) ) + { + controls.Remove( iCcField ); + } + + if ( !(aFlags&EBccFieldVisible) ) + { + controls.Remove( iBccField ); + } + + // initially attachments field is hidden + iAttachmentField->MakeVisible( EFalse ); + controls.Remove( iAttachmentField ); + + // test whether mailbox supports remote lookup + TBool remoteLookupSupported = TFsEmailUiUtility::IsRemoteLookupSupported( iMailBox ); + + iAacListBox = CNcsPopupListBox::NewL( this, iMailBox, *this, remoteLookupSupported ); + iAacListBox->MakeVisible( EFalse ); + + // + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMain, Rect(), EFalse ); + // + iRALInProgress = EFalse; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::~CNcsHeaderContainer +// --------------------------------------------------------------------------- +CNcsHeaderContainer::~CNcsHeaderContainer() + { + FUNC_LOG; + delete iToField; + delete iCcField; + delete iBccField; + delete iSubjectField; + delete iAttachmentField; + delete iAacListBox; + // + //delete iBackgroundBitmap; + //delete iBackgroundMask; + delete iLongTapDetector; + delete iBgContext; + // + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::FocusChanged +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::FocusChanged( TDrawNow aDrawNow ) + { + FUNC_LOG; + + CCoeControl* focused = FindFocused(); + if ( !IsFocused() ) + { + if ( focused ) + { + // We're loosing focus (probably going to message body) + // Commit changes and make sure no controls are focused. + TRAP_IGNORE( CommitFieldL( focused ) ); + focused->SetFocus( EFalse, aDrawNow ); + } + + // Remove MSK label when header loses focus + TRAP_IGNORE( SetMskL() ); + } + else if ( IsFocused() && !focused ) + { + // We're gaining focus from the message body + // Set the focus to the last control in the control array + // (either attachment line or subject field) + CCoeControlArray::TCursor cur = Components().End(); + cur.Prev(); + cur.Control()->SetFocus( ETrue, aDrawNow ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::Draw() const +// Draws the display +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::Draw( const TRect& /*aRect*/ ) const + { + FUNC_LOG; + // S60 Skin support + // Get the standard graphics context + //CWindowGc& gc = SystemGc(); + + //gc.Clear(); + + // Redraw the background + //gc.BitBlt( iBackgroundPos, iBackgroundBitmap, iBackgroundBitmap->SizeInPixels() ); + if ( iBgContext ) + { + CWindowGc& gc = SystemGc(); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + if ( skin ) + { + AknsDrawUtils::Background( skin, iBgContext, this, gc, Rect() ); + } + } + // + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::DrawAttachmentFocusNow() const +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::DrawAttachmentFocusNow() + { + FUNC_LOG; + iAttachmentField->DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::HandleControlArrayEventL() +// Handles removal or additons of controls to the header. +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::HandleControlArrayEventL( + CCoeControlArray::TEvent aEvent, + const CCoeControlArray* /*aArray*/, + CCoeControl* aControl, + TInt /*aControlId*/ ) + { + FUNC_LOG; + if (aEvent == CCoeControlArray::EControlAdded) + { + aControl->SetContainerWindowL( iParent ); + aControl->MakeVisible( ETrue ); + aControl->ActivateL(); + } + else if ( aEvent == CCoeControlArray::EControlRemoved ) + { + aControl->MakeVisible( EFalse ); + } + // Tell the parent to recalculate everything + // Platform layout change + iFieldSizeObserver.UpdateFieldPosition(NULL); + // Platform layout change + } + +void CNcsHeaderContainer::SetMskL() + { + FUNC_LOG; + CCoeControl* focused = FindFocused(); + if ( focused == iToField || focused == iCcField || focused == iBccField ) + { + // additional check if we can change MSK label + if(iSwitchChangeMskOff == EFalse) + { + // + ChangeMskCommandL( R_FSE_QTN_MSK_ADD ); + } + } + else if ( focused == iAttachmentField ) + { + if ( GetAttachmentCount() > 1 ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_VIEWATTACHMENTS ); + } + else if ( !HasRemoteAttachments() ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_VIEWATTACHMENT ); + } + else // message has single remote attachment => no MSK function + { + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + } + } + // msk context menu added into composer + else if ( focused == iSubjectField ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + } + else + { + ChangeMskCommandL( R_FSE_QTN_MSK_BODY_MENU ); + } + // + } + +// +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::HandlePointerEventL() +// +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + FUNC_LOG; + CCoeControl* clicked = 0; + for (TInt i=0; i < Components().Count(); ++i) + { + TRect rc = Components().At(i).iControl->Rect(); + if (rc.Contains(aPointerEvent.iPosition)) + { + clicked = Components().At(i).iControl; + } + } + if (clicked) + { + if (aPointerEvent.iType == TPointerEvent::EButton1Up) + { + CCoeControl* pOldCtrl = FindFocused(); + CCoeControl* pNewCtrl= clicked; + + if (pOldCtrl != pNewCtrl) + { + // Unfocus the control + if ( pOldCtrl ) + { + CommitFieldL( pOldCtrl ); + pOldCtrl->SetFocus( EFalse, ENoDrawNow ); + } + pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + + // If the attachments label has changed focus + if ( pOldCtrl == iAttachmentField || pNewCtrl == iAttachmentField ) + { + DrawAttachmentFocusNow(); + } + + CNcsComposeViewContainer* container = + static_cast( &iParent ); + container->UpdateScrollBarL(); + } + + if( iLongTapEventConsumed ) + { + iLongTapEventConsumed = EFalse; + return; + } + + if( pNewCtrl == iAttachmentField ) + { + CNcsComposeViewContainer& parent = static_cast( iParent ); + parent.HandleAttachmentsOpenCommandL(); + } + } + } + for (TInt i=0; i < Components().Count(); ++i) + { + Components().At(i).iControl->HandlePointerEventL(aPointerEvent); + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::HandleLongTapL() +// +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::HandleLongTapL( const TPoint& aPenEventLocation ) + { + FUNC_LOG; + iLongTapEventConsumed = EFalse; + + CCoeControl* control = FindFocused(); + TRect rect = iAttachmentField->Rect(); + if( iAttachmentField->IsVisible() && rect.Contains( aPenEventLocation ) ) + { + iLongTapEventConsumed = ETrue; + + CNcsComposeViewContainer& parent = static_cast( iParent ); + parent.LaunchAttachmentActionMenuL(); + } + } + +TBool CNcsHeaderContainer::NeedsLongTapL( const TPoint& aPenEventLocation ) + { + FUNC_LOG; + + CCoeControl* control = FindFocused(); + TRect rect = iAttachmentField->Rect(); + TBool result(EFalse); + if( iAttachmentField->IsVisible() && rect.Contains( aPenEventLocation ) ) + { + result = ETrue; + } + return result; + } +// + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::OfferKeyEventL() +// Handles key events +// ----------------------------------------------------------------------------- +TKeyResponse CNcsHeaderContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) + { + FUNC_LOG; + TKeyResponse ret( EKeyWasNotConsumed ); + + TBool doScroll( EFalse ); + + if( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) + { + if ( iAacListBox && iAacListBox->IsVisible() && !iAacListBox->IsPopupEmpty() ) + { + return iAacListBox->OfferKeyEventL( aKeyEvent, aType ); + } + else + { + ret = FindFocused()->OfferKeyEventL( aKeyEvent, aType ); + + doScroll = (ret == EKeyWasConsumed); + } + + if ( ret == EKeyWasNotConsumed ) + { + ret = ChangeFocusL( aKeyEvent ); + DrawDeferred(); + } + } + else + { + if ( FindFocused() == iAttachmentField ) + { + if ( aType == EEventKey ) + { + CNcsComposeViewContainer& parent = static_cast( iParent ); + + if ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter || + aKeyEvent.iCode == EKeyOK || aKeyEvent.iScanCode == EStdKeyDevice3 ) + { + // open list or attachment + parent.HandleAttachmentsOpenCommandL(); + ret = EKeyWasConsumed; + } + else if ( (AknLayoutUtils::LayoutMirrored() && aKeyEvent.iCode == EKeyLeftArrow) || + (!AknLayoutUtils::LayoutMirrored() && aKeyEvent.iCode == EKeyRightArrow) ) + { + parent.LaunchAttachmentActionMenuL(); + ret = EKeyWasConsumed; + } + } + } + else if ( IsPopupActive() && aType == EEventKey ) + { + // select current + if( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iCode == EKeyDevice4 || + aKeyEvent.iCode == EKeyOK ) + { + DoPopupSelectL(); + ret = EKeyWasConsumed; + } + } + else + { + // Don't allow line feeds in header fields. + // Could be nice if enter committed the field and moved the focus to next one + if ( aType == EEventKey && (aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter) ) + { + ret = FindFocused()->OfferKeyEventL( aKeyEvent, aType ); + return EKeyWasConsumed; + } + } + } + if ( ret == EKeyWasNotConsumed ) + { + CCoeControl* focused = FindFocused(); + if ( focused ) + { + ret = focused->OfferKeyEventL( aKeyEvent, aType ); + + doScroll = (ret == EKeyWasConsumed); + } + } + + if( doScroll ) + { + // scroll the screen if the cursor goes beyond the screen + CNcsComposeViewContainer& parent = static_cast( iParent ); + + TInt screenPos( -Position().iY ); + TInt cursorPos( CursorPosition() ); + TInt lineHeight( Rect().Height() / LineCount() ); + TInt screenHeight( parent.Rect().Height() ); + + if( cursorPos - lineHeight < screenPos ) + { + screenPos = cursorPos - lineHeight; + } + else + if( cursorPos + lineHeight > screenPos + screenHeight ) + { + screenPos = cursorPos + lineHeight - screenHeight; + } + + parent.ScrollL( screenPos ); + PositionChanged(); + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::FindFocused +// --------------------------------------------------------------------------- +// +CCoeControl* CNcsHeaderContainer::FindFocused() const + { + FUNC_LOG; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + if ( cur.Control()->IsFocused() ) + { + return cur.Control(); + } + } + while ( cur.Next() ); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ChangeFocusL() +// Handles key events +// ----------------------------------------------------------------------------- +TKeyResponse CNcsHeaderContainer::ChangeFocusL( const TKeyEvent& aKeyEvent ) + { + FUNC_LOG; + ASSERT( aKeyEvent.iCode == EKeyDownArrow || aKeyEvent.iCode == EKeyUpArrow ); + TKeyResponse ret( EKeyWasNotConsumed ); + + CCoeControl* pOldCtrl = FindFocused(); + + // If nothing is focused we return + if ( !pOldCtrl ) return ret; + + //If this is the first control in the list, don't change focus + CCoeControlArray::TCursor cur = Components().Find(pOldCtrl); + if ( aKeyEvent.iCode == EKeyUpArrow && cur == Components().Begin() ) + { + return ret; + } + + // Unfocus the control + pOldCtrl->SetFocus( EFalse, ENoDrawNow ); + + CCoeControl* pNewCtrl= NULL; + if ( aKeyEvent.iCode == EKeyDownArrow && cur.Next() ) + { + pNewCtrl = cur.Control(); + pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + ret = EKeyWasConsumed; + } + else if ( aKeyEvent.iCode == EKeyUpArrow && cur.Prev() ) + { + pNewCtrl = cur.Control(); + pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + ret = EKeyWasConsumed; + } + + CNcsComposeViewContainer* container = + static_cast( &iParent ); + if ( pOldCtrl == iToField ) + { + container->CommitL(EToField); + } + else if ( pOldCtrl == iCcField) + { + container->CommitL(ECcField); + } + else if ( pOldCtrl == iBccField) + { + container->CommitL(EBccField); + } + else if ( pOldCtrl == iSubjectField) + { + container->CommitL(ESubjectField); + } + + // If the attachments label has changed focus + if ( pOldCtrl == iAttachmentField || pNewCtrl == iAttachmentField ) + { + DrawAttachmentFocusNow(); + } + + // if focus was changed, update scroll bar + if ( ret == EKeyWasConsumed ) + { + container->UpdateScrollBarL(); + } + + // NOTE: If we're leaving the header (down was pushed on last control) + // then we return EKeyWasNotConsumed to make sure the + // parent moves the focus to the control below this container + return ret; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::UpdateFieldPosition() +// One of the controls want me to readjust myself to a new position,' +// anchoring arround the given control +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::UpdateFieldPosition( CCoeControl* aAnchor ) + { + FUNC_LOG; + // if the anchor is NULL just call SizeChanged + if ( !aAnchor ) + { + SizeChanged(); + return; + } + + CCoeControlArray::TCursor cur = Components().Find( aAnchor ); + ASSERT( cur.IsValid() ); + + // figure out the new top position of the container + TInt top = aAnchor->Rect().iTl.iY; + while ( cur.Prev() ) + { + CCoeControl* ctrl = cur.Control(); + top -= ctrl->Rect().Height(); + } + + // Then check we didn't move too much and composer still fills the whole + // visible area on the screen (i.e. don't scroll below the bottom of the body field) + CNcsComposeViewContainer& parent = static_cast( iParent ); + TInt composerHeight = parent.ContentTotalHeight(); + TInt screenHeight = parent.Rect().Height(); + if ( composerHeight <= screenHeight ) + { // no scrolling is needed at all since everything fits on screen + top = 0; + } + else + { + top = Max( top, screenHeight - composerHeight ); + } + + // The top edge of the header should never be lower than on the top edge of the screen. + // For some reason, the calculation above leads to such situation if recipient and subject + // fields are scrollable. If that happens, increase the top value to 0 to prevent empty + // space showing up above the header area. + top = Min( top, 0 ); + + // set the new position of the container + SetExtent( TPoint( Rect().iTl.iX, top ), Size() ); + } + +// Platform layout change +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SizeChanged() +// set size +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::SizeChanged() + { + FUNC_LOG; + + const TRect rect( Rect() ); + + TInt currentLine( 0 ); + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + const TInt lineCount( ToNcsControl( cur )->LayoutLineCount() ); + if ( lineCount > 0 ) + { + NcsUtility::LayoutHeaderControl( cur.Control(), rect, currentLine, lineCount ); + // + // Do not use stored value lineCount because count may change + // during layout (e.g. when orientation is changed => edit field + // length may change => it grows or shrinks) + currentLine += ToNcsControl( cur )->LayoutLineCount(); + // + } + } while ( cur.Next() ); + + if( iAacListBox->IsVisible() && !iAacListBox->IsPopupEmpty() ) + { + iAacListBox->SetPopupMaxRect( CalculatePopupRect() ); + } + } +// Platform layout change + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::PositionChanged() +// set size +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::PositionChanged() + { + FUNC_LOG; + DrawDeferred(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ChangePositions() +// set positions +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ChangePositions() + { + FUNC_LOG; + TPoint nextPoint(Rect().iTl); + + CCoeControl* ctrl; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + ctrl = cur.Control(); + ctrl->SetPosition(nextPoint); + nextPoint.iY += ctrl->Size().iHeight; + } + while ( cur.Next() ); + } + + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::NeedsAifMenu +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::NeedsAifMenu() const + { + FUNC_LOG; +// + CCoeControl* focused = FindFocused(); + + // Has to be an AIF field + TBool ret = EFalse; + + if ( IsAddressInputField( focused ) ) + { + CNcsAddressInputField* aifFocused = NULL; + aifFocused = static_cast( focused ); + ret = ( aifFocused->TextEditor()->SelectionLength() > 1 ); + } + + return ret; +// + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetTotalHeight +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetTotalHeight() const + { + FUNC_LOG; + TInt ret = 0; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + CCoeControl* ctrl = cur.Control(); + ret += ctrl->Size().iHeight; + } + while (cur.Next()); + return ret; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SetAttachmentLabelTextL() +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::SetAttachmentLabelTextL( const TDesC& aText ) + { + FUNC_LOG; + if ( aText.Length() >= 1 ) + { + iAttachmentField->SetTextL( aText ); + ShowAttachmentLabelL(); + } + DrawAttachmentFocusNow(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SetAttachmentLabelTextL() +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::SetAttachmentLabelTextL( const TDesC& aAttachmentName, + const TDesC& aAttachmentSizeDesc ) + { + FUNC_LOG; + iAttachmentField->SetTextL( aAttachmentName, aAttachmentSizeDesc ); + ShowAttachmentLabelL(); + DrawAttachmentFocusNow(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ShowAttachmentLabel() +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ShowAttachmentLabelL() + { + FUNC_LOG; + if ( !iAttachmentField->IsVisible() ) + { + CCoeControlArray::TCursor cur = Components().End(); + Components().InsertLC( cur, iAttachmentField ); + CleanupStack::Pop( iAttachmentField ); + + // Platform layout change + TRAP_IGNORE( iFieldSizeObserver.UpdateFieldSizeL() ); + // Platform layout change + + CCoeControl* pOldCtrl = FindFocused(); + if ( pOldCtrl ) + { + pOldCtrl->SetFocus( EFalse, ENoDrawNow ); + } + + iAttachmentField->SetFocus( ETrue, ENoDrawNow ); + // Platform layout change + //CNcsComposeViewContainer& parent = static_cast( iParent ); + iFieldSizeObserver.UpdateFieldPosition( iAttachmentField ); + // Platform layout change + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::HideAttachmentLabel() +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::HideAttachmentLabel() + { + FUNC_LOG; + // check if we are focused and in that case + // unfocus attachment filed and focus previous control + CCoeControl* pOldCtrl = FindFocused(); + CCoeControl* pNewCtrl = NULL; + + if ( pOldCtrl == iAttachmentField ) + { + CCoeControlArray::TCursor cur = Components().Find( pOldCtrl ); + pOldCtrl->SetFocus( EFalse, ENoDrawNow ); + + if ( cur.Prev() ) + { + pNewCtrl = cur.Control(); + pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + } + } + else + { + pNewCtrl = pOldCtrl; // no need to move focus + } + + if ( pOldCtrl == iAttachmentField || pNewCtrl == iAttachmentField ) + { + DrawAttachmentFocusNow(); + } + + iAttachmentField->MakeVisible( EFalse ); + Components().Remove( iAttachmentField ); + + // Platform layout change + TRAP_IGNORE( iFieldSizeObserver.UpdateFieldSizeL() ); + // Platform layout change + + // Scroll to currently focused field + if ( pNewCtrl ) + { + // Platform layout change + //CNcsComposeViewContainer& parent = static_cast( iParent ); + iFieldSizeObserver.UpdateFieldPosition( pNewCtrl ); + // Platform layout change + } + + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SetBccFieldVisibleL() +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetBccFieldVisibleL( TBool aVisible, TDrawNow aDrawNow, TBool aFocus ) + { + FUNC_LOG; + if (iBccField->IsVisible() == aVisible) + { + return; + } + + if ( aVisible ) + { + CCoeControlArray::TCursor cur = Components().Find(iSubjectField); + Components().InsertLC(cur,iBccField); + CleanupStack::Pop( iBccField ); + + if ( aFocus ) + { + CCoeControl* focused = FindFocused(); + + if ( focused ) + { + focused->SetFocus( EFalse ); + } + iBccField->SetFocus( ETrue ); + iBccField->SelectAllTextL(); + } + } + else + { + if ( iBccField->IsFocused() ) + { + CCoeControlArray::TCursor cur = Components().Find(iBccField); + ASSERT(cur.IsValid()); + + iBccField->SetFocus(EFalse); + + cur.Prev(); //Get the control before this field + cur.Control()->SetFocus(ETrue); + } + Components().Remove( iBccField ); + } + + // Platform layout change + TRAP_IGNORE( iFieldSizeObserver.UpdateFieldSizeL() ); + // Platform layout change + + if ( aDrawNow == EDrawNow ) + { + DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SetCcFieldVisibleL() +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::SetCcFieldVisibleL( TBool aVisible, TDrawNow aDrawNow, TBool aFocus ) + { + FUNC_LOG; + if ( iCcField->IsVisible() == aVisible ) + { + return; + } + + if ( aVisible ) + { + Components().InsertAfterLC( Components().Id(*iToField), iCcField ); + CleanupStack::Pop( iCcField ); + + if ( aFocus ) + { + CCoeControl* focused = FindFocused(); + if ( focused ) + { + focused->SetFocus( EFalse ); + } + iCcField->SetFocus( ETrue ); + iCcField->SelectAllTextL(); + } + } + else + { + if( iCcField->IsFocused() ) + { + iCcField->SetFocus(EFalse); + iToField->SetFocus(ETrue); + } + Components().Remove(iCcField); + } + + // Platform layout change + TRAP_IGNORE( iFieldSizeObserver.UpdateFieldSizeL() ); + // Platform layout change + + if ( aDrawNow == EDrawNow ) + { + DrawDeferred(); + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::MopSupplyObject +// From CCoeControl. +// ----------------------------------------------------------------------------- +TTypeUid::Ptr CNcsHeaderContainer::MopSupplyObject( TTypeUid aId ) + { + FUNC_LOG; + return CCoeControl::MopSupplyObject( aId ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::LineCount +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::LineCount() const + { + FUNC_LOG; + TInt cnt = 0; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + MNcsControl* ctrl = ToNcsControl(cur); + cnt += ctrl->LineCount(); + } + while ( cur.Next() ); + return cnt; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ScrollableLines +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::ScrollableLines() const + { + FUNC_LOG; + TInt cnt = 0; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + MNcsControl* ctrl = ToNcsControl(cur); + cnt += ctrl->ScrollableLines(); + } + while ( cur.Next() ); + return cnt; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::CursorPosition +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::CursorPosition() const + { + FUNC_LOG; + CCoeControl* coe = FindFocused(); + if ( !coe ) + { + return 0; + } + + MNcsControl* ncsCtrl = dynamic_cast( coe ); + // This will give the the position relative to the top of the control + TInt pos = ncsCtrl->CursorPosition(); + // add the location of the top of the control relative to the top of the header. + pos += coe->Rect().iTl.iY - Rect().iTl.iY; + return pos; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::CursorLineNumber +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::CursorLineNumber() const + { + FUNC_LOG; + TInt cnt = 0; + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + CCoeControl* coe = cur.Control(); + MNcsControl* ctrl = ToNcsControl(cur); + if ( !coe->IsFocused() ) + { + cnt += ctrl->LineCount(); + } + else + { + cnt += ctrl->CursorLineNumber(); + break; + } + } + while ( cur.Next() ); + return cnt; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetNumChars +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetNumChars() const + { + FUNC_LOG; + TInt cnt = iToField->GetNumChars() + + iCcField->GetNumChars() + + iBccField->GetNumChars() + + iSubjectField->GetNumChars(); + + return cnt; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::UpdatePopupContactListL() +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::UpdatePopupContactListL( const TDesC& aMatchString, TBool /*aListAll*/ ) + { + FUNC_LOG; + + // do update only for address fields + CCoeControl* focused = FindFocused(); + + if ( !IsAddressInputField( focused ) ) + { + return; + } + // + + if ( aMatchString.CompareC( KNullDesC ) == 0 || + aMatchString.Compare( KAddressDelimeterSemiColon ) == 0 ) + { + ClosePopupContactListL(); + return; + } + + if( !iAacListBox->IsVisible() ) + { + iAacListBox->SetPopupMaxRect( CalculatePopupRect() ); + iAacListBox->InitAndSearchL( aMatchString ); + iAacListBox->ActivateL(); + } + else + { + iAacListBox->SetSearchTextL( aMatchString ); + } + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ClosePopupContactListL() +// ----------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ClosePopupContactListL() + { + FUNC_LOG; + // + if ( iAacListBox->IsVisible() ) + { + // + iAacListBox->MakeVisible( EFalse ); + ShowPopupMenuBarL( EFalse ); + + // The focused address field should be redrawn after the popup is closed to fix + // the field border. + if ( iToField->IsFocused() ) + { + iToField->DrawDeferred(); + } + else if ( iCcField->IsFocused() ) + { + iCcField->DrawDeferred(); + } + else if ( iBccField->IsFocused() ) + { + iBccField->DrawDeferred(); + } + // + } + // + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ShowPopupMenuBarL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::ShowPopupMenuBarL( TBool aShow ) + { + FUNC_LOG; + if ( iMenuBar ) + { + if( aShow ) + { + iMenuBar->SetCommandSetL( R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT ); + } + else + { + iMenuBar->SetCommandSetL( R_FSE_EDITOR_SOFTKEYS_OPTIONS_CLOSE ); + SetMskL(); + } + iMenuBar->DrawDeferred(); + } + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::DeleteSelectionL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::DeleteSelectionL() + { + FUNC_LOG; + +// + CCoeControl* focused = FindFocused(); + + if ( IsAddressInputField( focused ) ) + { + CNcsAddressInputField* field = NULL; + field = static_cast( focused ); + TKeyEvent event; // This mimics c -button pressing + event.iCode = EKeyBackspace; + event.iScanCode = EStdKeyBackspace; + event.iModifiers = EModifierAutorepeatable|EModifierNumLock; + event.iRepeats = 0; + TEventCode code = EEventKey; + field->OfferKeyEventL( event, code ); + } +// + + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SelectAllToFieldTextL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SelectAllToFieldTextL() + { + FUNC_LOG; + iToField->SelectAllTextL(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SelectAllCcFieldTextL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SelectAllCcFieldTextL() + { + FUNC_LOG; + iCcField->SelectAllTextL(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SelectAllBccFieldTextL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SelectAllBccFieldTextL() + { + FUNC_LOG; + iBccField->SelectAllTextL(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SelectAllSubjectFieldTextL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SelectAllSubjectFieldTextL() + { + FUNC_LOG; + iSubjectField->SelectAllTextL(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::CalculatePopupRect +// ----------------------------------------------------------------------------- +TRect CNcsHeaderContainer::CalculatePopupRect() + { + FUNC_LOG; + // get focused control rect + // Added a NULL check for FindFocused(). + // Find out why we end up here in S60 5.0 if there is no focused + // item. In S60 3.2.3 this kind of situation seems not to be possible. + TRect popupRect; + + CCoeControl* focused = FindFocused(); + if ( IsAddressInputField( focused ) ) + { + CNcsAddressInputField* aifEditor = + static_cast( focused ); + + TRect editorRect = aifEditor->Editor()->Rect(); + + popupRect.iTl = TPoint( editorRect.iTl.iX - 1, editorRect.iTl.iY + aifEditor->CursorPosition() + 1 ); + + popupRect.iBr = TPoint( editorRect.iBr.iX + 1, iParent.Rect().iBr.iY ); + } + // + + return popupRect; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::DoPopupSelect +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::DoPopupSelectL() + { + FUNC_LOG; + __ASSERT_DEBUG( iAacListBox, Panic( ENcsBasicUi ) ); + __ASSERT_DEBUG( &iMailBox, Panic( ENcsBasicUi ) ); + + if( iAacListBox->IsRemoteLookupItemSelected() ) + { +// + CCoeControl* focused = FindFocused(); + + if ( IsAddressInputField( focused ) ) + { + // Launch remote lookup + iRALInProgress = ETrue; + CNcsAddressInputField* addressField = NULL; + addressField = static_cast( focused ); + HBufC* lookupText = addressField->GetLookupTextLC(); + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason ex; + CNcsEmailAddressObject* address = ExecuteRemoteSearchL( + ex, *lookupText ); + iRALInProgress = EFalse; + if ( address ) + { + CleanupStack::PushL( address ); + IncludeAddressL( *address ); + CleanupStack::PopAndDestroy( address ); + } + CleanupStack::PopAndDestroy( lookupText ); + CNcsComposeViewContainer& parent = static_cast( iParent ); + parent.FocusChanged(EDrawNow); + } +// + } + else if( !iAacListBox->IsPopupEmpty() ) + { + CNcsEmailAddressObject* emailAddress = iAacListBox->ReturnCurrentEmailAddressLC(); + if( emailAddress ) + { + if ( emailAddress->EmailAddress().Compare( KNullDesC ) != 0 ) + { + IncludeAddressL( *emailAddress ); + } + else + { + // selected contact doesn't have email address, launch remote contact lookup + // rcl must be usable, since otherwise there couldn't be any items + // without email addresses + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason exitReason; + CNcsEmailAddressObject* remAddress = ExecuteRemoteSearchL( + exitReason, + emailAddress->DisplayName() ); + if ( remAddress ) + { + CleanupStack::PushL( remAddress ); + IncludeAddressL( *remAddress ); + CleanupStack::PopAndDestroy( remAddress ); + } + } + CleanupStack::PopAndDestroy( emailAddress ); + } + } + ClosePopupContactListL(); + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::IsPopupActive +// ----------------------------------------------------------------------------- +TBool CNcsHeaderContainer::IsPopupActive() const + { + FUNC_LOG; + if ( iAacListBox && iAacListBox->IsVisible() ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsToFieldEmpty +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsToFieldEmpty() const + { + FUNC_LOG; + return ( GetToFieldLength() < 1 ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsCcFieldEmpty +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsCcFieldEmpty() const + { + FUNC_LOG; + return ( !IsCcFieldVisible() || GetCcFieldLength() < 1 ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsBccFieldEmpty +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsBccFieldEmpty() const + { + FUNC_LOG; + return ( !IsBccFieldVisible() || GetBccFieldLength() < 1 ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsSubjectFieldEmpty +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsSubjectFieldEmpty() const + { + FUNC_LOG; + return ( GetSubjectFieldLength() < 1 ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetToFieldAddressesL +// --------------------------------------------------------------------------- +// +const RPointerArray& CNcsHeaderContainer::GetToFieldAddressesL( TBool aParseNow ) + { + return iToField->GetAddressesL( aParseNow ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetCcFieldAddressesL +// --------------------------------------------------------------------------- +// +const RPointerArray& CNcsHeaderContainer::GetCcFieldAddressesL( TBool aParseNow ) + { + return iCcField->GetAddressesL( aParseNow ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetBccFieldAddressesL +// --------------------------------------------------------------------------- +// +const RPointerArray& CNcsHeaderContainer::GetBccFieldAddressesL( TBool aParseNow ) + { + return iBccField->GetAddressesL( aParseNow ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetSubjectLC +// --------------------------------------------------------------------------- +// +HBufC* CNcsHeaderContainer::GetSubjectLC() const + { + FUNC_LOG; + HBufC* subject = HBufC::NewLC(iSubjectField->Editor()->TextLength() + 2); + TPtr des = subject->Des(); + iSubjectField->Editor()->GetText(des); + return subject; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsBccFieldVisible +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsBccFieldVisible() const + { + FUNC_LOG; + return iBccField->IsVisible(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsCcFieldVisible +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsCcFieldVisible() const + { + FUNC_LOG; + return iCcField->IsVisible(); + } + +// Unneeded IsFocusAif removed +// + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsFocusAttachments +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsFocusAttachments() const + { + FUNC_LOG; + return ( FindFocused() == iAttachmentField ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsFocusTo +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsFocusTo() const + { + FUNC_LOG; + return ( FindFocused() == iToField ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsFocusCc +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsFocusCc() const + { + FUNC_LOG; + return ( FindFocused() == iCcField ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsFocusBcc +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsFocusBcc() const + { + FUNC_LOG; + return ( FindFocused() == iBccField ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetCcFieldLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetCcFieldLength() const + { + FUNC_LOG; + return iCcField->Editor()->TrimmedTextLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetBccFieldLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetBccFieldLength() const + { + FUNC_LOG; + return iBccField->Editor()->TrimmedTextLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetToFieldLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetToFieldLength() const + { + FUNC_LOG; + return iToField->Editor()->TrimmedTextLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetSubjectFieldLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetSubjectFieldLength() const + { + FUNC_LOG; + return iSubjectField->Editor()->TrimmedTextLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetAttachmentCount +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetAttachmentCount() const + { + FUNC_LOG; + CNcsComposeViewContainer& parent = static_cast( iParent ); + return parent.GetAttachmentCount(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::HasRemoteAttachments +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::HasRemoteAttachments() const + { + FUNC_LOG; + CNcsComposeViewContainer& parent = static_cast( iParent ); + return parent.HasRemoteAttachments(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetToFieldSelectionLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetToFieldSelectionLength() const + { + FUNC_LOG; + return iToField->TextEditor()->SelectionLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetCcFieldSelectionLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetCcFieldSelectionLength() const + { + FUNC_LOG; + return iCcField->TextEditor()->SelectionLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetBccFieldSelectionLength +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::GetBccFieldSelectionLength() const + { + FUNC_LOG; + return iBccField->TextEditor()->SelectionLength(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::GetLookupTextLC +// --------------------------------------------------------------------------- +// +HBufC* CNcsHeaderContainer::GetLookupTextLC() const + { + FUNC_LOG; + CCoeControl* focused = FindFocused(); + if ( !focused ) return NULL; + + CNcsAddressInputField* aif = dynamic_cast(focused); + if ( !aif ) return NULL; + return aif->GetLookupTextLC(); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SetToFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetToFieldAddressesL( const RPointerArray& aAddress ) + { + FUNC_LOG; + iToField->SetAddressesL( aAddress ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SetCcFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetCcFieldAddressesL( const RPointerArray& aAddress ) + { + FUNC_LOG; + iCcField->SetAddressesL( aAddress ); + if (!iCcField->IsEmpty()) + SetCcFieldVisibleL(ETrue, ENoDrawNow); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SetBccFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetBccFieldAddressesL( const RPointerArray& aAddress ) + { + FUNC_LOG; + iBccField->SetAddressesL( aAddress ); + if (!iBccField->IsEmpty()) + SetBccFieldVisibleL(ETrue, ENoDrawNow); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::AppendToFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::AppendToFieldAddressesL( const RPointerArray& aAddresses ) + { + FUNC_LOG; + iToField->AppendAddressesL( aAddresses ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::AppendCcFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::AppendCcFieldAddressesL( const RPointerArray& aAddresses ) + { + FUNC_LOG; + iCcField->AppendAddressesL( aAddresses ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::AppendBccFieldAddressesL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::AppendBccFieldAddressesL( const RPointerArray& aAddresses ) + { + FUNC_LOG; + iBccField->AppendAddressesL( aAddresses ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SetSubjectL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetSubjectL( const TDesC& aSubject ) + { + FUNC_LOG; + iSubjectField->SetSubjectL( aSubject ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::SetMenuBar +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::SetMenuBar( CEikButtonGroupContainer* aMenuBar ) + { + FUNC_LOG; + iMenuBar = aMenuBar; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IncludeAddressL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::IncludeAddressL(const CNcsEmailAddressObject& aEml ) + { + FUNC_LOG; +// + CCoeControl* focused = FindFocused(); + if ( IsAddressInputField( focused ) ) + { + CNcsAddressInputField* aifFocused = NULL; + aifFocused = static_cast( focused ); + aifFocused->AddAddressL( aEml ); + } +// + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IncludeAddressL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::IncludeAddressL() + { + FUNC_LOG; +// is this methods needed at all? +// get the curren selection from popup list if there is any? + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::FocusToField +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::FocusToField() + { + FUNC_LOG; + CCoeControl* oldCtrl = FindFocused(); + if ( !oldCtrl ) + { + return; + } + oldCtrl->SetFocus( EFalse, ENoDrawNow ); + iToField->SetFocus( ETrue, ENoDrawNow ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::FocusAttachmentField +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::FocusAttachmentField() + { + FUNC_LOG; + CCoeControl* oldCtrl = FindFocused(); + if ( !oldCtrl ) + { + return; + } + oldCtrl->SetFocus( EFalse, ENoDrawNow ); + iAttachmentField->SetFocus( ETrue, ENoDrawNow ); + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::AreAddressFieldsEmpty +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::AreAddressFieldsEmpty() const + { + FUNC_LOG; + return (IsToFieldEmpty() && IsCcFieldEmpty() && IsBccFieldEmpty()) || iRALInProgress; + } + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::HandleDynamicVariantSwitchL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::HandleDynamicVariantSwitchL() + { + FUNC_LOG; + } + +// Platform layout change +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::LayoutLineCount +// --------------------------------------------------------------------------- +// +TInt CNcsHeaderContainer::LayoutLineCount() const + { + FUNC_LOG; + TInt totalLineCount( 0 ); + CCoeControlArray::TCursor cur = Components().Begin(); + do + { + totalLineCount += ToNcsControl( cur )->LayoutLineCount(); + } while ( cur.Next() ); + return totalLineCount; + } +// Platform layout change + +// +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::IsAddressInputField +// --------------------------------------------------------------------------- +// +TBool CNcsHeaderContainer::IsAddressInputField( + const CCoeControl* aControl ) const + { + FUNC_LOG; + + TBool ret = EFalse; + + if ( aControl != NULL && + ( aControl == iToField || + aControl == iCcField || + aControl == iBccField ) ) + { + ret = ETrue; + } + + return ret; + } +// + +// --------------------------------------------------------------------------- +// CNcsHeaderContainer::ExecuteRemoteSearchL +// --------------------------------------------------------------------------- +// +CNcsEmailAddressObject* CNcsHeaderContainer::ExecuteRemoteSearchL( + CPbkxRemoteContactLookupServiceUiContext::TResult::TExitReason& /*aExitReason*/, + const TDesC& aSearchText ) + { + FUNC_LOG; + const TInt KMaxLength = 255; + RBuf displayname; + displayname.CreateL( KMaxLength ); + CleanupClosePushL( displayname ); + + RBuf emailAddress; + emailAddress.CreateL( KMaxLength ); + CleanupClosePushL( emailAddress ); + + TBool contactSelected = CFsDelayedLoader::InstanceL()->GetContactHandlerL()->GetNameAndEmailFromRemoteLookupL( + iMailBox, aSearchText, displayname, emailAddress ); + + CNcsEmailAddressObject* address = NULL; + if ( contactSelected ) + { + if ( !displayname.Length() ) + { + address = CNcsEmailAddressObject::NewL( emailAddress, emailAddress ); + } + else + { + address = CNcsEmailAddressObject::NewL( displayname, emailAddress ); + } + } + + CleanupStack::PopAndDestroy( &emailAddress ); + CleanupStack::PopAndDestroy( &displayname ); + + return address; + } + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::ChangeMskCommandL +// Utility function to change the command ID and label on the middle soft key +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::ChangeMskCommandL( TInt aLabelResourceId ) + { + FUNC_LOG; + CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); + if ( cba ) + { + cba->SetCommandL( CEikButtonGroupContainer::EMiddleSoftkeyPosition, + aLabelResourceId ); + cba->DrawDeferred(); + } + } + +// +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::SwitchChangeMskOff +// sets up iSwitchChangeMskOff falg +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::SwitchChangeMskOff(TBool aTag) + { + iSwitchChangeMskOff = aTag; + } +// + +// ----------------------------------------------------------------------------- +// CNcsHeaderContainer::OpenPhonebookL +// +// ----------------------------------------------------------------------------- +void CNcsHeaderContainer::OpenPhonebookL() + { + CNcsComposeViewContainer* container = static_cast( &iParent ); + container->AppendAddressesL(); + } + +void CNcsHeaderContainer::FixSemicolonInAddressFieldsL() + { + iToField->FixSemicolonAtTheEndL(); + iCcField->FixSemicolonAtTheEndL(); + iBccField->FixSemicolonAtTheEndL(); + } + +TBool CNcsHeaderContainer::IsRemoteSearchInprogress() const + { + return iRALInProgress; + } + +// --------------------------------------------------------------------------- +// Commits changes made to given input field. +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::CommitFieldL( CCoeControl* aField ) + { + FUNC_LOG; + CNcsComposeViewContainer* container = + static_cast( &iParent ); + if ( container && aField ) + { + if ( aField == iToField ) + { + container->CommitL( EToField ); + } + else if ( aField == iCcField ) + { + container->CommitL( ECcField ); + } + else if ( aField == iBccField ) + { + container->CommitL( EBccField ); + } + else if ( aField == iSubjectField ) + { + container->CommitL( ESubjectField ); + } + } + } +