--- /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 <MsgEditorView.h>
+#include <MsgEditor.hrh>
+#include "msgmaileditor.hrh"
+#include <MsgAddressControl.h>
+#include <MsgAttachmentControl.h>
+#include <MsgAttachmentModel.h>
+#include "cmsgmaileditorheader.h"
+#include "MsgMailEditorDocument.h"
+#include <MsgMailEditor.rsg>
+#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<TAdditionalHeaderStatus>& 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<CMsgAddressControl*> (
+ 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<count; ++index )
+ {
+ __ASSERT_DEBUG( 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<CMsgAttachmentControl*>( 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
+