diff -r ebe688cedc25 -r 7fdbb852d323 email/mail/EditorSrc/cmsgmaileditorheader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmaileditorheader.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,394 @@ +/* +* Copyright (c) 2006 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: Mail editor header content handler. +* +*/ + +#include +#include +#include "msgmaileditor.hrh" +#include +#include +#include +#include "cmsgmaileditorheader.h" +#include "MsgMailEditorDocument.h" +#include +#include "CMailCRHandler.h" +#include "MailInternalCRKeys.h" +#include "MailLog.h" + +// --------------------------------------------------------------------------- +// CMsgMailEditorHeader +// --------------------------------------------------------------------------- +// +CMsgMailEditorHeader::CMsgMailEditorHeader( CMsgMailEditorDocument& aDocument, + CMsgEditorView& aView): iDocument( aDocument ), + iView( aView ) + { + iDocument.AttachmentModel().SetObserver( this ); + } + +// --------------------------------------------------------------------------- +// ConstructL +// --------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::ConstructL() + { + CreateHeadersL(); + } + +// --------------------------------------------------------------------------- +// NewL +// --------------------------------------------------------------------------- +// +CMsgMailEditorHeader* CMsgMailEditorHeader::NewL( + CMsgMailEditorDocument& aDocument, + CMsgEditorView& aView ) + { + CMsgMailEditorHeader* self = new( ELeave ) CMsgMailEditorHeader( + aDocument, + aView ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// ~CMsgMailEditorHeader +// --------------------------------------------------------------------------- +// +CMsgMailEditorHeader::~CMsgMailEditorHeader() + { + + } + +// ---------------------------------------------------------------------------- +// UpdateHeaderVisibilityL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::UpdateHeaderVisibilityL( + RPointerArray& aHeaders ) + { + TInt focusedControl(KErrNotFound); + TInt controlCount = 0; // to field is always present + + for ( TInt index=0; index< aHeaders.Count(); ++index ) + { + TAdditionalHeaderStatus* header = aHeaders[index]; + TMsgControlId controlID = header->iHeaderValue; + CMsgBaseControl* headerControl = + iView.ControlById( controlID ); + + if ( headerControl ) + { + if ( header->iStatus == EHeaderHidden ) + { + iView.DeleteControlL(controlID ); + } + else + { + ++controlCount; + } + + } + else + { + if ( header->iStatus == EHeaderVisible || + header->iStatus == EHeaderOnlySave ) + { + AddControlL( controlID ); + focusedControl = controlID; + } + } + + } + + if ( focusedControl >=0 ) + { + iView.SetFocus( focusedControl ); + } + } + +// ---------------------------------------------------------------------------- +// show / hide reply to control +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::UpdateReplyToControlL() + { + const CImHeader& header = iDocument.HeaderL(); + TPtrC replyto = header.ReplyTo(); + if ( replyto.Length() ) + { + AddControlL( EMailEditorControlReplyTo ); + CMsgAddressControl* addressCtrl = static_cast ( + iView.ControlById( EMailEditorControlReplyTo )); + ASSERT( addressCtrl ); + addressCtrl->Reset(); + addressCtrl->SetReadOnly( ETrue ); + + MVPbkContactLink* link( NULL ); + addressCtrl->AddRecipientL( + KNullDesC(), replyto, ETrue, link ); + } + else + { + CMsgBaseControl* field = iView.RemoveControlL( + EMailEditorControlReplyTo ); + if ( field ) + { + field->Reset(); + delete field; + field = NULL; + } + } + } + +// ---------------------------------------------------------------------------- +// AddControlL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::AddControlL( TInt aControlType ) + { + TInt resourceId(0); + TInt controlType(0); + + switch (aControlType) + { + case EMsgComponentIdTo: + { + resourceId = R_MAIL_EDITOR_TO; + controlType = EMsgAddressControl; + break; + } + case EMsgComponentIdCc: + { + resourceId = R_MAIL_EDITOR_CC; + controlType = EMsgAddressControl; + break; + } + case EMsgComponentIdBcc: + { + resourceId = R_MAIL_EDITOR_BCC; + controlType = EMsgAddressControl; + break; + } + case EMailEditorControlReplyTo: + { + resourceId = R_MAIL_EDITOR_REPLYTO; + controlType = EMsgAddressControl; + break; + } + case EMsgComponentIdSubject: + { + resourceId = R_MAIL_EDITOR_SUBJECT; + controlType = EMsgExpandableControl; + break; + } + default: + break; + } + + if ( !iView.ControlById( aControlType ) ) + { + // Mail editor control order + const TInt TControls[] = + { + EMsgComponentIdTo, + EMsgComponentIdCc, + EMsgComponentIdBcc, + EMailEditorControlReplyTo, + EMsgComponentIdSubject + }; + + const TInt count( sizeof(TControls) / sizeof(TInt) ); + TInt location( EMsgFirstControl ); // find correct location for control + for( TInt index(0); index= 0 && index < count, User::Invariant() ); + + if ( iView.ControlById( TControls[ index ] ) && // CSI: 2 # This is checked above in the assert macro. + TControls[ index ] != aControlType ) // CSI: 2 # This is checked above in the assert macro. + { + ++location; + } + else if ( TControls[ index ] == aControlType ) // CSI: 2 # This is checked above in the assert macro. + { + // we are here, so no need to check rest of controls + break; + } + } + + iView.AddControlFromResourceL( + resourceId, controlType, + location, EMsgHeader); + } + } + +// ---------------------------------------------------------------------------- +// AttachmentControl +// ---------------------------------------------------------------------------- +// +CMsgAttachmentControl* CMsgMailEditorHeader::AttachmentControl() const + { + CMsgBaseControl* ctrl = iView.ControlById( EMsgComponentIdAttachment ); + ASSERT( ctrl ); + + return static_cast( ctrl ); + } + +// ---------------------------------------------------------------------------- +// CreateHeadersL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::CreateHeadersL() + { + AddControlL( EMsgComponentIdTo ); + + TInt headersvalue(0); + CMsgMailPreferences& prefs = iDocument.SendOptions(); + iDocument.MailCRHandler()->GetCRInt( + KCRUidMail,KMailAdditionalHeaderSettings,headersvalue); + prefs.SetAdditionalHeaders( headersvalue ); + + TAdditionalHeaderStatus header_status_cc; + TAdditionalHeaderStatus header_status_bcc; + TAdditionalHeaderStatus header_status_subject; + + header_status_cc.iStatus = + prefs.GetAdditionalHeaderVisibility(EMsgComponentIdCc); + header_status_bcc.iStatus = + prefs.GetAdditionalHeaderVisibility(EMsgComponentIdBcc); + header_status_subject.iStatus = + prefs.GetAdditionalHeaderVisibility(EMsgComponentIdSubject); + + const CImHeader& header = iDocument.HeaderL(); + const CDesCArray& ccArr = header.CcRecipients(); + if(header_status_cc.iStatus == EHeaderVisible || ccArr.Count() > 0) + { + AddControlL(EMsgComponentIdCc); + } + // Check if bcc field is allowed + if ( iDocument.MailCRHandler()->MailAdditionalHeaders() ) + { + const CDesCArray& bccArr = header.BccRecipients(); + if(header_status_bcc.iStatus == EHeaderVisible || bccArr.Count() > 0) + { + AddControlL(EMsgComponentIdBcc); + } + } + // Reply-to + UpdateReplyToControlL(); + + // Subject + const TPtrC& subjectStr = header.Subject(); + if(header_status_subject.iStatus == + EHeaderVisible || + subjectStr.Length() > 0) + { + AddControlL(EMsgComponentIdSubject); + } + } + +// ---------------------------------------------------------------------------- +// DoCreateAttachmentControlL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::DoCreateAttachmentControlL() + { + if ( !iView.ControlById( EMsgComponentIdAttachment ) ) + { + LOG( "CMsgMailEditorAppUi::DoCreateAttachmentControlL() - create" ); + CMsgAttachmentControl* control = + CMsgAttachmentControl::NewL( iView, iView ); + CleanupStack::PushL( control ); + iView.AddControlL( control, + EMsgComponentIdAttachment, + EMsgAppendControl, + EMsgHeader ); + CleanupStack::Pop( control ); + } + } + +// ---------------------------------------------------------------------------- +// DoRemoveAttachmentControlL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::DoRemoveAttachmentControlL() + { + CMsgBaseControl* control = + iView.RemoveControlL( EMsgComponentIdAttachment ); + if ( control ) + { + delete control; + control = NULL; + } + } + +// ---------------------------------------------------------------------------- +// UpdateAttachmentControlL +// ---------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::UpdateAttachmentControlL( + TMsgAttachmentCommand aCommand, + CMsgAttachmentInfo* aAttachmentInfo ) + { + CMsgAttachmentModel& model = iDocument.AttachmentModel(); + if ( aCommand == EMsgAttachmentAdded ) + { + DoCreateAttachmentControlL(); + AttachmentControl()->AddAttachmentsL( model ); + } + else // to be removed + { + if ( model.NumberOfItems() == 1 ) // 1 = we are removing last atta + { + DoRemoveAttachmentControlL(); + } + else + { + ASSERT( aAttachmentInfo ); + TParsePtrC fileParser( aAttachmentInfo->FileName() ); + AttachmentControl()->RemoveAttachmentL( + fileParser.NameAndExt() ); + } + } + } + +// --------------------------------------------------------------------------- +// From class MMsgAttachmentModelObserver. +// NotifyChanges +// --------------------------------------------------------------------------- +// +void CMsgMailEditorHeader::NotifyChanges( + TMsgAttachmentCommand aCommand, + CMsgAttachmentInfo* aAttachmentInfo ) + { + LOG1( "CMsgMailEditorHeader::NotifyChanges: %d", aCommand ); + iDocument.NotifyChanges( aCommand, aAttachmentInfo ); + TRAP_IGNORE( UpdateAttachmentControlL( aCommand, aAttachmentInfo ) ); + } + +// --------------------------------------------------------------------------- +// From class MMsgAttachmentModelObserver. +// GetAttachmentFileL +// --------------------------------------------------------------------------- +// +RFile CMsgMailEditorHeader::GetAttachmentFileL( TMsvAttachmentId aId ) + { + return iDocument.GetAttachmentFileL( aId ); + } + +// End of File +