# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1279207165 -10800 # Node ID d620048b48106fedef333b3605f3b91ef55eec53 # Parent efd4f1afd43e8bdb50e851cfbe2fc7466c8dbd04 Revision: 201025 Kit: 2010127 diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/bwins/FSMailFrameworkU.DEF --- a/emailservices/emailframework/bwins/FSMailFrameworkU.DEF Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/bwins/FSMailFrameworkU.DEF Thu Jul 15 18:19:25 2010 +0300 @@ -28,4 +28,5 @@ ?NewL@CFSMailClient@@SAPAV1@XZ @ 27 NONAME ; class CFSMailClient * CFSMailClient::NewL(void) ?AddObserverL@CFSMailClient@@QAEXAAVMFSMailEventObserver@@@Z @ 28 NONAME ; void CFSMailClient::AddObserverL(class MFSMailEventObserver &) ?GetMailBoxByUidLC@CFSMailClient@@QAEPAVCFSMailBox@@VTFSMailMsgId@@@Z @ 29 NONAME ; class CFSMailBox * CFSMailClient::GetMailBoxByUidLC(class TFSMailMsgId) + ?PrepareMrDescriptionL@CFSMailClient@@UAEXABVTFSMailMsgId@@0@Z @ 30 NONAME ; void CFSMailClient::PrepareMrDescriptionL(class TFSMailMsgId const &, class TFSMailMsgId const &) diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/commonlib/inc/CFSMailCommon.h --- a/emailservices/emailframework/commonlib/inc/CFSMailCommon.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/commonlib/inc/CFSMailCommon.h Thu Jul 15 18:19:25 2010 +0300 @@ -47,6 +47,7 @@ EFSMsgFlag_OnlyToMe = 2048, // The message was sent only to this user EFSMsgFlag_RemoteDeleted = 4096, // The message has been deleted on the server EFSMsgFlag_HasMsgSender = 8192, // The message has one or more senders + EFSMsgFlag_BodyTruncated = 16384, // The message body has exceeded the maximum size and was truncated }; /** email list sorting options */ diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/eabi/FSMailFrameworkU.DEF --- a/emailservices/emailframework/eabi/FSMailFrameworkU.DEF Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/eabi/FSMailFrameworkU.DEF Thu Jul 15 18:19:25 2010 +0300 @@ -42,4 +42,5 @@ _ZTV23CFSMailBrandManagerImpl @ 41 NONAME _ZTV26CFSClientAPIRequestHandler @ 42 NONAME _ZN13CFSMailClient17GetMailBoxByUidLCE12TFSMailMsgId @ 43 NONAME + _ZN13CFSMailClient21PrepareMrDescriptionLERK12TFSMailMsgIdS2_ @ 44 NONAME diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/inc/CFSMailClient.h --- a/emailservices/emailframework/inc/CFSMailClient.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/inc/CFSMailClient.h Thu Jul 15 18:19:25 2010 +0300 @@ -389,7 +389,15 @@ * @param aMailboxName new name for the mailbox */ IMPORT_C void SetMailboxName( const TFSMailMsgId aMailboxId, const TDesC& aMailboxName ); - + + /** + * Prepares and sets the MR description by converting HTML body to Plain text + * + * @param aMailboxId mailbox id + * @param aMessageId message id + */ + IMPORT_C virtual void PrepareMrDescriptionL( const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aMessageId ); public: // from CExtendableEmail /** diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/inc/CFSMailPlugin.h --- a/emailservices/emailframework/inc/CFSMailPlugin.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/inc/CFSMailPlugin.h Thu Jul 15 18:19:25 2010 +0300 @@ -1019,6 +1019,16 @@ * @param aMailboxName new name for the mailbox */ virtual void SetMailboxName(const TFSMailMsgId& aMailboxId, const TDesC& aMailboxName ) = 0; + + /** + * Prepares and sets the MR description by converting HTML body to Plain text + * + * @param aMailboxId mailbox id + * @param aMessageId message id + */ + virtual void PrepareMrDescriptionL( const TFSMailMsgId& /*aMailBoxId*/, + const TFSMailMsgId& /*aMessageId*/ ) + { return; }; protected: diff -r efd4f1afd43e -r d620048b4810 emailservices/emailframework/src/CFSMailClient.cpp --- a/emailservices/emailframework/src/CFSMailClient.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailframework/src/CFSMailClient.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -553,7 +553,24 @@ plugin->SetMailboxName( aMailboxId, aMailboxName ); } } - + +// ----------------------------------------------------------------------------- +// CFSMailClient::PrepareMrDescriptionL +// ----------------------------------------------------------------------------- +EXPORT_C void CFSMailClient::PrepareMrDescriptionL( const TFSMailMsgId& aMailBoxId, + const TFSMailMsgId& aMessageId ) + { + FUNC_LOG; + CFSMailMessage* message = NULL; + // select plugin + CFSMailPlugin* plugin = iFWImplementation->GetPluginManager().GetPluginByUid( aMessageId ); + if ( plugin ) + { + // set MR description from the plugin + plugin->PrepareMrDescriptionL( aMailBoxId, aMessageId ); + } + } + // ----------------------------------------------------------------------------- // CFSMailClient::Close // ----------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailmailboxdetails.h Thu Jul 15 18:19:25 2010 +0300 @@ -71,8 +71,6 @@ // For bookkeeping // id of the mailbox in the message store TFSMailMsgId iMailboxId; - // array of message details objects - RPointerArray iMessageDetailsArray; // Data // mailbox name HBufC* iMailboxName; diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -483,7 +483,7 @@ *ints ); iLiwIf->PublishActiveMailboxNameL( - aWidgetInstance, + aWidgetInstance, aRowNumber, *mailboxAndCount); CleanupStack::PopAndDestroy(mailboxAndCount); @@ -495,7 +495,7 @@ // show only mailbox name iLiwIf->PublishActiveMailboxNameL( - aWidgetInstance, + aWidgetInstance, aRowNumber, accountName); } } @@ -505,8 +505,8 @@ // Publishing empty descriptor for rows that should not contain // anything on widget UI. iLiwIf->PublishActiveMailboxNameL( aWidgetInstance, - aRowNumber, - KNullDesC); + aRowNumber, + KNullDesC); } } @@ -537,7 +537,7 @@ CFSMailFolder* folder = MailClient().GetFolderByUidL( mailBoxId, parentFolder ); if ( !folder ) { - UpdateEmptyMessagesL( aWidgetInstance, aRow ); + UpdateEmptyMessagesL( aWidgetInstance, aRow ); return; } CleanupStack::PushL( folder ); @@ -757,9 +757,9 @@ { mailBoxId = iAccountsArray[aMailBoxNumber]->iMailboxId; iLiwIf->PublishMailboxIconL( aWidgetInstance, - aRowNumber, - EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account, - mailBoxId); + aRowNumber, + EMbmCmailhandlerpluginQgn_indi_cmail_drop_email_account, + mailBoxId); } else { @@ -886,14 +886,12 @@ } case TFSEventNewMail: { - HandleNewMailEventL( aMailbox, aParam1, aParam2 ); SetUpdateNeeded( aMailbox ); UpdateFullL(); break; } case TFSEventMailDeleted: { - HandleMailDeletedEventL( aMailbox, aParam1, aParam2 ); SetUpdateNeeded( aMailbox ); UpdateFullL(); break; @@ -983,162 +981,6 @@ } } -// --------------------------------------------------------- -// CMailCpsHandler::HandleNewMailEventL -// --------------------------------------------------------- -// -void CMailCpsHandler::HandleNewMailEventL( - TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2 ) - { - FUNC_LOG; - - iSettings->ToggleWidgetNewMailIconL( ETrue, aMailbox ); - - // Basic assertions - if ( !aParam1 || !aParam2 ) - { - User::Leave( KErrArgument ); - } - - // typecast param2 - TFSMailMsgId* parentFolder = static_cast( aParam2 ); - - // Check that folder is correct - CFSMailFolder* folder = MailClient().GetFolderByUidL( aMailbox, *parentFolder ); - if ( !folder ) - { - User::Leave( KErrNotFound ); - } - CleanupStack::PushL( folder ); - if ( folder->GetFolderType() != EFSInbox ) - { - CleanupStack::PopAndDestroy( folder ); - return; - } - CleanupStack::PopAndDestroy( folder ); - - // typecast param1 - RArray* newEntries( - static_cast< RArray* >( aParam1 ) ); - CleanupClosePushL( *newEntries ); - const TInt iiMax( newEntries->Count() ); - if ( iiMax == 0 ) - { - User::Leave( KErrArgument ); - } - - // Loop through message array - TFSMailMsgId msgId; - CFSMailMessage* msg( NULL ); - CMailMailboxDetails* mailbox; - for ( TInt ii = 0; ii < iiMax; ii++ ) - { - msgId = (*newEntries)[ii]; - - msg = MailClient().GetMessageByUidL( - aMailbox, *parentFolder, (*newEntries)[ii], EFSMsgDataEnvelope ); - if ( !msg ) - { - User::Leave( KErrNotFound ); - } - CleanupStack::PushL( msg ); - - // Check if message read - if ( !MsgIsUnread( *msg ) ) - { - // Ignore already read messages - CleanupStack::PopAndDestroy( msg ); - continue; - } - - // Find mailbox instance from array - mailbox = FindMailboxDetails( aMailbox ); - if ( !mailbox ) - { - CleanupStack::PopAndDestroy( msg ); - CleanupStack::PopAndDestroy( newEntries ); - return; - } - - // Check if message is duplicate - if ( IsDuplicate( *mailbox, msgId ) ) - { - // Ignore already known messages - CleanupStack::PopAndDestroy( msg ); - continue; - } - - CMailMessageDetails* messageDetails = CMailMessageDetails::NewL( - msg->GetMessageId(), - mailbox, - msg->GetSender()->GetEmailAddress(), - msg->GetSubject(), - msg->GetDate() ); - CleanupStack::PopAndDestroy( msg ); - CleanupStack::PushL( messageDetails ); - - // Place message to array - mailbox->iMessageDetailsArray.AppendL( messageDetails ); - CleanupStack::Pop( messageDetails ); - } - CleanupStack::PopAndDestroy( newEntries ); - } - -// --------------------------------------------------------- -// CMailCpsHandler::HandleMailDeletedEventL -// --------------------------------------------------------- -// -void CMailCpsHandler::HandleMailDeletedEventL( - TFSMailMsgId aMailbox, TAny* aParam1, TAny* aParam2 ) - { - FUNC_LOG; - // Basic assertions - if ( !aParam1 || !aParam2 ) - { - User::Leave( KErrArgument ); - } - // Typecast parameters - RArray* entries( - static_cast< RArray* >( aParam1 ) ); - CleanupClosePushL( *entries ); - if ( entries->Count() == 0 ) - { - User::Leave( KErrArgument ); - } - - // Find correct mailbox - CMailMailboxDetails* mailbox = FindMailboxDetails( aMailbox ); - if ( !mailbox ) - { - CleanupStack::PopAndDestroy( entries ); - return; - } - - const TInt iiMax( entries->Count() ); - const TInt jjMax( mailbox->iMessageDetailsArray.Count() ); - // Loop through entries in the array - for ( TInt ii = 0; ii < iiMax; ii++ ) - { - // Loop through messages in the local cache - for ( TInt jj = 0; jj < jjMax; jj++ ) - { - if ( mailbox->iMessageDetailsArray[jj]->iMsgId.Id() == - (*entries)[ii].Id() ) - { - CMailMessageDetails* details = mailbox->iMessageDetailsArray[jj]; - delete details; - details = NULL; - mailbox->iMessageDetailsArray.Remove(jj); - break; // breaks out from the inner loop and starts new outer loop if necessary - } - else - { - } - } - } - - CleanupStack::PopAndDestroy( entries ); - } // --------------------------------------------------------- // CMailCpsHandler::GetUnreadCountL @@ -1666,24 +1508,6 @@ } // ----------------------------------------------------------------------------- -// CMailCpsHandler::IsDuplicate -// ----------------------------------------------------------------------------- -TBool CMailCpsHandler::IsDuplicate( const CMailMailboxDetails& aMailbox, const TFSMailMsgId& aMsgId ) - { - FUNC_LOG; - TBool isDuplicate( EFalse ); - const TInt size( aMailbox.iMessageDetailsArray.Count() ); - for ( TInt jj = 0; jj < size; jj++ ) - { - if ( aMailbox.iMessageDetailsArray[jj]->iMsgId.Id() == aMsgId.Id() ) - { - isDuplicate = ETrue; - } - } - return isDuplicate; - } - -// ----------------------------------------------------------------------------- // CMailCpsHandler::LaunchWidgetSettingsL() // ----------------------------------------------------------------------------- // diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailmailboxdetails.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -55,7 +55,6 @@ FUNC_LOG; delete iMailboxName; delete iWidgetInstance; - iMessageDetailsArray.ResetAndDestroy(); } // --------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/emailsoundhandler.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -68,6 +68,7 @@ void CFSMailSoundHandler::ConstructL() { FUNC_LOG; + CFSNotificationHandlerBase::ConstructL(); SetObserving(ETrue); diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/cmailhandlerplugin/src/fsnotificationhandlerbaseimpl.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/fsnotificationhandlerbaseimpl.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/fsnotificationhandlerbaseimpl.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -16,10 +16,8 @@ */ #include -// #include "emailtrace.h" #include "cfsmailclient.h" -// #include "fsnotificationhandlermgr.h" #include "fsnotificationhandlerbase.h" @@ -29,6 +27,8 @@ #include "FreestyleEmailUiConstants.h" +const TInt KTimerDelay = 20; + // ======== MEMBER FUNCTIONS ======== CFSNotificationHandlerBase::CFSNotificationHandlerBase( @@ -42,12 +42,17 @@ void CFSNotificationHandlerBase::ConstructL() { FUNC_LOG; + + iTimer = CNewMailNotificationTimer::NewL( *this ); } CFSNotificationHandlerBase::~CFSNotificationHandlerBase() { FUNC_LOG; REComSession::DestroyedImplementation( iDestructorKey ); + + delete iTimer; + iNewInboxEntries.Reset(); } CFSMailClient& CFSNotificationHandlerBase::MailClient() const @@ -64,16 +69,6 @@ return; } - /* TBool capabilitiesToContinue( CapabilitiesToContinueL( aEvent, - aMailbox, - aParam1, - aParam2, - aParam3) ); - if ( !capabilitiesToContinue ) - { - return; - }*/ - HandleEventL( aEvent, aMailbox, aParam1, aParam2, aParam3 ); } @@ -102,14 +97,20 @@ } TBool CFSNotificationHandlerBase::MessagesCauseNotificationL( TFSMailMsgId aMailboxId, - CFSMailFolder& aParentFolder, + TFSMailMsgId aParentFolderId, const RArray& aMsgIdList ) { FUNC_LOG; + + CFSMailFolder* parentFolder( + MailClient().GetFolderByUidL( aMailboxId, aParentFolderId ) ); + User::LeaveIfNull( parentFolder ); + CleanupStack::PushL( parentFolder ); + CFSMailMessage* newestMsg( NULL ); TRAPD( notFoundError, newestMsg = - NewestMsgInFolderL( aParentFolder ) ); + NewestMsgInFolderL( *parentFolder ) ); if ( notFoundError == KErrNotFound ) { // For some odd reason we are not able to get the newest @@ -125,11 +126,12 @@ delete newestMsg; newestMsg = NULL; - TFSMailMsgId parentFolderId( aParentFolder.GetFolderId() ); - - TInt index( 0 ); + CleanupStack::PopAndDestroy( parentFolder ); + const TInt entriesCount( aMsgIdList.Count() ); - while ( index < entriesCount ) + TInt index( entriesCount-1 ); + // go from back of list, as messages are coming from earliest to latest.. + while ( index >= 0 ) { // Let's get the message. We need to check from it that // it is really unread. This info is stored in the @@ -139,7 +141,7 @@ CFSMailMessage* currentMessage( MailClient().GetMessageByUidL( aMailboxId, - parentFolderId, + aParentFolderId, aMsgIdList[index], EFSMsgDataEnvelope ) ); User::LeaveIfNull( currentMessage ); @@ -157,7 +159,7 @@ return ETrue; } - ++index; + --index; } return EFalse; @@ -221,33 +223,33 @@ { User::Leave( KErrArgument ); } - CFSMailFolder* parentFolder( - MailClient().GetFolderByUidL( aMailbox, *parentFolderId ) ); - User::LeaveIfNull( parentFolder ); - CleanupStack::PushL( parentFolder ); - + // Set the notification on only in cases that the new mail is // in folder of type EFSInbox - if ( parentFolder->GetFolderType() == EFSInbox ) + if ( iOwner.GetFolderTypeL( aMailbox, parentFolderId ) == EFSInbox ) { - RArray* newEntries( static_cast< RArray* >( aParam1 ) ); - if ( MessagesCauseNotificationL( - aMailbox, - *parentFolder, - *newEntries ) ) + TInt count = newEntries->Count(); + for ( TInt i = 0; ioperator []( i ); + TNewMailInfo info( msgId, aMailbox, *parentFolderId ); + iNewInboxEntries.AppendL( info ); } + + if (iTimer->IsActive() ) + { + iTimer->Cancel(); + } + iTimer->After( KTimerDelay ); } else { // If messages are in some other folder than in inbox // they have no effect on the notification } - CleanupStack::PopAndDestroy( parentFolder ); } else { @@ -257,9 +259,51 @@ } } +void CFSNotificationHandlerBase::TimerExpiredL() + { + // process collected insert requests + RArray msgIds; + TFSMailMsgId mailBoxId; + TFSMailMsgId parentFolderId; + for ( TInt i = 0; i< iNewInboxEntries.Count(); i++ ) + { + TNewMailInfo& info = iNewInboxEntries[ i ]; + if ( mailBoxId.IsNullId() && parentFolderId.IsNullId() ) + { + // starting new group is starting to collect + mailBoxId = info.iMailBox; + parentFolderId = info.iParentFolderId; + } + if ( mailBoxId == info.iMailBox && parentFolderId == info.iParentFolderId ) + { + // collect message ids for the same mailbox and parent folder + msgIds.Append( info.iMsgId ); + } + else + { + // process collected message ids for the same mailbox and parent folder + if ( msgIds.Count()&& MessagesCauseNotificationL( mailBoxId, parentFolderId, msgIds ) ) + { + TurnNotificationOn(); + } + // clear data and start collecting again + msgIds.Reset(); + mailBoxId = TFSMailMsgId(); + parentFolderId = TFSMailMsgId(); + } + } + // process collected message ids for the same mailbox and parent folder + if ( msgIds.Count() && MessagesCauseNotificationL( mailBoxId, parentFolderId, msgIds ) ) + { + TurnNotificationOn(); + } + // clear processed entries + msgIds.Reset(); + iNewInboxEntries.Reset(); + } CFSMailMessage* CFSNotificationHandlerBase::NewestMsgInFolderL( - /*const*/ CFSMailFolder& aFolder ) const + CFSMailFolder& aFolder ) const { FUNC_LOG; // Load info only necessary for sorting by date into the messages. @@ -273,11 +317,11 @@ RArray sorting; CleanupClosePushL( sorting ); // First criteria appended would be the primary criteria - // but here we don't have any other criterias + // but here we don't have any other criteria sorting.Append( criteriaDate ); MFSMailIterator* iterator = aFolder.ListMessagesL( details, sorting ); - // Resetting array of sort criterias already here because + // Resetting array of sort criteria already here because // the iterator does not need it anymore. CleanupStack::PopAndDestroy(); // sorting @@ -303,6 +347,52 @@ return outcome; } +CNewMailNotificationTimer::CNewMailNotificationTimer( MFSTimerObserver& aObserver ) : + CTimer( EPriorityIdle ), iObserver( aObserver ) + { + FUNC_LOG; + } + +void CNewMailNotificationTimer::ConstructL() + { + FUNC_LOG; + CTimer::ConstructL(); + CActiveScheduler::Add( this ); + } + +CNewMailNotificationTimer* CNewMailNotificationTimer::NewL( + MFSTimerObserver& aObserver ) + { + FUNC_LOG; + CNewMailNotificationTimer* self = + new( ELeave ) CNewMailNotificationTimer( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +CNewMailNotificationTimer::~CNewMailNotificationTimer() + { + FUNC_LOG; + Cancel(); + } + +void CNewMailNotificationTimer::DoCancel() + { + FUNC_LOG; + // Cancel Base class + CTimer::DoCancel(); + } + +void CNewMailNotificationTimer::RunL() + { + FUNC_LOG; + iObserver.TimerExpiredL(); + } + + void Panic( TCmailhandlerPanic aPanic ) { _LIT( KPanicText, "emailhandlerplugin" ); diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/inc/cmailmailboxdetails.h --- a/emailservices/emailserver/inc/cmailmailboxdetails.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/inc/cmailmailboxdetails.h Thu Jul 15 18:19:25 2010 +0300 @@ -61,8 +61,6 @@ // For bookkeeping // id of the mailbox in the message store TFSMailMsgId iMailboxId; - // array of message details objects - RPointerArray iMessageDetailsArray; // Data // mailbox name HBufC* iMailboxName; diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/inc/fsnotificationhandlerbase.h --- a/emailservices/emailserver/inc/fsnotificationhandlerbase.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/inc/fsnotificationhandlerbase.h Thu Jul 15 18:19:25 2010 +0300 @@ -29,8 +29,78 @@ class CFSMailMessage; class MFSNotificationHandlerMgr; class CFSNotificationHandlerHSConnection; +class TFSMailMsgId; +class TNewMailInfo + { +public: + inline TNewMailInfo( TFSMailMsgId aMsgId, + TFSMailMsgId aMailBoxId, + TFSMailMsgId aParentFolderId) + : iMsgId( aMsgId ), iMailBox( aMailBoxId ), iParentFolderId( aParentFolderId) + { } + + TFSMailMsgId iMsgId; + TFSMailMsgId iMailBox; + TFSMailMsgId iParentFolderId; + }; + +class MFSTimerObserver + { + public: + + /** + * TODO document me + */ + virtual void TimerExpiredL() = 0; + + }; + +class CNewMailNotificationTimer : public CTimer + { +public: + + static CNewMailNotificationTimer* NewL( + MFSTimerObserver& aObserver ); + static CNewMailNotificationTimer* NewLC( + MFSTimerObserver& aObserver ); + + /** + * Destructor. + */ + virtual ~CNewMailNotificationTimer(); + + +protected: + + /** + * Constructor. + * + * @since S60 ?S60_version + * @param aObserver Observer of this timer. + */ + CNewMailNotificationTimer( + MFSTimerObserver& aObserver ); + void ConstructL(); + +// from base class CActive + virtual void DoCancel(); + virtual void RunL(); + +private: + + + +private: // data + + /** + * Observer and user of this timer. + */ + MFSTimerObserver& iObserver; + + }; + /** * A base class for notification handlers that need timer services. * @@ -41,7 +111,7 @@ * @lib ?library * @since S60 ?S60_version *** for example, S60 v3.0 */ -class CFSNotificationHandlerBase : public CBase, public MFSMailEventObserver +class CFSNotificationHandlerBase : public CBase, public MFSMailEventObserver, public MFSTimerObserver { public: @@ -133,7 +203,7 @@ * messages was found among the identified messages. */ virtual TBool MessagesCauseNotificationL( TFSMailMsgId aMailboxId, - CFSMailFolder& aParentFolder, + TFSMailMsgId aParentFolderId, const RArray& aMsgIdList ); @@ -234,6 +304,9 @@ */ virtual void TurnNotificationOff() = 0; +// from TODO + virtual void TimerExpiredL(); + protected: // data /** @@ -253,6 +326,10 @@ // Destructor key for the ECOM plugin TUid iDestructorKey; + + RArray iNewInboxEntries; + + CNewMailNotificationTimer* iTimer; }; #include "fsnotificationhandlerbase.inl" diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/inc/fsnotificationhandlermgr.h --- a/emailservices/emailserver/inc/fsnotificationhandlermgr.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/inc/fsnotificationhandlermgr.h Thu Jul 15 18:19:25 2010 +0300 @@ -73,7 +73,6 @@ */ virtual CFSNotificationHandlerHSConnection* HSConnection() const = 0; - // virtual void MessageQueryL( TDesC& aMailboxName, TRequestStatus& aStatus, const TDesC& aCustomMessageText, @@ -82,7 +81,12 @@ virtual TInt AuthenticateL( TDes& aPassword, TDesC& aMailboxName, TRequestStatus& aStatus ) = 0; - // + + /** + * Gets cached folder type + * @param TODO SK + */ + virtual TFSFolderType GetFolderTypeL( TFSMailMsgId& aMailbox, TFSMailMsgId* parentFolderId ) = 0; /** * Increases the active dialog count. @@ -118,7 +122,6 @@ // protected: - }; diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/inc/fsnotificationhandlermgrimpl.h --- a/emailservices/emailserver/inc/fsnotificationhandlermgrimpl.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/inc/fsnotificationhandlermgrimpl.h Thu Jul 15 18:19:25 2010 +0300 @@ -99,7 +99,11 @@ virtual TInt AuthenticateL( TDes& aPassword, TDesC& aMailboxName, TRequestStatus& aStatus ); - // + + /** + * @see MFSNotificationHandlerMgr::GetFolderType + */ + virtual TFSFolderType GetFolderTypeL( TFSMailMsgId& aMailbox, TFSMailMsgId* parentFolderId ); /** * @see MFSNotificationHandlerMgr::IncreaseDialogCount @@ -171,7 +175,7 @@ */ void CreateAndStoreHandlerL( TInt aImplementationUid ); - void CleanTempFilesIfNeededL(); + void CleanTempFilesIfNeededL(); private: // data @@ -209,6 +213,10 @@ */ TInt iDialogCount; + // for caching of parent folder type + TFSMailMsgId iPreviousMailbox; + TFSMailMsgId iPreviousParentFolderId; + TFSFolderType iPreviousParentFolderType; }; #endif // C_FSNOTIFICATIONHANDLERMGRIMPL_H diff -r efd4f1afd43e -r d620048b4810 emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp --- a/emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/emailserver/src/fsnotificationhandlermgrimpl.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -70,7 +70,7 @@ } // --------------------------------------------------------------------------- -// Finishes the initialisation +// Finishes the initialization // --------------------------------------------------------------------------- // void CFSNotificationHandlerMgr::RunL() @@ -189,15 +189,13 @@ iHSConnection = NULL; - if( iMailClient ) - { + if( iMailClient ) + { iMailClient->Close(); iMailClient = NULL; - } + } - // - iAppUi = NULL; - // + iAppUi = NULL; // Finished using ECom // ECom used at least in CFSMailHSUpdateHandler @@ -231,8 +229,11 @@ } case TFSEventMailboxDeleted: { - // Don't have to do anything here. Observing has ended when the - // mailbox is deleted. + // Observing has ended when the mailbox is deleted. + + // reset mailbox cached values + iPreviousParentFolderId = TFSMailMsgId(); + iPreviousMailbox = TFSMailMsgId(); break; } case TFSMailboxAvailable: // Flow through @@ -243,13 +244,13 @@ } case TFSEventNewMail: { - // If this is a preinstalled version and we receive a new mail we + // If this is a pre-installed version and we receive a new mail we // update the current status of the HS here before passing // the events to handlers so they don't have to do it. If they // do it, it is done several times which is not desired. // The drawback is that by doing it here we might also do it // in situations where the handlers would actually not need it. - // Possibly the best solution would be to initialise the + // Possibly the best solution would be to initialize the // iHSConnection once and then let it observe for changes in // central repository. Currently that solution is not implemented // as it would require more time to implement. @@ -269,7 +270,7 @@ { // Event is passed to each handler. If one fails the // event is still passed to others as they are not - // necessarily dependant on the same services. This way + // necessarily dependent on the same services. This way // If one fails the others can still succeed. TRAP_IGNORE( iHandlers[handlerIndex]->EventL( aEvent, @@ -339,6 +340,37 @@ return err; } + +TFSFolderType CFSNotificationHandlerMgr::GetFolderTypeL( TFSMailMsgId& aMailbox, TFSMailMsgId* parentFolderId ) + { + TFSFolderType folderType( EFSInbox ); + if ( parentFolderId ) + { + if ( (*parentFolderId) == iPreviousParentFolderId && + aMailbox == iPreviousMailbox ) + { + // we assume that folder with some id does not change + // its type during mail synchronization + folderType = iPreviousParentFolderType; + } + else + { + iPreviousParentFolderId = (*parentFolderId); + // Get the parent folder object + CFSMailFolder* parentFolder = iMailClient->GetFolderByUidL( + aMailbox, *parentFolderId ); + if ( parentFolder ) + { + folderType = parentFolder->GetFolderType(); + iPreviousParentFolderType = folderType; + delete parentFolder; + parentFolder = NULL; + } + } + } + + return folderType; + } // --------------------------------------------------------------------------- // // --------------------------------------------------------------------------- @@ -419,7 +451,7 @@ // --------------------------------------------------------------------------- // void CFSNotificationHandlerMgr::CleanTempFilesIfNeededL() - { + { FUNC_LOG; RFs fsSession; User::LeaveIfError(fsSession.Connect()); @@ -427,19 +459,19 @@ // Check whether disk space is below 3MB, in that case start cleaning up // downloaded attachments from mailboxes. if ( SysUtil::DiskSpaceBelowCriticalLevelL( &fsSession, 3*KMegaByte, EDriveC ) ) - { - RPointerArray mailBoxList; - // Null id given as a plugin id. mailboxes of all plugins retrieved. - // Notice that ownership of the mailboxes is not passed to here. - iMailClient->ListMailBoxes( TFSMailMsgId(), mailBoxList ); - for ( TInt i = 0 ; i < mailBoxList.Count() ; ++i ) - { - TRAP_IGNORE( mailBoxList[i]->RemoveDownLoadedAttachmentsL() ); - } - mailBoxList.ResetAndDestroy(); - } + { + RPointerArray mailBoxList; + // Null id given as a plugin id. mailboxes of all plugins retrieved. + // Notice that ownership of the mailboxes is not passed to here. + iMailClient->ListMailBoxes( TFSMailMsgId(), mailBoxList ); + for ( TInt i = 0 ; i < mailBoxList.Count() ; ++i ) + { + TRAP_IGNORE( mailBoxList[i]->RemoveDownLoadedAttachmentsL() ); + } + mailBoxList.ResetAndDestroy(); + } CleanupStack::PopAndDestroy( &fsSession ); - } + } // diff -r efd4f1afd43e -r d620048b4810 emailservices/psmruadapter/inc/CPsMruAdapter.h --- a/emailservices/psmruadapter/inc/CPsMruAdapter.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/psmruadapter/inc/CPsMruAdapter.h Thu Jul 15 18:19:25 2010 +0300 @@ -111,7 +111,7 @@ */ void DeleayMailboxCreationEventL( TFSMailMsgId &aMailbox ); - private: + private: /** * Constructor @@ -126,18 +126,18 @@ /** * Updates given data store - */ + */ TBool FillDataStoreL( TDesC& aDataStoreURI ); /** * Updates given data store - */ + */ TBool FillDataStoreL( TFSMailMsgId& aId ); /** * Updates a list of supported data stores - */ - void UpdateSupportedDataStoresList(); + */ + void UpdateSupportedDataStoresList(); /** * Starts observing mailbox @@ -166,12 +166,12 @@ /** * Updates given data store - */ - TBool FillDataStoreL( TFSMailMsgId& aId, TDesC& aDataStoreURI ); + */ + TBool FillDataStoreL( TFSMailMsgId& aId, TDesC& aDataStoreURI ); /** * Calls MDataStoreObserver::AddData for every mru email - used for trapping - */ + */ void AddMruEmailsL( MDesCArray* aMruList, TDesC& aDataStoreURI ); private: // data @@ -185,12 +185,12 @@ /** * An observer instance used to send the datastore to the adapter */ - MStoreListObserver* iStoreListObserver; - + MStoreListObserver* iStoreListObserver; + /** * Supported Uris(data stores) */ - RPointerArray iSupportedUris; + RPointerArray iSupportedUris; /** * List of mailboxes currently being observed @@ -212,6 +212,10 @@ */ RArray iDelayedCreatedMailboxes; + TFSMailMsgId iPreviousMailboxId; + TFSMailMsgId iPreviousParentFolderId; // not owned + /* folder type for a mailbox referenced by iPreviousMailbox and iPreviousParentFolderId */ + TFSFolderType iPreviousParentFolderType; }; // class CPsMruAdapter //----------------------------------------------------------------------------- @@ -236,7 +240,7 @@ // d-tor virtual ~CDelayMailboxCreationHelper(); // Start timer to call CPsMruAdapter::DeleayedMailboxCreationEventL by RunL - void StartDelayedCall(); + void StartDelayedCall(); protected: // on timer event - calls CPsMruAdapter::DeleayedMailboxCreationEventL virtual void RunL(); diff -r efd4f1afd43e -r d620048b4810 emailservices/psmruadapter/src/CPsMruAdapter.cpp --- a/emailservices/psmruadapter/src/CPsMruAdapter.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailservices/psmruadapter/src/CPsMruAdapter.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -17,6 +17,7 @@ + #include #include #include @@ -53,7 +54,7 @@ // Get the PsData plugin parametrs TPsDataPluginParams* params = - reinterpret_cast(aPsDataPluginParameters ); + reinterpret_cast(aPsDataPluginParameters ); CPsMruAdapter* self = new ( ELeave ) CPsMruAdapter(); CleanupStack::PushL(self); self->ConstructL( params->iDataStoreObserver, params->iStoreListObserver ); @@ -83,7 +84,7 @@ void CPsMruAdapter::ConstructL( MDataStoreObserver* aObserverForDataStore, MStoreListObserver* aStoreListObserver ) { - FUNC_LOG; + FUNC_LOG; PRINT ( _L( "Enter CPsMruAdapter::ConstructL" ) ); // Mail client for FS Email framework @@ -109,7 +110,7 @@ // ---------------------------------------------------------------------------- CPsMruAdapter::~CPsMruAdapter() { - FUNC_LOG; + FUNC_LOG; PRINT ( _L( "Enter CPsMruAdapter::~CPsMruAdapter" ) ); iSupportedUris.ResetAndDestroy(); @@ -140,8 +141,8 @@ // // ---------------------------------------------------------------------------- void CPsMruAdapter::RequestForDataL( TDesC& aDataStoreURI ) - { - FUNC_LOG; + { + FUNC_LOG; PRINT ( _L( "Enter CPsMruAdapter::RequestForDataL" ) ); // Add data to datastore, fill only requested one @@ -158,7 +159,7 @@ void CPsMruAdapter::GetSupportedDataStoresL( RPointerArray &aDataStoresURIs ) { - FUNC_LOG; + FUNC_LOG; for ( TInt i = 0; i < iSupportedUris.Count(); i++ ) { aDataStoresURIs.Append( iSupportedUris[i] ); @@ -171,7 +172,7 @@ // ---------------------------------------------------------------------------- TAny* CPsMruAdapter::RequestForDataExtensionL(TInt /*aItemId*/) { - FUNC_LOG; + FUNC_LOG; // No extention required for this since we have and interger as itemId // Simply return NULL return NULL; @@ -183,7 +184,7 @@ // ---------------------------------------------------------------------------- void CPsMruAdapter::UpdateSupportedDataStoresList() { - FUNC_LOG; + FUNC_LOG; // Mailboxes will be fetched to this array RPointerArray mailBoxes; @@ -222,7 +223,7 @@ // ---------------------------------------------------------------------------- TBool CPsMruAdapter::FillDataStoreL( TDesC& aDataStoreURI ) { - FUNC_LOG; + FUNC_LOG; TBool result = EFalse; TFSMailMsgId dataStoreId; @@ -237,7 +238,7 @@ TBool CPsMruAdapter::FillDataStoreL( TFSMailMsgId& aId ) { - FUNC_LOG; + FUNC_LOG; TBool result = EFalse; // Create Uri for this mailbox @@ -252,7 +253,7 @@ void CPsMruAdapter::AddMruEmailsL( MDesCArray* aMruList, TDesC& aDataStoreURI ) { - FUNC_LOG; + FUNC_LOG; TInt entryIndex = 0; // Add all data to data store, the format is: // index0: displayname @@ -281,18 +282,20 @@ TBool CPsMruAdapter::FillDataStoreL( TFSMailMsgId& aId, TDesC& aDataStoreURI ) { - FUNC_LOG; + FUNC_LOG; TBool result = EFalse; // code was simplified not to trace all mailboxes // function has trap in Event() -case> TFSEventNewMailbox and in DeleayedMailboxCreationEventL() // should not leave when new mailbox only when new mail address +// TODO SK how to avoid extra calls? CFSMailBox *mailBox = iMailClient->GetMailBoxByUidLC(aId); if( mailBox ) { AddMailboxObserverL( aId ); // Get MRU list for this mailbox - MDesCArray* mruList = mailBox->ListMrusL(); + MDesCArray* mruList = mailBox->ListMrusL(); // TODO SK this value can be cached? + //TODO add to cleanup stack? // update the caching status as InProgress iDataStoreObserver->UpdateCachingStatus( aDataStoreURI, @@ -327,7 +330,7 @@ // ---------------------------------------------------------------------------- TBool CPsMruAdapter::IsDataStoresSupportedL( TDesC& aDataStoreURI ) { - FUNC_LOG; + FUNC_LOG; for ( TInt i = 0; i < iSupportedUris.Count(); i++ ) { if ( iSupportedUris[i]->Compare( aDataStoreURI ) == 0 ) @@ -342,7 +345,7 @@ // ---------------------------------------------------------------------------- void CPsMruAdapter::GetSupportedDataFieldsL( RArray& aDataFields ) { - FUNC_LOG; + FUNC_LOG; aDataFields.Append( R_VPBK_FIELD_TYPE_FIRSTNAME ); aDataFields.Append( R_VPBK_FIELD_TYPE_LASTNAME ); aDataFields.Append( R_VPBK_FIELD_TYPE_EMAILGEN ); @@ -350,7 +353,7 @@ TBool CPsMruAdapter::GetMailboxIdentifierFromUri( TDesC& aUri, TFSMailMsgId& aId ) { - FUNC_LOG; + FUNC_LOG; // Find first separator in reverse order TInt lastSeparator = aUri.LocateReverseF( KDefaultMailBoxURISeparator ); if ( lastSeparator == KErrNotFound ) @@ -392,7 +395,7 @@ TBool CPsMruAdapter::GetUriFromMailboxIdentifier( TFSMailMsgId& aId, HBufC& aUri ) { - FUNC_LOG; + FUNC_LOG; // Add the uri identifier aUri.Des().Copy( KDefaultMailBoxURI ); // Add plugin ID @@ -408,35 +411,48 @@ void CPsMruAdapter::EventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, TAny* /*aParam1*/, TAny* aParam2, TAny* /*aParam3*/ ) { - FUNC_LOG; + FUNC_LOG; switch ( aEvent ) { case TFSEventMailMoved: - case TFSEventMailCopied: + case TFSEventMailCopied: case TFSEventNewMail: { // Check the new parent folder id for this message // For all these events, param2 indicates the new parent folder TFSMailMsgId* parentFolderId = - static_cast< TFSMailMsgId* >( aParam2 ); + static_cast< TFSMailMsgId* >( aParam2 ); if ( parentFolderId ) { - // Get the parent folder object - CFSMailFolder* parentFolder = iMailClient->GetFolderByUidL( - aMailbox, *parentFolderId ); - if ( parentFolder ) + TFSFolderType folderType( EFSInbox ); + if ( (*parentFolderId) == iPreviousParentFolderId && aMailbox == iPreviousMailboxId ) + { + // we assume that folder with some id does not change + // its type during mail synchronization + folderType = iPreviousParentFolderType; + } + else { - CleanupStack::PushL( parentFolder ); - - // If it's sent/outbox folder, - // we'll consider that as a new message being sent - // and therefore we'll update the MRU list here - if ( ( parentFolder->GetFolderType() == EFSSentFolder ) || - ( parentFolder->GetFolderType() == EFSOutbox ) ) + // Get the parent folder object + CFSMailFolder* parentFolder = iMailClient->GetFolderByUidL( + aMailbox, *parentFolderId ); + if ( parentFolder ) { - FillDataStoreL( aMailbox ); + iPreviousParentFolderId = (*parentFolderId); + iPreviousMailboxId = aMailbox; + folderType = parentFolder->GetFolderType(); + iPreviousParentFolderType = folderType; + delete parentFolder; + parentFolder = NULL; } - CleanupStack::PopAndDestroy( parentFolder ); + } + // If it's sent/outbox folder, + // we'll consider that as a new message being sent + // and therefore we'll update the MRU list here + if ( ( folderType == EFSSentFolder ) || + ( folderType == EFSOutbox ) ) + { + FillDataStoreL( aMailbox ); } } } @@ -459,7 +475,7 @@ else { // mailbox still does not exist - DeleayMailboxCreationEventL( aMailbox ); // start timer to postpone creation + DeleayMailboxCreationEventL( aMailbox ); // start timer to postpone creation break; } @@ -510,14 +526,22 @@ } } delete identifier; + + iPreviousParentFolderId = TFSMailMsgId(); + iPreviousMailboxId = TFSMailMsgId(); + break; } + case TFSEventMailboxSettingsChanged: // TODO SK check + { + iPreviousParentFolderId = TFSMailMsgId(); + iPreviousMailboxId = TFSMailMsgId(); break; + } } } - TBool CPsMruAdapter::AddMailboxObserverL( TFSMailMsgId& aId ) { - FUNC_LOG; + FUNC_LOG; for( TInt index = 0; index < iObservedMailboxes.Count(); index++ ) { if( iObservedMailboxes[index] == aId ) @@ -534,7 +558,7 @@ TBool CPsMruAdapter::RemoveMailboxObserver( TFSMailMsgId& aId ) { - FUNC_LOG; + FUNC_LOG; for( TInt index = 0; index < iObservedMailboxes.Count(); index++ ) { if( iObservedMailboxes[index] == aId ) @@ -550,13 +574,13 @@ void CPsMruAdapter::RemoveAllMailboxObservers() { - FUNC_LOG; + FUNC_LOG; for( TInt index = 0; index < iObservedMailboxes.Count(); index++ ) { iMailClient->UnsubscribeMailboxEvents( iObservedMailboxes[index], *this ); } - iObservedMailboxes.Reset(); + iObservedMailboxes.Reset(); } /** @@ -564,7 +588,7 @@ * by CDelayMailboxCreationHelper timer to try it after some delay */ TBool CPsMruAdapter::DeleayedMailboxCreationEventL() - { + { FUNC_LOG; for ( int i = iDelayedCreatedMailboxes.Count()-1; i>=0; i-- ) { @@ -598,7 +622,7 @@ AddMailboxObserverL( iDelayedCreatedMailboxes[i] ); // will be added by FillDataStoreL CleanupStack::Pop( identifier ); - iDelayedCreatedMailboxes.Remove( i ); + iDelayedCreatedMailboxes.Remove( i ); } else { @@ -615,7 +639,7 @@ */ void CPsMruAdapter::DeleayMailboxCreationEventL( TFSMailMsgId &aMailbox ) { - FUNC_LOG; + FUNC_LOG; if ( NULL == iDelayMailboxCreationPtr ) { iDelayMailboxCreationPtr = CDelayMailboxCreationHelper::NewL( this ); @@ -648,7 +672,7 @@ } // used by MruAdapter when delayed datasource adding is needed -void CDelayMailboxCreationHelper::StartDelayedCall() +void CDelayMailboxCreationHelper::StartDelayedCall() { FUNC_LOG; if( IsActive() ) // don't call again in case the timer rq is pending diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/FreestyleEmailUi.rss --- a/emailuis/emailui/data/FreestyleEmailUi.rss Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/data/FreestyleEmailUi.rss Thu Jul 15 18:19:25 2010 +0300 @@ -988,6 +988,12 @@ cba = r_freestyle_emauil_ui_sk_options_back; } +RESOURCE AVKON_VIEW r_fsemailui_html_view_fullscreen + { + menubar = r_fsemailui_htmlviewer_menubar; + cba = r_freestyle_emauil_ui_sk_options_back_fullscreen; + } + RESOURCE MENU_BAR r_freestyle_emailui_menubar { titles = @@ -1050,6 +1056,31 @@ } }; } +RESOURCE CBA r_freestyle_emauil_ui_sk_options_back_fullscreen + { + flags = EEikButtonGroupAddToStack | EEikCbaFlagAppMskIcon; + buttons = + { + CBA_BUTTON + { + id = EAknSoftkeyOptions; + txt = text_softkey_option; + }, + CBA_BUTTON + { + id = EAknSoftkeyBack; + txt = text_softkey_back; + }, + CBA_BUTTON + { + id = EFsEmailUiCmdActionsDelete; + // txt = text_softkey_empty; + bmpfile = EMAILUI_ICON_FILE; + bmpid = EMbmFreestyleemailuiQgn_prop_cmail_action_delete; + bmpmask = EMbmFreestyleemailuiQgn_prop_cmail_action_delete_mask; + } + }; + } RESOURCE CBA r_freestyle_emauil_ui_sk_options_cancel { @@ -1204,6 +1235,7 @@ RESOURCE TBUF r_freestyle_email_ui_viewer_low_prio { buf=qtn_cmail_header_low_prio; } RESOURCE TBUF r_freestyle_email_ui_images_are_not_displayed { buf=qtn_cmail_viewer_images_not_displayed; } RESOURCE TBUF r_freestyle_email_ui_display_images { buf=qtn_cmail_viewer_display_images; } +RESOURCE TBUF r_freestyle_email_ui_view_additional_info { buf=qtn_mail_viewer_additional_info; } // NOTES RESOURCE TBUF r_freestyle_email_delete_mail_note { buf=qtn_fse_delete_mail_note; } diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/Thumbs.db Binary file emailuis/emailui/data/html/Thumbs.db has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/attachment.gif Binary file emailuis/emailui/data/html/attachment.gif has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/attachment.png Binary file emailuis/emailui/data/html/attachment.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/btn_left.png Binary file emailuis/emailui/data/html/btn_left.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/btn_middle.png Binary file emailuis/emailui/data/html/btn_middle.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/btn_right.png Binary file emailuis/emailui/data/html/btn_right.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/collapse.png Binary file emailuis/emailui/data/html/collapse.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/email.html --- a/emailuis/emailui/data/html/email.html Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/data/html/email.html Thu Jul 15 18:19:25 2010 +0300 @@ -1,6 +1,6 @@ - + diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/expand.png Binary file emailuis/emailui/data/html/expand.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/follow_up.png Binary file emailuis/emailui/data/html/follow_up.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/follow_up_complete.png Binary file emailuis/emailui/data/html/follow_up_complete.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/header.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/emailuis/emailui/data/html/header.css Thu Jul 15 18:19:25 2010 +0300 @@ -0,0 +1,73 @@ +table { border-style: none; } +table.fixed { border-style: none; table-layout:fixed; } +td { font-family:arial,sans-serif; font-size:75%; border-style: solid; border-width: 0px; } +.button_cell { width: 60px; } +.icon_cell { width: 60px; } +.sender_name { font-weight: bold; font-family: arial,sans-serif; } +.subject { font-weight: bold; font-family: arial,sans-serif; } +.subject_intended { font-weight: bold; font-family: arial,sans-serif; padding-left: 10px; } +.attachment { font-family: arial,sans-serif; padding: 2px 0 5px 7px; } +.recipient { padding-left: 10px; } +.sender_address { padding-left: 14px; } +.message_icon { width: 20px; height 20px; } +.label { font-weight: bold; font-family: arial,sans-serif; } +.datetime { font-family: arial,sans-serif; } +.truncate { text-overflow: ellipsis; overflow: hidden; } +img.icon { height: 21px; } + +button { + color: black; + position: relative; + border: 0; + padding: 0; + cursor: pointer; + overflow: visible; +} + +button::-moz-focus-inner { + border: none; +} + +button span { + position: relative; + display:block; + white-space: nowrap; +} + +@media screen and (-webkit-min-device-pixel-ratio:0 ) { + button span { + margin-top: -1px; + } +} + +button.submitBtn { + padding: 0 9px 0 0; + margin-right: 0px; + font-size: 21px; + text-align: center; + background: transparent url('btn_right.png') no-repeat right 6px; +} + +button.submitBtn span { + padding: 8px 0 0 5px; + height: 40px; + background: transparent url('btn_left.png') no-repeat left 6px; +} + +button.submitBtn span.buttonText { + background: none; + display: inline; + top: 8px; +} + +button.expand { + width: 57px; + height: 40px; + background: transparent url('expand.png') no-repeat top left; +} + +button.collapse { + width: 57px; + height: 40px; + background: transparent url('collapse.png') no-repeat top left; +} diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/header.js --- a/emailuis/emailui/data/html/header.js Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/data/html/header.js Thu Jul 15 18:19:25 2010 +0300 @@ -1,51 +1,166 @@ -var collapsed = true; +var collapsed = is_header_expanded_visible; var displayImagesHidden = false; var previousPageYOffset = -1; var setScrollPositionInterval; function collapseHeader(sendEvent) { - if (sendEvent) { - location.href = "cmail://collapseHeader/"; - } + if (sendEvent) { + location.href = "cmail://collapseHeader/"; + } collapsed = true; - handleHeaderDisplay('expanded_header', 'collapsed_header'); - updateHeader(); + handleHeaderDisplay( "header_expanded", "header_collapsed" ); + showTable( "header_collapsed_2" ); + hideTable( "to_table" ); + hideTable( "cc_table" ); + hideTable( "bcc_table" ); + hideTable( "header_expanded_2" ); + handleHeaderDisplay( "to_expanded", "to_collapsed" ); + handleHeaderDisplay( "cc_expanded", "cc_collapsed" ); + handleHeaderDisplay( "bcc_expanded", "bcc_collapsed" ); + if (sendEvent) { + handleHeaderDisplay( "attachments_expanded", "attachments_collapsed" ); + } + updateHeader(); } +function initHeader() { + + if (typeof(is_header_expanded_visible) !== "undefined" && !is_header_expanded_visible) { + handleHeaderDisplay( "header_expanded", "header_collapsed" ); + } + + if (typeof(is_header_collapsed_visible) !== "undefined" && !is_header_collapsed_visible) { + hideTable( "header_collapsed" ); + } + + if (typeof(is_header_collapsed_2_visible) !== "undefined" && !is_header_collapsed_2_visible) { + hideTable( "header_collapsed_2" ); + } + + if (typeof(is_header_expanded_2_visible) !== "undefined" && !is_header_expanded_2_visible) { + hideTable( "header_expanded_2" ); + } + + if (typeof(is_to_table_visible) !== "undefined") { + if (!is_to_table_visible) { + hideTable( "to_table" ); + handleHeaderDisplay( "to_expanded", "to_collapsed" ); + } else { + if (typeof(is_to_expanded_visible) !== "undefined" ) { + if (is_to_expanded_visible) { + handleHeaderDisplay( "to_collapsed", "to_expanded" ); + } else { + handleHeaderDisplay( "to_expanded", "to_collapsed" ); + } + } else { + handleHeaderDisplay( "to_expanded", "to_collapsed" ); + } + } + } + + if (typeof(is_cc_table_visible) !== "undefined") { + if (!is_cc_table_visible) { + hideTable( "cc_table" ); + handleHeaderDisplay( "cc_expanded", "cc_collapsed" ); + } else { + if (typeof(is_cc_expanded_visible) !== "undefined" ) { + if (is_cc_expanded_visible) { + handleHeaderDisplay( "cc_collapsed", "cc_expanded" ); + } else { + handleHeaderDisplay( "cc_expanded", "cc_collapsed" ); + } + } else { + handleHeaderDisplay( "cc_expanded", "cc_collapsed" ); + } + } + } + + + if (typeof(is_bcc_table_visible) !== "undefined") { + if (!is_bcc_table_visible) { + hideTable( "bcc_table" ); + handleHeaderDisplay( "bcc_expanded", "bcc_collapsed" ); + } else { + if (typeof(is_bcc_expanded_visible) !== "undefined" ) { + if (is_bcc_expanded_visible) { + handleHeaderDisplay( "bcc_collapsed", "bcc_expanded" ); + } else { + handleHeaderDisplay( "bcc_expanded", "bcc_collapsed" ); + } + } else { + handleHeaderDisplay( "bcc_expanded", "bcc_collapsed" ); + } + } + } + + if (typeof(is_header_expanded_2_visible) !== "undefined" && !is_header_expanded_2_visible) { + hideTable( "attachments_expanded" ); + } + + if (typeof(is_attachments_expanded_visible) !== "undefined" && is_attachments_expanded_visible) { + handleHeaderDisplay( "attachments_collapsed" , "attachments_expanded" ); + } else { + handleHeaderDisplay( "attachments_expanded", "attachments_collapsed" ); + } +} + function expandHeader(sendEvent) { - if (sendEvent) { - location.href = "cmail://expandHeader/"; - } - collapsed = false; - handleHeaderDisplay('collapsed_header', 'expanded_header'); - updateHeader(); - } + if (sendEvent) { + location.href = "cmail://expandHeader/"; + } + collapsed = false; + handleHeaderDisplay( "header_collapsed", "header_expanded" ) + hideTable( "header_collapsed_2" ); + showTable( "to_table" ); + showTable( "cc_table" ); + showTable( "bcc_table" ); + showTable( "header_expanded_2" ); + parent.document.getElementById('email_frameSet').rows = "30%, *"; + } function updateHeader() { - var rows = "40%, *"; - if (collapsed) { - if (displayImagesHidden || (parent.header_frame.g_autoLoadImages != 0) || (parent.hiddenCount == 0)) { + var rows = "30%, *"; + if (collapsed) { + if (displayImagesHidden || (parent.header_frame.g_autoLoadImages != 0) || (parent.hiddenCount == 0)) { rows = "10%, *"; } else { - rows = "17%, *"; - } - } + rows = "19%, *"; + } + } parent.document.getElementById('email_frameSet').rows = rows; } +function showTable( tableToShow ) { + if (document.getElementById(tableToShow) != null) { + document.getElementById(tableToShow).style.display = ""; + } +} + +function hideTable( tableToHide ) { + if (document.getElementById(tableToHide) != null) { + document.getElementById(tableToHide).style.display = "none"; + } +} + function handleHeaderDisplay( tableToHide, tableToShow ) { - document.getElementById(tableToHide).style.display = 'none'; - document.getElementById(tableToShow).style.display = ''; + showTable(tableToShow); + if (document.getElementById(tableToShow) != null) { + hideTable(tableToHide); + } else { + showTable(tableToHide); } +} function init(scrollPos) { - if (document.getElementById('collapsed_header').style.display != 'none') { + /*if (document.getElementById("header_collapsed").style.display != "none") { collapseHeader(false); - } else { - expandHeader(false); - } + } else { + expandHeader(false); + }*/ + + initHeader(); window.scrollTo(0, scrollPos); - setScrollPositionInterval = setInterval("updateScrollPosition()", 500); + setScrollPositionInterval = setInterval("updateScrollPosition()", 500); } function displayImagesButtonPressed() { diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/hidden.png Binary file emailuis/emailui/data/html/hidden.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/html.flag diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/minus.gif Binary file emailuis/emailui/data/html/minus.gif has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/plus.gif Binary file emailuis/emailui/data/html/plus.gif has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/priority_high.png Binary file emailuis/emailui/data/html/priority_high.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/priority_low.png Binary file emailuis/emailui/data/html/priority_low.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/todo_high_add.png Binary file emailuis/emailui/data/html/todo_high_add.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/data/html/todo_low_add.png Binary file emailuis/emailui/data/html/todo_low_add.png has changed diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/group/FreestyleEmailUi.mmp --- a/emailuis/emailui/group/FreestyleEmailUi.mmp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/group/FreestyleEmailUi.mmp Thu Jul 15 18:19:25 2010 +0300 @@ -30,7 +30,7 @@ CAPABILITY CAP_APPLICATION NetworkControl SwEvent UID 0x0 0x2001E277 -EPOCHEAPSIZE 0x5000 0x800000 +EPOCHEAPSIZE 0x5000 0x2000000 EPOCSTACKSIZE 0x13880 VERSION KEmailBinaryVersionNumber @@ -220,3 +220,4 @@ LIBRARY touchfeedback.lib LIBRARY ccaclient.lib LIBRARY pbk2rclengine.lib +LIBRARY memman.lib diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/group/bld.inf --- a/emailuis/emailui/group/bld.inf Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/group/bld.inf Thu Jul 15 18:19:25 2010 +0300 @@ -51,49 +51,55 @@ ../group/backup_registration.xml /epoc32/data/z/private/2001E277/backup_registration.xml // Files for html display -// make the files ready for creating ROM image -../data/html/attachment.gif /epoc32/data/z/private/2001E277/HtmlFile/attachment.gif +// make the files ready for creating ROM image ../data/html/email.html /epoc32/data/z/private/2001E277/HtmlFile/email.html ../data/html/email_rtl.html /epoc32/data/z/private/2001E277/HtmlFile/email_rtl.html ../data/html/header.js /epoc32/data/z/private/2001E277/HtmlFile/header.js -../data/html/plus.gif /epoc32/data/z/private/2001E277/HtmlFile/plus.gif -../data/html/minus.gif /epoc32/data/z/private/2001E277/HtmlFile/minus.gif +../data/html/header.css /epoc32/data/z/private/2001E277/HtmlFile/header.css ../data/html/email.js /epoc32/data/z/private/2001E277/HtmlFile/email.js ../data/html/follow_up.png /epoc32/data/z/private/2001E277/HtmlFile/follow_up.png ../data/html/follow_up_complete.png /epoc32/data/z/private/2001E277/HtmlFile/follow_up_complete.png -../data/html/btn_middle.png /epoc32/data/z/private/2001E277/HtmlFile/btn_middle.png -../data/html/todo_high_add.png /epoc32/data/z/private/2001E277/HtmlFile/todo_high_add.png -../data/html/todo_low_add.png /epoc32/data/z/private/2001E277/HtmlFile/todo_low_add.png - +../data/html/btn_right.png /epoc32/data/z/private/2001E277/HtmlFile/btn_right.png +../data/html/btn_left.png /epoc32/data/z/private/2001E277/HtmlFile/btn_left.png +../data/html/priority_high.png /epoc32/data/z/private/2001E277/HtmlFile/priority_high.png +../data/html/priority_low.png /epoc32/data/z/private/2001E277/HtmlFile/priority_low.png +../data/html/attachment.png /epoc32/data/z/private/2001E277/HtmlFile/attachment.png +../data/html/hidden.png /epoc32/data/z/private/2001E277/HtmlFile/hidden.png +../data/html/expand.png /epoc32/data/z/private/2001E277/HtmlFile/expand.png +../data/html/collapse.png /epoc32/data/z/private/2001E277/HtmlFile/collapse.png // make the files ready for udeb emulator -../data/html/attachment.gif /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/attachment.gif ../data/html/email.html /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/email.html ../data/html/email_rtl.html /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/email_rtl.html ../data/html/header.js /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/header.js -../data/html/plus.gif /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/plus.gif -../data/html/minus.gif /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/minus.gif +../data/html/header.css /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/header.css ../data/html/email.js /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/email.js ../data/html/follow_up.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/follow_up.png ../data/html/follow_up_complete.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/follow_up_complete.png -../data/html/todo_high_add.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/todo_high_add.png -../data/html/btn_middle.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/btn_middle.png -../data/html/todo_low_add.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/todo_low_add.png +../data/html/btn_right.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/btn_right.png +../data/html/btn_left.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/btn_left.png +../data/html/priority_high.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/priority_high.png +../data/html/priority_low.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/priority_low.png +../data/html/attachment.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/attachment.png +../data/html/hidden.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/hidden.png +../data/html/expand.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/expand.png +../data/html/collapse.png /epoc32/release/winscw/udeb/z/private/2001E277/HtmlFile/collapse.png // make the files ready for urel emulator -../data/html/attachment.gif /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/attachment.gif ../data/html/email.html /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/email.html ../data/html/email_rtl.html /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/email_rtl.html ../data/html/header.js /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/header.js -../data/html/plus.gif /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/plus.gif -../data/html/minus.gif /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/minus.gif +../data/html/header.css /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/header.css ../data/html/email.js /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/email.js ../data/html/follow_up.png /epoc32/release/winscw/urel/z/private/2001E277/follow_up.png -../data/html/follow_up_complete.png /epoc32/release/winscw/urel/z/private/2001E277/follow_up_complete.png -../data/html/todo_high_add.png /epoc32/release/winscw/urel/z/private/2001E277/todo_high_add.png -../data/html/btn_middle.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/btn_middle.png -../data/html/todo_low_add.png /epoc32/release/winscw/urel/z/private/2001E277/todo_low_add.png - +../data/html/btn_right.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/btn_right.png +../data/html/btn_left.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/btn_left.png +../data/html/priority_high.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/priority_high.png +../data/html/priority_low.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/priority_low.png +../data/html/attachment.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/attachment.png +../data/html/hidden.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/hidden.png +../data/html/expand.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/expand.png +../data/html/collapse.png /epoc32/release/winscw/urel/z/private/2001E277/HtmlFile/collapse.png ../data/cmail_marking_mode_bg.svg /epoc32/s60/icons/cmail_marking_mode_bg.svg ../sis/commonemailstub.sis /epoc32/data/z/system/install/commonemailstub.sis diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/inc/FreestyleEmailUiAknStatusIndicator.h --- a/emailuis/emailui/inc/FreestyleEmailUiAknStatusIndicator.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiAknStatusIndicator.h Thu Jul 15 18:19:25 2010 +0300 @@ -42,9 +42,11 @@ void ShowIndicatorL( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap, TDesC* aText, - TInt aDuration ); + TInt aDuration, + const TBool aAnimate = EFalse ); void HideIndicator( TInt aDelayBeforeHidingInMs = 0 ); + void StartTimer( const TInt aTimeOut ); // The ownship of aText is transferred in. void SetTextL( TDesC* aText ); @@ -77,11 +79,17 @@ void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); private: + TRect ImageRect( const TRect& aRect ) const; + TRect TextRect( const TRect& aRect ) const; void CalculateLayout( const TRect& aRect ) const; void SetTextFont() const; void CalculateVisualText() const; + TRgb BackgroundColor() const; + TRgb BorderColor() const; + TRgb FontColor() const; + void DrawBoundary( const TRect& aRect ) const; void DrawImage( const TRect& aRect ) const; void DrawText( const TRect& aRect ) const; @@ -104,6 +112,11 @@ mutable HBufC* iVisualText; mutable CFont* iTextFont; + mutable TInt iVisualTextWidth; + + TInt iHideTimeout; + TInt iAngle; + TBool iAnimate; }; #endif // __FREESTYLEEMAILUI_AKN_STATUS_INDICATOR_H__ diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h --- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Thu Jul 15 18:19:25 2010 +0300 @@ -153,6 +153,7 @@ */ void KeyValueChangedL( TUint32 aKey ); +public: /** * @see CEUiHtmlViewerSettingsKeyListener::MObserver::Repository */ @@ -302,7 +303,7 @@ void ConvertToHtmlFileL( CFSMailMessagePart& aTextBodyPart, const TDesC& aHtmlFileName ); // Reads given file content to buffer and return pointer to it - HBufC8* ReadContentFromFileLC( RFile& aFile ); + HBufC8* ReadContentFromFileLC( RFile& aFile, CFSMailMessagePart& aHtmlBodyPart ); // Writes buffer to given file void WriteContentToFileL( const TDesC8& aContent, const TDesC& aFileName, CFSMailMessagePart& aHtmlBodyPart ); @@ -394,7 +395,7 @@ TBool iHeaderExpanded; // tactile feed back -- not owned MTouchFeedback* iTouchFeedBack; - + TBitFlags iFlags; TInt iZoomLevel; }; diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h --- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerView.h Thu Jul 15 18:19:25 2010 +0300 @@ -56,7 +56,7 @@ public: /** Two-phased constructor. */ - static CFsEmailUiHtmlViewerView* NewL( CAlfEnv& aEnv, + static CFsEmailUiHtmlViewerView* NewL( CAlfEnv& aEnv, CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ); @@ -72,22 +72,22 @@ TUid Id() const; void HandleStatusPaneSizeChange(); - + void HandleViewRectChange(); - + /** * HandleCommandL * From CAknView, takes care of command handling. * @param aCommand Command to be handled */ void HandleCommandL( TInt aCommand ); - + // Handle accept/decline/tentative/remove commands given for meeting request message directly from list UI. void HandleMrCommandL( TInt aCommandId, TFSMailMsgId aMailboxId, TFSMailMsgId aFolderId, TFSMailMsgId aMessageId ); - + void CompletePendingMrCommand(); void CancelPendingMrCommandL(); - + /** * ChildDoDeactivate * From CFsEmailUiViewBase, deactivate the AknView @@ -106,32 +106,32 @@ void SetMskL(); void PrepareForExit(); - + public : // for MFSMailRequestObserver void RequestResponseL( TFSProgress aEvent, TInt aRequestId ); - -public: + +public: // from MProgressDialogCallback void DialogDismissedL( TInt aButtonId); - + CFSMailMessage* CurrentMessage(); CFSEmailUiAttachmentsListModel* CurrentAttachmentsListModel(); - + // Return view area that can be used for container TRect ContainerRect() const; -public: +public: void HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType ); void HandleMailBoxEventL( TFSMailEvent aEvent, TFSMailMsgId aMailbox, TAny* aParam1, TAny* /*aParam2*/, TAny* /*aParam3*/ ); - - void HandleEmailAddressCommandL( TInt aCommand, const TDesC& aEmailAddress ); + + void HandleEmailAddressCommandL( TInt aCommand, const TDesC& aEmailAddress ); void HandleWebAddressCommandL( TInt aCommand, const TDesC& aUrl ); - + void DownloadAttachmentL( const TAttachmentData& aAttachment ); void DownloadAllAttachmentsL(); - void CancelAttachmentL( const TAttachmentData& aAttachment ); - void CancelAllAttachmentsL(); + void CancelAttachmentL( const TAttachmentData& aAttachment ); + void CancelAllAttachmentsL(); void OpenAttachmentL( const TAttachmentData& aAttachment ); void SaveAttachmentL( const TAttachmentData& aAttachment ); void SaveAllAttachmentsL(); @@ -141,8 +141,8 @@ TBool IsEmbeddedMsgSavingAllowed(); // Helper funcitons to get viewed message ID and Folder id TFSMailMsgId ViewedMessageFolderId(); - TFSMailMsgId ViewedMessageId(); - + TFSMailMsgId ViewedMessageId(); + TBool GetAsyncFetchStatus(); void StartFetchingMessageL(); void ReloadPageL(); @@ -154,21 +154,21 @@ public : // from MFSEmailDownloadInformationObserver void RequestResponseL( const TFSProgress& aEvent, const TPartData& aPart ); - + public: // from MFSEmailUiAttachmentsStatusObserver void DownloadStatusChangedL( TInt aIndex ); - + public: // from MESMRIcalViewerCallback - void ProcessAsyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage, MESMRIcalViewerObserver* aObserver = NULL ); - void ProcessSyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage ); - TBool CanProcessCommand( TESMRIcalViewerOperationType aCommandId ) const; - + void ProcessAsyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage, MESMRIcalViewerObserver* aObserver = NULL ); + void ProcessSyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage ); + TBool CanProcessCommand( TESMRIcalViewerOperationType aCommandId ) const; + public: // from MESMRIcalViewerObserver - void OperationCompleted( TIcalViewerOperationResult aResult ); + void OperationCompleted( TIcalViewerOperationResult aResult ); void OperationError( TIcalViewerOperationResult aResult ); - + void FadeOut(TBool aDirectionOut); - + private: // from /** * @see CFsEmailUiViewBase::ChildDoActivateL @@ -178,31 +178,27 @@ const TDesC8& aCustomMessage ); /** - * @see CFsEmailUiViewBase::ToolbarResourceId + * @see CFsEmailUiViewBase::NavigateBackL */ - TInt ToolbarResourceId() const; - + void NavigateBackL(); + /** - * @see CFsEmailUiViewBase::GetInitiallyDimmedItemsL + * @see CFsEmailUiViewBase::ChangeMskCommandL */ - virtual void GetInitiallyDimmedItemsL( const TInt aResourceId, - RArray& aDimmedItems ) const; + void ChangeMskCommandL( TInt aLabelResourceId ); /** - * @see CFsEmailUiViewBase::OfferToolbarEventL + * @see CFsEmailUiViewBase::IsStatusPaneVisible */ - void OfferToolbarEventL( TInt aCommand ); - - /** - * @see CFsEmailUiViewBase::NavigateBackL - */ - void NavigateBackL(); - + TBool IsStatusPaneVisible() const; + /** * @see CFsEmailUiViewBase::SetStatusBarLayout - */ + */ void SetStatusBarLayout(); + private: // New functions + // list of different types of content enum TFetchedType { @@ -229,8 +225,8 @@ void OpenContactDetailsL( const TDesC& aEmailAddress ); void LaunchRemoteLookupL( const TDesC& aEmailAddress ); void CreateMessageL( const TDesC& aEmailAddress ); - - void UpdateDownloadIndicatorL( const TPartData& aPart, + + void UpdateDownloadIndicatorL( const TPartData& aPart, const TFSProgress& aEvent ); //fetching related API TBool MessagePartFullyFetchedL( TFetchedType aFetchedContentType ) const; @@ -259,22 +255,22 @@ // from the move to folder dialog. This is necessary because view swithching is asynchronous. static TInt MoveToFolderAndExitL( TAny* aMailViewerVisualiser ); void FolderSelectedL( TFSMailMsgId aSelectedFolderId, - TFSEmailUiCtrlBarResponse aResponse ); - + TFSEmailUiCtrlBarResponse aResponse ); + void UpdateEmailHeaderIndicators(); TBool IsOpenedInMRViewerL(); void CopyCurrentToClipBoardL( const TDesC& aArgument) const; void OpenLinkInBrowserL( const TDesC& aUrl) const; void SaveWebAddressToFavouritesL( const TDesC& aUrl ) const; void SetScrollPosition(TInt aPosition); - + void CheckMessageBodyL( CFSMailMessage& aMessage, TBool& aMessageBodyStructurePresent, TBool& aMessageBodyContentPresent); - + private: // Constructors - + void ConstructL(); - CFsEmailUiHtmlViewerView( CAlfEnv& aEnv, - CFreestyleEmailUiAppUi& aAppUi, + CFsEmailUiHtmlViewerView( CAlfEnv& aEnv, + CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ); private: @@ -284,13 +280,13 @@ THtmlViewerActivationData iActivationData; CFSEmailUiAttachmentsListModel* iAttachmentsListModel; - // Stack of open messages. Messages are owned by this stack. + // Stack of open messages. Messages are owned by this stack. CStack* iOpenMessages; // Stack of embedded messages. Message are NOT owned by this stack. Similar to iOpenMessages // but has NULL pointer in slots which correspond non-embedded messages. CStack* iEmbeddedMessages; TBool iCreateNewMsgFromEmbeddedMsg; - + // // Temporary mail address for opening editor CFSMailAddress* iNewMailTempAddress; @@ -327,8 +323,8 @@ TBool iMoveToFolderOngoing; TBool iMovingMeetingRequest; CAsyncCallBack* iAsyncCallback; - - TFSMailMsgId iMoveDestinationFolder; + + TFSMailMsgId iMoveDestinationFolder; // Meeting request observer stuff. // Pointer to observer to inform, not owned. MESMRIcalViewerObserver* iMrObserverToInform; @@ -338,10 +334,10 @@ // Message pointer to a deleted mail from Mrui TFSMailMsgId iDeletedMessageFromMrui; // Flag selection handler active object for global note - CFlagSelectionNoteHandler* iFlagSelectionHandler; + CFlagSelectionNoteHandler* iFlagSelectionHandler; TBool iNextOrPrevMessageSelected; TBool iMessageIsDeleted; - + // Id of last deleted message TFSMailMsgId iLastDeletedMessageID; }; @@ -354,20 +350,20 @@ public: // Constructors and destructor static CFlagSelectionNoteHandler* NewL( CFsEmailUiHtmlViewerView& aViewerVisualiser ); virtual ~CFlagSelectionNoteHandler(); - void Cancel(); - void LaunchFlagListQueryDialogL(); - - private: - - void RunL(); - void DoCancel(); + void Cancel(); + void LaunchFlagListQueryDialogL(); + + private: + + void RunL(); + void DoCancel(); TInt RunError( TInt aError ); - + private: CFlagSelectionNoteHandler( CFsEmailUiHtmlViewerView& aVoIPDialogObserver ); - - private: + + private: CFsEmailUiHtmlViewerView& iViewerView; CAknGlobalListQuery* iGlobalFlagQuery; HBufC* iPrompt; diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/inc/FreestyleEmailUiViewBase.h --- a/emailuis/emailui/inc/FreestyleEmailUiViewBase.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiViewBase.h Thu Jul 15 18:19:25 2010 +0300 @@ -101,7 +101,7 @@ void DoTransition( TBool aDirectionOut ); virtual void FadeOut(TBool aDirectionOut); - + /** * Prepares application exit. This is called by AppUi during cleanup before AppUi's destructor */ @@ -190,7 +190,13 @@ * Derived classes can call this utility function to set the middle soft key * label and ID from the given resource. */ - void ChangeMskCommandL( TInt aLabelResourceId ); + virtual void ChangeMskCommandL( TInt aLabelResourceId ); + + /** + * Derived classes can overwrite this method to control status pane + * visibility. + */ + virtual TBool IsStatusPaneVisible() const; // Toolbar protected: // toobar changes @@ -319,7 +325,7 @@ TBool iSendToBackgroundOnDeactivation; // View's active status TBool iViewActive; -protected: // to enable overridning +protected: // to enable overridning TBool iWasActiveControlGroup; }; diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/inc/FreestyleMessageHeaderHTML.h --- a/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleMessageHeaderHTML.h Thu Jul 15 18:19:25 2010 +0300 @@ -20,6 +20,7 @@ #include #include +#include #include "cfsmailmessage.h" #include "cfsmailaddress.h" @@ -33,32 +34,58 @@ class CFreestyleMessageHeaderHTML : public CBase { public: + + /** + * Flags to control exporting + */ + enum TExportFlag + { + // Header is expanded + EHeaderExpanded, + // Attachments are expanded + EAttachmentExpanded, + // To field is expanded + EToExpanded, + // Cc field is expanded + ECcExpanded, + // Bcc field is expanded + EBccExpanded, + + // ** For internal use only ** + // Load images automatically + EAutoLoadImages, + // Mirrored layout in use + EMirroredLayout + }; + +public: + IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ); + const TBitFlags& aFlags ); IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFile& aFile, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ); + const TBitFlags& aFlags ); IMPORT_C static void ExportL( CFSMailMessage& aMailMessage, RFs& aFs, const TPath& aFilePath, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ); + const TBitFlags& aFlags ); IMPORT_C static CFreestyleMessageHeaderHTML* NewL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ); + const TBitFlags& aFlags ); ~CFreestyleMessageHeaderHTML(); @@ -70,101 +97,73 @@ TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ); + const TBitFlags& aFlags ); void ConstructL(); - - void HTMLStartL() const; - void HTMLEndL() const; - - void ExportHTMLHeaderL() const; - void HTMLHeaderStartL() const; - void HTMLMetaL() const; - void HTMLHeaderEndL() const; - - void ExportDisplayImagesTableL() const; + + void ExportHeaderTablesL() const; + void ExportCollapsedHeaderTableL() const; + void ExportExpandedHeaderTablesL() const; - void ExportHTMLBodyL() const; - void HTMLBodyStartL() const; - void HTMLBodyEndL() const; - - /* - * Writes the subject to iWriteStream and also - * takes care of the urls and marks them as hotspots - */ - void WriteSubjectL(TDesC& aText ) const; - - void ExportCollapseButtonL() const; - void ExportTimeAndExpandButtonL() const; - void ExportSubjectL() const; - void ExportSubjectCollapsedL() const; - void ExportFromL() const; - void ExportToL() const; - void ExportCcL() const; - void ExportBccL() const; - void ExportSentTimeL() const; - void ExportAttachmentsL() const; - - void ExportEmailAddressesL( FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const RPointerArray& aEmailAddresses, - const TDesC8& aRowId, - const TDesC8& aTableId, - TInt aHeaderTextResourceId ) const; - - void AddEmailAddressL( FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const CFSMailAddress& aEmailAddress ) const; + void ExportTableVisibilityParameterL( const TDesC& aTableName, const TBitFlags& aFlags ) const; + void ExportTableVisibilityParameterL( const TDesC& aTableName, const TBool aVisible ) const; + void ExportTableBeginL( const TDesC& aTableName, const TBitFlags& aFlags = TBitFlags() ) const; + void ExportTableEndL() const; + void ExportInnerTableBeginL( const TDesC& aTableName, const TInt aColSpan, const TBitFlags& aFlags = TBitFlags() ) const; + void ExportInnerTableBeginWithRowBeginL( const TDesC& aTableName, const TInt aColSpan, const TBool aVisible, const TBitFlags& aFlags = TBitFlags() ) const; + void ExportInnerTableEndL() const; + void ExportInnerTableEndWithRowEndL() const; - void AddAttachmentL( CFSMailMessagePart& aAttachment ) const; - - void StartHyperlinkL( const TDesC8& aUrl ) const; - void EndHyperlinkL() const; - - void AddImageL( const TDesC8& aImageUrl ) const; - void AddImageL( const TDesC8& aImageId, const TDesC8& aImageUrl, const TDesC8& aImageEvent ) const; - - void StartHeaderTableL( const TDesC8& aTableId, TBool aVisible ) const; - void EndHeaderTableL() const; - - void StartTableL( const TDesC8& aTableId ) const; - void EndTableL() const; - - HBufC8* ClickImageEventL( const TDesC8& aImageName ) const; - - void AddJavascriptL() const; - - HBufC8* HeadingTextLC( TInt aId ) const; - HBufC8* HeadingTextLC( TInt aId, TInt aSize ) const; + void ExportAttachmentTablesL() const; + void ExportCollapsedAttachmentTableL( const TBool aHide ) const; + void ExportCollapsedAttachmentsTableRowL() const; + void ExportExpandedAttachmentTableL( const TBool aHide ) const; + void ExportExpandedAttachmentsTableRowsL() const; + void ExportAttachmentsL() const; + void ExportAttachmentL( CFSMailMessagePart& aAttachment ) const; + void ExportAttachmentIconL() const; - void ExportCollapsedHeaderTableL() const; - void ExportExpandedHeaderTableL() const; - - /** - * Function for generating follow up icon's HTML code. - * Returns NULL if no follow up flags are set. - * - * @param aShowText Whether to show icon's text after the icon or not. - */ - HBufC8* HTMLHeaderFollowUpIconLC( TBool aShowText ) const; - - /** - * Function for generating priority icon's HTML code. - * Returns NULL if mail message's priority is normal. - * - * @param aShowText Whether to show icon's text after the icon or not. - */ - HBufC8* HTMLHeaderPriorityIconLC( TBool aShowText ) const; - void AddStyleSheetL() const; - void StartDivL() const; - void EndDivL() const; + void ExportSenderTableRowL( const TBool aCollapsed ) const; + void ExportSenderAddressTableRowL() const; + void ExportDateTimeTableRowL( const TInt aColSpan = 1 ) const; + void ExportSubjectTableRowL( const TBool aShowLabel = EFalse ) const; + void ExportMessageIconsL() const; + void ExportFromTableRowL() const; + void ExportToTableL() const; + void ExportCcTableL() const; + void ExportBccTableL() const; + void ExportRecipientsTableL( const TDesC& aType, const TInt aLabelResourceId, + const RPointerArray& aRecipients, const TBool aExpanded ) const; + void ExportRecipientsL( const TDesC& aType, const RPointerArray& aRecipients ) const; + void ExportExpandRecipientsL( const TDesC& aType, const TInt aCount ) const; + void ExportExpandAttachmentsL( const TDesC& aType, const TInt aCount ) const; + void ExportLabelTableRowL( const TInt aResourceId, const TInt aColSpan = 1 ) const; + void ExportIconL( const TDesC& aIconName ) const; + HBufC* SubjectLC() const; + TInt CalculateTotalSpaceRequired( const TDesC& aText, CFindItemEngine& aItemEngine, + TInt& aMaxLength ) const; + HBufC* CreateLinksLC( const TDesC& aText, const TInt aSearchCases ) const; + void ExportHTMLBodyStartL() const; + void ExportHTMLBodyEndL() const; + void ExportDisplayImagesTableL() const; + void ExportBodyStyleL() const; private: + + // Table formatting flags + enum TTableStyleFlags + { + // Table is hidden + EHidden, + // Table width is fixed + EFixed + }; + CFSMailMessage& iMailMessage; RWriteStream& iWriteStream; TInt iVisibleWidth; TInt iScrollPosition; - TBool iAutoLoadImages; - TBool iMirrorLayout; - TBool iExpanded; RPointerArray iAttachments; + TBitFlags iExportFlags; }; #endif //__CFREESTYLE_MESSAGE_HEADER_HTML_H__ diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/loc/freestyleemailui.loc --- a/emailuis/emailui/loc/freestyleemailui.loc Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/loc/freestyleemailui.loc Thu Jul 15 18:19:25 2010 +0300 @@ -2876,3 +2876,8 @@ // #define qtn_mail_tb_ext_hide_bcc "Hide Bcc" +// d:Additional information for large Email +// l:cell_tb_ext_pane_t1/opt1 +// r:TB9.2 +// +#define qtn_mail_viewer_additional_info "--- Message too long ---" diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/rom/freestyleemailui.iby --- a/emailuis/emailui/rom/freestyleemailui.iby Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/rom/freestyleemailui.iby Thu Jul 15 18:19:25 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -33,18 +33,21 @@ data=DATAZ_\private\2001E277\backup_registration.xml private\2001E277\backup_registration.xml // files for html display -data=DATAZ_\private\2001E277\HtmlFile\attachment.gif private\2001E277\HtmlFile\attachment.gif data=DATAZ_\private\2001E277\HtmlFile\email.html private\2001E277\HtmlFile\email.html data=DATAZ_\private\2001E277\HtmlFile\email_rtl.html private\2001E277\HtmlFile\email_rtl.html data=DATAZ_\private\2001E277\HtmlFile\header.js private\2001E277\HtmlFile\header.js -data=DATAZ_\private\2001E277\HtmlFile\plus.gif private\2001E277\HtmlFile\plus.gif -data=DATAZ_\private\2001E277\HtmlFile\minus.gif private\2001E277\HtmlFile\minus.gif +data=DATAZ_\private\2001E277\HtmlFile\header.css private\2001E277\HtmlFile\header.css data=DATAZ_\private\2001E277\HtmlFile\email.js private\2001E277\HtmlFile\email.js data=DATAZ_\private\2001E277\HtmlFile\follow_up.png private\2001E277\HtmlFile\follow_up.png data=DATAZ_\private\2001E277\HtmlFile\follow_up_complete.png private\2001E277\HtmlFile\follow_up_complete.png -data=DATAZ_\private\2001E277\HtmlFile\btn_middle.png private\2001E277\HtmlFile\btn_middle.png -data=DATAZ_\private\2001E277\HtmlFile\todo_high_add.png private\2001E277\HtmlFile\todo_high_add.png -data=DATAZ_\private\2001E277\HtmlFile\todo_low_add.png private\2001E277\HtmlFile\todo_low_add.png +data=DATAZ_\private\2001E277\HtmlFile\priority_high.png private\2001E277\HtmlFile\priority_high.png +data=DATAZ_\private\2001E277\HtmlFile\priority_low.png private\2001E277\HtmlFile\priority_low.png +data=DATAZ_\private\2001E277\HtmlFile\btn_right.png private\2001E277\HtmlFile\btn_right.png +data=DATAZ_\private\2001E277\HtmlFile\btn_left.png private\2001E277\HtmlFile\btn_left.png +data=DATAZ_\private\2001E277\HtmlFile\attachment.png private\2001E277\HtmlFile\attachment.png +data=DATAZ_\private\2001E277\HtmlFile\expand.png private\2001E277\HtmlFile\expand.png +data=DATAZ_\private\2001E277\HtmlFile\collapse.png private\2001E277\HtmlFile\collapse.png +data=DATAZ_\private\2001E277\HtmlFile\hidden.png private\2001E277\HtmlFile\hidden.png #endif //FF_EMAIL_FRAMEWORK diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/sis/commonemail.pkg --- a/emailuis/emailui/sis/commonemail.pkg Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/sis/commonemail.pkg Thu Jul 15 18:19:25 2010 +0300 @@ -67,16 +67,22 @@ "\epoc32\data\Z\private\10202BE9\2001E277.txt" - "c:\private\10202be9\2001E277.txt" "\epoc32\data\Z\private\2001E277\backup_registration.xml" - "c:\private\2001E277\backup_registration.xml" -"\epoc32\data\z\private\2001E277\HtmlFile\attachment.gif" - "c:\private\2001E277\HtmlFile\attachment.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" -"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" -"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" -"\epoc32\data\z\private\2001E277\HtmlFile\plus.gif" - "c:\private\2001E277\HtmlFile\plus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\minus.gif" - "c:\private\2001E277\HtmlFile\minus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_high_add.png" - "c:\private\2001E277\HtmlFile\todo_high_add.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_low_add.png" - "c:\private\2001E277\HtmlFile\todo_low_add.png" +; HTML viewer +"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" +"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" +"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" +"\epoc32\data\z\private\2001E277\HtmlFile\header.css" - "c:\private\2001E277\HtmlFile\header.css" +"\epoc32\data\z\private\2001E277\HtmlFile\email.js" - "c:\private\2001E277\HtmlFile\email.js" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_right.png" - "c:\private\2001E277\HtmlFile\btn_right.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_left.png" - "c:\private\2001E277\HtmlFile\btn_left.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_high.png" - "c:\private\2001E277\HtmlFile\priority_high.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_low.png" - "c:\private\2001E277\HtmlFile\priority_low.png" +"\epoc32\data\z\private\2001E277\HtmlFile\attachment.png" - "c:\private\2001E277\HtmlFile\attachment.png" +"\epoc32\data\z\private\2001E277\HtmlFile\hidden.png" - "c:\private\2001E277\HtmlFile\hidden.png" +"\epoc32\data\z\private\2001E277\HtmlFile\expand.png" - "c:\private\2001E277\HtmlFile\expand.png" +"\epoc32\data\z\private\2001E277\HtmlFile\collapse.png" - "c:\private\2001E277\HtmlFile\collapse.png" ; Emailuis / gsemailsettings "\epoc32\release\armv5\urel\GSEmailSettingsPluginDll.dll" - "c:\sys\bin\GSEmailSettingsPluginDll.dll" diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/sis/commonemail_loc.pkg --- a/emailuis/emailui/sis/commonemail_loc.pkg Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/sis/commonemail_loc.pkg Thu Jul 15 18:19:25 2010 +0300 @@ -68,16 +68,22 @@ "\epoc32\data\Z\private\10202BE9\2001E277.txt" - "c:\private\10202be9\2001E277.txt" "\epoc32\data\Z\private\2001E277\backup_registration.xml" - "c:\private\2001E277\backup_registration.xml" -"\epoc32\data\z\private\2001E277\HtmlFile\attachment.gif" - "c:\private\2001E277\HtmlFile\attachment.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" -"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" -"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" -"\epoc32\data\z\private\2001E277\HtmlFile\plus.gif" - "c:\private\2001E277\HtmlFile\plus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\minus.gif" - "c:\private\2001E277\HtmlFile\minus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_high_add.png" - "c:\private\2001E277\HtmlFile\todo_high_add.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_low_add.png" - "c:\private\2001E277\HtmlFile\todo_low_add.png" +; HTML viewer +"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" +"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" +"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" +"\epoc32\data\z\private\2001E277\HtmlFile\header.css" - "c:\private\2001E277\HtmlFile\header.css" +"\epoc32\data\z\private\2001E277\HtmlFile\email.js" - "c:\private\2001E277\HtmlFile\email.js" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_right.png" - "c:\private\2001E277\HtmlFile\btn_right.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_left.png" - "c:\private\2001E277\HtmlFile\btn_left.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_high.png" - "c:\private\2001E277\HtmlFile\priority_high.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_low.png" - "c:\private\2001E277\HtmlFile\priority_low.png" +"\epoc32\data\z\private\2001E277\HtmlFile\attachment.png" - "c:\private\2001E277\HtmlFile\attachment.png" +"\epoc32\data\z\private\2001E277\HtmlFile\hidden.png" - "c:\private\2001E277\HtmlFile\hidden.png" +"\epoc32\data\z\private\2001E277\HtmlFile\expand.png" - "c:\private\2001E277\HtmlFile\expand.png" +"\epoc32\data\z\private\2001E277\HtmlFile\collapse.png" - "c:\private\2001E277\HtmlFile\collapse.png" ; Emailuis / gsemailsettings "\epoc32\release\armv5\urel\GSEmailSettingsPluginDll.dll" - "c:\sys\bin\GSEmailSettingsPluginDll.dll" diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/sis/commonemail_udeb.pkg --- a/emailuis/emailui/sis/commonemail_udeb.pkg Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/sis/commonemail_udeb.pkg Thu Jul 15 18:19:25 2010 +0300 @@ -55,16 +55,22 @@ "\epoc32\data\Z\private\10202BE9\2001E277.txt" - "c:\private\10202be9\2001E277.txt" "\epoc32\data\Z\private\2001E277\backup_registration.xml" - "c:\private\2001E277\backup_registration.xml" -"\epoc32\data\z\private\2001E277\HtmlFile\attachment.gif" - "c:\private\2001E277\HtmlFile\attachment.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" -"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" -"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" -"\epoc32\data\z\private\2001E277\HtmlFile\plus.gif" - "c:\private\2001E277\HtmlFile\plus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\minus.gif" - "c:\private\2001E277\HtmlFile\minus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_high_add.png" - "c:\private\2001E277\HtmlFile\todo_high_add.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_low_add.png" - "c:\private\2001E277\HtmlFile\todo_low_add.png" +; HTML viewer +"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" +"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" +"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" +"\epoc32\data\z\private\2001E277\HtmlFile\header.css" - "c:\private\2001E277\HtmlFile\header.css" +"\epoc32\data\z\private\2001E277\HtmlFile\email.js" - "c:\private\2001E277\HtmlFile\email.js" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_right.png" - "c:\private\2001E277\HtmlFile\btn_right.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_left.png" - "c:\private\2001E277\HtmlFile\btn_left.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_high.png" - "c:\private\2001E277\HtmlFile\priority_high.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_low.png" - "c:\private\2001E277\HtmlFile\priority_low.png" +"\epoc32\data\z\private\2001E277\HtmlFile\attachment.png" - "c:\private\2001E277\HtmlFile\attachment.png" +"\epoc32\data\z\private\2001E277\HtmlFile\hidden.png" - "c:\private\2001E277\HtmlFile\hidden.png" +"\epoc32\data\z\private\2001E277\HtmlFile\expand.png" - "c:\private\2001E277\HtmlFile\expand.png" +"\epoc32\data\z\private\2001E277\HtmlFile\collapse.png" - "c:\private\2001E277\HtmlFile\collapse.png" ; Emailuis / gsemailsettings "\epoc32\release\armv5\udeb\GSEmailSettingsPluginDll.dll" - "c:\sys\bin\GSEmailSettingsPluginDll.dll" diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/sis/commonemail_udeb_loc.pkg --- a/emailuis/emailui/sis/commonemail_udeb_loc.pkg Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/sis/commonemail_udeb_loc.pkg Thu Jul 15 18:19:25 2010 +0300 @@ -56,16 +56,22 @@ "\epoc32\data\Z\private\10202BE9\2001E277.txt" - "c:\private\10202be9\2001E277.txt" "\epoc32\data\Z\private\2001E277\backup_registration.xml" - "c:\private\2001E277\backup_registration.xml" -"\epoc32\data\z\private\2001E277\HtmlFile\attachment.gif" - "c:\private\2001E277\HtmlFile\attachment.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" -"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" -"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" -"\epoc32\data\z\private\2001E277\HtmlFile\plus.gif" - "c:\private\2001E277\HtmlFile\plus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\minus.gif" - "c:\private\2001E277\HtmlFile\minus.gif" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" -"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_high_add.png" - "c:\private\2001E277\HtmlFile\todo_high_add.png" -"\epoc32\data\z\private\2001E277\HtmlFile\todo_low_add.png" - "c:\private\2001E277\HtmlFile\todo_low_add.png" +; HTML viewer +"\epoc32\data\z\private\2001E277\HtmlFile\email.html" - "c:\private\2001E277\HtmlFile\email.html" +"\epoc32\data\z\private\2001E277\HtmlFile\email_rtl.html" - "c:\private\2001E277\HtmlFile\email_rtl.html" +"\epoc32\data\z\private\2001E277\HtmlFile\header.js" - "c:\private\2001E277\HtmlFile\header.js" +"\epoc32\data\z\private\2001E277\HtmlFile\header.css" - "c:\private\2001E277\HtmlFile\header.css" +"\epoc32\data\z\private\2001E277\HtmlFile\email.js" - "c:\private\2001E277\HtmlFile\email.js" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up.png" - "c:\private\2001E277\HtmlFile\follow_up.png" +"\epoc32\data\z\private\2001E277\HtmlFile\follow_up_complete.png" - "c:\private\2001E277\HtmlFile\follow_up_complete.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_right.png" - "c:\private\2001E277\HtmlFile\btn_right.png" +"\epoc32\data\z\private\2001E277\HtmlFile\btn_left.png" - "c:\private\2001E277\HtmlFile\btn_left.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_high.png" - "c:\private\2001E277\HtmlFile\priority_high.png" +"\epoc32\data\z\private\2001E277\HtmlFile\priority_low.png" - "c:\private\2001E277\HtmlFile\priority_low.png" +"\epoc32\data\z\private\2001E277\HtmlFile\attachment.png" - "c:\private\2001E277\HtmlFile\attachment.png" +"\epoc32\data\z\private\2001E277\HtmlFile\hidden.png" - "c:\private\2001E277\HtmlFile\hidden.png" +"\epoc32\data\z\private\2001E277\HtmlFile\expand.png" - "c:\private\2001E277\HtmlFile\expand.png" +"\epoc32\data\z\private\2001E277\HtmlFile\collapse.png" - "c:\private\2001E277\HtmlFile\collapse.png" ; Emailuis / gsemailsettings "\epoc32\release\armv5\udeb\GSEmailSettingsPluginDll.dll" - "c:\sys\bin\GSEmailSettingsPluginDll.dll" diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUi.cpp --- a/emailuis/emailui/src/FreestyleEmailUi.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUi.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -21,6 +21,10 @@ #include "FreestyleEmailUiDocument.h" #include "FreestyleEmailUiConstants.h" #include +#include +#include + +#define __USE_FAST_ALLOCATOR CApaDocument* CFreestyleEmailUiApplication::CreateDocumentL() { @@ -41,10 +45,42 @@ return new CFreestyleEmailUiApplication; } +#ifdef __USE_FAST_ALLOCATOR +EXPORT_C TInt UserHeap::SetupThreadHeap( TBool aSubThread, SStdEpocThreadCreateInfo& aInfo ) + { + TInt error( KErrNone ); + if (!aInfo.iAllocator && aInfo.iHeapInitialSize>0) + { + // new heap required + RHeap* pH = NULL; + error = CreateThreadHeap(aInfo, pH); + if (!error && !aSubThread) + { + // main thread - new allocator created and set as default heap + MemoryManager::CreateFastAllocator(); + } + } + else if (aInfo.iAllocator) + { + // sharing a heap + RAllocator* pA = aInfo.iAllocator; + error = pA->Open(); + if (!error) + { + User::SwitchAllocator(pA); + } + } + return error; + } +#endif // __USE_FAST_ALLOCATOR GLDEF_C TInt E32Main() { +#ifdef __USE_FAST_ALLOCATOR + // initialize MemmoryManager + MemoryManager::InitFastAllocator(); +#endif // __USE_FAST_ALLOCATOR return EikStart::RunApplication(NewApplication); } - + diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp --- a/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiAknStatusIndicator.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2008 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" @@ -13,19 +13,25 @@ * * Description: Implementation for status indicator * -*/ +*/ #include "FreestyleEmailUiAknStatusIndicator.h" #include #include #include +#include +#include const TInt KImageMargin = 8; const TInt KTextMargin = 4; -const TInt KRoundBoundaryEllipse = 5; -const TInt KTuncationCharsWidth = 20; +const TInt KRoundBoundaryEllipse = 7; +const TInt KTuncationCharsWidth = 20; +const TInt KAnimationFps = 15; +const TInt KAnimationDelayMs = 1000 / KAnimationFps; +const TInt KSecondsPerFullRotation = 2; +const TInt KPenSize = 2; CFreestyleEmailUiAknStatusIndicator* CFreestyleEmailUiAknStatusIndicator::NewL( const TRect& aRect, const CCoeControl* aParent ) { @@ -46,41 +52,48 @@ { ClearImage(); ClearText(); - + delete iTimer; } -void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap, +void CFreestyleEmailUiAknStatusIndicator::ShowIndicatorL( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap, TDesC* aText, - TInt aDuration ) + TInt aDuration, + const TBool aAnimate ) { iTimer->Stop(); + iAnimate = aAnimate; SetImage( aBitmap, aMaskBitmap ); SetTextL( aText ); MakeVisible( ETrue ); DrawNow(); - + if ( aDuration >= 0 ) { HideIndicator( aDuration ); } + else if ( iAnimate ) + { + iHideTimeout = KMaxTInt; + StartTimer( KAnimationDelayMs ); + } } void CFreestyleEmailUiAknStatusIndicator::SetTextL( TDesC* aText ) { SetTextFont(); - ClearText(); - iText = aText; + ClearText(); + iText = aText; if ( iText ) { iVisualText = HBufC::NewL( iText->Length() + KAknBidiExtraSpacePerLine ); CalculateVisualText(); - } - + } + if ( IsVisible() ) { DrawNow(); @@ -89,18 +102,34 @@ void CFreestyleEmailUiAknStatusIndicator::HideIndicator( TInt aDelayBeforeHidingInMs ) { - iTimer->Stop(); - - if ( aDelayBeforeHidingInMs == 0 ) + if ( !aDelayBeforeHidingInMs ) { + iTimer->Stop(); MakeVisible( EFalse ); + iAngle = 0; } else { - iTimer->Start( aDelayBeforeHidingInMs ); + if (iAnimate) + { + iHideTimeout = aDelayBeforeHidingInMs / KAnimationDelayMs; + StartTimer( KAnimationDelayMs ); + } + else + { + iHideTimeout = 0; + iTimer->Start( aDelayBeforeHidingInMs ); + } } } +void CFreestyleEmailUiAknStatusIndicator::StartTimer( const TInt aTimeOut ) + { + iTimer->Stop(); + iTimer->Start( aTimeOut ); + } + + CCoeControl* CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator::ComponentControl( TInt /*aIndex*/ ) const { return NULL; @@ -113,55 +142,60 @@ void CFreestyleEmailUiAknStatusIndicator::Draw( const TRect& aRect ) const { - CWindowGc& gc = SystemGc(); - gc.Clear( aRect ); - DrawBoundary( aRect ); DrawImage( iImageRect ); DrawText( iTextRect ); } void CFreestyleEmailUiAknStatusIndicator::SizeChanged() - { + { CalculateLayout( Rect() ); ScaleImage(); CalculateVisualText(); } - + CFreestyleEmailUiAknStatusIndicator::CFreestyleEmailUiAknStatusIndicator() : iBitmap( NULL ), iMaskBitmap( NULL ), iText( NULL ), iVisualText( NULL ), iTextFont( NULL ) - { + { } void CFreestyleEmailUiAknStatusIndicator::ConstructL( const TRect& aRect, const CCoeControl* aParent ) { - iTimer = CFSEmailUiGenericTimer::NewL( this ); - - if ( !aParent ) + iTimer = CFSEmailUiGenericTimer::NewL( this ); + + if ( aParent ) + { + SetContainerWindowL( *aParent ); + } + else { CreateWindowL(); } - else - { - SetContainerWindowL( *aParent ); - } - SetRect( aRect ); ActivateL(); - MakeVisible( EFalse ); } void CFreestyleEmailUiAknStatusIndicator::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ ) { - HideIndicator(); + if ( iAnimate && ( iHideTimeout == KMaxTInt || iHideTimeout-- > 0 ) ) + { + StartTimer( KAnimationDelayMs ); + iAngle -= 360 / (KAnimationFps * KSecondsPerFullRotation); + ScaleImage(); + DrawDeferred(); + } + else + { + HideIndicator(); + } } -void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const +TRect CFreestyleEmailUiAknStatusIndicator::ImageRect( const TRect& aRect ) const { TSize imageSize = aRect.Size(); imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin; @@ -174,36 +208,62 @@ { imageSize.iHeight = imageSize.iWidth; } - + + TPoint imageLeftTop; + if ( !Layout_Meta_Data::IsMirrored() ) + { + imageLeftTop = TPoint( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin ); + } + else + { + imageLeftTop = TPoint( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin ); + } + + return TRect( imageLeftTop, imageSize ); + } + +TRect CFreestyleEmailUiAknStatusIndicator::TextRect( const TRect& aRect ) const + { + TSize imageSize = aRect.Size(); + imageSize.iHeight = imageSize.iHeight - 2 * KImageMargin; + imageSize.iWidth = imageSize.iWidth - 2 * KImageMargin; + if ( imageSize.iWidth > imageSize.iHeight ) + { + imageSize.iWidth = imageSize.iHeight; + } + else + { + imageSize.iHeight = imageSize.iWidth; + } + TSize textSize = aRect.Size(); textSize.iHeight = textSize.iHeight - 2 * KTextMargin; textSize.iWidth = textSize.iWidth - 2 * KTextMargin - 2 * KImageMargin - imageSize.iWidth; - - TLanguage language = User::Language(); - TBidiText::TDirectionality direction = TBidiText::ScriptDirectionality( language ); - if ( direction == TBidiText::ELeftToRight ) + + TPoint textLeftTop; + if ( !Layout_Meta_Data::IsMirrored() ) { - TPoint imageLeftTop ( aRect.iTl.iX + KImageMargin, aRect.iTl.iY + KImageMargin ); - iImageRect.SetRect( imageLeftTop, imageSize ); - - TPoint textLeftTop ( aRect.iTl.iX + 2*KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin ); - iTextRect.SetRect( textLeftTop, textSize ); + textLeftTop = TPoint( aRect.iTl.iX + KImageMargin + imageSize.iWidth + KTextMargin, aRect.iTl.iY + KTextMargin ); } else { - TPoint imageLeftTop ( aRect.iBr.iX - KImageMargin - imageSize.iWidth, aRect.iTl.iY + KImageMargin ); - iImageRect.SetRect( imageLeftTop, imageSize ); - - TPoint textLeftTop ( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin ); - iTextRect.SetRect( textLeftTop, textSize ); + textLeftTop = TPoint( aRect.iTl.iX + KTextMargin, aRect.iTl.iY + KTextMargin ); } + + return TRect( textLeftTop, textSize ); + } + +void CFreestyleEmailUiAknStatusIndicator::CalculateLayout( const TRect& aRect ) const + { + iImageRect = ImageRect( aRect ); + iTextRect = TextRect( aRect ); } void CFreestyleEmailUiAknStatusIndicator::SetTextFont() const { if ( iTextFont ) return; - + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); iTextFont = CONST_CAST( CFont*, font ); } @@ -220,27 +280,65 @@ visualText, *iTextFont, MaxWidthInPixels, - MaxClippedWidthInPixels ); + MaxClippedWidthInPixels ); + iVisualTextWidth = AknBidiTextUtils::MeasureTextBoundsWidth( + *iTextFont, *iVisualText, CFont::TMeasureTextInput::EFVisualOrder ); + } + } + +TRgb CFreestyleEmailUiAknStatusIndicator::BackgroundColor() const + { + TRgb color; + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnOtherColors, EAknsCIQsnOtherColorsCG22 ) ) + { + // fallback to default value + color = TRgb(197, 197, 197); } + return color; + } + +TRgb CFreestyleEmailUiAknStatusIndicator::BorderColor() const + { + return KRgbBlack; + } + +TRgb CFreestyleEmailUiAknStatusIndicator::FontColor() const + { + TRgb color; + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( AknsUtils::GetCachedColor( skin, color, KAknsIIDQsnTextColors, EAknsCIQsnTextColorsCG55 /*EAknsCIQsnTextColorsCG81*/ ) ) + { + // fallback to default value + color = KRgbBlack; + } + return color; } void CFreestyleEmailUiAknStatusIndicator::DrawBoundary( const TRect& aRect ) const { CWindowGc& gc = SystemGc(); - gc.SetPenColor( KRgbCyan ); + gc.SetClippingRect( aRect ); + gc.SetBrushColor( BackgroundColor() ); + gc.SetPenColor( BorderColor() ); + gc.SetPenSize( TSize(KPenSize, KPenSize) ); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetPenStyle( CGraphicsContext::ESolidPen ); TSize ellipse( KRoundBoundaryEllipse, KRoundBoundaryEllipse ); - gc.DrawRoundRect( aRect, ellipse); + TRect roundRect( aRect ); + roundRect.Shrink( 2, 2 ); + gc.DrawRoundRect( roundRect, ellipse); } void CFreestyleEmailUiAknStatusIndicator::DrawImage( const TRect& aRect ) const { if ( !iBitmap ) return; - + CWindowGc& gc = SystemGc(); if ( iMaskBitmap ) { - TRect bmpPieceRect(TPoint(0,0), aRect.Size() ); + TRect bmpPieceRect(TPoint(0,0), aRect.Size() ); gc.BitBltMasked( aRect.iTl, iBitmap, bmpPieceRect, iMaskBitmap, EFalse ); } else @@ -255,29 +353,24 @@ return; if ( iVisualText->Length() == 0 ) return; - - TLanguage language = User::Language(); - TBidiText::TDirectionality direction = TBidiText::ScriptDirectionality( language ); - - CGraphicsContext::TTextAlign alignment = CGraphicsContext::ELeft; - if ( direction == TBidiText::ERightToLeft ) - { - alignment = CGraphicsContext::ERight; - } - + + CGraphicsContext::TTextAlign alignment = Layout_Meta_Data::IsMirrored() ? + CGraphicsContext::ERight : CGraphicsContext::ELeft; + CWindowGc& gc = SystemGc(); gc.UseFont( iTextFont ); + TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2; + gc.SetPenColor(FontColor()); - TInt baseline = aRect.Height() / 2 + iTextFont->FontMaxAscent() / 2; - - gc.SetPenColor(KRgbBlack); - - gc.DrawText( *iVisualText, aRect, baseline, alignment, 0); + TRect drawRect( aRect ); + drawRect.Shrink( (drawRect.Width() - iVisualTextWidth) / 2, 0 ); + gc.DrawText( *iVisualText, drawRect, baseline, alignment, 0); } void CFreestyleEmailUiAknStatusIndicator::SetImage( CFbsBitmap* aBitmap, CFbsBitmap* aMaskBitmap ) { ClearImage(); + iAngle = 0; iBitmap = aBitmap; iMaskBitmap = aMaskBitmap; ScaleImage(); @@ -288,13 +381,8 @@ if ( iBitmap ) { AknIconUtils::DisableCompression( iBitmap ); - AknIconUtils::SetSize( iBitmap, iImageRect.Size(), EAspectRatioPreserved ); + AknIconUtils::SetSizeAndRotation( iBitmap, iImageRect.Size(), EAspectRatioPreserved, iAngle ); } - if ( iMaskBitmap ) - { - AknIconUtils::DisableCompression( iMaskBitmap ); - AknIconUtils::SetSize( iMaskBitmap, iImageRect.Size(), EAspectRatioPreserved ); - } } void CFreestyleEmailUiAknStatusIndicator::ClearImage() @@ -309,7 +397,7 @@ { delete iText; iText = NULL; - + delete iVisualText; iVisualText = NULL; } diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiAppui.cpp --- a/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -878,12 +878,6 @@ return; } - if ( iActiveMailbox ) - { - StartMonitoringL(); // start connect automatically - SyncActiveMailBoxL(); // start sync - } - // Do nothing if the externally activated view was already active if ( iCurrentActiveView->Id() != aViewId ) { @@ -3104,7 +3098,7 @@ (CAknTitlePane*)StatusPane()->ControlL( titlePaneUid ) ); TSize iconSize = LayoutHandler()->statusPaneIconSize(); - iConnectionStatusIconAngle += KConnectionStatusIconRotationAmount; + iConnectionStatusIconAngle -= KConnectionStatusIconRotationAmount; AknIconUtils::SetSizeAndRotation(iConnectionIconBitmap, iconSize, EAspectRatioNotPreserved, iConnectionStatusIconAngle); titlePane->DrawNow(); iConnectionStatusIconAnimTimer->Start(KConnectionStatusIconRotationInterval); diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -65,12 +65,12 @@ _LIT8( KStartTag, ""); _LIT8( KHtmlHeader1, "\xD\xA"); +_LIT8( KHtmlHeader2, "\"/>\xD\xA"); _LIT8( KHtmlHeader3, "\n"); _LIT8( KHtmlEndTags, "\xD\xA\xD\xA"); _LIT8( KCharsetTag8, "charset"); _LIT( KCharsetTag, "charset"); -_LIT8( KHTMLEmptyContent, ""); +_LIT8( KHTMLEmptyContent, ""); _LIT( KHTMLDataScheme, "data:0"); @@ -86,6 +86,11 @@ _LIT( KURLLoadImages, "cmail://loadImages/" ); _LIT( KURLCollapseHeader, "cmail://collapseHeader/" ); _LIT( KURLExpandHeader, "cmail://expandHeader/" ); +_LIT( KURLExpandItem, "cmail://expand_" ); +_LIT( KURLItemTo, "to" ); +_LIT( KURLItemCc, "cc" ); +_LIT( KURLItemBcc, "bcc" ); +_LIT( KURLItemAttachments, "attachments" ); const TText KGreaterThan = 0x3e; const TText KLessThan = 0x3c; @@ -101,14 +106,15 @@ const TReal KOverlayButtonSizeLs = 0.20; // 25% -const TInt KStatusIndicatorHeight = 50; -const TInt KStatusIndicatorXMargin = 50; +const TInt KStatusIndicatorHeight = 55; +const TInt KStatusIndicatorXMargin = 58; +const TInt KStatusIndicatorBottomMargin = 6; // CONSTANTS // Zoom levels available on the UI const TInt KZoomLevels[] = { 75, 100, 125, 150 }; const TInt KZoomLevelCount = sizeof( KZoomLevels ) / sizeof( TInt ); -const TInt KZoomLevelIndex100 = 100; // 100 in array KZoomLevels +const TInt KZoomLevelIndex100 = 1; // 100 in array KZoomLevels // CEUiHtmlViewerSettingsKeyListener @@ -653,9 +659,8 @@ } const TInt visibleWidth(iAppUi.ClientRect().Width()); CFreestyleMessageHeaderHTML::ExportL( *iMessage, iFs, headerHtmlFile, visibleWidth, iScrollPosition, - iViewerSettings->AutoLoadImages() || iAppUi.DisplayImagesCache().Contains(*iMessage), - iHeaderExpanded ); - + iViewerSettings->AutoLoadImages() || iAppUi.DisplayImagesCache().Contains(*iMessage), iFlags ); + // Remove all previously created files from temporary HTML folder EmptyTempHtmlFolderL(); @@ -713,7 +718,7 @@ iLinkContents.Reset(); iMessageParts.Reset(); iMessage = NULL; - iHeaderExpanded = EFalse; + iFlags.ClearAll(); iScrollPosition = 0; } @@ -946,7 +951,7 @@ CleanupStack::PushL( part ); RFile contentFile = part->GetContentFileL(); CleanupClosePushL( contentFile ); - HBufC8* content = ReadContentFromFileLC( contentFile ); + HBufC8* content = ReadContentFromFileLC( contentFile, *part ); linkContent->HandleResolveComplete( part->GetContentType(), KNullDesC(), content ); CleanupStack::PopAndDestroy( content ); @@ -1126,7 +1131,7 @@ CleanupClosePushL( htmlFile ); // Read content from given source file - HBufC8* content = ReadContentFromFileLC( htmlFile ); + HBufC8* content = ReadContentFromFileLC( htmlFile, aHtmlBodyPart ); // Write content to target file WriteContentToFileL( *content, targetFileName, aHtmlBodyPart ); @@ -1148,13 +1153,33 @@ targetFileName.Copy( iTempHtmlFolderPath ); targetFileName.Append( aHtmlFileName ); - HBufC* content = HBufC::NewLC( aTextBodyPart.FetchedContentSize() ); + TInt contentsize = aTextBodyPart.FetchedContentSize(); + + TInt limit(0); + TInt err = iViewerSettings->Repository().Get( KFreestyleMaxBodySize , limit ); + limit *= KKilo; // cenrep value is in kB, 0 means unlimited + + if ( limit == 0 || err ) + { + limit = KMaxTInt; + } + + TInt size = Min(limit,contentsize); + HBufC* content = HBufC::NewLC( size ); TPtr contentPtr( content->Des() ); aTextBodyPart.GetContentToBufferL( contentPtr, 0 ); - + //When we found EFSMsgFlag_BodyTruncated was set, add "--Message too long--" in the end of plain html view + if ( limit < contentsize ) + { + HBufC* addingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEW_ADDITIONAL_INFO ); + TInt pos = limit - addingText->Length(); + contentPtr.Replace(pos,addingText->Length(),*addingText); + CleanupStack::PopAndDestroy( addingText ); + aTextBodyPart.SetFlag(EFSMsgFlag_BodyTruncated); + } + ConvertToHTML( *content, targetFileName, aTextBodyPart ); - CleanupStack::PopAndDestroy( content ); } @@ -1163,11 +1188,29 @@ // Reads given file content to buffer and return pointer to it // --------------------------------------------------------------------------- // -HBufC8* CFsEmailUiHtmlViewerContainer::ReadContentFromFileLC( RFile& aFile ) +HBufC8* CFsEmailUiHtmlViewerContainer::ReadContentFromFileLC( RFile& aFile, CFSMailMessagePart& aHtmlBodyPart ) { FUNC_LOG; - TInt size = 0; - User::LeaveIfError( aFile.Size( size ) ); + TInt fileSize = 0; + + TInt limit(0); + TInt err = iViewerSettings->Repository().Get( KFreestyleMaxBodySize , limit ); + limit *= KKilo; // cenrep value is in kB, 0 means unlimited + + User::LeaveIfError( aFile.Size( fileSize ) ); + if ( limit == 0 || err ) + { + limit = KMaxTInt; + } + + TInt size = Min( limit, fileSize ); // read no more than limit bytes.. + + + if ( size < fileSize ) + { + aHtmlBodyPart.SetFlag( EFSMsgFlag_BodyTruncated ); + } + HBufC8* buffer = HBufC8::NewLC( size ); TPtr8 ptr = buffer->Des(); User::LeaveIfError( aFile.Read( ptr, size ) ); @@ -1253,9 +1296,18 @@ // Write the original content User::LeaveIfError( targetFile.Write( buffer ) ); - + //When we found EFSMsgFlag_BodyTruncated was set, add "--Message too long--" in the end of html view + if( aHtmlBodyPart.GetFlags()&EFSMsgFlag_BodyTruncated ) + { + HBufC* addingText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEW_ADDITIONAL_INFO ); + HBufC8* addingText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *addingText ); + CleanupStack::PopAndDestroy( addingText ); + CleanupStack::PushL( addingText8 ); + User::LeaveIfError( targetFile.Write( *addingText8 ) ); + CleanupStack::PopAndDestroy( addingText8 ); + } // Write ending metadata if needed - if ( modificationNeeded ) + if ( modificationNeeded || (aHtmlBodyPart.GetFlags()&EFSMsgFlag_BodyTruncated) ) { INFO("Add end tags"); User::LeaveIfError( targetFile.Write( KHtmlEndTags ) ); @@ -1363,7 +1415,7 @@ { RFile attachmentFile = aAttachment.GetContentFileL(); CleanupClosePushL( attachmentFile ); - HBufC8* content = ReadContentFromFileLC( attachmentFile ); + HBufC8* content = ReadContentFromFileLC( attachmentFile, aAttachment ); aEmbeddedLinkContent.HandleResolveComplete( aAttachment.GetContentType(), KNullDesC(), content ); CleanupStack::PopAndDestroy( content ); @@ -1609,9 +1661,9 @@ TRAP_IGNORE( CFreestyleMessageHeaderHTML::ExportL( *iMessage, iFs, headerHtmlFile, iAppUi.ClientRect().Width(), iScrollPosition, iViewerSettings->AutoLoadImages() || iAppUi.DisplayImagesCache().Contains(*iMessage), - iHeaderExpanded ) ) - - + iFlags ) ) + + if(!iEventHandler->IsMenuVisible()) { TRAP_IGNORE( ReloadPageL() ); @@ -1775,13 +1827,14 @@ TRect CFsEmailUiHtmlViewerContainer::CalcAttachmentStatusRect() { - TRect rect = Rect(); + TRect rect( Rect() ); TPoint topLeft = rect.iTl; TPoint bottomRight = rect.iBr; - TPoint statusTopLeft( topLeft.iX + KStatusIndicatorXMargin, bottomRight.iY - KStatusIndicatorHeight + 1 ); TPoint statusBottomRight( bottomRight.iX - KStatusIndicatorXMargin, bottomRight.iY ); - return TRect( statusTopLeft, statusBottomRight ); + rect = TRect(statusTopLeft, statusBottomRight); + rect.Move(0, -KStatusIndicatorBottomMargin); + return rect; } void CFsEmailUiHtmlViewerContainer::TouchFeedback() @@ -1822,16 +1875,35 @@ else if (aUrl.Compare(KURLCollapseHeader()) == 0) { TouchFeedback(); - iHeaderExpanded = EFalse; + iFlags.ClearAll(); return ETrue; } else if (aUrl.Compare(KURLExpandHeader()) == 0) { TouchFeedback(); - iHeaderExpanded = ETrue; - return ETrue; + iFlags.Set( CFreestyleMessageHeaderHTML::EHeaderExpanded ); + return ETrue; } - else if (aUrl.Left(index).CompareF(KURLSchemeCmail) == 0) + else if ( aUrl.Find( KURLExpandItem() ) == 0 ) { + const TPtrC item( aUrl.Mid( KURLExpandItem().Length() ) ); + if ( item.Find( KURLItemTo() ) == 0 ) + { + iFlags.Assign( CFreestyleMessageHeaderHTML::EToExpanded, ETrue ); + } + else if ( item.Find( KURLItemCc() ) == 0 ) + { + iFlags.Assign( CFreestyleMessageHeaderHTML::ECcExpanded, ETrue ); + } + else if ( item.Find( KURLItemBcc() ) == 0 ) + { + iFlags.Assign( CFreestyleMessageHeaderHTML::EBccExpanded, ETrue ); + } + else if ( item.Find( KURLItemAttachments() ) == 0 ) + { + iFlags.Assign( CFreestyleMessageHeaderHTML::EAttachmentExpanded, ETrue ); + } + return ETrue; + } else if (aUrl.Left(index).CompareF(KURLSchemeCmail) == 0) { TInt bodyIndex = aUrl.Find(KURLTypeBody); if (bodyIndex == KErrNotFound) @@ -2010,7 +2082,7 @@ HBufC* statusText = NULL; statusText = StringLoader::LoadL(R_FREESTYLE_EMAIL_UI_VIEWER_FETCHING_CONTENT_TEXT); iAppUi.FsTextureManager()->ProvideBitmapL(EStatusTextureSynchronising, image, imageMask ); - iStatusIndicator->ShowIndicatorL( image, imageMask, statusText, aDuration ); + iStatusIndicator->ShowIndicatorL( image, imageMask, statusText, aDuration, ETrue ); } void CFsEmailUiHtmlViewerContainer::MailListModelUpdatedL() diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -63,11 +63,12 @@ #include "FSDelayedLoader.h" #include "FreestyleMessageHeaderURL.h" #include "FreestyleEmailUiAknStatusIndicator.h" -#include + +#include -CFsEmailUiHtmlViewerView* CFsEmailUiHtmlViewerView::NewL( +CFsEmailUiHtmlViewerView* CFsEmailUiHtmlViewerView::NewL( CAlfEnv& aEnv, - CFreestyleEmailUiAppUi& aAppUi, + CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ) { FUNC_LOG; @@ -79,7 +80,7 @@ } CFsEmailUiHtmlViewerView::CFsEmailUiHtmlViewerView( CAlfEnv& aEnv, - CFreestyleEmailUiAppUi& aAppUi, + CFreestyleEmailUiAppUi& aAppUi, CAlfControlGroup& aControlGroup ) : CFsEmailUiViewBase( aControlGroup, aAppUi ), iEnv( aEnv ) @@ -96,14 +97,12 @@ iAppUi.DownloadInfoMediator()->StopObserving( this, iMessage->GetMessageId() ); } - // if ( iContainer ) { iContainer->PrepareForExit(); } delete iNewMailTempAddress; - // if ( iContainer ) { iContainer->CancelFetch(); @@ -116,8 +115,8 @@ delete iEmbeddedMessages; iEmbeddedMessages = NULL; iMessage = NULL; - - delete iMailBox; + + delete iMailBox; iMailBox = NULL; delete iAsyncCallback; } @@ -125,11 +124,11 @@ void CFsEmailUiHtmlViewerView::ConstructL() { FUNC_LOG; - BaseConstructL( R_FSEMAILUI_HTML_VIEW ); + BaseConstructL( R_FSEMAILUI_HTML_VIEW_FULLSCREEN ); iAsyncCallback = new (ELeave) CAsyncCallBack( CActive::EPriorityLow ); iOpenMessages = new (ELeave) CStack(); iEmbeddedMessages = new (ELeave) CStack(); - iNextOrPrevMessageSelected = EFalse; + iNextOrPrevMessageSelected = EFalse; iForwardingMessage = EFalse; iMessageIsDeleted = EFalse; } @@ -223,7 +222,7 @@ CleanupStack::PushL( handler ); handler->HandleUrlStandaloneL(); CleanupStack::PopAndDestroy( handler ); - CleanupStack::PopAndDestroy( url ); + CleanupStack::PopAndDestroy( url ); } break; case TBrCtlDefs::EElementNone: @@ -318,7 +317,7 @@ params.iMailBoxId = iMessage->GetMailBoxId(); params.iFolderId = iMessage->GetFolderId(); params.iMessageId = iMessage->GetMessageId(); - + // use package buffer to pass the params TPckgBuf buf( params ); TUid emptyCustomMessageId = { 0 }; @@ -364,12 +363,12 @@ { if ( iMessage ) { - + if ( iActivationData.iEmbeddedMessageMode ) { iCreateNewMsgFromEmbeddedMsg = ETrue; } - + HBufC* mailAddress=iMessage->GetSender()->GetEmailAddress().AllocLC(); delete iNewMailTempAddress; iNewMailTempAddress = NULL; @@ -392,7 +391,7 @@ break; } } - TIMESTAMP( "Html viewer selected operation done" ); + TIMESTAMP( "Html viewer selected operation done" ); } // --------------------------------------------------------------------------- @@ -477,13 +476,13 @@ TBool msgBodyStructurePresent ( EFalse ); TBool msgBodyContentPresent ( EFalse ); - + if( aCustomMessageId != KHtmlViewerReturnToPrevious) { ViewEntered( aPrevViewId ); } - if ( iMrObserverToInform && + if ( iMrObserverToInform && aCustomMessageId == KStartViewerReturnToPreviousMsg ) { // If returning from view launched by MRUI, complete the ongoing @@ -515,7 +514,7 @@ } CleanupClosePushL( iActivationData.iFile ); - + if ( !iMessage && iContainer ) { iContainer->ResetContent(); @@ -523,14 +522,14 @@ iContainer->CancelFetch(); iContainer->ClearCacheAndLoadEmptyContent(); } - + if ( !iContainer ) { iContainer = CFsEmailUiHtmlViewerContainer::NewL( iAppUi, *this ); } - + // Check whether this activation is actually for a meeting request - TBool openedInMrViewer( EFalse ); + TBool openedInMrViewer( EFalse ); if ( THtmlViewerActivationData::EMailMessage == iActivationData.iActivationDataType ) { openedInMrViewer = IsOpenedInMRViewerL(); @@ -539,25 +538,25 @@ if ( openedInMrViewer ) { // The previous contents are cleared (otherwise they are shown just - // before the meeting request viewer kicks in, especially annoying + // before the meeting request viewer kicks in, especially annoying // when navigating between prev/next meeting requests by using navi // decorator array buttons. iContainer->ClearCacheAndLoadEmptyContent(); ClearMailViewer(); } - + ShowContainerL(); - + switch ( iActivationData.iActivationDataType ) { case THtmlViewerActivationData::EMailMessage: { - + if ( iMessage && iAppUi.DownloadInfoMediator() ) { iAppUi.DownloadInfoMediator()->StopObserving( this, iMessage->GetMessageId() ); } - + //clean message stack which owns object iMessage EraseMessageStack(); iMessage = NULL; @@ -566,14 +565,12 @@ iActivationData.iFolderId, iActivationData.iMessageId, EFSMsgDataEnvelope ); - - UpdateToolbarL(); if ( iMessage && iAppUi.DownloadInfoMediator() ) { iAppUi.DownloadInfoMediator()->AddObserver( this, iMessage->GetMessageId() ); } - + delete iAttachmentsListModel; iAttachmentsListModel = NULL; @@ -586,13 +583,17 @@ PushMessageL( iMessage, EFalse ); } - if ( openedInMrViewer ) + if ( openedInMrViewer ) { + iContainer->DisplayStatusIndicatorL(); + iAppUi.GetMailClient()->PrepareMrDescriptionL( iActivationData.iMailBoxId, + iActivationData.iMessageId ); + // Setting MSK empty. This blocks unwanted MSK keypresses before MrViewer is initialized. ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); iMrUiActive = ETrue; - iAppUi.MrViewerInstanceL()->ExecuteViewL( *iMessage, *this ); - } + iAppUi.MrViewerInstanceL()->ExecuteViewL( *iMessage, *this ); + } else { // Attachment list model is not created when opening mrViewer, so attachment options menu is @@ -602,18 +603,18 @@ iAttachmentsListModel->UpdateListL( msgPartData ); CheckMessageBodyL( *iMessage, msgBodyStructurePresent, msgBodyContentPresent ); LoadContentFromMailMessageL( iMessage, ETrue ); - } + } } else { User::Leave( KErrNotFound ); } - + if ( aCustomMessageId != KStartViewerReturnToPreviousMsg && iMessage ) { delete iMailBox; iMailBox = NULL; iMailBox = iAppUi.GetMailClient()->GetMailBoxByUidL( iMessage->GetMailBoxId() ); - + // Change active mailbox if necessary if ( !iMessage->GetMailBoxId().IsNullId() ) { @@ -629,30 +630,27 @@ { PushMessageL(iActivationData.iEmbeddedMessage, ETrue); } - + iMessage = iOpenMessages->Head(); iCreateNewMsgFromEmbeddedMsg = EFalse; - + delete iAttachmentsListModel; iAttachmentsListModel = NULL; iAttachmentsListModel = CFSEmailUiAttachmentsListModel::NewL( iAppUi, *this ); - + if ( iOpenMessages->Head()== iOpenMessages->Last() ) { TPartData msgPartData( iActivationData.iMailBoxId, iActivationData.iFolderId, iActivationData.iMessageId); iAttachmentsListModel->UpdateListL( msgPartData ); - + } else{ - iAttachmentsListModel->UpdateListL( iOpenMessages->Head() ); - } - + iAttachmentsListModel->UpdateListL( iOpenMessages->Head() ); + } + CheckMessageBodyL( *iOpenMessages->Head(), msgBodyStructurePresent, msgBodyContentPresent ); LoadContentFromMailMessageL( iOpenMessages->Head(), ETrue ); - - // update tool bar as some action menu boton should not appear in embbeded messages. - UpdateToolbarL(); - + } break; case THtmlViewerActivationData::EFile: @@ -671,17 +669,17 @@ } break; } - + CleanupStack::PopAndDestroy( &iActivationData.iFile ); SetMskL(); - + if(iMessage) { CFSMailAddress* address = iMessage->GetSender(); if ( address ) { HBufC* displayName = address->GetDisplayName().AllocLC(); - + if ( displayName->Length() ) { iAppUi.SetTitlePaneTextL( *displayName ); @@ -695,7 +693,7 @@ CleanupStack::PopAndDestroy( displayName ); } } - + if ( !openedInMrViewer && iMessage) { CFSMailMessagePart* htmlBodyPart = iMessage->HtmlBodyPartL(); @@ -716,7 +714,7 @@ StartWaitedFetchingL(EMessageStructure); iFetchingAlready = ETrue; } - else + else { if ( msgBodyStructurePresent && !msgBodyContentPresent ) { @@ -732,88 +730,14 @@ } iNextOrPrevMessageSelected = EFalse; iForwardingMessage = EFalse; - + //update rect only if it has changed from previous time. if ( iContainer->Rect() != ContainerRect() ) { iContainer->SetRect( ContainerRect() ); } - - TIMESTAMP( "Html viewer opened" ); - } -// ----------------------------------------------------------------------------- -// CFsEmailUiHtmlViewerView::OfferToolbarEventL -// ----------------------------------------------------------------------------- -void CFsEmailUiHtmlViewerView::OfferToolbarEventL( TInt aCommand ) - { - FUNC_LOG; - switch (aCommand) - { - case EFsEmailUiTbCmdReply: - { - HandleCommandL(EFsEmailUiCmdActionsReply); - break; - } - - case EFsEmailUiTbCmdForward: - { - HandleCommandL(EFsEmailUiCmdActionsForward); - break; - } - case EFsEmailUiTbCmdDelete: - { - iAsyncCallback->Cancel(); - iAsyncCallback->Set( TCallBack( DeleteMail, this ) ); - iAsyncCallback->SetPriority( CActive::EPriorityHigh ); - iAsyncCallback->CallBack(); - break; - } - case EFsEmailUiTbCmdReplyAll: - { - HandleCommandL(EFsEmailUiCmdActionsReplyAll); - break; - } - default: - break; - } - } - -// ----------------------------------------------------------------------------- -// CFsEmailUiHtmlViewerView::ToolbarResourceId -// ----------------------------------------------------------------------------- -TInt CFsEmailUiHtmlViewerView::ToolbarResourceId() const - { - TInt resourceId( R_FREESTYLE_EMAIL_UI_TOOLBAR_HTML_MESSAGE_VIEWER_NO_REPLY_ALL ); - if (iMessage) - { - if (!iActivationData.iEmbeddedMessageMode && - TFsEmailUiUtility::CountRecipientsSmart( iAppUi, iMessage ) > 1) - { - resourceId = R_FREESTYLE_EMAIL_UI_TOOLBAR_HTML_MESSAGE_VIEWER; - } - } - return resourceId; - } - -// ----------------------------------------------------------------------------- -// CFsEmailUiHtmlViewerView::GetInitiallyDimmedItemsL -// ----------------------------------------------------------------------------- -void CFsEmailUiHtmlViewerView::GetInitiallyDimmedItemsL( const TInt aResourceId, - RArray& aDimmedItems ) const - { - if ( R_FREESTYLE_EMAIL_UI_TOOLBAR_HTML_MESSAGE_VIEWER == aResourceId || - R_FREESTYLE_EMAIL_UI_TOOLBAR_HTML_MESSAGE_VIEWER_NO_REPLY_ALL == aResourceId ) - { - if ( iActivationData.iEmbeddedMessageMode ) - { - aDimmedItems.AppendL(EFsEmailUiTbCmdActions); - aDimmedItems.AppendL(EFsEmailUiTbCmdDelete); - aDimmedItems.AppendL(EFsEmailUiTbCmdReply); - aDimmedItems.AppendL(EFsEmailUiTbCmdForward); - aDimmedItems.AppendL(EFsEmailUiTbCmdReplyAll); - } - } + TIMESTAMP( "Html viewer opened" ); } // ----------------------------------------------------------------------------- @@ -844,7 +768,6 @@ iContainer->ClearCacheAndLoadEmptyContent(); } } - Toolbar()->SetToolbarObserver( this ); iMessage = NULL; } @@ -854,7 +777,7 @@ delete iMessage; iMessage = NULL; CancelFetchings(); - + if ( iFlagSelectionHandler ) { iFlagSelectionHandler->Cancel(); @@ -870,7 +793,7 @@ void CFsEmailUiHtmlViewerView::NavigateBackL() { FUNC_LOG; - // clean up current message + // clean up current message if ( iMessage && iAppUi.DownloadInfoMediator() ) { iAppUi.DownloadInfoMediator()->StopObserving( this, iMessage->GetMessageId() ); @@ -886,7 +809,7 @@ delete tmp; tmp = NULL; } - + if ( iFlagSelectionHandler ) { iFlagSelectionHandler->Cancel(); @@ -897,13 +820,13 @@ // Return to previous message in the stack if there is still some left if ( !iOpenMessages->IsEmpty() ) { - - THtmlViewerActivationData htmlData; + + THtmlViewerActivationData htmlData; if ( iOpenMessages->Head()!= iOpenMessages->Last() ) { htmlData.iActivationDataType = THtmlViewerActivationData::EmbeddedEmailMessage; htmlData.iEmbeddedMessageMode = ETrue; - + } else { @@ -912,10 +835,10 @@ htmlData.iFolderId = iOpenMessages->Head()->GetFolderId(); htmlData.iMessageId = iOpenMessages->Head()->GetMessageId(); } - + TPckgBuf pckgData( htmlData ); iAppUi.EnterFsEmailViewL( HtmlViewerId, KStartViewerReturnFromEmbeddedMsg, pckgData ); - + } // In usual case we use the base view implementation else @@ -933,23 +856,52 @@ } // --------------------------------------------------------------------------- +// Wrapper for implementation in view base class +// --------------------------------------------------------------------------- +// +void CFsEmailUiHtmlViewerView::ChangeMskCommandL( TInt /*aLabelResourceId*/ ) + { + CEikButtonGroupContainer* cba( Cba() ); + if ( cba ) + { + cba->SetCommandSetL( R_FREESTYLE_EMAUIL_UI_SK_OPTIONS_BACK_FULLSCREEN ); + CEikCba* eikCba( static_cast< CEikCba* >( cba->ButtonGroup() ) ); + TFileName filename; + TFsEmailUiUtility::GetFullIconFileNameL( filename ); + if (iActivationData.iEmbeddedMessageMode) + { + eikCba->UpdateMSKIconL( KAknsIIDQsnIconColors, filename, + EMbmFreestyleemailuiQgn_graf_cmail_blank, + EMbmFreestyleemailuiQgn_graf_cmail_blank_mask, ETrue ); + } + else + { + eikCba->UpdateMSKIconL( KAknsIIDQsnIconColors, filename, + EMbmFreestyleemailuiQgn_prop_cmail_action_delete, + EMbmFreestyleemailuiQgn_prop_cmail_action_delete_mask, ETrue ); + } + } + } + +// --------------------------------------------------------------------------- +// Sets status bar layout +// --------------------------------------------------------------------------- +// +TBool CFsEmailUiHtmlViewerView::IsStatusPaneVisible() const + { + return EFalse; + } + +// --------------------------------------------------------------------------- // Sets status bar layout // --------------------------------------------------------------------------- // void CFsEmailUiHtmlViewerView::SetStatusBarLayout() { - TInt res = R_AVKON_STATUS_PANE_LAYOUT_USUAL_FLAT; - if( Layout_Meta_Data::IsLandscapeOrientation() ) - { - // landscape must use different layout - res = R_AVKON_STATUS_PANE_LAYOUT_USUAL_EXT; - } - - if( StatusPane()->CurrentLayoutResId() != res ) - { - TRAP_IGNORE( - StatusPane()->SwitchLayoutL( res )); - } + if( StatusPane()->CurrentLayoutResId() != R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT ) + { + TRAP_IGNORE( StatusPane()->SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_IDLE_FLAT ) ); + } } void CFsEmailUiHtmlViewerView::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane ) @@ -960,29 +912,25 @@ { // Pinch zoom only aMenuPane->SetItemDimmed( EFsEmailUiCmdZoomLevel, ETrue ); - + if ( FeatureManager::FeatureSupported( KFeatureIdFfCmailIntegration ) ) { // remove help support in pf5250 - aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); - } - - TBool toolbarExists = EFalse; - if( iAppUi.CurrentFixedToolbar() ) - { - toolbarExists = iAppUi.CurrentFixedToolbar()->IsVisible(); + aMenuPane->SetItemDimmed( EFsEmailUiCmdHelp, ETrue); } - + + const TBool toolbarExists( EFalse ); + // Some commands are blocked when viewing embedded message object // or separate HTML file. const TBool blockCmds( !iMessage || iActivationData.iEmbeddedMessageMode || toolbarExists ); const TBool blockReplyALLCmd( toolbarExists || !iMessage || iActivationData.iEmbeddedMessageMode || - TFsEmailUiUtility::CountRecipientsSmart( iAppUi, iMessage ) < 2 ); + TFsEmailUiUtility::CountRecipientsSmart( iAppUi, iMessage ) < 2 ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReply, blockCmds ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsReplyAll, blockReplyALLCmd ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsForward, blockCmds ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsDelete, blockCmds ); - + if( iActivationData.iEmbeddedMessageMode ) { aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkAsRead, ETrue ); @@ -990,7 +938,7 @@ aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsMoveMessage, ETrue ); aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsFlag, ETrue ); } - + TBool hideNext = !ShowNextMessageMenuInOptions(); TBool blockNextCmd = !iMessage || iActivationData.iEmbeddedMessageMode || hideNext; TInt menuPos; @@ -1004,16 +952,16 @@ { aMenuPane->SetItemDimmed( EFsEmailUiCmdPreviousMessage, blockPrevCmd ); } - + CFSMailFolder* currentFolder = NULL; if ( iMessage ) { - TRAP_IGNORE( currentFolder = + TRAP_IGNORE( currentFolder = iAppUi.GetMailClient()->GetFolderByUidL( - iMessage->GetMailBoxId(), + iMessage->GetMailBoxId(), iMessage->GetFolderId() ) ); } - + if ( currentFolder && currentFolder->GetFolderType() != EFSOutbox ) { @@ -1021,14 +969,14 @@ TBool messageIsRead( iMessage->IsFlagSet( EFSMsgFlag_Read ) ); aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkAsRead, messageIsRead ); aMenuPane->SetItemDimmed( EFsEmailUiCmdMarkAsUnread, !messageIsRead ); - + // Move to another folder option - aMenuPane->SetItemDimmed( - EFsEmailUiCmdActionsMoveMessage, + aMenuPane->SetItemDimmed( + EFsEmailUiCmdActionsMoveMessage, !iAppUi.GetActiveMailbox()->HasCapability( EFSMBoxCapaMoveToFolder ) ); // Follow-up flag option - aMenuPane->SetItemDimmed( + aMenuPane->SetItemDimmed( EFsEmailUiCmdActionsFlag, !( iMailBox && TFsEmailUiUtility::IsFollowUpSupported( *iMailBox ) ) ); } @@ -1050,7 +998,7 @@ iAppUi.ShortcutBinding().AppendShortcutHintsL( *aMenuPane, CFSEmailUiShortcutBinding::EContextHtmlViewer ); } - + // ----------------------------------------------------------------------------- // CFsEmailUiHtmlViewerView::HandleMrCommandL // Handle accept/decline/tentative/remove commands given for meeting request @@ -1063,7 +1011,7 @@ TFSMailMsgId aMessageId ) { FUNC_LOG; - ///any init required? + ///any init required? UpdateMessagePtrL( aMailboxId, aFolderId, aMessageId ); if ( aCommandId == EFsEmailUiCmdCalRemoveFromCalendar && iMessage ) @@ -1097,14 +1045,14 @@ void CFsEmailUiHtmlViewerView::HandleStatusPaneSizeChange() { CFsEmailUiViewBase::HandleStatusPaneSizeChange(); - + HandleViewRectChange(); } void CFsEmailUiHtmlViewerView::HandleViewRectChange() { CFsEmailUiViewBase::HandleViewRectChange(); - + if ( iContainer ) { iContainer->SetRect( ContainerRect() ); @@ -1114,12 +1062,12 @@ void CFsEmailUiHtmlViewerView::HandleDynamicVariantSwitchL( CFsEmailUiViewBase::TDynamicSwitchType aType ) { FUNC_LOG; - + if ( aType == EScreenLayoutChanged ) { SetStatusBarLayout(); } - + if ( iContainer ) { iContainer->SetRect( ContainerRect() ); @@ -1127,22 +1075,10 @@ } } -TRect CFsEmailUiHtmlViewerView::ContainerRect() const +TRect CFsEmailUiHtmlViewerView::ContainerRect() const { - TRect rect = ClientRect(); - - CAknToolbar* toolbar = iAppUi.CurrentFixedToolbar(); - if( toolbar && toolbar->IsVisible() && Layout_Meta_Data::IsLandscapeOrientation() ) - { - TPoint pos = toolbar->PositionRelativeToScreen(); - - // In some LS status pane layouts the toolbar will be shown on top of the client area - if( pos.iX > 0 ) - { - rect.iBr.iX = pos.iX; - } - } - return rect; + TRect rect( ClientRect() ); + return rect; } void CFsEmailUiHtmlViewerView::LoadContentFromFileL( const TDesC& aFileName ) @@ -1211,7 +1147,7 @@ TInt reallyDelete( ETrue ); - if ( iAppUi.GetCRHandler()->WarnBeforeDelete() && + if ( iAppUi.GetCRHandler()->WarnBeforeDelete() && !aSilentDelete ) { reallyDelete = TFsEmailUiUtility::ShowConfirmationQueryL( @@ -1228,43 +1164,43 @@ HideContainer(); iContainer->ResetContent(); } - + RArray msgIds; CleanupClosePushL( msgIds ); - + msgIds.Append( currentMsgId ); TFSMailMsgId mailBox = iMessage->GetMailBoxId(); - TFSMailMsgId folderId = iMessage->GetFolderId(); - - //Get the id and check if there is a previous message available + TFSMailMsgId folderId = iMessage->GetFolderId(); + + //Get the id and check if there is a previous message available TFSMailMsgId prevMsgId; - TFSMailMsgId prevMsgFolderId; - + TFSMailMsgId prevMsgFolderId; + //Get the previous message if it exists - TBool available = iAppUi.IsPreviousMsgAvailable( currentMsgId, - prevMsgId, + TBool available = iAppUi.IsPreviousMsgAvailable( currentMsgId, + prevMsgId, prevMsgFolderId ); - + //Delete the message - iLastDeletedMessageID = iMessage->GetMessageId(); + iLastDeletedMessageID = iMessage->GetMessageId(); iAppUi.GetMailClient()->DeleteMessagesByUidL( mailBox, folderId, msgIds ); CleanupStack::PopAndDestroy( &msgIds ); // Notify appui of deleted mail item - SendEventToAppUiL( TFSEventMailDeletedFromViewer ); - - + SendEventToAppUiL( TFSEventMailDeletedFromViewer ); + + if ( iAppUi.CurrentActiveView()->Id() == HtmlViewerId ) - { + { //Open the previous message or navigate back to list viewer if ( available ) { iMessageIsDeleted = ETrue; TRAPD( err, iAppUi.MoveToPreviousMsgAfterDeleteL( prevMsgId ) ); iMessageIsDeleted = EFalse; - + User::LeaveIfError( err ); - } + } else { ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); @@ -1289,14 +1225,14 @@ if ( /*iFirstStartCompleted &&*/ iMessage && aMailbox.Id() == iAppUi.GetActiveMailboxId().Id() && (aEvent == TFSEventMailDeleted || aEvent == TFSEventMailDeletedFromViewer) && aParam1 ) // Safety, in list events that only concern active mailbox are handled { - TFSMailMsgId curMsgId = iMessage->GetMessageId(); + TFSMailMsgId curMsgId = iMessage->GetMessageId(); RArray* removedEntries = static_cast*>( aParam1 ); TBool cont = ETrue; for ( TInt i = 0 ; i < removedEntries->Count() && cont; i++ ) { if ( ( curMsgId == ( *removedEntries )[i] ) && (iDeletedMessageFromMrui != curMsgId) ) - { + { cont = EFalse; ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); if( aEvent == TFSEventMailDeleted && !iMessageIsDeleted ) @@ -1305,14 +1241,14 @@ // The message we are viewing was deleted => stop here return; } - } - } + } + } } - + if ( iContainer && iMessage && aMailbox.Id() == iAppUi.GetActiveMailboxId().Id() ) { - if ( aEvent == TFSEventNewMail || - aEvent == TFSEventMailDeleted || + if ( aEvent == TFSEventNewMail || + aEvent == TFSEventMailDeleted || aEvent == TFSEventMailChanged ) { iContainer->MailListModelUpdatedL(); @@ -1320,13 +1256,13 @@ // DSW fix for FAMZ-82YJQ2 // Dismiss the download status dialog after sync has been finished or cancelled - + if ( aEvent == TFSEventMailboxSyncStateChanged ) { TSSMailSyncState* newSyncState = static_cast( aParam1 ); - if ( newSyncState && ( *newSyncState == FinishedSuccessfully || - *newSyncState == SyncCancelled || - *newSyncState == Idle || + if ( newSyncState && ( *newSyncState == FinishedSuccessfully || + *newSyncState == SyncCancelled || + *newSyncState == Idle || *newSyncState == SyncError )) { iContainer->HideDownloadStatus(); @@ -1337,7 +1273,7 @@ void CFsEmailUiHtmlViewerView::DynInitZoomMenuL( CEikMenuPane* aMenuPane ) { - FUNC_LOG; + FUNC_LOG; /* -- Pinch zoom only -- TInt zoomLevelIdx = iContainer->ZoomLevelL(); @@ -1447,7 +1383,7 @@ { CopyCurrentToClipBoardL( aUrl ); break; - } + } } } @@ -1538,28 +1474,7 @@ HBufC* textData = aEmailAddress.AllocLC(); CFSMailBox* mailBox = iAppUi.GetMailClient()->GetMailBoxByUidL( iMessage->GetMailBoxId() ); CleanupStack::PushL( mailBox ); - - //UI options Delete and Actions dimmed in Remote Lookup. - const TInt resourceId(ToolbarResourceId()); - RArray dimmedItems; - CleanupClosePushL(dimmedItems); - GetInitiallyDimmedItemsL(resourceId, dimmedItems); // get the currently dimmed buttons - - SetToolbarItemDimmed( EFsEmailUiTbCmdActions, ETrue); - SetToolbarItemDimmed( EFsEmailUiTbCmdDelete, ETrue); - - HideToolbar(); CFsDelayedLoader::InstanceL()->GetContactHandlerL()->LaunchRemoteLookupWithQueryL( *mailBox, *textData ); - ShowToolbar(); - - SetToolbarItemDimmed( EFsEmailUiTbCmdActions, EFalse); - SetToolbarItemDimmed( EFsEmailUiTbCmdDelete, EFalse); - - for (TInt i = 0; i < dimmedItems.Count(); i++) // restore the buttons - { - SetToolbarItemDimmed(dimmedItems[i], ETrue); - } - CleanupStack::PopAndDestroy(); // dimmedItems.Close() CleanupStack::PopAndDestroy( mailBox ); CleanupStack::PopAndDestroy( textData ); } @@ -1641,10 +1556,10 @@ { iContainer->ShowAttachmentDownloadStatusL( TFSProgress::EFSStatus_Status, aAttachment ); } - + if ( savedCount ) { - TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( savedCount ); + TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( savedCount ); } } } @@ -1692,19 +1607,19 @@ TBool CFsEmailUiHtmlViewerView::IsEmbeddedMsgSavingAllowed() { - return iMailBox->HasCapability( + return iMailBox->HasCapability( EFSMboxCapaSupportsSavingOfEmbeddedMessages ); } -void CFsEmailUiHtmlViewerView::UpdateDownloadIndicatorL( - const TPartData& aPart, +void CFsEmailUiHtmlViewerView::UpdateDownloadIndicatorL( + const TPartData& aPart, const TFSProgress& aEvent ) { FUNC_LOG; - + if ( !iMessage || !iContainer || ( aEvent.iError != KErrNone ) ) return; - + TAttachmentData* attachment = NULL; const RArray& attachments = iAttachmentsListModel->GetModel(); for ( TInt i=0; i < attachments.Count(); i++ ) @@ -1715,7 +1630,7 @@ break; } } - + if ( attachment ) { switch ( aEvent.iProgressStatus ) @@ -1732,17 +1647,17 @@ } } break; - + case TFSProgress::EFSStatus_RequestComplete: { attachment->downloadProgress = KComplete; } break; - + default: break; } - + iContainer->ShowAttachmentDownloadStatusL( aEvent.iProgressStatus, *attachment ); } } @@ -1764,7 +1679,7 @@ // CFsEmailUiHtmlViewerView::PushMessageL // Message stack handling. Ownership of message is transferred when succesful. // ----------------------------------------------------------------------------- -// +// void CFsEmailUiHtmlViewerView::PushMessageL( CFSMailMessage* aMessage, TBool aIsEmbedded ) { if ( !iOpenMessages || !iEmbeddedMessages ) @@ -1793,12 +1708,12 @@ // CFsEmailUiHtmlViewerView::PopMessage // Message stack handling. Ownership of message is returned. // ----------------------------------------------------------------------------- -// +// CFSMailMessage* CFsEmailUiHtmlViewerView::PopMessage() { ASSERT( iOpenMessages && iEmbeddedMessages ); ASSERT( iOpenMessages->Count() == iEmbeddedMessages->Count() ); - + CFSMailMessage* msg = NULL; if ( !iOpenMessages->IsEmpty() ) { @@ -1815,7 +1730,7 @@ // CFsEmailUiHtmlViewerView::EraseMessageStack // Message stack handling. All messages in stack are deallocated // ----------------------------------------------------------------------------- -// +// void CFsEmailUiHtmlViewerView::EraseMessageStack() { ASSERT( iOpenMessages && iEmbeddedMessages ); @@ -1877,7 +1792,7 @@ } iMessage->SaveMessageL(); // Save read status SendEventToAppUiL( TFSEventMailChanged ); - + } } @@ -1889,7 +1804,7 @@ FUNC_LOG; TBool available = EFalse; // Next/previous message options are inavailable in the embedded mode - if ( iMessage && !iActivationData.iEmbeddedMessageMode ) + if ( iMessage && !iActivationData.iEmbeddedMessageMode ) { TFSMailMsgId currentMsgId = iMessage->GetMessageId(); TFSMailMsgId nextMsgId; @@ -1920,7 +1835,7 @@ // Stop timer and cancel fetchings before showing next message //iFetchingAnimationTimer->Stop(); CancelFetchings(); - + // Change empty msk when moving to next ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); @@ -1959,15 +1874,15 @@ TFSMailMsgId prevMsgId; TFSMailMsgId prevMsgFolderId; if ( iAppUi.IsPreviousMsgAvailable( currentMsgId, prevMsgId, prevMsgFolderId ) ) - { + { if (iContainer) { iContainer->PrepareForMessageNavigation(); } - + // Stop timer and cancel fetchings before showing prev message CancelFetchings(); - + // Change empty msk when moving to previous ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); @@ -2200,9 +2115,9 @@ void CFsEmailUiHtmlViewerView::RequestResponseL( TFSProgress aEvent, TInt aRequestId ) { FUNC_LOG; - + TBool reloadContent ( EFalse ); - + if ( aRequestId == iCurrentPlainTextBodyFetchRequestId && iFetchingPlainTextMessageBody ) { if ( aEvent.iError != KErrNone || @@ -2230,7 +2145,7 @@ UpdateMessagePtrL( mailboxId, folderId, messageId ); reloadContent = ETrue; } - + } } @@ -2245,10 +2160,10 @@ else if ( aEvent.iProgressStatus == TFSProgress::EFSStatus_RequestComplete ) { iAsyncProcessComplete = ETrue; - iFetchingHtmlMessageBody = EFalse; - + iFetchingHtmlMessageBody = EFalse; + reloadContent = ETrue; - + } } else if ( aRequestId == iCurrentStructureFetchRequestId && iFetchingMessageStructure ) @@ -2281,19 +2196,19 @@ } if ( reloadContent ) { - + if ( iContainer ) { - iContainer->ResetContent(); + iContainer->ResetContent(); if( iMessage ) { - LoadContentFromMailMessageL( iMessage , EFalse); + LoadContentFromMailMessageL( iMessage , EFalse); SetMskL(); } } } - - + + if(iAsyncProcessComplete && iWaitDialog && iDialogNotDismissed) { iWaitDialog->ProcessFinishedL(); // deletes the dialog @@ -2361,8 +2276,6 @@ iAppUi.DownloadInfoMediator()->AddObserver( this, iMessage->GetMessageId() ); } } - - UpdateToolbarL(); } // ----------------------------------------------------------------------------- @@ -2387,13 +2300,13 @@ iFetchingMessageStructure = EFalse; } iAsyncProcessComplete = ETrue; - + //also cancel embedded images download in DownloadInfoMediator if ( iMailBox ) { - TRAP_IGNORE( iAppUi.DownloadInfoMediator()->CancelAllDownloadsL( iMailBox->GetId() ) ); + TRAP_IGNORE( iAppUi.DownloadInfoMediator()->CancelAllDownloadsL( iMailBox->GetId() ) ); } - + // if(iWaitDialog && iDialogNotDismissed) @@ -2452,7 +2365,7 @@ iWaitDialog->SetCallback(this); iDialogNotDismissed = ETrue; iWaitDialog->ExecuteLD(R_FSE_FETCHING_WAIT_DIALOG); - */ + */ if( iMessage ) { StartFetchingMessagePartL( *iMessage, iStartAsyncFetchType ); @@ -2584,7 +2497,7 @@ return ret; } - + void CFsEmailUiHtmlViewerView::ProcessAsyncCommandL( TESMRIcalViewerOperationType aCommandId, const CFSMailMessage& aMessage, MESMRIcalViewerObserver* aObserver ) @@ -2718,7 +2631,7 @@ } break; case EESMRCmdMailComposeMessage: - { + { iAppUi.CreateNewMailL(); iOpResult.iResultCode = KErrNone; } @@ -2854,16 +2767,16 @@ if ( aResult.iOpType == EESMRViewLaunch ) { iMrUiActive = EFalse; - + // load mr content to viewer so we don't end up with empty view if ( iContainer ) { iContainer->ResetContent(); } - + if( iMessage ) { - TRAP_IGNORE( LoadContentFromMailMessageL( iMessage ) ); + TRAP_IGNORE( LoadContentFromMailMessageL( iMessage ) ); TRAP_IGNORE( SetMskL() ); } } @@ -2900,7 +2813,7 @@ iMrUiActive = EFalse; iMrObserverToInform = NULL; } - + // ----------------------------------------------------------------------------- // CFsEmailUiHtmlViewerView::ClearMailViewer // ----------------------------------------------------------------------------- @@ -2958,12 +2871,12 @@ iEmbeddedMessages = NULL; iMessage = NULL; CancelFetchings(); - + delete iMailBox; iMailBox = NULL; } -void CFsEmailUiHtmlViewerView::ReloadPageL( ) +void CFsEmailUiHtmlViewerView::ReloadPageL( ) { FUNC_LOG; if( iContainer ) @@ -2976,7 +2889,7 @@ { return ( iFetchingHtmlMessageBody || iFetchingMessageStructure || iFetchingPlainTextMessageBody ); } - + // --------------------------------------------------------------------------- // CFsEmailUiHtmlViewerView::UpdateEmailHeaderIndicatorsL // --------------------------------------------------------------------------- @@ -2999,20 +2912,20 @@ { FUNC_LOG; TBool retVal( EFalse ); - CFSMailMessage* msg = iAppUi.GetMailClient()->GetMessageByUidL( + CFSMailMessage* msg = iAppUi.GetMailClient()->GetMessageByUidL( iActivationData.iMailBoxId, iActivationData.iFolderId, iActivationData.iMessageId, EFSMsgDataEnvelope ); - + if ( msg ) { CleanupStack::PushL( msg ); - if ( msg->IsFlagSet( EFSMsgFlag_CalendarMsg ) && + if ( msg->IsFlagSet( EFSMsgFlag_CalendarMsg ) && iAppUi.MrViewerInstanceL() ) { TESMRMeetingRequestMethod mrMethod( EESMRMeetingRequestMethodUnknown ); mrMethod = iAppUi.MrViewerInstanceL()->ResolveMeetingRequestMethodL( *msg ); // Opened in MR viewer if request/cancellation or unknown MR - retVal = + retVal = mrMethod == EESMRMeetingRequestMethodRequest || mrMethod == EESMRMeetingRequestMethodCancellation || mrMethod == EESMRMeetingRequestMethodUnknown; @@ -3028,8 +2941,8 @@ void CFsEmailUiHtmlViewerView::CopyCurrentToClipBoardL( const TDesC& aArgument ) const { FUNC_LOG; - - // Making sure that we are copying something to the clipboard + + // Making sure that we are copying something to the clipboard if ( aArgument.Length() > 0 ) { HBufC* clipBoardText = aArgument.AllocLC(); @@ -3042,7 +2955,7 @@ CleanupStack::PopAndDestroy( plainText ); cb->CommitL(); CleanupStack::PopAndDestroy( cb ); - CleanupStack::PopAndDestroy( clipBoardText ); + CleanupStack::PopAndDestroy( clipBoardText ); } } @@ -3052,21 +2965,21 @@ void CFsEmailUiHtmlViewerView::OpenLinkInBrowserL( const TDesC& aUrl ) const { FUNC_LOG; - + // Create session RApaLsSession session; User::LeaveIfError( session.Connect() ); CleanupClosePushL( session ); - + // Gets the default application UID for for the given MIME type TUid uid; TDataType dataType( _L8( "text/html" ) ); session.AppForDataType( dataType, uid ); - + // Runs the default application using the dataType TThreadId threadId; User::LeaveIfError( session.StartDocument( aUrl , dataType, threadId ) ); - + CleanupStack::PopAndDestroy(); // session } @@ -3077,7 +2990,7 @@ { FUNC_LOG; HBufC* url = aUrl.AllocLC(); - + RFavouritesSession fSession; User::LeaveIfError( fSession.Connect() ); CleanupClosePushL( fSession ); @@ -3108,7 +3021,7 @@ CleanupStack::PopAndDestroy( &fSession ); CleanupStack::PopAndDestroy( url ); - + if ( error == KErrNone ) { TFsEmailUiUtility::ShowInfoNoteL( @@ -3122,8 +3035,8 @@ } /* - * Delaying the fetch for MfE till the user scrolls to the bottom of - * the message. + * Delaying the fetch for MfE till the user scrolls to the bottom of + * the message. */ void CFsEmailUiHtmlViewerView::StartFetchingMessageL() { @@ -3139,13 +3052,13 @@ { type = EMessagePlainTextBodyPart; } - - + + if ( !MessagePartFullyFetchedL( type )) { iAsyncProcessComplete = EFalse; iStartAsyncFetchType = type; - //check to make sure we don't kick off fetch twice for the cases where bodypart + //check to make sure we don't kick off fetch twice for the cases where bodypart //not found(OZ) if(iMessage && !GetAsyncFetchStatus()) { @@ -3164,12 +3077,12 @@ { bodyPart = iMessage->PlainTextBodyPartL(); } - + if ( bodyPart ) { aMessageBodyStructurePresent = ETrue; CleanupStack::PushL( bodyPart ); - + if ( bodyPart->FetchedContentSize() == 0 && bodyPart->ContentSize() != 0 ) { aMessageBodyContentPresent = EFalse; @@ -3178,7 +3091,7 @@ { aMessageBodyContentPresent = ETrue; } - + CleanupStack::PopAndDestroy( bodyPart ); } else @@ -3277,7 +3190,7 @@ return err; } -CFlagSelectionNoteHandler::CFlagSelectionNoteHandler( CFsEmailUiHtmlViewerView& aViewerVisualiser ) +CFlagSelectionNoteHandler::CFlagSelectionNoteHandler( CFsEmailUiHtmlViewerView& aViewerVisualiser ) : CActive ( EPriorityHigh ), iViewerView( aViewerVisualiser ) { diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -1232,8 +1232,12 @@ } } - // if iNewMailIds is not empty - start timer - if ( !iNewMailTimer->IsActive() && iNewMailIds.Count() ) + // start timer only when all conditions are met: + // timer isn`t already active + // there are new mails in the array + // timer event isn`t processing + if ( !iNewMailTimer->IsActive() && iNewMailIds.Count() && + iNewMailTimer->iStatus != KErrInUse ) { iNewMailTimer->Start( KNewMailTimerDelay ); } @@ -1251,6 +1255,12 @@ TInt count = Min( KNewMailMaxBatch, iNewMailIds.Count() ); CFSMailClient* mailClient = iAppUi.GetMailClient(); + // Enter critical section + // Because CFSMailClient::GetMessageByUidL can use CActiveSchedulerWait + // to ensure that only one TimerEventL method is processed at time + // CFSEmailUiGenericTimer`s iStatus will be used as mutex + iNewMailTimer->iStatus = KErrInUse; + for ( TInt i = 0; i < count; i++ ) { CFSMailMessage* msgPtr = mailClient->GetMessageByUidL( iAppUi.GetActiveMailboxId(), @@ -1270,6 +1280,9 @@ iNewMailIds.Remove( 0 ); } + // End critical section + iNewMailTimer->iStatus = KErrNone; + // if timer stoped then restart if more messages available if ( iNewMailIds.Count() && ! iNewMailTimer->IsActive() ) { diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleEmailUiViewBase.cpp --- a/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiViewBase.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -68,9 +68,11 @@ const TDesC8& aCustomMessage ) { FUNC_LOG; + SetViewActive( ETrue ); + StatusPane()->MakeVisible( IsStatusPaneVisible() ); SetStatusBarLayout(); - iAppUi.StatusPane()->DrawNow(); + StatusPane()->DrawNow(); iFocusVisible = iAppUi.IsFocusShown(); // fix view stack in case of external activation @@ -102,7 +104,7 @@ SetNextTransitionOutLong( EFalse ); // Clear status pane indicators - CCustomStatuspaneIndicators* indicators = + CCustomStatuspaneIndicators* indicators = iAppUi.GetStatusPaneIndicatorContainer(); if ( indicators ) { @@ -114,7 +116,7 @@ // Make sure Alfred display is of correct size (there is some problems with toolbar) iAppUi.AlfEnv().PrimaryDisplay().ForceSetVisibleArea(iAppUi.ClientRect()); - + // Finally call child classes activation method TRAPD( error, ChildDoActivateL(aPrevViewId, aCustomMessageId, aCustomMessage) ); @@ -128,7 +130,7 @@ } // View activated succesfully - DoTransition( EFalse ); + DoTransition( EFalse ); if ( !iAppUi.SwitchingToBackground() ) { // Change visible control group @@ -173,6 +175,10 @@ } CleanupStack::PopAndDestroy(); // dimmedItems.Close() toolbar->SetToolbarObserver(this); + if(resourceId == R_FREESTYLE_EMAIL_UI_TOOLBAR_FOLDER_LIST) + { + toolbar->SetToolbarVisibility(EFalse); + } SetToolbar(toolbar); ShowToolbar(); } @@ -282,14 +288,14 @@ void CFsEmailUiViewBase::FadeOut( TBool /* aDirectionOut */ ) { FUNC_LOG; - // should be overriden ( if needed ) to use polymorphism + // should be overriden ( if needed ) to use polymorphism // to hide or show CAlfVisuals used in views } // --------------------------------------------------------------------------- // Check if transition effects are enabled and run the effect if needed. -// if not enabled it calls FadeOut virtual methods only +// if not enabled it calls FadeOut virtual methods only // void CFsEmailUiViewBase::DoTransition( TBool aDirectionOut ) { @@ -300,7 +306,7 @@ } else { - // FadeOut method should be overridden and use by polymorphism only when needed + // FadeOut method should be overridden and use by polymorphism only when needed FadeOut( aDirectionOut ); // used for hide/show visuals without transition time } } @@ -480,7 +486,7 @@ void CFsEmailUiViewBase::HandleAppForegroundEventL( TBool aForeground ) { FUNC_LOG; - HandleForegroundEventL(aForeground); + HandleForegroundEventL(aForeground); if ( aForeground ) { // Activate control group in case the view was activated when @@ -629,7 +635,7 @@ // Email app should be hidden once the view gets deactivated. Note that hiding // should not happen before control group switching is over because that // may cause views of other Alfred apps to get distorted. - if( !iAppUi.EmbeddedAppIsPreviousApp() ) // if previous app is embedded app, + if( !iAppUi.EmbeddedAppIsPreviousApp() ) // if previous app is embedded app, //do not need hide FSEmail app when previous app view gets deactivated. { iSendToBackgroundOnDeactivation = ETrue; @@ -673,6 +679,14 @@ } // ----------------------------------------------------------------------------- +// CFsEmailUiViewBase::IsStatusPaneVisible +// ----------------------------------------------------------------------------- +TBool CFsEmailUiViewBase::IsStatusPaneVisible() const + { + return ETrue; + } + +// ----------------------------------------------------------------------------- // CFsEmailUiViewBase::HasToolbar // Method to check whether the view has toolbar defined or not. // ----------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp --- a/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -31,70 +31,34 @@ #include "FreestyleEmailUiUtilities.h" #include "ncsconstants.h" - - -_LIT8( KExpandHeaderIconFileName, "plus.gif"); -_LIT8( KCollapseHeaderIconFileName, "minus.gif"); -_LIT8( KAttachementIconGeneral, "attachment.gif"); -_LIT8( KFollowUpIconFileName, "follow_up.png"); -_LIT8( KFollowUpCompleteIconFileName, "follow_up_complete.png"); -_LIT8( KPriorityHighIconFileName, "todo_high_add.png"); -_LIT8( KPriorityLowIconFileName, "todo_low_add.png"); +_LIT( KAlignRight, "right" ); +_LIT( KAlignLeft, "left" ); +_LIT( KRtl, "rtl" ); +_LIT( KLtr, "ltr" ); -_LIT8( KCollapsedHeaderTableName, "collapsed_header" ); -_LIT8( KExpandedHeaderTableName, "expanded_header" ); -_LIT8( KToTableName, "to_table"); -_LIT8( KCcTableName, "cc_table"); -_LIT8( KBccTableName, "bcc_table"); -_LIT8( KAttachmentTableName, "attachment_table"); -_LIT8( KFromTableName,"from_table"); - -_LIT8( KFromFieldName, "from_field"); -_LIT8( KToFieldName, "to_field"); -_LIT8( KCcFieldName, "cc_field"); -_LIT8( KBccFieldName, "bcc_field"); -_LIT8( KSentFieldName, "sent_field"); -_LIT8( KSubjectFieldName, "subject_field"); +const TInt KMaxRecipientsShown( 10 ); +const TInt KFreestyleMessageHeaderHTMLRightMarginInPx( 10 ); -_LIT8( KToImageName, "to_img"); -_LIT8( KCcImageName, "cc_img"); -_LIT8( KBccImageName, "bcc_img"); -_LIT8( KAttachmentImageName, "attachment_img"); -_LIT8( KFollowUpImageName, "follow_up_img"); -_LIT8( KFollowUpCompleteImageName, "follow_up_complete_img"); -_LIT8( KPriorityHighImageName, "todo_high_add_img"); -_LIT8( KPriorityLowImageName, "todo_low_add_img"); - -_LIT8( KSpace8, " "); +_LIT8( KTableRowBegin, "" ); +_LIT8( KTableRowEnd, "\n" ); +_LIT8( KTableCellEnd, "" ); -_LIT8( KHTMLImgTagId, "" ); - -_LIT8( KMetaHeader, "\n" ); - -_LIT8( KDisplayImagesLeftToRight, - "\n
%S
" ); - -_LIT8( KDisplayImagesRightToLeft, - "\n
%S
" ); -_LIT8 ( KProtocolIdentifier, "://" ); -const TInt KMaxEventLength( 256 ); -const TInt KFreestyleMessageHeaderHTMLRightMarginInPx( 10 ); -const TInt KFreestyleMessageHeaderHTMLMaxBufferSizeForWidth( 5 ); +_LIT( KSchemeSeparator, "://" ); +_LIT( KUrlFormat, "%S" ); +_LIT( KUrlFormatWithHttp, "%S" ); // Define this to allow theme colorin for the header -#undef __USE_THEME_COLOR_FOR_HEADER +#define __USE_THEME_COLOR_FOR_HEADER EXPORT_C CFreestyleMessageHeaderHTML* CFreestyleMessageHeaderHTML::NewL( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded + const TBitFlags& aFlags ) { - CFreestyleMessageHeaderHTML* self = new (ELeave) CFreestyleMessageHeaderHTML( aMailMessage, aWriteStream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aExpanded); + CFreestyleMessageHeaderHTML* self = new (ELeave) CFreestyleMessageHeaderHTML( aMailMessage, aWriteStream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aFlags); self->ConstructL(); return self; } @@ -104,9 +68,9 @@ TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ) + const TBitFlags& aFlags ) { - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, aWriteStream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aExpanded); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, aWriteStream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aFlags); CleanupStack::PushL( headerHtml ); headerHtml->ExportL(); CleanupStack::PopAndDestroy( headerHtml ); @@ -117,13 +81,13 @@ TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ) + const TBitFlags& aFlags ) { RFileWriteStream fwstream; fwstream.Attach( aFile, 0 ); CleanupClosePushL( fwstream ); - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, fwstream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aExpanded ); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, fwstream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aFlags ); CleanupStack::PushL( headerHtml ); headerHtml->ExportL(); CleanupStack::PopAndDestroy( headerHtml ); @@ -137,13 +101,13 @@ TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ) + const TBitFlags& aFlags ) { RFileWriteStream fwstream; User::LeaveIfError( fwstream.Replace( aFs, aFilePath, EFileStreamText | EFileWrite) ); CleanupClosePushL( fwstream ); - CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, fwstream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aExpanded); + CFreestyleMessageHeaderHTML* headerHtml = CFreestyleMessageHeaderHTML::NewL( aMailMessage, fwstream, aVisibleWidth, aScrollPosition, aAutoLoadImages, aFlags); CleanupStack::PushL( headerHtml ); headerHtml->ExportL(); CleanupStack::PopAndDestroy( headerHtml ); @@ -156,28 +120,20 @@ iAttachments.ResetAndDestroy(); } -EXPORT_C void CFreestyleMessageHeaderHTML::ExportL() const - { - HTMLStartL(); - ExportHTMLHeaderL(); - ExportHTMLBodyL(); - HTMLEndL(); - } - CFreestyleMessageHeaderHTML::CFreestyleMessageHeaderHTML( CFSMailMessage& aMailMessage, RWriteStream& aWriteStream, TInt aVisibleWidth, TInt aScrollPosition, const TBool aAutoLoadImages, - const TBool aExpanded ) + const TBitFlags& aFlags ) : iMailMessage( aMailMessage ), iWriteStream( aWriteStream ), iVisibleWidth( aVisibleWidth - KFreestyleMessageHeaderHTMLRightMarginInPx ), iScrollPosition( aScrollPosition ), - iAutoLoadImages( aAutoLoadImages ), - iMirrorLayout( AknLayoutUtils::LayoutMirrored() ), - iExpanded( aExpanded ) + iExportFlags( aFlags ) { + iExportFlags.Assign( EAutoLoadImages, aAutoLoadImages ); + iExportFlags.Assign( EMirroredLayout, AknLayoutUtils::LayoutMirrored() ); } void CFreestyleMessageHeaderHTML::ConstructL() @@ -185,1008 +141,614 @@ iMailMessage.AttachmentListL( iAttachments ); } -void CFreestyleMessageHeaderHTML::HTMLStartL() const +EXPORT_C void CFreestyleMessageHeaderHTML::ExportL() const { - iWriteStream.WriteL(_L8("\n")); - iWriteStream.CommitL(); + ExportBodyStyleL(); + ExportHTMLBodyStartL(); + ExportHeaderTablesL(); + ExportHTMLBodyEndL(); } -void CFreestyleMessageHeaderHTML::HTMLEndL() const +void CFreestyleMessageHeaderHTML::ExportHTMLBodyStartL() const { - iWriteStream.WriteL(_L8("\n")); + _LIT( KHtmlBodyStart, "\n\n\nEmail Header\n\n\n\n\n" ); + //_LIT( KHtmlBodyStart, "\n\n\nEmail Header\n\n\n\n\n" ); + const TPtrC direction( iExportFlags.IsSet( EMirroredLayout ) ? KRtl() : KLtr() ); + HBufC* formatBuffer = HBufC::NewLC( KHtmlBodyStart().Length() + direction.Length() + 16 ); + formatBuffer->Des().Format( KHtmlBodyStart(), &direction, iScrollPosition ); + //formatBuffer->Des().Format( KHtmlBodyStart(), &direction, Math::Random() % 2, iScrollPosition ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf iWriteStream.CommitL(); } -void CFreestyleMessageHeaderHTML::ExportHTMLHeaderL() const +void CFreestyleMessageHeaderHTML::ExportInnerTableBeginWithRowBeginL( const TDesC& aTableName, const TInt aColSpan, + const TBool aVisible, const TBitFlags& aFlags ) const + { + iWriteStream.WriteL( KTableRowBegin() ); + ExportTableVisibilityParameterL( aTableName, aVisible ); + ExportInnerTableBeginL( aTableName, aColSpan, aFlags ); + } + + +void CFreestyleMessageHeaderHTML::ExportInnerTableBeginL( const TDesC& aTableName, const TInt aColSpan, + const TBitFlags& aFlags ) const + { + _LIT( KHidden, " style=\"display: none;\""); + _LIT( KFixed, " class=\"fixed\""); + _LIT( KTableHeader, "\n" ); + const TPtrC style( aFlags.IsClear( EHidden ) ? KNullDesC() : KHidden() ); + const TPtrC fixed( aFlags.IsClear( EFixed ) ? KNullDesC() : KFixed() ); + HBufC* formatBuffer = HBufC::NewLC( KTableHeader().Length() + aTableName.Length() + 16 + style.Length() + fixed.Length() ); + formatBuffer->Des().Format( KTableHeader(), aColSpan, &aTableName, &style, &fixed ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportTableVisibilityParameterL( const TDesC& aTableName, const TBitFlags& aFlags ) const + { + ExportTableVisibilityParameterL( aTableName, aFlags.IsClear( EHidden ) ); + } + +void CFreestyleMessageHeaderHTML::ExportTableVisibilityParameterL( const TDesC& aTableName, const TBool aVisible ) const + { + _LIT( KTrue, "true" ); + _LIT( KFalse, "false" ); + _LIT( KVisibilityParameter, "" ); + const TPtrC visible( aVisible ? KTrue() : KFalse() ); + HBufC* formatBuffer = HBufC::NewLC( KVisibilityParameter().Length() + aTableName.Length() + visible.Length() ); + formatBuffer->Des().Format( KVisibilityParameter(), &aTableName, &visible ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportTableBeginL( const TDesC& aTableName, const TBitFlags& aFlags ) const + { + _LIT( KFixed, " class=\"fixed\""); + _LIT( KTableHeader, "
\n" ); + const TPtrC style( aFlags.IsClear( EHidden ) ? KNullDesC() : KNullDesC() ); + const TPtrC fixed( aFlags.IsClear( EFixed ) ? KNullDesC() : KFixed() ); + ExportTableVisibilityParameterL( aTableName, aFlags ); + HBufC* formatBuffer = HBufC::NewLC( KTableHeader().Length() + aTableName.Length() + 16 + style.Length() + fixed.Length() ); + formatBuffer->Des().Format( KTableHeader(), &aTableName, iVisibleWidth, &style, &fixed ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportInnerTableEndL() const + { + ExportTableEndL(); + iWriteStream.WriteL( KTableCellEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportInnerTableEndWithRowEndL() const + { + ExportInnerTableEndL(); + iWriteStream.WriteL( KTableRowEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportTableEndL() const { - HTMLHeaderStartL(); - HTMLMetaL(); - iWriteStream.WriteL( _L8("Email Header\n") ); - AddJavascriptL(); - AddStyleSheetL(); - HTMLHeaderEndL(); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( _L("
\n") ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy(); // utf + } + +void CFreestyleMessageHeaderHTML::ExportSenderTableRowL( const TBool aCollapsed ) const + { + _LIT( KStyleExpand, "expand" ); + _LIT( KStyleCollapse, "collapse" ); + _LIT( KExpandFunction, "expandHeader(true)" ); + _LIT( KCollapseFunction, "collapseHeader(true)" ); + _LIT( KSenderFormat, "
%S
\n" ); + const CFSMailAddress* sender( iMailMessage.GetSender() ); + TPtrC displayName( sender->GetDisplayName() ); + if ( !displayName.Length() ) + { + displayName.Set( sender->GetEmailAddress() ); + } + const TPtrC function( aCollapsed ? KExpandFunction() : KCollapseFunction() ); + const TPtrC style( aCollapsed ? KStyleExpand() : KStyleCollapse() ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KSenderFormat().Length() + displayName.Length() + align.Length() + function.Length() + style.Length() ); + formatBuffer->Des().Format( KSenderFormat(), &align, &displayName, &function, &style ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportSenderAddressTableRowL() const + { + _LIT( KSenderAddressFormat, "\n" ); + const CFSMailAddress* sender( iMailMessage.GetSender() ); + const TPtrC emailAddress( sender->GetEmailAddress() ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KSenderAddressFormat().Length() + emailAddress.Length() * 2 + align.Length() ); + formatBuffer->Des().Format( KSenderAddressFormat(), &align, &emailAddress, &emailAddress ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportLabelTableRowL( const TInt aResourceId, const TInt aColSpan ) const + { + _LIT( KLabelFormat, "%S\n" ); + HBufC* labelText = StringLoader::LoadLC( aResourceId ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KLabelFormat().Length() + labelText->Length() + align.Length() + 8 ); + formatBuffer->Des().Format( KLabelFormat(), &align, aColSpan, labelText ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 3 ); // labelText, formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportFromTableRowL() const + { + ExportLabelTableRowL( R_FREESTYLE_EMAIL_UI_VIEWER_FROM ); + ExportSenderAddressTableRowL(); + } + +void CFreestyleMessageHeaderHTML::ExportExpandRecipientsL( const TDesC& aType, const TInt aCount ) const + { + _LIT( KExpandRecipientsFormat, "%S\n" ); + HBufC* text = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_N_MORE_RECIPIENTS, aCount ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KExpandRecipientsFormat().Length() + text->Length() + align.Length() + aType.Length() * 3 ); + formatBuffer->Des().Format( KExpandRecipientsFormat(), &align, &aType, &aType, &aType, text ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 3 ); // text, formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportExpandAttachmentsL( const TDesC& aType, const TInt aCount ) const + { + _LIT( KExpandRecipientsFormat, "%S" ); + HBufC* text = StringLoader::LoadLC( R_FSE_VIEWER_ATTACHMENTS_TEXT, aCount ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KExpandRecipientsFormat().Length() + text->Length() + align.Length() + aType.Length() * 3 ); + formatBuffer->Des().Format( KExpandRecipientsFormat(), &align, &aType, &aType, &aType, text ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 3 ); // text, formatBuffer, utf } -void CFreestyleMessageHeaderHTML::HTMLHeaderStartL() const +void CFreestyleMessageHeaderHTML::ExportRecipientsTableL( const TDesC& aType, const TInt aLabelResourceId, + const RPointerArray& aRecipients, const TBool aExpanded ) const + { + if ( aRecipients.Count() > 0 ) + { + TBool innerTableExpanded( aExpanded ); + TBitFlags flags; + flags.Assign( EHidden, iExportFlags.IsClear( EHeaderExpanded ) ); + _LIT( KTableNameFormat, "%S_table" ); + HBufC* outerTableName = HBufC::NewLC( KTableNameFormat().Length() + aType.Length() ); + outerTableName->Des().Format( KTableNameFormat(), &aType ); + ExportTableBeginL( *outerTableName, flags ); + CleanupStack::PopAndDestroy(); // outerTableName + + ExportLabelTableRowL( aLabelResourceId, 2 ); + const TBool showCollapsed( aRecipients.Count() > KMaxRecipientsShown ); + TBitFlags tableFlags; + tableFlags.Set( EFixed ); + if ( showCollapsed ) + { + _LIT( KFormatCollapsed, "%S_collapsed" ); + HBufC* tableName = HBufC::NewLC( KFormatCollapsed().Length() + 8 ); + tableName->Des().Format( KFormatCollapsed(), &aType ); + ExportInnerTableBeginWithRowBeginL( *tableName, 2, !innerTableExpanded, tableFlags ); + CleanupStack::PopAndDestroy(); // tableName + ExportExpandRecipientsL( aType, aRecipients.Count() ); + ExportInnerTableEndWithRowEndL(); + tableFlags.Set( EHidden ); + } + else + { + innerTableExpanded = ETrue; + } + _LIT( KFormatExpanded, "%S_expanded" ); + HBufC* tableName = HBufC::NewLC( KFormatExpanded().Length() + 8 ); + tableName->Des().Format( KFormatExpanded(), &aType ); + ExportInnerTableBeginWithRowBeginL( *tableName, 2, innerTableExpanded, tableFlags ); + CleanupStack::PopAndDestroy(); // tableName + ExportRecipientsL( aType, aRecipients ); + ExportInnerTableEndWithRowEndL(); + ExportTableEndL(); + } + } + +void CFreestyleMessageHeaderHTML::ExportRecipientsL( const TDesC& aType, + const RPointerArray& aRecipients) const + { + _LIT( KRecipientFormat, "" ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + for ( TInt i = 0; i < aRecipients.Count(); i++ ) + { + const CFSMailAddress* sender( aRecipients[ i ] ); + TPtrC displayName( sender->GetDisplayName() ); + const TPtrC emailAddress( sender->GetEmailAddress() ); + if ( !displayName.Length() ) + { + displayName.Set( emailAddress ); + } + HBufC* formatBuffer = HBufC::NewLC( KRecipientFormat().Length() + align.Length() + aType.Length() + emailAddress.Length() + displayName.Length() ); + formatBuffer->Des().Format( KRecipientFormat(), &align, &aType, &emailAddress, &displayName ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + } + +void CFreestyleMessageHeaderHTML::ExportToTableL() const + { + ExportRecipientsTableL( _L("to"), R_FREESTYLE_EMAIL_UI_VIEWER_TO, iMailMessage.GetToRecipients(), iExportFlags.IsSet( EToExpanded ) ); + } + +void CFreestyleMessageHeaderHTML::ExportCcTableL() const + { + ExportRecipientsTableL( _L("cc"), R_FREESTYLE_EMAIL_UI_VIEWER_CC, iMailMessage.GetCCRecipients(), iExportFlags.IsSet( ECcExpanded ) ); + } + +void CFreestyleMessageHeaderHTML::ExportBccTableL() const + { + ExportRecipientsTableL( _L("bcc"), R_FREESTYLE_EMAIL_UI_VIEWER_BCC, iMailMessage.GetBCCRecipients(), iExportFlags.IsSet( EBccExpanded ) ); + } + +void CFreestyleMessageHeaderHTML::ExportDateTimeTableRowL( const TInt aColSpan ) const { - iWriteStream.WriteL(_L8("")); + _LIT( KDateTimeFormat, "%S%S%S\n" ); + HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &iMailMessage ); + HBufC* timeText = TFsEmailUiUtility::TimeTextFromMsgLC( &iMailMessage ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* formatBuffer = HBufC::NewLC( KDateTimeFormat().Length() + dateText->Length() + timeText->Length() + KSentLineDateAndTimeSeparatorText().Length() + align.Length() + 3 ); + formatBuffer->Des().Format( KDateTimeFormat(), aColSpan, &align, dateText, &KSentLineDateAndTimeSeparatorText(), timeText ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 4 ); // dateText, timeText, formatBuffer, utf + } + +void CFreestyleMessageHeaderHTML::ExportSubjectTableRowL( const TBool aShowLabel ) const + { + _LIT( KClassSubject, "subject" ); + TPtrC subjectClass( KClassSubject() ); + if ( aShowLabel ) + { + _LIT( KClassSubjectIntended, "subject_intended"); + ExportLabelTableRowL( R_FREESTYLE_EMAIL_UI_VIEWER_SUBJECT, 2 ); + subjectClass.Set( KClassSubjectIntended() ); + } + _LIT( KSubjectFormat, "%S"); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* subject = SubjectLC(); + HBufC* formatBuffer = HBufC::NewLC( KSubjectFormat().Length() + align.Length() + subject->Length() + subjectClass.Length() ); + formatBuffer->Des().Format( KSubjectFormat(), &align, &subjectClass, subject ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 3 ); // subject, formatBuffer, utf + ExportMessageIconsL(); + iWriteStream.WriteL( KTableCellEnd() ); + iWriteStream.WriteL( KTableRowEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportMessageIconsL() const + { + _LIT( KPriorityLow, "priority_low" ); + _LIT( KPriorityHigh, "priority_high" ); + _LIT( KFollowUp, "follow_up" ); + _LIT( KFollowUpComplete, "follow_up_complete" ); + + TBool iconShown( EFalse ); + + if ( iMailMessage.IsFlagSet( EFSMsgFlag_Low ) ) + { + ExportIconL( KPriorityLow() ); + iconShown = ETrue; + } + else if ( iMailMessage.IsFlagSet( EFSMsgFlag_Important ) ) + { + ExportIconL( KPriorityHigh() ); + iconShown = ETrue; + } + + if ( iMailMessage.IsFlagSet( EFSMsgFlag_FollowUp ) ) + { + ExportIconL( KFollowUp() ); + iconShown = ETrue; + } + else if ( iMailMessage.IsFlagSet( EFSMsgFlag_FollowUpComplete ) ) + { + ExportIconL( KFollowUpComplete() ); + iconShown = ETrue; + } + if ( iconShown ) + { + iWriteStream.WriteL( _L8("
") ); + } + } + +void CFreestyleMessageHeaderHTML::ExportHeaderTablesL() const + { + ExportCollapsedHeaderTableL(); + ExportExpandedHeaderTablesL(); + ExportAttachmentTablesL(); + ExportDisplayImagesTableL(); + } + +void CFreestyleMessageHeaderHTML::ExportCollapsedHeaderTableL() const + { + TBitFlags flags; + flags.Set( EFixed ); + flags.Assign( EHidden, iExportFlags.IsSet( EHeaderExpanded ) ); + ExportTableBeginL( _L("header_collapsed"), flags ); + ExportSenderTableRowL( ETrue ); + ExportDateTimeTableRowL(); + ExportTableEndL(); + flags.Clear( EFixed ); + ExportTableBeginL( _L("header_collapsed_2"), flags ); + ExportSubjectTableRowL(); + ExportTableEndL(); iWriteStream.CommitL(); } -void CFreestyleMessageHeaderHTML::HTMLMetaL() const +void CFreestyleMessageHeaderHTML::ExportExpandedHeaderTablesL() const { - // Html file representing email header fields, is always constructed locally - // in the phone, and it is always of charset UTF-8 irrespective of what - // the email html-format body is - iWriteStream.WriteL( KMetaHeader ); + TBitFlags flags; + flags.Set( EFixed ); + flags.Assign( EHidden, iExportFlags.IsClear( EHeaderExpanded ) ); + ExportTableBeginL( _L("header_expanded"), flags ); + ExportSenderTableRowL( EFalse ); + ExportFromTableRowL(); + ExportTableEndL(); + ExportToTableL(); + ExportCcTableL(); + ExportBccTableL(); + flags.Clear( EFixed ); + ExportTableBeginL( _L("header_expanded_2"), flags ); + ExportDateTimeTableRowL( 2 ); + ExportSubjectTableRowL(); + ExportTableEndL(); iWriteStream.CommitL(); } -void CFreestyleMessageHeaderHTML::HTMLHeaderEndL() const +void CFreestyleMessageHeaderHTML::ExportAttachmentTablesL() const + { + const TInt attachmentCount( iAttachments.Count() ); + if ( attachmentCount ) + { + if ( attachmentCount > 1 ) + { + ExportCollapsedAttachmentTableL( iExportFlags.IsSet( EAttachmentExpanded ) ); + ExportExpandedAttachmentTableL( iExportFlags.IsClear( EAttachmentExpanded ) ); + } + else + { + ExportExpandedAttachmentTableL( EFalse ); + } + } + } + +void CFreestyleMessageHeaderHTML::ExportAttachmentIconL() const + { + _LIT8( KCellBegin, "" ); + iWriteStream.WriteL( KCellBegin() ); + _LIT( KAttachment, "attachment" ); + ExportIconL( KAttachment() ); + iWriteStream.WriteL( KTableCellEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportCollapsedAttachmentTableL( const TBool aHide ) const + { + TBitFlags flags; + flags.Assign( EHidden, aHide ); + ExportTableBeginL( _L("attachments_collapsed"), flags ); + ExportCollapsedAttachmentsTableRowL(); + ExportTableEndL(); + } + +void CFreestyleMessageHeaderHTML::ExportCollapsedAttachmentsTableRowL() const { - iWriteStream.WriteL(_L8("\n")); - iWriteStream.CommitL(); + iWriteStream.WriteL( KTableRowBegin() ); + ExportAttachmentIconL(); + ExportExpandAttachmentsL( _L("attachments"), iAttachments.Count() ); + iWriteStream.WriteL( KTableRowEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportExpandedAttachmentTableL( const TBool aHide ) const + { + TBitFlags flags; + flags.Assign( EHidden, aHide ); + ExportTableBeginL( _L("attachments_expanded"), flags ); + ExportExpandedAttachmentsTableRowsL(); + ExportTableEndL(); + } + +void CFreestyleMessageHeaderHTML::ExportExpandedAttachmentsTableRowsL() const + { + iWriteStream.WriteL( KTableRowBegin() ); + ExportAttachmentIconL(); + ExportAttachmentsL(); + iWriteStream.WriteL( KTableRowEnd() ); + } + +void CFreestyleMessageHeaderHTML::ExportAttachmentsL() const + { + ExportInnerTableBeginL( _L("_attachments_expanded"), 1 ); + for ( TInt i = 0; i < iAttachments.Count(); i++ ) + { + ExportAttachmentL( *iAttachments[ i ] ); + } + ExportInnerTableEndL(); + } + +void CFreestyleMessageHeaderHTML::ExportAttachmentL( CFSMailMessagePart& aAttachment ) const + { + _LIT( KAttachmentFormat, "%S (%S)\n" ); + const TPtrC align( iExportFlags.IsSet( EMirroredLayout ) ? KAlignRight() : KAlignLeft() ); + HBufC* size = TFsEmailUiUtility::CreateSizeDescLC( aAttachment.ContentSize(), EFalse ); + const TPtrC attachmentName( aAttachment.AttachmentNameL() ); + HBufC* formatBuffer = HBufC::NewLC( KAttachmentFormat().Length() + align.Length() + size->Length() + attachmentName.Length() + 16 ); + formatBuffer->Des().Format( KAttachmentFormat(), &align, aAttachment.GetPartId().Id(), &attachmentName, size ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 3 ); // size, formatBuffer, utf } -void CFreestyleMessageHeaderHTML::ExportHTMLBodyL() const +void CFreestyleMessageHeaderHTML::ExportIconL( const TDesC& aIconName ) const + { + _LIT( KMessageIconFormat, "" ); + HBufC* formatBuffer = HBufC::NewLC( KMessageIconFormat().Length() + aIconName.Length() ); + formatBuffer->Des().Format( KMessageIconFormat(), &aIconName ); + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 2 ); // formatBuffer, utf + } + +HBufC* CFreestyleMessageHeaderHTML::SubjectLC() const + { + return CreateLinksLC( iMailMessage.GetSubject(), CFindItemEngine::EFindItemSearchURLBin ); + } + +TInt CFreestyleMessageHeaderHTML::CalculateTotalSpaceRequired( const TDesC& aText, + CFindItemEngine& aItemEngine, TInt& aMaxLength ) const + { + TInt totalLength( 0 ); + aMaxLength = KMinTInt; + CFindItemEngine::SFoundItem item; + aItemEngine.ResetPosition(); + for ( TBool available( aItemEngine.Item( item ) ); available; available = aItemEngine.NextItem( item ) ) + { + totalLength += item.iLength; + if ( item.iItemType == CFindItemEngine::EFindItemSearchURLBin ) + { + const TPtrC url( aText.Mid( item.iStartPos, item.iLength ) ); + if ( url.FindF( KSchemeSeparator() ) == KErrNotFound ) + { + totalLength += KUrlFormatWithHttp().Length(); + } + else + { + totalLength += KUrlFormat().Length(); + } + aMaxLength = ( aMaxLength < item.iLength ) ? item.iLength : aMaxLength; + } + } + aItemEngine.ResetPosition(); + return totalLength; + } + +HBufC* CFreestyleMessageHeaderHTML::CreateLinksLC( const TDesC& aText, const TInt aSearchCases ) const { - HTMLBodyStartL(); - ExportCollapsedHeaderTableL(); - ExportExpandedHeaderTableL(); - ExportAttachmentsL(); - ExportDisplayImagesTableL(); - HTMLBodyEndL(); + HBufC* result = NULL; + CFindItemEngine* itemEngine = CFindItemEngine::NewL( aText, + CFindItemEngine::TFindItemSearchCase( aSearchCases ) ); + CleanupStack::PushL ( itemEngine ); + if ( itemEngine->ItemCount() > 0 ) + { + RBuf buf; + TInt maxLength; + buf.CreateL( CalculateTotalSpaceRequired( aText, *itemEngine, maxLength ) + aText.Length() ); + buf.CleanupClosePushL(); + TInt currentReadPosition( 0 ); + CFindItemEngine::SFoundItem item; + HBufC* urlBuffer = HBufC::NewLC( KUrlFormatWithHttp().Length() + maxLength * 2 ); + for ( TBool available( itemEngine->Item( item ) ); available; available = itemEngine->NextItem( item ) ) + { + // Append characters from currentReadPosition to iStartPos + buf.Append( aText.Mid( currentReadPosition, item.iStartPos - currentReadPosition ) ); + const TPtrC url( aText.Mid( item.iStartPos, item.iLength ) ); + TPtrC format( KUrlFormat() ); + if ( url.FindF( KSchemeSeparator() ) == KErrNotFound ) + { + format.Set( KUrlFormatWithHttp() ); + } + urlBuffer->Des().Format( format, &url, &url ); + buf.Append( *urlBuffer ); + currentReadPosition = item.iStartPos + item.iLength; + } + CleanupStack::PopAndDestroy(); // urlBuffer + // Append characters that are left in buffer + buf.Append( aText.Mid( currentReadPosition ) ); + result = buf.AllocL(); + CleanupStack::PopAndDestroy(); // buf.Close() + } + else + { + result = aText.AllocL(); + } + CleanupStack::PopAndDestroy( itemEngine ); + CleanupStack::PushL( result ); + return result; + } + +void CFreestyleMessageHeaderHTML::ExportHTMLBodyEndL() const + { + iWriteStream.WriteL( _L8("\n\n") ); + iWriteStream.CommitL(); } void CFreestyleMessageHeaderHTML::ExportDisplayImagesTableL() const { - if (!iAutoLoadImages) + _LIT( KDisplayImagesLeftToRight, + "
%S
" ); + + _LIT( KDisplayImagesRightToLeft, + "
%S
" ); + + if ( iExportFlags.IsClear( EAutoLoadImages ) ) { - _LIT8(KDescription, ""); - //_LIT8(KButton, "Display images"); - HBufC8* description = KDescription().AllocLC(); //HeadingTextLC(R_FREESTYLE_EMAIL_UI_IMAGES_ARE_NOT_DISPLAYED); - HBufC8* button = HeadingTextLC(R_FREESTYLE_EMAIL_UI_DISPLAY_IMAGES); // KButton().AllocLC(); - HBufC8* formatBuffer = NULL; - if (iMirrorLayout) + _LIT(KDescription, ""); + HBufC* description = KDescription().AllocLC(); //StringLoader::LoadLC(R_FREESTYLE_EMAIL_UI_IMAGES_ARE_NOT_DISPLAYED); + HBufC* button = StringLoader::LoadLC(R_FREESTYLE_EMAIL_UI_DISPLAY_IMAGES); + HBufC* formatBuffer = NULL; + if ( iExportFlags.IsSet( EMirroredLayout ) ) { - formatBuffer = HBufC8::NewLC(KDisplayImagesRightToLeft().Length() + description->Length() + button->Length() + 8); + formatBuffer = HBufC::NewLC(KDisplayImagesRightToLeft().Length() + description->Length() + button->Length() + 8); formatBuffer->Des().Format( KDisplayImagesRightToLeft(), - iAutoLoadImages, + EFalse, iVisibleWidth, button, description); } else { - formatBuffer = HBufC8::NewLC(KDisplayImagesLeftToRight().Length() + description->Length() + button->Length() + 8); + formatBuffer = HBufC::NewLC(KDisplayImagesLeftToRight().Length() + description->Length() + button->Length() + 8); formatBuffer->Des().Format( KDisplayImagesLeftToRight(), - iAutoLoadImages, + EFalse, iVisibleWidth, description, button); } - iWriteStream.WriteL(*formatBuffer); - CleanupStack::PopAndDestroy(3); // description, button, formatBuffer + HBufC8* utf = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *formatBuffer ); + CleanupStack::PushL( utf ); + iWriteStream.WriteL( *utf ); + CleanupStack::PopAndDestroy( 4 ); // description, button, formatBuffer, utf iWriteStream.CommitL(); } } -void CFreestyleMessageHeaderHTML::HTMLBodyStartL() const - { - TBuf8 scrollPos; - scrollPos.AppendNum(iScrollPosition); - iWriteStream.WriteL(_L8("\n")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportCollapsedHeaderTableL() const - { - StartHeaderTableL( KCollapsedHeaderTableName, !iExpanded ); - ExportTimeAndExpandButtonL(); - ExportSubjectCollapsedL(); - EndHeaderTableL(); - } - -void CFreestyleMessageHeaderHTML::ExportExpandedHeaderTableL() const - { - StartHeaderTableL( KExpandedHeaderTableName, iExpanded ); - ExportCollapseButtonL(); - ExportFromL(); - ExportToL(); - ExportCcL(); - ExportBccL(); - ExportSentTimeL(); - ExportSubjectL(); - EndHeaderTableL(); - } - -// ----------------------------------------------------------------------------- -// CFreestyleMessageHeaderHTML::WriteSubjectL -// Writes the subject to iWriteStream and also -// takes care of the urls and marks them as hotspots -// ----------------------------------------------------------------------------- -// -void CFreestyleMessageHeaderHTML::WriteSubjectL(TDesC& aText ) const - { - /* - * Add these to searchcases to make it also search - * for emailaddress and phonenumber : - * CFindItemEngine::EFindItemSearchMailAddressBin | - * CFindItemEngine::EFindItemSearchPhoneNumberBin | - */ - // Search for urls - TInt searchCases = CFindItemEngine::EFindItemSearchURLBin; - - CFindItemEngine* itemEngine = - CFindItemEngine::NewL ( aText, - ( CFindItemEngine::TFindItemSearchCase ) searchCases ); - CleanupStack::PushL (itemEngine ); - - const CArrayFixFlat - * foundItems = itemEngine->ItemArray ( ); - - TInt index = 0; - // For each found item - for (TInt i=0; iCount ( ); ++i ) - { - // iItemType, iStartPos, iLength - const CFindItemEngine::SFoundItem& item = foundItems->At (i ); - HBufC* valueBuf = aText.Mid (item.iStartPos, item.iLength ).AllocL ( ); - CleanupStack::PushL (valueBuf ); - // We write the normal text to iWriteStream before and between the links in the header subject field - if(item.iStartPos > 0) - { - TInt itemstart = item.iStartPos; - HBufC* normalText = aText.Mid(index, itemstart-index).Alloc(); - CleanupStack::PushL( normalText ); - HBufC8* normalText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *normalText ); - CleanupStack::PushL( normalText8 ); - iWriteStream.WriteL( *normalText8 ); - CleanupStack::PopAndDestroy( 2 ); //normalText8m, normalText - } - switch (item.iItemType ) - { - /* To make header subjectfield to recognise also phonenumber and emailadress just - * add CFindItemEngine::EFindItemSearchMailAddressBin & - * CFindItemEngine::EFindItemSearchPhoneNumberBin cases here. - */ - case CFindItemEngine::EFindItemSearchURLBin: - { - HBufC8* url8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *valueBuf ); - CFreestyleMessageHeaderURL *fsurl = FreestyleMessageHeaderURLFactory::CreateEmailSubjectUrlL(*valueBuf); - delete fsurl; - CleanupStack::PushL( url8 ); - StartHyperlinkL(*url8); - iWriteStream.WriteL(*url8); - EndHyperlinkL(); - CleanupStack::PopAndDestroy( url8 ); - - break; - } - default: - { - break; - } - } - index = item.iStartPos+item.iLength; - CleanupStack::PopAndDestroy (valueBuf ); - } - //Write the rest of the subject to subject field if we are not - //at the end of the subject already, or if there wasn't any - //url items write the whole subject field here - if(index < aText.Length() ) - { - HBufC* normalText = aText.Mid(index, aText.Length()-index).Alloc(); - CleanupStack::PushL( normalText ); - HBufC8* normalText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *normalText ); - CleanupStack::PushL( normalText8 ); - iWriteStream.WriteL( *normalText8 ); - CleanupStack::PopAndDestroy( 2 ); //normalText8m, normalText - } - CleanupStack::PopAndDestroy (itemEngine ); - } - -HBufC8* CFreestyleMessageHeaderHTML::HTMLHeaderFollowUpIconLC( TBool aShowText ) const - { - HBufC8* followUpText8( NULL ); - HBufC8* followUpCompletedText8( NULL ); - - // Reserve space with worst case scenario in mind. - TInt textLength( 0 ); - if ( aShowText ) - { - // Follow up completed. - HBufC* followUpCompletedText = StringLoader::LoadLC( - R_FREESTYLE_EMAIL_UI_VIEWER_COMPLETED ); - followUpCompletedText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( - *followUpCompletedText ); - CleanupStack::PopAndDestroy( followUpCompletedText ); - CleanupStack::PushL( followUpCompletedText8 ); - - // Follow up. - HBufC* followUpText = StringLoader::LoadLC( - R_FREESTYLE_EMAIL_UI_VIEWER_FOLLOWUP ); - followUpText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( - *followUpText ); - CleanupStack::PopAndDestroy( followUpText ); - CleanupStack::PushL( followUpText8 ); - - textLength += KHTMLImgTagId().Length() + - KFollowUpCompleteImageName().Length() + - KHTMLImgTagSrcBefore().Length() + - KFollowUpCompleteIconFileName().Length() + - KHTMLImgTagSrcAfter().Length() + - ( followUpText8->Length() >= followUpCompletedText8->Length() ? - followUpText8->Length() : followUpCompletedText8->Length() ); - } - else - { - // Plain icon and no text. - textLength += KHTMLImgTagId().Length() + - KFollowUpCompleteImageName().Length() + - KHTMLImgTagSrcBefore().Length() + - KFollowUpCompleteIconFileName().Length() + - KHTMLImgTagSrcAfter().Length(); - } - - // Allocate space. - HBufC8* iconText8 = HBufC8::NewLC( textLength ); - - // Generate HTML code - TPtr8 iconPtr( iconText8->Des() ); - - if ( iMailMessage.IsFlagSet( EFSMsgFlag_FollowUp ) ) - { - iconPtr.Append( KHTMLImgTagId ); - iconPtr.Append( KFollowUpImageName ); - iconPtr.Append( KHTMLImgTagSrcBefore ); - iconPtr.Append( KFollowUpIconFileName ); - iconPtr.Append( KHTMLImgTagSrcAfter ); - if ( aShowText && followUpText8 ) - { - iconPtr.Append( followUpText8->Des() ); - } - } - else if ( iMailMessage.IsFlagSet( EFSMsgFlag_FollowUpComplete ) ) - { - iconPtr.Append( KHTMLImgTagId ); - iconPtr.Append( KFollowUpCompleteImageName ); - iconPtr.Append( KHTMLImgTagSrcBefore ); - iconPtr.Append( KFollowUpCompleteIconFileName ); - iconPtr.Append( KHTMLImgTagSrcAfter ); - if ( aShowText && followUpCompletedText8 ) - { - iconPtr.Append( followUpCompletedText8->Des() ); - } - } - else - { - // No follow up flag set. - CleanupStack::PopAndDestroy( iconText8 ); - iconText8 = NULL; - } - - if ( aShowText ) - { - if ( iconText8 ) - { - CleanupStack::Pop( iconText8 ); - } - CleanupStack::PopAndDestroy( followUpText8 ); - CleanupStack::PopAndDestroy( followUpCompletedText8 ); - if ( iconText8 ) - { - CleanupStack::PushL( iconText8 ); - } - } - - return iconText8; - } - -HBufC8* CFreestyleMessageHeaderHTML::HTMLHeaderPriorityIconLC( TBool aShowText ) const - { - HBufC8* highPrioText8( NULL ); - HBufC8* lowPrioText8( NULL ); - - // Reserve space with worst case scenario in mind. - TInt textLength( 0 ); - if ( aShowText ) - { - // High priority. - HBufC* highPrioText = StringLoader::LoadLC( - R_FREESTYLE_EMAIL_UI_VIEWER_HIGH_PRIO ); - highPrioText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( - *highPrioText ); - CleanupStack::PopAndDestroy( highPrioText ); - CleanupStack::PushL( highPrioText8 ); - - // Low priority. - HBufC* lowPrioText = StringLoader::LoadLC( - R_FREESTYLE_EMAIL_UI_VIEWER_LOW_PRIO ); - lowPrioText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( - *lowPrioText ); - CleanupStack::PopAndDestroy( lowPrioText ); - CleanupStack::PushL( lowPrioText8 ); - - textLength += KHTMLImgTagId().Length() + - KPriorityHighImageName().Length() + - KHTMLImgTagSrcBefore().Length() + - KPriorityHighIconFileName().Length() + - KHTMLImgTagSrcAfter().Length() + - ( lowPrioText8->Length() >= highPrioText8->Length() ? - lowPrioText8->Length() : highPrioText8->Length() ); - } - else - { - // Plain icon and no text. - textLength += KHTMLImgTagId().Length() + - KPriorityHighImageName().Length() + - KHTMLImgTagSrcBefore().Length() + - KPriorityHighIconFileName().Length() + - KHTMLImgTagSrcAfter().Length(); - } - - // Allocate space. - HBufC8* iconText8 = HBufC8::NewLC( textLength ); - - // Generate HTML code - TPtr8 iconPtr( iconText8->Des() ); - - if ( iMailMessage.IsFlagSet( EFSMsgFlag_Low ) ) - { - iconPtr.Append( KHTMLImgTagId ); - iconPtr.Append( KPriorityLowImageName ); - iconPtr.Append( KHTMLImgTagSrcBefore ); - iconPtr.Append( KPriorityLowIconFileName ); - iconPtr.Append( KHTMLImgTagSrcAfter ); - if ( aShowText && lowPrioText8 ) - { - iconPtr.Append( lowPrioText8->Des() ); - } - } - else if ( iMailMessage.IsFlagSet( EFSMsgFlag_Important ) ) - { - iconPtr.Append( KHTMLImgTagId ); - iconPtr.Append( KPriorityHighImageName ); - iconPtr.Append( KHTMLImgTagSrcBefore ); - iconPtr.Append( KPriorityHighIconFileName ); - iconPtr.Append( KHTMLImgTagSrcAfter ); - if ( aShowText && highPrioText8 ) - { - iconPtr.Append( highPrioText8->Des() ); - } - } - else - { - // No priority flag set. - CleanupStack::PopAndDestroy( iconText8 ); - iconText8 = NULL; - } - - if ( aShowText ) - { - if ( iconText8 ) - { - CleanupStack::Pop( iconText8 ); - } - CleanupStack::PopAndDestroy( lowPrioText8 ); - CleanupStack::PopAndDestroy( highPrioText8 ); - if ( iconText8 ) - { - CleanupStack::PushL( iconText8 ); - } - } - - return iconText8; - } - -void CFreestyleMessageHeaderHTML::HTMLBodyEndL() const - { - iWriteStream.WriteL(_L8("\n")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportCollapseButtonL() const - { - TBuf8 tableWidth; - tableWidth.AppendNum( iVisibleWidth ); - - // Add "Collapse" button as its own table with its own width - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.WriteL( _L8("\n") ); - - iWriteStream.WriteL( _L8("\n") ); - - iWriteStream.WriteL( _L8("\n")); - iWriteStream.WriteL( _L8("
\n") ); - } - else - { - iWriteStream.WriteL( _L8(" align=\"left\"") ); - iWriteStream.WriteL( _L8(" style=\"padding-left: 10px;\">\n") ); - } - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("
\n")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportTimeAndExpandButtonL() const - { - // set the width, using the visible screen width - TBuf8 tableWidth; - tableWidth.AppendNum( iVisibleWidth ); - - // start first row: table with the sent info and the '+' icon - iWriteStream.WriteL(_L8("\n")); - - iWriteStream.WriteL(_L8("\n")); - - // add Sent time and date - iWriteStream.WriteL(_L8("\n")); - - // Add "expand" button on the same line as Sent time and date - iWriteStream.WriteL(_L8("\n")); - - // finish first row - iWriteStream.WriteL(_L8("\n")); - iWriteStream.WriteL(_L8("
")); - - HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &iMailMessage ); - HBufC* timeText = TFsEmailUiUtility::TimeTextFromMsgLC( &iMailMessage ); - - TInt len = dateText->Length() + KSentLineDateAndTimeSeparatorText().Length() + timeText->Length(); - HBufC* sentTimeText = HBufC::NewLC( len ); - TPtr sentTimeTextPtr = sentTimeText->Des(); - sentTimeTextPtr.Append( *dateText ); - sentTimeTextPtr.Append( KSentLineDateAndTimeSeparatorText ); - sentTimeTextPtr.Append( *timeText ); - HBufC8* sentTimeText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( sentTimeTextPtr ); - CleanupStack::PushL( sentTimeText8 ); - iWriteStream.WriteL( *sentTimeText8 ); - CleanupStack::PopAndDestroy( sentTimeText8 ); - CleanupStack::PopAndDestroy( sentTimeText ); - CleanupStack::PopAndDestroy( timeText ); - CleanupStack::PopAndDestroy( dateText ); - - iWriteStream.WriteL(_L8("\n")); - } - else - { - iWriteStream.WriteL(_L8(" align=\"left\"")); - iWriteStream.WriteL(_L8(" style=\"padding-left: 10px;\">\n")); - } - iWriteStream.WriteL(_L8("")); - iWriteStream.WriteL(_L8("
\n")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportSubjectL() const +void CFreestyleMessageHeaderHTML::ExportBodyStyleL() const { - iWriteStream.WriteL( _L8("") ); - - - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - HBufC8* subjectHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_SUBJECT ); - iWriteStream.WriteL( *subjectHeadingText ); - CleanupStack::PopAndDestroy( subjectHeadingText ); - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("\n") ); - - // subject text - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - HBufC* subject = iMailMessage.GetSubject().Alloc(); - /* - * Writes the subject to iWriteStream and also - * takes care of the urls and marks them as hotspots - */ - WriteSubjectL(*subject); - - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("\n") ); - // Write icons (if necessary). - HBufC8* followUp = HTMLHeaderFollowUpIconLC( ETrue ); - HBufC8* priority = HTMLHeaderPriorityIconLC( ETrue ); - - if ( priority ) - { - iWriteStream.WriteL(_L8("")); - iWriteStream.WriteL( *priority ); - iWriteStream.WriteL(_L8("")); - CleanupStack::PopAndDestroy( priority); - } - - if ( followUp ) - { - iWriteStream.WriteL(_L8("")); - iWriteStream.WriteL( *followUp ); - iWriteStream.WriteL(_L8("")); - CleanupStack::PopAndDestroy( followUp ); - } - - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportSubjectCollapsedL() const - { - iWriteStream.WriteL(_L8("\n")); - iWriteStream.WriteL(_L8("")); - - HBufC* subject = iMailMessage.GetSubject().Alloc(); - /* - * Writes the subject to iWriteStream and also - * takes care of the urls and marks them as hotspots - */ - WriteSubjectL(*subject); - - iWriteStream.WriteL(_L8("")); - - // Write icons (if necessary). - HBufC8* followUp = HTMLHeaderFollowUpIconLC( EFalse ); - HBufC8* priority = HTMLHeaderPriorityIconLC( EFalse ); - - if ( priority ) - { - iWriteStream.WriteL( *priority ); - CleanupStack::PopAndDestroy( priority); - } - - if ( followUp ) - { - iWriteStream.WriteL( *followUp ); - CleanupStack::PopAndDestroy( followUp ); - } - - iWriteStream.WriteL(_L8("\n")); // finish subject row - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportFromL() const - { - RPointerArray froms; - CleanupClosePushL( froms ); - CFSMailAddress* from = iMailMessage.GetSender(); // ownership not transferred - if ( from ) - { - froms.AppendL( from ); - } - ExportEmailAddressesL( FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom, froms, - KFromFieldName, KFromTableName, R_FREESTYLE_EMAIL_UI_VIEWER_FROM ); - CleanupStack::PopAndDestroy( &froms ); - } - -void CFreestyleMessageHeaderHTML::ExportToL() const - { - RPointerArray& recipients = iMailMessage.GetToRecipients(); - ExportEmailAddressesL( FreestyleMessageHeaderURLFactory::EEmailAddressTypeTo, recipients, - KToFieldName, KToTableName, R_FREESTYLE_EMAIL_UI_VIEWER_TO ); - } - -void CFreestyleMessageHeaderHTML::ExportCcL() const - { - RPointerArray& recipients = iMailMessage.GetCCRecipients(); - ExportEmailAddressesL( FreestyleMessageHeaderURLFactory::EEmailAddressTypeCc, recipients, - KCcFieldName, KCcTableName, R_FREESTYLE_EMAIL_UI_VIEWER_CC ); - } - -void CFreestyleMessageHeaderHTML::ExportBccL() const - { - RPointerArray& recipients = iMailMessage.GetBCCRecipients(); - ExportEmailAddressesL( FreestyleMessageHeaderURLFactory::EEmailAddressTypeBcc, recipients, - KBccFieldName, KBccTableName, R_FREESTYLE_EMAIL_UI_VIEWER_BCC ); - } - -void CFreestyleMessageHeaderHTML::ExportSentTimeL() const - { - - iWriteStream.WriteL( _L8("") ); - - - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - HBufC8* sentHeadingText = HeadingTextLC( R_FREESTYLE_EMAIL_UI_VIEWER_SENT ); - iWriteStream.WriteL( *sentHeadingText ); - CleanupStack::PopAndDestroy( sentHeadingText ); - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("\n") ); - - iWriteStream.WriteL( _L8("") ); - iWriteStream.WriteL( _L8("") ); - - HBufC* dateText = TFsEmailUiUtility::DateTextFromMsgLC( &iMailMessage ); - HBufC* timeText = TFsEmailUiUtility::TimeTextFromMsgLC( &iMailMessage ); - - TInt len = dateText->Length() + KSentLineDateAndTimeSeparatorText().Length() + timeText->Length(); - HBufC* sentTimeText = HBufC::NewLC( len ); - TPtr sentTimeTextPtr = sentTimeText->Des(); - sentTimeTextPtr.Append( *dateText ); - sentTimeTextPtr.Append( KSentLineDateAndTimeSeparatorText ); - sentTimeTextPtr.Append( *timeText ); - HBufC8* sentTimeText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( sentTimeTextPtr ); - CleanupStack::PushL( sentTimeText8 ); - iWriteStream.WriteL( *sentTimeText8 ); - CleanupStack::PopAndDestroy( sentTimeText8 ); - CleanupStack::PopAndDestroy( sentTimeText ); - CleanupStack::PopAndDestroy( timeText ); - CleanupStack::PopAndDestroy( dateText ); - - iWriteStream.WriteL( _L8("") ); - - iWriteStream.WriteL( _L8("\n") ); - - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::ExportAttachmentsL() const - { - TInt attachmentsCount (iAttachments.Count()); - if ( attachmentsCount) - { - // The attachments table consists of one row that contains 2 cells - // first cell contains the attachment icon - // second cell contains a table which contains the attachments list - - // start attachments table - iWriteStream.WriteL( _L8("\n") ); // width is set at 100% intentionally - - // add attachment icon - // start row - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.WriteL( _L8("\n") ); - // start table of attachments as a table within a cell - iWriteStream.WriteL( _L8("\n") ); - - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.WriteL(_L8("
\n") ); - iWriteStream.WriteL(_L8("\n")); - - for (TInt i=0; i < attachmentsCount; i++) - { - AddAttachmentL( *iAttachments[i] ); - } - - iWriteStream.WriteL(_L8("
\n")); // end table_attachments_list - iWriteStream.WriteL( _L8("
\n")); // end attachments table - } - } - -void CFreestyleMessageHeaderHTML::ExportEmailAddressesL(FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const RPointerArray& aEmailAddresses, - const TDesC8& aRowId, - const TDesC8& /*aTableId*/, - TInt aHeaderTextResourceId ) const - { - if ( aEmailAddresses.Count() ) - { - // begin table row - iWriteStream.WriteL( _L8("") ); - - // heading text - iWriteStream.WriteL( _L8("")); - HBufC8* headingText = HeadingTextLC( aHeaderTextResourceId ); - iWriteStream.WriteL( *headingText ); - CleanupStack::PopAndDestroy( headingText ); - iWriteStream.WriteL( _L8("")); - - iWriteStream.WriteL( _L8("\n") ); // end table row - - // add addresses, one address per row - TInt count( aEmailAddresses.Count() ); - for (TInt i = 0; i < count; ++i ) - { - iWriteStream.WriteL( _L8("") ); - AddEmailAddressL (aEmailAddressType, *aEmailAddresses[i] ); - iWriteStream.WriteL( _L8("\n") ); - } - - iWriteStream.CommitL(); - } - } - -void CFreestyleMessageHeaderHTML::AddEmailAddressL( FreestyleMessageHeaderURLFactory::TEmailAddressType aEmailAddressType, - const CFSMailAddress& aEmailAddress ) const - { - CFreestyleMessageHeaderURL* emailUrl = FreestyleMessageHeaderURLFactory::CreateEmailAddressUrlL( aEmailAddressType, aEmailAddress ); - CleanupStack::PushL( emailUrl ); - - HBufC* url = emailUrl->ExternalizeL(); - CleanupStack::PushL( url ); - HBufC8* url8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *url ); - CleanupStack::PushL( url8 ); - StartHyperlinkL( *url8 ); - CleanupStack::PopAndDestroy( url8 ); - CleanupStack::PopAndDestroy( url ); - - HBufC8* displayName8 = NULL; - // ENLN-7ZVBES - // Display name not shown in From:, instead, email address is shown - if ( (aEmailAddress.GetDisplayName().Length() > 0) && aEmailAddressType != FreestyleMessageHeaderURLFactory::EEmailAddressTypeFrom ) - { - displayName8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aEmailAddress.GetDisplayName() ); - } - else - { - displayName8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( aEmailAddress.GetEmailAddress() ); - } - CleanupStack::PushL( displayName8 ); - iWriteStream.WriteL( *displayName8 ); - CleanupStack::PopAndDestroy( displayName8 ); - - EndHyperlinkL(); - - CleanupStack::PopAndDestroy( emailUrl ); - } - -void CFreestyleMessageHeaderHTML::AddAttachmentL( CFSMailMessagePart& aAttachment ) const - { - iWriteStream.WriteL( _L8("") ); // pad bottom to allow some space between the lines - - TUint id = aAttachment.GetPartId().Id(); - TBuf<32> itemId; - itemId.AppendNum( id ); - CFreestyleMessageHeaderURL* attnUrl = FreestyleMessageHeaderURLFactory::CreateAttachmentUrlL( itemId ); - CleanupStack::PushL( attnUrl ); - HBufC* attnUrlText = attnUrl->ExternalizeL(); - CleanupStack::PushL( attnUrlText ); - HBufC8* attnUrlText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *attnUrlText ); - CleanupStack::PushL( attnUrlText8 ); - StartHyperlinkL( *attnUrlText8 ); - CleanupStack::PopAndDestroy( attnUrlText8 ); - CleanupStack::PopAndDestroy( attnUrlText ); - CleanupStack::PopAndDestroy( attnUrl ); - - TDesC& attnName = aAttachment.AttachmentNameL(); - HBufC8* attnName8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( attnName ); - CleanupStack::PushL( attnName8 ); - iWriteStream.WriteL( *attnName8 ); - CleanupStack::PopAndDestroy( attnName8 ); - - HBufC* sizeDesc = TFsEmailUiUtility::CreateSizeDescLC(aAttachment.ContentSize(), EFalse); - - TBuf8<48> sizeText; - - // Add right to left marker as "(" and ")" are messing up the html language markers - // and &rlm is only added in mirror layout - if( iMirrorLayout ) - { - sizeText.Append( KSpace8 ); - sizeText.Append( _L8( "‏" ) ); - } - - sizeText.Append( KSpace8 ); - sizeText.Append( _L8("(") ); - HBufC8* sizeDesc8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( sizeDesc->Des() ); - CleanupStack::PushL( sizeDesc8 ); - sizeText.Append( sizeDesc8->Des() ); - CleanupStack::PopAndDestroy( sizeDesc8 ); - CleanupStack::PopAndDestroy( sizeDesc ); - sizeText.Append( _L8(")") ); - - if( iMirrorLayout ) - { - sizeText.Append( KSpace8 ); - sizeText.Append( _L8( "‏" ) ); - } - - iWriteStream.WriteL( sizeText ); - - EndHyperlinkL(); - - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.CommitL(); - } - - -void CFreestyleMessageHeaderHTML::StartHyperlinkL( const TDesC8& aUrl ) const - { - iWriteStream.WriteL( _L8("")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::EndHyperlinkL() const - { - iWriteStream.WriteL( _L8("") ); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::AddImageL( const TDesC8& aImageUrl ) const - { - iWriteStream.WriteL( _L8("")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::AddImageL( const TDesC8& aImageId, - const TDesC8& aImageUrl, - const TDesC8& aImageEvent ) const - { - iWriteStream.WriteL( _L8("")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::AddJavascriptL() const - { - iWriteStream.WriteL( _L8("\n")); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::StartHeaderTableL( const TDesC8& aTableId, - TBool /*aVisible*/ ) const - { - iWriteStream.WriteL( _L8("\n") ); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::EndHeaderTableL() const - { - EndTableL(); - } - -void CFreestyleMessageHeaderHTML::StartTableL( const TDesC8& aTableId ) const - { - iWriteStream.WriteL( _L8("
\n") ); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::EndTableL() const - { - iWriteStream.WriteL( _L8("
\n") ); - iWriteStream.CommitL(); - } - -HBufC8* CFreestyleMessageHeaderHTML::ClickImageEventL( const TDesC8& aImageName ) const - { - TBuf8 event; - if ( aImageName.Compare( KToImageName ) == 0 ) - { - event.Append( _L8("onClick=\"toggleField('") ); - event.Append( KToTableName ); - event.Append( _L8("', '") ); - event.Append( KToImageName ); - event.Append( _L8("')\"") ); - } - else if ( aImageName.Compare( KCcImageName ) == 0 ) - { - event.Append( _L8("onClick=\"toggleField('") ); - event.Append( KCcTableName ); - event.Append( _L8("', '") ); - event.Append( KCcImageName ); - event.Append( _L8("')\"") ); - } - else if ( aImageName.Compare( KBccImageName ) == 0 ) - { - event.Append( _L8("onClick=\"toggleField('") ); - event.Append( KBccTableName ); - event.Append( _L8("', '") ); - event.Append( KBccImageName ); - event.Append( _L8("')\"") ); - } - else if ( aImageName.Compare( KAttachmentImageName ) == 0 ) - { - event.Append( _L8("onClick=\"toggleField('") ); - event.Append( KAttachmentTableName ); - event.Append( _L8("', '") ); - event.Append( KAttachmentImageName ); - event.Append( _L8("')\"") ); - } - else - { - User::Leave(KErrNotSupported); - } - return event.AllocL(); - } - -HBufC8* CFreestyleMessageHeaderHTML::HeadingTextLC( TInt aId ) const - { - HBufC* headingText = StringLoader::LoadLC( aId ); - HBufC8* headingText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *headingText ); - CleanupStack::PopAndDestroy( headingText ); - CleanupStack::PushL( headingText8 ); - return headingText8; - } - -HBufC8* CFreestyleMessageHeaderHTML::HeadingTextLC( TInt aId, TInt aSize ) const - { - HBufC* headingText = StringLoader::LoadLC( aId, aSize ); - HBufC8* headingText8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( *headingText ); - CleanupStack::PopAndDestroy( headingText ); - CleanupStack::PushL( headingText8 ); - return headingText8; - } - -void CFreestyleMessageHeaderHTML::AddStyleSheetL() const - { - // Add an internal style sheet - // If the style becomes numerous or complicated, consider using an external style sheet - iWriteStream.WriteL( _L8("\n") ); iWriteStream.CommitL(); } -void CFreestyleMessageHeaderHTML::StartDivL() const - { - // Add div, using "header" class - iWriteStream.WriteL( _L8("
\n") ); - iWriteStream.CommitL(); - } - -void CFreestyleMessageHeaderHTML::EndDivL() const - { - iWriteStream.WriteL( _L8("
\n") ); - iWriteStream.CommitL(); - } - - + diff -r efd4f1afd43e -r d620048b4810 emailuis/emailui/src/ncscomposeview.cpp --- a/emailuis/emailui/src/ncscomposeview.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/emailui/src/ncscomposeview.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -450,6 +450,9 @@ // Simulate a back key to exit embedded app // so that email editor could show on the top level. TKeyEvent KeyEvent = TKeyEvent(); + // this is neccesary for photogalery image viewer (don't remove) + KeyEvent.iScanCode = EStdKeyUpArrow; + rwsSession.SimulateKeyEvent( KeyEvent ); KeyEvent.iCode = EKeyCBA2; rwsSession.SimulateKeyEvent( KeyEvent ); @@ -1407,6 +1410,13 @@ self->iContainer->SwitchChangeMskOff( ETrue ); TRAP( error, ok = attachmentControl->AppendAttachmentToListL( self->iAttachmentAddType) ); + + if( error == KErrNoMemory ) + { + TRAP_IGNORE( TFsEmailUiUtility::ShowErrorNoteL( + R_FREESTYLE_EMAIL_ERROR_GENERAL_UNABLE_TO_COMPLETE, + ETrue ) ); + } self->iContainer->SwitchChangeMskOff( EFalse ); self->iAddingAttachmentDialogOpened = EFalse; diff -r efd4f1afd43e -r d620048b4810 emailuis/uicomponents/inc/fstreevisualizerbase.h --- a/emailuis/uicomponents/inc/fstreevisualizerbase.h Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/uicomponents/inc/fstreevisualizerbase.h Thu Jul 15 18:19:25 2010 +0300 @@ -654,7 +654,7 @@ * Leave-safe constructor */ static CDragHandler* NewL(CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, - const TBitFlagsT& aFlags ); + const TBitFlags& aFlags ); /** * Destructor @@ -711,7 +711,7 @@ /** * Private constructor */ - CDragHandler(CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, const TBitFlagsT& aFlags); + CDragHandler(CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, const TBitFlags& aFlags); /** * Leave safe construct. @@ -726,7 +726,7 @@ private: CFsTreeVisualizerBase& iTree; - TBitFlagsT iFlags; + TBitFlags iFlags; TTimeIntervalMicroSeconds32 iHighlightTimeout; CPeriodic* iHighlightTimer; TTime iStartTime; @@ -734,7 +734,7 @@ TPoint iLastPointerPosition; TPoint iDrag; TFsTreeItemId iItemId; - const TBitFlagsT& iTreeVisualizerFlags; + const TBitFlags& iTreeVisualizerFlags; TDragDirection iDragDirection; }; @@ -2358,11 +2358,23 @@ /** * List is shown in popup mode. */ - EPopupMode + EPopupMode, + + /** + * Informs tactile feedback that item was added i.e. does not + * play feedback. + */ + EListModelUpdate, + + /** + * This flag is checked when trying to focus item. Focus is ignored + * if list is being panned. + */ + EListPanning }; // Flags - TBitFlagsT iFlags; + TBitFlags iFlags; // ETrue when the stylus/finger is currently pressed down TBool iTouchPressed; diff -r efd4f1afd43e -r d620048b4810 emailuis/uicomponents/src/fstreevisualizerbase.cpp --- a/emailuis/uicomponents/src/fstreevisualizerbase.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/emailuis/uicomponents/src/fstreevisualizerbase.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -1530,7 +1530,7 @@ // void CFsTreeVisualizerBase::SetFocusVisibility( TBool aShow ) { - if ( iFocusVisible != aShow ) + if ( ( iFocusVisible && !aShow ) || ( !iFocusVisible && aShow ) ) { iFocusVisible = aShow; TRAP_IGNORE( @@ -1549,9 +1549,9 @@ if (iDragHandler && iOwnerControl->ControlGroup()->AcceptInput()) { TPointerEvent::TType type = aEvent.PointerEvent().iType; - const TInt id(EventItemId(aEvent)); + const TFsTreeItemId id(EventItemId(aEvent)); INFO_1("visual: $%x", aEvent.Visual()); - if (KErrNotFound != id || type == TPointerEvent::EDrag || + if ( KFsTreeNoneID != id || type == TPointerEvent::EDrag || type == TPointerEvent::EButtonRepeat || type == TPointerEvent::EButton1Up || type == TPointerEvent::EButton1Down) @@ -1597,6 +1597,7 @@ }*/ iDragHandler->PointerUp( aEvent.PointerEvent(), id ); iFlags.Clear(EIgnorePointerUpAction); + iFlags.Clear( EListPanning ); break; } case TPointerEvent::EDrag: @@ -1684,7 +1685,7 @@ TFsTreeItemId CFsTreeVisualizerBase::VisualItemId(const CAlfVisual* aVisual) const { FUNC_LOG; - TInt itemId(KErrNotFound); + TFsTreeItemId itemId( KFsTreeNoneID ); if (aVisual) { aVisual->PropertyFindInteger(KPropertyItemId(), &itemId); @@ -2887,7 +2888,7 @@ void CFsTreeVisualizerBase::RemoveItemL(TFsTreeItemId aItemId) { FUNC_LOG; - TInt removedindex = iWorld.IndexOfItem(aItemId); + const TInt removedindex(iWorld.IndexOfItem(aItemId)); iWorld.RemoveL(aItemId); if (iFocusedItem == aItemId) { @@ -5051,7 +5052,9 @@ void CFsTreeVisualizerBase::SetPanningPosition(const TPoint& aDelta) { FUNC_LOG; - iPhysics->RegisterPanningPosition(aDelta); + iPhysics->RegisterPanningPosition(aDelta); + iFlags.Set( EListPanning ); + SetFocusVisibility( EFalse ); } // --------------------------------------------------------------------------- @@ -5228,7 +5231,7 @@ // CFsTreeVisualizerBase::CDragHandler* CFsTreeVisualizerBase::CDragHandler::NewL( CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, - const TBitFlagsT& aFlags) + const TBitFlags& aFlags) { FUNC_LOG; CDragHandler* self = new (ELeave) CDragHandler(aTree, aHighlightTimeout, @@ -5427,7 +5430,7 @@ // CFsTreeVisualizerBase::CDragHandler::CDragHandler( CFsTreeVisualizerBase& aTree, const TInt aHighlightTimeout, - const TBitFlagsT& aFlags) : + const TBitFlags& aFlags) : iTree(aTree), iHighlightTimeout(aHighlightTimeout * 1000), iTreeVisualizerFlags(aFlags) { @@ -5462,12 +5465,7 @@ // TBool CFsTreeVisualizerBase::IsFocusShown() { - if( iTouchPressed || iFocusVisible ) - { - return ETrue; - } - - return EFalse; + return ( iTouchPressed || iFocusVisible ) && iFlags.IsClear( EListPanning ); } diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/inc/ipsplgpop3fetchoperation.h --- a/ipsservices/ipssosplugin/inc/ipsplgpop3fetchoperation.h Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/inc/ipsplgpop3fetchoperation.h Thu Jul 15 18:19:25 2010 +0300 @@ -68,6 +68,11 @@ */ virtual TFSProgress GetFSProgressL() const; + /** + * + */ + virtual TInt IpsOpType() const; + protected: /** diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/inc/ipsplgsearch.h --- a/ipsservices/ipssosplugin/inc/ipsplgsearch.h Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/inc/ipsplgsearch.h Thu Jul 15 18:19:25 2010 +0300 @@ -367,11 +367,16 @@ /** * @param aCriteria Sorting criterias. */ - TMsgContainer( - const TMsvId& aId, + + + /*TMsgContainer( + const TMsvId& aId, const TFSMailSortCriteria& aCriteria, - CMsvSession& aMsvSession ); - + CMsvSession& aMsvSession );*/ + + TMsgContainer( const TMsvEntry& aEntry, + const TFSMailSortCriteria& aCriteria ); + /** * @param aMsgContainer MsgContainer to be compared. * @return ETrue, when content is greater than in parameter. @@ -446,17 +451,19 @@ /** * Entry to be used for compare operations. */ - TMsvId iId; + //TMsvId iId; /** * Reference to existing sort criteria. */ const TFSMailSortCriteria& iCriteria; + TMsvEntry iEntry; + /** * Message server session. */ - CMsvSession& iMsvSession; + //CMsvSession& iMsvSession; }; /** diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/inc/ipsplgsearch.inl --- a/ipsservices/ipssosplugin/inc/ipsplgsearch.inl Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/inc/ipsplgsearch.inl Thu Jul 15 18:19:25 2010 +0300 @@ -209,7 +209,7 @@ // TMsvId CIpsPlgSearch::TMsgContainer::Id() const { - return iId; + return iEntry.Id(); } // End of File diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/inc/ipsplgsosbaseplugin.hrh --- a/ipsservices/ipssosplugin/inc/ipsplgsosbaseplugin.hrh Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/inc/ipsplgsosbaseplugin.hrh Thu Jul 15 18:19:25 2010 +0300 @@ -65,6 +65,7 @@ EIpsOpTypeImap4SyncOp, EIpsOpTypePop3SyncOp, EIpsOpTypeOnlineOp, - EIpsOpTypeImap4PopulateOp + EIpsOpTypeImap4PopulateOp, + EIpsOpTypePop3PopulateOp }; #endif /*IPSSOSPLUGIN_HRH_*/ diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/src/ipsplgimap4populateop.cpp --- a/ipsservices/ipssosplugin/src/ipsplgimap4populateop.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgimap4populateop.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -425,11 +425,23 @@ *iTempSelection, param, this->iStatus); iState = EStateInfoEntryChange; SetActive(); + + if ( iEventHandler ) + { + iEventHandler->SetNewPropertyEvent( + iService, KIpsSosEmailSyncStarted, KErrNone ); + } } else { iState = EStateIdle; CompleteObserver(); + + if ( iEventHandler ) + { + iEventHandler->SetNewPropertyEvent( + iService, KIpsSosEmailSyncCompleted, KErrNone ); + } } } diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/src/ipsplgpop3fetchoperation.cpp --- a/ipsservices/ipssosplugin/src/ipsplgpop3fetchoperation.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgpop3fetchoperation.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -378,5 +378,14 @@ return result; } +// ---------------------------------------------------------------------------- +// CIpsPlgPop3FetchOperation::IpsOpType() +// ---------------------------------------------------------------------------- +// +TInt CIpsPlgPop3FetchOperation::IpsOpType() const + { + FUNC_LOG; + return EIpsOpTypePop3PopulateOp; + } // EOF diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/src/ipsplgsearch.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsearch.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsearch.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -107,8 +107,9 @@ // CIpsPlgSearch::TMsgContainer::TMsgContainer() // --------------------------------------------------------------------------- // -CIpsPlgSearch::TMsgContainer::TMsgContainer( - const TMsvId& aId, +/* +CIpsPlgSearch::TMsgContainer::TMsgContainer( + const TMsvId& aId, const TFSMailSortCriteria& aCriteria, CMsvSession& aMsvSession ) : @@ -118,6 +119,13 @@ { FUNC_LOG; } +*/ +CIpsPlgSearch::TMsgContainer::TMsgContainer( const TMsvEntry& aEntry, + const TFSMailSortCriteria& aCriteria ) : + iCriteria( aCriteria ), iEntry( aEntry ) + { + FUNC_LOG; + } // --------------------------------------------------------------------------- // CIpsPlgSearch::TMsgContainer::TMsgContainer() @@ -136,12 +144,12 @@ break; case EFSMailSortByDate: - result = Entry( iId ).iDate > Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate > aMsgContainer.iEntry.iDate; break; case EFSMailSortBySender: { - HBufC* leftSender = NULL; + /*HBufC* leftSender = NULL; HBufC* rightSender = NULL; GetSenderStringsCC( @@ -151,13 +159,14 @@ rightSender ); result = *leftSender > *rightSender; - CleanupStack::PopAndDestroy( 2, leftSender ); + CleanupStack::PopAndDestroy( 2, leftSender );*/ + result = iEntry.iDetails > aMsgContainer.iEntry.iDetails; } break; case EFSMailSortBySubject: { - HBufC* leftSubject = NULL; + /*HBufC* leftSubject = NULL; HBufC* rightSubject = NULL; GetSubjectStringsCC( @@ -167,28 +176,29 @@ rightSubject ); result = *leftSubject > *rightSubject; - CleanupStack::PopAndDestroy( 2, leftSubject ); + CleanupStack::PopAndDestroy( 2, leftSubject );*/ + result = iEntry.iDescription > aMsgContainer.iEntry.iDescription; } break; case EFSMailSortByPriority: - result = Entry( iId ).Priority() > Entry( aMsgContainer.Id() ).Priority(); + result = iEntry.Priority() > aMsgContainer.iEntry.Priority(); break; case EFSMailSortByFlagStatus: - result = Entry( iId ).New() > Entry( aMsgContainer.Id() ).New(); + result = iEntry.New() > aMsgContainer.iEntry.New(); break; case EFSMailSortByUnread: - result = Entry( iId ).Unread() > Entry( aMsgContainer.Id() ).Unread(); + result = iEntry.Unread() > aMsgContainer.iEntry.Unread(); break; case EFSMailSortBySize: - result = Entry( iId ).iSize > Entry( aMsgContainer.Id() ).iSize; + result = iEntry.iSize > aMsgContainer.iEntry.iSize; break; case EFSMailSortByAttachment: - result = Entry( iId ).iDate > Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate > aMsgContainer.iEntry.iDate; break; } @@ -212,12 +222,12 @@ break; case EFSMailSortByDate: - result = Entry( iId ).iDate >= Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate >= aMsgContainer.iEntry.iDate; break; case EFSMailSortBySender: { - HBufC* leftSender = NULL; + /*HBufC* leftSender = NULL; HBufC* rightSender = NULL; GetSenderStringsCC( @@ -227,13 +237,14 @@ rightSender ); result = *leftSender >= *rightSender; - CleanupStack::PopAndDestroy( 2, leftSender ); + CleanupStack::PopAndDestroy( 2, leftSender );*/ + result = iEntry.iDetails > aMsgContainer.iEntry.iDetails; } break; case EFSMailSortBySubject: { - HBufC* leftSubject = NULL; + /*HBufC* leftSubject = NULL; HBufC* rightSubject = NULL; GetSubjectStringsCC( @@ -243,32 +254,33 @@ rightSubject ); result = *leftSubject >= *rightSubject; - CleanupStack::PopAndDestroy( 2, leftSubject ); + CleanupStack::PopAndDestroy( 2, leftSubject );*/ + result = iEntry.iDescription > aMsgContainer.iEntry.iDescription; } break; - + case EFSMailSortByPriority: - result = Entry( iId ).Priority() >= Entry( aMsgContainer.Id() ).Priority(); + result = iEntry.Priority() >= aMsgContainer.iEntry.Priority(); break; - + case EFSMailSortByFlagStatus: - result = Entry( iId ).New() >= Entry( aMsgContainer.Id() ).New(); + result = iEntry.New() >= aMsgContainer.iEntry.New(); break; - + case EFSMailSortByUnread: - result = Entry( iId ).Unread() >= Entry( aMsgContainer.Id() ).Unread(); + result = iEntry.Unread() >= aMsgContainer.iEntry.Unread(); break; - + case EFSMailSortBySize: - result = Entry( iId ).iSize >= Entry( aMsgContainer.Id() ).iSize; + result = iEntry.iSize >= aMsgContainer.iEntry.iSize; break; - + case EFSMailSortByAttachment: - result = Entry( iId ).iDate >= Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate >= aMsgContainer.iEntry.iDate; break; } - - return result; + + return result; } // --------------------------------------------------------------------------- @@ -288,12 +300,12 @@ break; case EFSMailSortByDate: - result = Entry( iId ).iDate <= Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate <= aMsgContainer.iEntry.iDate; break; case EFSMailSortBySender: { - HBufC* leftSender = NULL; + /*HBufC* leftSender = NULL; HBufC* rightSender = NULL; GetSenderStringsCC( @@ -303,13 +315,14 @@ rightSender ); result = *leftSender <= *rightSender; - CleanupStack::PopAndDestroy( 2, leftSender ); + CleanupStack::PopAndDestroy( 2, leftSender );*/ + result = iEntry.iDetails > aMsgContainer.iEntry.iDetails; } break; case EFSMailSortBySubject: { - HBufC* leftSubject = NULL; + /*HBufC* leftSubject = NULL; HBufC* rightSubject = NULL; GetSubjectStringsCC( @@ -319,34 +332,36 @@ rightSubject ); result = *leftSubject <= *rightSubject; - CleanupStack::PopAndDestroy( 2, leftSubject ); + CleanupStack::PopAndDestroy( 2, leftSubject );*/ + result = iEntry.iDescription > aMsgContainer.iEntry.iDescription; } break; case EFSMailSortByPriority: - result = Entry( iId ).Priority() <= Entry( aMsgContainer.Id() ).Priority(); + result = iEntry.Priority() <= aMsgContainer.iEntry.Priority(); break; - + case EFSMailSortByFlagStatus: - result = Entry( iId ).New() <= Entry( aMsgContainer.Id() ).New(); + result = iEntry.New() <= aMsgContainer.iEntry.New(); break; - + case EFSMailSortByUnread: - result = Entry( iId ).Unread() <= Entry( aMsgContainer.Id() ).Unread(); + result = iEntry.Unread() <= aMsgContainer.iEntry.Unread(); break; - + case EFSMailSortBySize: - result = Entry( iId ).iSize <= Entry( aMsgContainer.Id() ).iSize; + result = iEntry.iSize <= aMsgContainer.iEntry.iSize; break; - + case EFSMailSortByAttachment: - result = Entry( iId ).iDate <= Entry( aMsgContainer.Id() ).iDate; + result = iEntry.iDate <= aMsgContainer.iEntry.iDate; break; } return result; } +/* // --------------------------------------------------------------------------- // CIpsPlgSearch::TMsgContainer::GetSenderStringsCC() // --------------------------------------------------------------------------- @@ -386,7 +401,7 @@ aRightSubject = entry.iDescription.Alloc(); TRAP_IGNORE( CleanupStack::PushL( aRightSubject ) ); } - +*/ // --------------------------------------------------------------------------- // CIpsPlgSearch::TMsgContainer::TMsgContainer() // --------------------------------------------------------------------------- @@ -395,10 +410,11 @@ const TMsgContainer& aMsgContainer ) { FUNC_LOG; - iId = aMsgContainer.Id(); + iEntry = aMsgContainer.iEntry; + /*Id() = aMsgContainer.Id();*/ return *this; } - +/* // --------------------------------------------------------------------------- // CIpsPlgSearch::TMsgContainer::Entry() // --------------------------------------------------------------------------- @@ -423,6 +439,7 @@ aMsvSession.GetEntry( aId, service, entry ); return entry; } + */ // ======== CLASS CIPSPLGSEARCH ======== @@ -993,11 +1010,11 @@ ( entry.iMtm.iUid == KSenduiMtmSmtpUidValue || entry.iMtm.iUid == iPlugin.MtmId().iUid ) ) { - iEmailMessages.AppendL( TMsgContainer( - entry.Id(), iCurrentSearch.iSortCriteria, iMsvSession ) ); - } + iEmailMessages.AppendL( TMsgContainer( entry, + iCurrentSearch.iSortCriteria ) ); + } } - } + } } //Ask client if it wants to change the search prority (i.e. to enable search for contact) diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsosbaseplugin.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -655,6 +655,7 @@ iOperations[i]->BaseOperation(); if ( baseOp && baseOp->FSMailboxId() == aMailBoxId && ( baseOp->IpsOpType() == EIpsOpTypePop3SyncOp + || baseOp->IpsOpType() == EIpsOpTypePop3PopulateOp || baseOp->IpsOpType() == EIpsOpTypeImap4SyncOp || baseOp->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) { @@ -2198,7 +2199,8 @@ if ( op && ( op->IpsOpType() == EIpsOpTypeImap4SyncOp || op->IpsOpType() == EIpsOpTypePop3SyncOp || - op->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) + op->IpsOpType() == EIpsOpTypeImap4PopulateOp || + op->IpsOpType() == EIpsOpTypePop3PopulateOp ) ) { service = op->Service(); } diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssosplugin/src/ipsplgsyncstatehandler.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsyncstatehandler.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsyncstatehandler.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -141,6 +141,7 @@ if ( baseOp && baseOp->FSMailboxId() == aMailboxId && ( baseOp->IpsOpType() == EIpsOpTypePop3SyncOp || + baseOp->IpsOpType() == EIpsOpTypePop3PopulateOp || baseOp->IpsOpType() == EIpsOpTypeImap4SyncOp || baseOp->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) { @@ -168,6 +169,7 @@ if ( baseOp && baseOp->FSMailboxId() == aMailBoxId && ( baseOp->IpsOpType() == EIpsOpTypePop3SyncOp + || baseOp->IpsOpType() == EIpsOpTypePop3PopulateOp || baseOp->IpsOpType() == EIpsOpTypeImap4SyncOp || baseOp->IpsOpType() == EIpsOpTypeOnlineOp || baseOp->IpsOpType() == EIpsOpTypeImap4PopulateOp ) ) diff -r efd4f1afd43e -r d620048b4810 ipsservices/ipssossettings/src/ipssetdataapi.cpp --- a/ipsservices/ipssossettings/src/ipssetdataapi.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/ipsservices/ipssossettings/src/ipssetdataapi.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -45,7 +45,8 @@ #include "ipssetdataapi.h" #include "ipssetwizardadapter.h" -#include "ipssetwizardsettingscenrepkeys.h" +#include "ipssetwizardsettingscenrepkeys.h" +#include "freestyleemailcenrepkeys.h" #include "ipssetdatasignature.h" const TInt KIpsDataApiMaxPassLen = 256; @@ -443,10 +444,7 @@ TInt err3 = repository->Set( ECRKMaxAccountsReached, EFalse ); - if ( err3 != KErrNone ) - { - } - + delete repository; repository = NULL; } @@ -667,6 +665,18 @@ FUNC_LOG; TInt sizeLimit = aImap4Settings.BodyTextSizeLimit(); + + CRepository* centRep = NULL; + TRAP_IGNORE( centRep = CRepository::NewL( KFreestyleEmailCenRep ) ); + + TInt limit( 0 ); + TInt err = centRep->Get( KFreestyleMaxBodySize , limit ); + limit *= KKilo; + if ( limit == 0 || err ) + { + limit = KMaxTInt; + } + if ( sizeLimit == KIpsSetDataHeadersOnly ) { aInfo.iTotalSizeLimit = KIpsSetDataHeadersOnly; @@ -675,7 +685,7 @@ { aInfo.iTotalSizeLimit = KMaxTInt; aInfo.iAttachmentSizeLimit = KMaxTInt; - aInfo.iBodyTextSizeLimit = KMaxTInt; + aInfo.iBodyTextSizeLimit = limit; aInfo.iMaxEmailSize = KMaxTInt; aInfo.iPartialMailOptions = ENoSizeLimits; aInfo.iGetMailBodyParts = EGetImap4EmailBodyTextAndAttachments; @@ -684,7 +694,7 @@ { aInfo.iTotalSizeLimit = KMaxTInt; aInfo.iAttachmentSizeLimit = 0; - aInfo.iBodyTextSizeLimit = KMaxTInt; + aInfo.iBodyTextSizeLimit = limit; aInfo.iMaxEmailSize = KMaxTInt; aInfo.iPartialMailOptions = EBodyAlternativeText; aInfo.iGetMailBodyParts = EGetImap4EmailBodyAlternativeText; @@ -695,7 +705,7 @@ // set zero when it not documentated does total size overrides these aInfo.iAttachmentSizeLimit = 0; aInfo.iMaxEmailSize = sizeLimit*1024; - aInfo.iBodyTextSizeLimit = sizeLimit*1024; + aInfo.iBodyTextSizeLimit = Min(sizeLimit*1024, limit); aInfo.iPartialMailOptions = EBodyAlternativeText; aInfo.iGetMailBodyParts = EGetImap4EmailBodyAlternativeText; } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/inc/cmrfieldcontainer.h --- a/meetingrequest/mrgui/inc/cmrfieldcontainer.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/inc/cmrfieldcontainer.h Thu Jul 15 18:19:25 2010 +0300 @@ -27,53 +27,66 @@ class MMRFieldContainerObserver; // CLASS DECLARATIONS -NONSHARABLE_CLASS( CMRFieldContainer ) : +NONSHARABLE_CLASS( CMRFieldContainer ) : public CCoeControl, public MESMRListObserver { public: // Creation and destruction /** * Static constructor. - * + * * @return New instance of this class */ - static CMRFieldContainer* NewL( - MESMRFieldStorage& aFactory, + static CMRFieldContainer* NewL( + MESMRFieldStorage& aFactory, const CCoeControl& aParent ); /** * Destructor */ ~CMRFieldContainer(); - + public: // Interface - - /** - * Return focused field. - * @return Focused list item or NULL if no focused item - */ - CESMRField* FocusedField() const; - - /** - * Moves focus up one step. - * - * @param aHiddenFocus, in case of hidden focus use case, ETrue. - * @return TKeyResponse, if key response was used or not - */ - TKeyResponse MoveFocusUpL( TBool aHiddenFocus ); + + /** + * Return focused field. + * @return Focused list item or NULL if no focused item + */ + CESMRField* FocusedField() const; + + /** + * Moves focus up one step. + * + * @param aHiddenFocus, in case of hidden focus use case, ETrue. + * @return TKeyResponse, if key response was used or not + */ + TKeyResponse MoveFocusUpL( TBool aHiddenFocus ); - /** - * Moves focus down one step. - * - * @param aHiddenFocus, in case of hidden focus use case, ETrue. - * @return TKeyResponse, if key response was used or not - */ - TKeyResponse MoveFocusDownL( TBool aHiddenFocus ); - - /** - * Moves focus visible if it is partly or completely out of - * viewable area. - */ - void SetFieldContainerObserver( MMRFieldContainerObserver* aObserver ); + /** + * Moves focus down one step. + * + * @param aHiddenFocus, in case of hidden focus use case, ETrue. + * @return TKeyResponse, if key response was used or not + */ + TKeyResponse MoveFocusDownL( TBool aHiddenFocus ); + + /** + * Moves focus visible if it is partly or completely out of + * viewable area. + */ + void SetFieldContainerObserver( MMRFieldContainerObserver* aObserver ); + + /** + * Scrolls field container. This is called by list pane during + * kinetic scrolling. + * @param aTl new top left corner of the container + */ + void ScrollContainer( const TPoint& aTl ); + + /** + * Synchronizes field container and visible field positions after + * kinetic scrolling. + */ + void Synchronize(); public: // From MESMRListObserver void ControlSizeChanged( CESMRField* aField ); @@ -86,15 +99,17 @@ void ScrollControlVisible( TInt aInd ); void RePositionFields( TInt aAmount ); TRect ViewableAreaRect(); - + public: // From CCoeControl TSize MinimumSize(); - + private: // From CCoeControl TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aIndex ) const; void SizeChanged(); - + void Draw( const TRect& aRect ) const; + void HandlePointerEventL( const TPointerEvent &aPointerEvent ); + private: // Implementation CMRFieldContainer( MESMRFieldStorage& aFactory ); void ConstructL( const CCoeControl& aParent ); @@ -103,7 +118,8 @@ TInt LastVisibleField( TESMREntryFieldId aFieldId ); void DoSetFocusL( TInt aNewFocusIndex ); TKeyResponse MoveFocusVisibleL(); - + void SetScrolling( TBool aScrolling ); + private: // Data // Own: Informs listapane about needed position changes MMRFieldContainerObserver* iObserver; @@ -111,9 +127,10 @@ MESMRFieldStorage& iFactory; /// Own: Current focus index TInt iFocusedFieldIndex; - + /// Own: Flag for kinetic scrolling state + TBool iScrolling; }; - + #endif // CMRFIELDCONTAINER_H // End of file diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/inc/cmrlistpane.h --- a/meetingrequest/mrgui/inc/cmrlistpane.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/inc/cmrlistpane.h Thu Jul 15 18:19:25 2010 +0300 @@ -143,6 +143,11 @@ * after list pane construction. */ void ReActivateL(); + + /** + * Records drawing commands of the visible fields + */ + void RecordFields(); public: // MMRFieldContainerObserver void ScrollFieldsUp( TInt aPx ); @@ -184,6 +189,7 @@ void ForwardReceivedPointerEventsToChildrenL(); void HandleTactileFeedback( const TTouchLogicalFeedback& aType ); TBool FeedbackScrollMarginExceeded( TInt aMargin ); + void UpdatePosition(); private: // Data /// Ref: Storage for list items. @@ -216,6 +222,12 @@ TInt iPreviousVerticalScrollIndex; /// Own: This records default field height for tactile feedback during scroll TInt iDefaultFieldHeight; + /// Own: Flag to determine if pointer event is being processed + TBool iPointerEventInProgress; + /// Own: Flag to determine if position is being changed + TBool iPositionChanged; + /// Own: Updated field container position + TPoint iUpdatedPanePoint; }; #endif // CMRLISTPANE_H diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/bwins/esmrfieldbuildercommonu.def --- a/meetingrequest/mrgui/mrfieldbuildercommon/bwins/esmrfieldbuildercommonu.def Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/bwins/esmrfieldbuildercommonu.def Thu Jul 15 18:19:25 2010 +0300 @@ -119,4 +119,7 @@ ?ResetActionMenuL@CESMRRichTextViewer@@QBEXXZ @ 118 NONAME ; void CESMRRichTextViewer::ResetActionMenuL(void) const ?SupportsLongTapFunctionalityL@CESMRField@@UAEHABUTPointerEvent@@@Z @ 119 NONAME ; int CESMRField::SupportsLongTapFunctionalityL(struct TPointerEvent const &) ?PointerEventOccuresOnALinkL@CESMRRichTextViewer@@QAEHABUTPointerEvent@@@Z @ 120 NONAME ; int CESMRRichTextViewer::PointerEventOccuresOnALinkL(struct TPointerEvent const &) + ?RecordField@CESMRField@@QAEXXZ @ 121 NONAME ; void CESMRField::RecordField(void) + ?Draw@CESMRField@@UBEXABVTRect@@@Z @ 122 NONAME ; void CESMRField::Draw(class TRect const &) const + ?MoveToScreen@CESMRField@@QAEXH@Z @ 123 NONAME ; void CESMRField::MoveToScreen(int) diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/eabi/esmrfieldbuildercommonu.def --- a/meetingrequest/mrgui/mrfieldbuildercommon/eabi/esmrfieldbuildercommonu.def Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/eabi/esmrfieldbuildercommonu.def Thu Jul 15 18:19:25 2010 +0300 @@ -149,3 +149,7 @@ _ZNK19CESMRRichTextViewer12GetFocusLinkEv @ 148 NONAME _ZN10CESMRField29SupportsLongTapFunctionalityLERK13TPointerEvent @ 149 NONAME _ZN19CESMRRichTextViewer27PointerEventOccuresOnALinkLERK13TPointerEvent @ 150 NONAME + _ZN10CESMRField11RecordFieldEv @ 151 NONAME + _ZN10CESMRField12MoveToScreenEi @ 152 NONAME + _ZNK10CESMRField4DrawERK5TRect @ 153 NONAME + diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/group/esmrfieldbuildercommon.mmp --- a/meetingrequest/mrgui/mrfieldbuildercommon/group/esmrfieldbuildercommon.mmp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/group/esmrfieldbuildercommon.mmp Thu Jul 15 18:19:25 2010 +0300 @@ -48,6 +48,7 @@ SOURCE cmrattachmentprogressinfo.cpp SOURCE cmrfilemanager.cpp SOURCE cmrgrid.cpp +SOURCE cmrrecordinggc.cpp LIBRARY esmrcommon.lib LIBRARY esmrfieldevent.lib @@ -81,6 +82,7 @@ LIBRARY apgrfx.lib LIBRARY apmime.lib LIBRARY egul.lib +LIBRARY ws32.lib #if defined( ENABLE_TRACES ) && defined( TRACE_INTO_FILE ) LIBRARY flogger.lib diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/inc/cesmrfield.h --- a/meetingrequest/mrgui/mrfieldbuildercommon/inc/cesmrfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/inc/cesmrfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -34,12 +34,12 @@ class MESMRListObserver; class MESMRCalEntry; -class CESMRBorderLayer; class CMRBackground; class MTouchFeedback; class MESMRFieldValidator; class CEikMenuPane; class MTouchFeedback; +class CMRRecordingGc; // Enumeration for border type enum TESMRFieldFocusType @@ -348,6 +348,17 @@ IMPORT_C virtual TBool SupportsLongTapFunctionalityL( const TPointerEvent &aPointerEvent ); + /** + * Moves field to and away from screen + * @param aVisible if ETrue, field is moved to screen + */ + IMPORT_C void MoveToScreen( TBool aVisible ); + + /** + * Records field drawing commands to custom graphics context + */ + IMPORT_C void RecordField(); + protected: /** @@ -423,6 +434,7 @@ IMPORT_C virtual TInt CountComponentControls() const; IMPORT_C virtual CCoeControl* ComponentControl( TInt aInd ) const; IMPORT_C virtual TSize MinimumSize(); + IMPORT_C void Draw( const TRect& aRect ) const; protected: // From base class CCoeControl @@ -464,11 +476,12 @@ private: void AquireTactileFeedback(); + void DrawControl( CCoeControl* aControl ) const; protected: // data /// Own: control which is surrounded by border CCoeControl* iExtControl; - /// Ref: Observer for notifying list component + /// Ref: Observer for notifying field container MESMRListObserver* iObserver; /// Ref: Id for this field. TESMREntryFieldId iFieldId; @@ -504,6 +517,8 @@ MESMRFieldValidator* iValidator; /// Own: lock status TBool iLocked; + /// Own: Cache for drawing commands + CMRRecordingGc* iRecordingGc; }; -#endif +#endif // CESMRFIELD_H diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/inc/cmrrecordinggc.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/inc/cmrrecordinggc.h Thu Jul 15 18:19:25 2010 +0300 @@ -0,0 +1,211 @@ +/* +* Copyright (c) 2010 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: Recording graphics context used to cache drawing commands. +* +*/ + + +#include +#include + +class CFbsBitmap; +class CFbsBitGc; +class CFbsBitmapDevice; + +NONSHARABLE_CLASS( CMRRecordingGc ) : public CWindowGc + { +public: + + CMRRecordingGc( CWindowGc& aRealGc ); + ~CMRRecordingGc(); + +public: + + /** + * Flush recorded drawing commands from buffer to the real + * graphics context. + * + * @param aRect Target rectangle to draw + */ + void FlushBuffer( const TRect& aRect ); + + /** + * Delete recorded drawing commands + */ + void PurgeBuffer(); + +public: // From CGraphicsContext + + void SetOrigin(const TPoint &aPoint=TPoint(0,0)); + +protected: + + // From CWindowGc + + void Activate( RDrawableWindow &aDevice ); + void Deactivate(); + + // From CGraphicsContext + CGraphicsDevice* Device() const; + void SetDrawMode(TDrawMode aDrawingMode); + void SetClippingRect(const TRect& aRect); + void CancelClippingRect(); + void Reset(); + + void UseFont(const CFont *aFont); + void DiscardFont(); + void SetUnderlineStyle(TFontUnderline aUnderlineStyle); + void SetStrikethroughStyle( TFontStrikethrough aStrikethroughStyle ); + + void SetWordJustification(TInt aExcessWidth,TInt aNumGaps); + void SetCharJustification(TInt aExcessWidth,TInt aNumChars); + + void SetPenColor(const TRgb &aColor); + void SetPenStyle(TPenStyle aPenStyle); + void SetPenSize(const TSize& aSize); + + void SetBrushColor(const TRgb &aColor); + void SetBrushStyle(TBrushStyle aBrushStyle); + void SetBrushOrigin(const TPoint &aOrigin); + void UseBrushPattern(const CFbsBitmap *aDevice); + void DiscardBrushPattern(); + + void MoveTo(const TPoint &aPoint); + void MoveBy(const TPoint &aPoint); + void Plot(const TPoint &aPoint); + + void DrawArc(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd); + void DrawLine(const TPoint &aPoint1,const TPoint &aPoint2); + void DrawLineTo(const TPoint &aPoint); + void DrawLineBy( const TPoint& aPoint ); + + void DrawPolyLine(const CArrayFix *aPointList); + void DrawPolyLine(const TPoint* aPointList,TInt aNumPoints); + + void DrawPie(const TRect &aRect,const TPoint &aStart,const TPoint &aEnd); + void DrawEllipse(const TRect &aRect); + void DrawRect(const TRect &aRect); + void DrawRoundRect(const TRect &aRect,const TSize &aEllipse); + TInt DrawPolygon(const CArrayFix *aPointList,TFillRule aFillRule=EAlternate); + TInt DrawPolygon(const TPoint* aPointList,TInt aNumPoints,TFillRule aFillRule=EAlternate); + + void DrawBitmap(const TPoint &aTopLeft, const CFbsBitmap *aDevice); + void DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice); + void DrawBitmap(const TRect &aDestRect, const CFbsBitmap *aDevice, const TRect &aSourceRect); + void DrawBitmapMasked(const TRect& aDestRect, const CFbsBitmap* aBitmap, const TRect& aSourceRect, const CFbsBitmap* aMaskBitmap, TBool aInvertMask); + void DrawBitmapMasked(const TRect& aDestRect, const CWsBitmap* aBitmap, const TRect& aSourceRect, const CWsBitmap* aMaskBitmap, TBool aInvertMask); + + void DrawText(const TDesC &aBuf,const TPoint &aPos); + void DrawText(const TDesC &aBuf,const TRect &aBox,TInt aBaselineOffset,TTextAlign aHoriz=ELeft,TInt aLeftMrg=0); + + // From CBitmapContext + void Clear(); + void Clear(const TRect &aRect); + void CopyRect(const TPoint &anOffset,const TRect &aRect); + void BitBlt(const TPoint &aPos, const CFbsBitmap *aBitmap); + void BitBlt(const TPoint &aDestination, const CFbsBitmap *aBitmap, const TRect &aSource); + void BitBltMasked(const TPoint& aPoint,const CFbsBitmap* aBitmap,const TRect& aSourceRect,const CFbsBitmap* aMaskBitmap,TBool aInvertMask); + void BitBlt(const TPoint &aPoint, const CWsBitmap *aBitmap); + void BitBlt(const TPoint &aDestination, const CWsBitmap *aBitmap, const TRect &aSource); + void BitBltMasked(const TPoint& aPoint,const CWsBitmap *aBitmap,const TRect& aSourceRect,const CWsBitmap *aMaskBitmap,TBool aInvertMask); + void MapColors(const TRect& aRect,const TRgb* aColors,TInt aNumPairs=2,TBool aMapForwards=ETrue); + + void DrawTextVertical(const TDesC& aText,const TPoint& aPos,TBool aUp); + void DrawTextVertical(const TDesC& aText,const TRect& aBox,TInt aBaselineOffset,TBool aUp,TTextAlign aVert=ELeft,TInt aMargin=0); + + //=================Extra functions specific to wserv GDI============== + void SetDitherOrigin(const TPoint& aPoint); + TInt SetClippingRegion(const TRegion &aRegion); + void CancelClippingRegion(); + void SetOpaque(TBool aDrawOpaque=ETrue); + + // From CFbsBitGc + void SetFaded(TBool aFaded); + void SetFadingParameters(TUint8 aBlackMap,TUint8 aWhiteMap); + TInt AlphaBlendBitmaps(const TPoint& aDestPt, const CFbsBitmap* aSrcBmp, const TRect& aSrcRect, const CFbsBitmap* aAlphaBmp, const TPoint& aAlphaPt); + TInt AlphaBlendBitmaps(const TPoint& aDestPt, const CWsBitmap* aSrcBmp, const TRect& aSrcRect, const CWsBitmap* aAlphaBmp, const TPoint& aAlphaPt); + + TAny* Interface( TUid aInterfaceId ); + const TAny* Interface( TUid aInterfaceId ) const; + +protected: + TInt APIExtension( TUid aUid, TAny*& aOutput, TAny* aInput ); + +private: + + /** + * Buffer item to store drawing command and parameters + */ + NONSHARABLE_CLASS( CBufferItem ) : public CBase + { + public: + enum TCommandType + { + EShortText, + ELongText, + ESetPenColor, + EBitBlt1, + EBitBlt2, + EBitBltMasked1, + EUseFont, + EDiscardFont, + ESetDrawMode, + ESetClippingRect, + ECancelClippingRect, + ESetBrushColor, + ESetBrushStyle, + EDrawRect, + EClear, + EDrawLine, + ESetUnderlineStyle, + ESetStrikethroughStyle + }; + + public: + ~CBufferItem(); + + /** + * Translated commaned with given point + */ + void Translate( const TPoint& aPoint ); + + TInt iType; + HBufC* iText; + TPoint iPosition; + TRect iBox; + TInt iBaseLineOffset; + //TTextAlign iHorizontal; + TInt iLeftMargin; + TRgb iColor; + const CFbsBitmap* iBitmap; + const CFbsBitmap* iMask; + TRect iSource; + TBool iInvertMask; + const CFont* iFont; + //TDrawMode iDrawMode; + //TBrushStyle iBrushStyle; + TRect iRect; + TInt iValue; + }; + + CBufferItem* BufferItem(); + + /// Ref: Real window GC for actual drawing + CWindowGc& iRealGc; + /// Own: Array of recorded drawing commands + RPointerArray iItems; + /// Own: Recording origin relative to real context + TPoint iOrigin; + }; + diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp --- a/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -23,6 +23,7 @@ #include "cesmrfieldcommandevent.h" #include "cmrbackground.h" #include "esmrcommands.h" +#include "cmrrecordinggc.h" #include "emailtrace.h" @@ -34,6 +35,12 @@ #include #include +namespace +{ +// Off-screen x coordinate for fields +const TInt KOffScreenPositionX = 1000; +} + // ======== MEMBER FUNCTIONS ======== // --------------------------------------------------------------------------- @@ -65,6 +72,7 @@ iEventQueue->RemoveObserver( this ); } delete iBackground; + delete iRecordingGc; } // --------------------------------------------------------------------------- @@ -79,6 +87,7 @@ iBackground = CMRBackground::NewL(); this->SetBackground( iBackground ); + iRecordingGc = new( ELeave ) CMRRecordingGc( SystemGc() ); } // --------------------------------------------------------------------------- @@ -219,6 +228,23 @@ } // --------------------------------------------------------------------------- +// CESMRField::Draw +// --------------------------------------------------------------------------- +// +EXPORT_C void CESMRField::Draw( const TRect& aRect ) const + { + FUNC_LOG; + + // Draw only if field is not on screen + if ( Position().iX != Parent()->Position().iX ) + { + // Flush cached drawing commands from custom graphics context + iRecordingGc->FlushBuffer( aRect ); + } + + } + +// --------------------------------------------------------------------------- // CESMRField::HandlePointerEventL // --------------------------------------------------------------------------- // @@ -256,11 +282,17 @@ EXPORT_C void CESMRField::SetContainerWindowL(const CCoeControl& aContainer) { FUNC_LOG; + + // Use container window from aContainer + // This will set also aContainer as MOP parent and CCoeControl parent CCoeControl::SetContainerWindowL( aContainer ); - if ( iExtControl ) + + // Set this same window and this as parent for component controls + TInt count( CountComponentControls() ); + + for ( TInt i = 0; i < count; ++i ) { - iExtControl->SetContainerWindowL( aContainer ); - iExtControl->SetParent( this ); + ComponentControl( i )->SetContainerWindowL( *this ); } } @@ -322,6 +354,7 @@ { FUNC_LOG; iOutlineFocus = aFocus; + if ( iExtControl ) { iExtControl->SetFocus( aFocus ); @@ -829,6 +862,9 @@ FUNC_LOG; delete iExtControl; iExtControl = aControl; + + // Set also container window + iExtControl->SetContainerWindowL( *this ); } // --------------------------------------------------------------------------- @@ -856,7 +892,7 @@ // --------------------------------------------------------------------------- // EXPORT_C TBool CESMRField::SupportsLongTapFunctionalityL( - const TPointerEvent &aPointerEvent ) + const TPointerEvent& /*aPointerEvent*/ ) { FUNC_LOG; // Subclasses may override for field specific actions @@ -864,6 +900,41 @@ } // --------------------------------------------------------------------------- +// CESMRField::MoveToScreen +// --------------------------------------------------------------------------- +// +EXPORT_C void CESMRField::MoveToScreen( TBool aVisible ) + { + FUNC_LOG + + // Check that field is activated + if ( IsActivated() ) + { + TPoint pos( Position() ); + + if ( aVisible ) + { + // Set x coordinate to parent (field container) x coordinate + pos.iX = Parent()->Position().iX; + } + else + { + // Move field outside screen + pos.iX = KOffScreenPositionX; + // Record field drawing commands + RecordField(); + } + + if ( pos != Position() ) + { + // Set new position only if it different from current one + // Setting new position potentially causes relayout in field + SetPosition( pos ); + } + } + } + +// --------------------------------------------------------------------------- // CESMRField::HandleTactileFeedbackL // --------------------------------------------------------------------------- // @@ -892,6 +963,74 @@ } } +// --------------------------------------------------------------------------- +// CESMRField::RecordField +// --------------------------------------------------------------------------- +// +EXPORT_C void CESMRField::RecordField() + { + FUNC_LOG; + + // Record only activated field + if ( IsActivated() ) + { + // Purge old draw commands + iRecordingGc->PurgeBuffer(); + + // Set recording graphics context to be used for drawing + SetCustomGc( iRecordingGc ); + + // Set gc origin to point (-x,-y) + // This will cause drawing commands to be relative to point (0,0) + iRecordingGc->SetOrigin( -iPosition ); + + // Draw custom background if available + const MCoeControlBackground* bg = Background(); + if ( bg ) + { + bg->Draw( *iRecordingGc, *this, Rect() ); + } + + // Draw child controls + DrawControl( this ); + + // Reset custom gc + SetCustomGc( NULL ); + } + } + +// --------------------------------------------------------------------------- +// CESMRField::DrawControl +// --------------------------------------------------------------------------- +// +void CESMRField::DrawControl( CCoeControl* aControl ) const + { + TInt count( aControl->CountComponentControls() ); + + for ( TInt i = 0; i < count; ++i ) + { + CCoeControl* control = aControl->ComponentControl( i ); + + // Draw only non-window owning children + if ( !control->OwnsWindow() ) + { + TRect rect( control->Rect() ); + + // Draw control background if available + const MCoeControlBackground* bg = control->Background(); + if ( bg ) + { + bg->Draw( *iRecordingGc, *control, rect ); + } + + // Draw control foreground + control->DrawForeground( rect ); + + // Draw child components + DrawControl( control ); + } + } + } // EOF diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp --- a/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description : CEikRichTextEditor based Rich Text viewer -* Version : %version: e002sa32#42.1.2 % +* Version : %version: e002sa33#45.3 % * */ @@ -333,7 +333,6 @@ switch ( aPointerEvent.iType ) { case TPointerEvent::EButton1Down: - case TPointerEvent::EDrag: { RRegion linkArea; CleanupClosePushL( linkArea ); @@ -352,6 +351,7 @@ { iCntMenuHdlr->Reset(); iCntMenuHdlr->SetContactMenuObserver( this ); + HighlightLinkL( *link ); DrawDeferred(); } @@ -395,7 +395,7 @@ } } - if ( !linkFound ) + if ( !linkFound && TPointerEvent::EDrag != aPointerEvent.iType ) { // Tap on plain text TextView()->ClearSelectionL(); @@ -924,10 +924,18 @@ { type = CESMRRichTextLink::ETypePhoneNumber; - // Remove unsupported characters from phone number + // patch the symbian level error , 10.120.22.141 this kind of url should not + // be recognized to be a phone number. TPtr phonePtr = valueBuf->Des ( ); - CommonPhoneParser::ParsePhoneNumber (phonePtr, - CommonPhoneParser::EContactCardNumber ); + if( phonePtr.Find(_L(".")) == KErrNotFound ) + { + CommonPhoneParser::ParsePhoneNumber (phonePtr, + CommonPhoneParser::EContactCardNumber ); + } + else + { + type = (CESMRRichTextLink::TType) -1 ; + } break; } case CFindItemEngine::EFindItemSearchURLBin: @@ -1106,12 +1114,12 @@ if ( iOpenActionMenu ) { // Activate link as actions have been discovered + iOpenActionMenu = EFalse; TRAP_IGNORE( LinkSelectedL() ); } // Reset menu observer - iCntMenuHdlr->SetContactMenuObserver( NULL ); - iOpenActionMenu = EFalse; + iCntMenuHdlr->SetContactMenuObserver( NULL ); } // ----------------------------------------------------------------------------- @@ -1121,8 +1129,11 @@ void CESMRRichTextViewer::ShowContextMenuL() { FUNC_LOG; - iOpenActionMenu = EFalse; - ProcessCommandL( EAknSoftkeyContextOptions ); + + if ( !iOpenActionMenu ) + { + ProcessCommandL( EAknSoftkeyContextOptions ); + } } // ----------------------------------------------------------------------------- @@ -1154,15 +1165,8 @@ CFont::TMeasureTextInput::EFVisualOrder ); TPoint tl( posInfo.iEdge ); + tl.iY -= iFont->FontMaxAscent(); - if ( AknLayoutUtils::LayoutMirrored() ) - { - // move top left x to end of text - // will be handled further, if all mr fields need to be changed the order from right to left. - //tl.iX -= textWidth; - } - - tl.iY -= iFont->FontMaxAscent(); TPoint br( tl.iX + textWidth, tl.iY + iFont->FontMaxHeight() ); TRect rect( Rect() ); diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuildercommon/src/cmrrecordinggc.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cmrrecordinggc.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -0,0 +1,1355 @@ +/* +* Copyright (c) 2010 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: Recording graphics context used to cache drawing commands +* +*/ + + + +#include +#include +#include +#include + +#include "cmrrecordinggc.h" +#include "emailtrace.h" + +namespace +{ + +#ifdef _DEBUG +_LIT( KPanicCategory, "CMRRecordingGc" ); + +enum TPanic + { + EBadArgument = 0, + ENotSupported + }; + +void Panic( TPanic aPanic ) + { + User::Panic( KPanicCategory, aPanic ); + } + +#endif // _DEBUG + +} + +// ======== MEMBER FUNCTIONS ======== + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::CMRRecordingGc +// ----------------------------------------------------------------------------- +// +CMRRecordingGc::CMRRecordingGc( CWindowGc& aRealGc ) + : CWindowGc( static_cast( aRealGc.Device() ) ), + iRealGc( aRealGc ) + { + FUNC_LOG; + } + + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::~CMRRecordingGc +// ----------------------------------------------------------------------------- +// +CMRRecordingGc::~CMRRecordingGc() + { + FUNC_LOG; + + iItems.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::FlushBuffer +// ----------------------------------------------------------------------------- +// +void CMRRecordingGc::FlushBuffer( const TRect& aRect ) + { + FUNC_LOG; + + if ( iItems.Count() == 0 ) + { + return; + } + + CBufferItem* item = NULL; + + // Use real graphics context + CBitmapContext* gc = &iRealGc; + + // Set graphics context origin relative to the drawing position + gc->SetOrigin( aRect.iTl ); + + for ( TInt i = 0; i < iItems.Count(); ++i ) + { + item = iItems[i]; + + switch ( item->iType ) + { + case CBufferItem::EShortText: + gc->DrawText( *item->iText, item->iPosition ); + break; + + case CBufferItem::ELongText: + gc->DrawText( + *item->iText, + item->iBox, + item->iBaseLineOffset, + TTextAlign( item->iValue ), //iHorizontal, + item->iLeftMargin ); + break; + + case CBufferItem::ESetPenColor: + gc->SetPenColor( item->iColor ); + break; + + case CBufferItem::EBitBltMasked1: + gc->BitBltMasked( + item->iPosition, + item->iBitmap, + item->iBox, + item->iMask, + item->iInvertMask ); + break; + + case CBufferItem::EUseFont: + gc->UseFont( item->iFont ); + break; + + case CBufferItem::EDiscardFont: + gc->DiscardFont(); + break; + + case CBufferItem::ESetDrawMode: + gc->SetDrawMode( TDrawMode( item->iValue ) ); + break; + + case CBufferItem::ESetClippingRect: + gc->SetClippingRect( item->iBox ); + break; + + case CBufferItem::ECancelClippingRect: + gc->CancelClippingRect(); + break; + + case CBufferItem::ESetBrushColor: + gc->SetBrushColor( item->iColor ); + break; + + case CBufferItem::ESetBrushStyle: + gc->SetBrushStyle( TBrushStyle( item->iValue ) );//iBrushStyle ); + break; + + case CBufferItem::EDrawRect: + gc->DrawRect( item->iRect ); + break; + + case CBufferItem::EClear: + gc->Clear( item->iRect ); + break; + + case CBufferItem::EDrawLine: + gc->DrawLine( item->iRect.iTl, item->iRect.iBr ); + break; + case CBufferItem::ESetUnderlineStyle: + gc->SetUnderlineStyle( TFontUnderline( item->iValue ) ); + break; + case CBufferItem::ESetStrikethroughStyle: + gc->SetStrikethroughStyle( TFontStrikethrough( item->iValue ) ); + break; + default: + break; + } + } + + // Reset gc + gc->Reset(); + } + + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::PurgeBuffer +// ----------------------------------------------------------------------------- +// +void CMRRecordingGc::PurgeBuffer() + { + FUNC_LOG; + + iItems.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::CBufferItem::~CBufferItem +// ----------------------------------------------------------------------------- +// +CMRRecordingGc::CBufferItem::~CBufferItem() + { + FUNC_LOG; + + delete iText; + delete iBitmap; + delete iMask; + } + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::CBufferItem::Translate +// ----------------------------------------------------------------------------- +// +void CMRRecordingGc::CBufferItem::Translate( const TPoint& aPoint ) + { + FUNC_LOG; + + iBox.Move( aPoint ); + iPosition += aPoint; + iRect.Move( aPoint ); + } + + +// ----------------------------------------------------------------------------- +// CMRRecordingGc::BufferItem +// ----------------------------------------------------------------------------- +// +CMRRecordingGc::CBufferItem* CMRRecordingGc::BufferItem() + { + FUNC_LOG; + + CBufferItem* buffer = NULL; + + TRAP_IGNORE( + { + buffer = new ( ELeave ) CBufferItem ; + CleanupStack::PushL( buffer ); + iItems.AppendL( buffer ); + CleanupStack::Pop( buffer ); + buffer->iPosition.SetXY( -1, -1 ); + } ); + + return buffer; + } + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Activate +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Activate( RDrawableWindow& /*aDevice*/ ) + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Deactivate +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Deactivate() + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Device +// From class CWindowGc +// --------------------------------------------------------------------------- +// +CGraphicsDevice* CMRRecordingGc::Device() const + { + FUNC_LOG; + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetOrigin +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetOrigin( const TPoint& aPoint ) + { + FUNC_LOG; + + iOrigin = aPoint; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetDrawMode +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetDrawMode( TDrawMode aDrawingMode ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetDrawMode; + buffer->iValue = aDrawingMode; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetClippingRect +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetClippingRect( const TRect& aRect ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetClippingRect; + buffer->iBox = aRect; + buffer->iPosition = aRect.iTl; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::CancelClippingRect +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::CancelClippingRect() + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ECancelClippingRect; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetClippingRegion +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::SetClippingRegion( const TRegion& /*aRegion*/ ) + { + FUNC_LOG; + + return 0; + } + + +// --------------------------------------------------------------------------- +// void CMRRecordingGc::Reset +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Reset() + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::UseFont +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::UseFont( const CFont* aFont ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EUseFont; + buffer->iFont = aFont; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DiscardFont +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DiscardFont() + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EDiscardFont; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetUnderlineStyle +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetUnderlineStyle( TFontUnderline aUnderlineStyle ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetUnderlineStyle; + buffer->iValue = aUnderlineStyle; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetStrikethroughStyle +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetStrikethroughStyle( + TFontStrikethrough aStrikethroughStyle ) + { + FUNC_LOG; + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetStrikethroughStyle; + buffer->iValue = aStrikethroughStyle; + } + } + + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetWordJustification +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetWordJustification( + TInt /*aExcessWidth*/, + TInt /*aNumGaps*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetCharJustification +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetCharJustification( + TInt /*aExcessWidth*/, + TInt /*aNumChars*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetPenColor +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetPenColor( const TRgb& aColor ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetPenColor; + buffer->iColor = aColor; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetPenStyle +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetPenStyle( TPenStyle /*aPenStyle*/ ) + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetPenSize +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetPenSize( const TSize& /*aSize*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetBrushColor +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetBrushColor( const TRgb& aColor ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetBrushColor; + buffer->iColor = aColor; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetBrushStyle +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetBrushStyle( TBrushStyle aBrushStyle ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ESetBrushStyle; + buffer->iValue = aBrushStyle; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetBrushOrigin +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetBrushOrigin( const TPoint& /*aOrigin*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::UseBrushPattern +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::UseBrushPattern( const CFbsBitmap* /*aDevice*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DiscardBrushPattern +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DiscardBrushPattern() + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::MoveTo +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::MoveTo( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::MoveBy +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::MoveBy( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Plot +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Plot( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawArc +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawArc( + const TRect& /*aRect*/, + const TPoint& /*aStart*/, + const TPoint& /*aEnd*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawLine +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawLine( + const TPoint& aPoint1, + const TPoint& aPoint2 ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EDrawLine; + buffer->iRect.iTl = aPoint1; + buffer->iRect.iBr = aPoint2; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawLineTo +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawLineTo( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawLineBy +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawLineBy( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawPolyLine +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawPolyLine( const CArrayFix* /*aPointList*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawPolyLine +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawPolyLine( + const TPoint* /*aPointList*/, + TInt /*aNumPoints*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawPie +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawPie( + const TRect& /*aRect*/, + const TPoint& /*aStart*/, + const TPoint& /*aEnd*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawEllipse +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawEllipse( const TRect& /*aRect*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawRect +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawRect( const TRect& aRect ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EDrawRect; + buffer->iRect = aRect; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawRoundRect +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawRoundRect( + const TRect& /*aRect*/, + const TSize& /*aEllipse*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawPolygon +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::DrawPolygon( + const CArrayFix* /*aPointList*/, + TFillRule /*aFillRule*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + + return KErrNotSupported; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawPolygon +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::DrawPolygon( + const TPoint* /*aPointList*/, + TInt /*aNumPoints*/, + TFillRule /*aFillRule*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + + return KErrNotSupported; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawBitmap +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawBitmap( + const TPoint& /*aTopLeft*/, + const CFbsBitmap* /*aDevice*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawBitmap +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawBitmap( + const TRect& /*aDestRect*/, + const CFbsBitmap* /*aDevice*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawBitmap +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawBitmap( + const TRect& /*aDestRect*/, + const CFbsBitmap* /*aDevice*/, + const TRect& /*aSourceRect*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawBitmapMasked +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawBitmapMasked( + const TRect& /*aDestRect*/, + const CFbsBitmap* /*aBitmap*/, + const TRect& /*aSourceRect*/, + const CFbsBitmap* /*aMaskBitmap*/, + TBool /*aInvertMask*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawBitmapMasked +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawBitmapMasked( + const TRect& /*aDestRect*/, + const CWsBitmap* /*aBitmap*/, + const TRect& /*aSourceRect*/, + const CWsBitmap* /*aMaskBitmap*/, + TBool /*aInvertMask*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawText +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawText( const TDesC& aBuf, const TPoint& aPos ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EShortText; + TRAP_IGNORE( buffer->iText = aBuf.AllocL() ); + buffer->iPosition = aPos; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawText +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawText( + const TDesC& aBuf, + const TRect& aBox, + TInt aBaselineOffset, + TTextAlign aHoriz, + TInt aLeftMrg ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::ELongText; + TRAP_IGNORE( buffer->iText = aBuf.AllocL() ); + buffer->iBox = aBox; + buffer->iBaseLineOffset = aBaselineOffset; + buffer->iValue = aHoriz; + buffer->iLeftMargin = aLeftMrg; + buffer->iPosition = aBox.iTl; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Clear +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Clear() + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Clear +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::Clear( const TRect& aRect ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EClear; + buffer->iRect = aRect; + buffer->Translate( iOrigin ); + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::CopyRect +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::CopyRect( + const TPoint& /*aOffset*/, + const TRect& /*aRect */ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBlt +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBlt( + const TPoint& /*aPos*/, + const CFbsBitmap* /*aBitmap*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBlt +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBlt( + const TPoint& aDestination, + const CFbsBitmap* aBitmap, + const TRect& aSource ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EBitBlt2; + buffer->iPosition = aDestination + iOrigin; + + // Duplicate bitmap + CFbsBitmap* bitmap = NULL; + TRAP_IGNORE( bitmap = new( ELeave ) CFbsBitmap; ) + bitmap->Duplicate( aBitmap->Handle() ); + buffer->iBitmap = bitmap; + buffer->iBox = aSource; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBltMasked +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBltMasked( + const TPoint& aPoint, + const CFbsBitmap* aBitmap, + const TRect& aSourceRect, + const CFbsBitmap* aMaskBitmap, + TBool aInvertMask ) + { + FUNC_LOG; + + CBufferItem* buffer = BufferItem(); + + if ( buffer ) + { + buffer->iType = CBufferItem::EBitBltMasked1; + buffer->iPosition = aPoint + iOrigin; + buffer->iBox = aSourceRect; + buffer->iInvertMask = aInvertMask; + + // Make a duplicate of passed in bitmap, so that to make sure + // the bitmap won't be freed when FlushBuffer(). (Duplicate + // only increases the access count for bitmap) + CFbsBitmap* bitmap = NULL; + CFbsBitmap* maskBitmap = NULL; + TRAP_IGNORE( bitmap = new (ELeave) CFbsBitmap; ) + TRAP_IGNORE( maskBitmap = new (ELeave) CFbsBitmap; ) + bitmap->Duplicate(aBitmap->Handle()); + maskBitmap->Duplicate(aMaskBitmap->Handle()); + buffer->iBitmap = bitmap; + buffer->iMask = maskBitmap; + } + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBlt +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBlt( + const TPoint& /*aPoint*/, + const CWsBitmap* /*aBitmap*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBlt +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBlt( + const TPoint& /*aDestination*/, + const CWsBitmap* /*aBitmap*/, + const TRect& /*aSource*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::BitBltMasked +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::BitBltMasked( + const TPoint& /*aPoint*/, + const CWsBitmap* /*aBitmap*/, + const TRect& /*aSourceRect*/, + const CWsBitmap* /*aMaskBitmap*/, + TBool /*aInvertMask*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::MapColors +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::MapColors( + const TRect& /*aRect*/, + const TRgb* /*aColors*/, + TInt /*aNumPairs*/, + TBool /*aMapForwards*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawTextVertical +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawTextVertical( + const TDesC& /*aText*/, + const TPoint& /*aPos*/, + TBool /*aUp*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::DrawTextVertical +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::DrawTextVertical( + const TDesC& /*aText*/, + const TRect& /*aBox*/, + TInt /*aBaselineOffset*/, + TBool /*aUp*/, + TTextAlign /*aVert*/, + TInt /*aMargin*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetDitherOrigin +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetDitherOrigin( const TPoint& /*aPoint*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::CancelClippingRegion +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::CancelClippingRegion() + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetOpaque +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetOpaque( TBool /*aDrawOpaque*/ ) + { + FUNC_LOG; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetFaded +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetFaded( TBool /*aFaded*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::SetFadingParameters +// From class CWindowGc +// --------------------------------------------------------------------------- +// +void CMRRecordingGc::SetFadingParameters( + TUint8 /*aBlackMap*/, + TUint8 /*aWhiteMap*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::AlphaBlendBitmaps +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::AlphaBlendBitmaps( + const TPoint& /*aDestPt*/, + const CFbsBitmap* /*aSrcBmp*/, + const TRect& /*aSrcRect*/, + const CFbsBitmap* /*aAlphaBmp*/, + const TPoint& /*aAlphaPt*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + + return KErrNotSupported; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::AlphaBlendBitmaps +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::AlphaBlendBitmaps( + const TPoint& /*aDestPt*/, + const CWsBitmap* /*aSrcBmp*/, + const TRect& /*aSrcRect*/, + const CWsBitmap* /*aAlphaBmp*/, + const TPoint& /*aAlphaPt*/ ) + { + FUNC_LOG; + + __ASSERT_DEBUG( EFalse, Panic( ENotSupported ) ); + + return KErrNotSupported; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Interface +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TAny* CMRRecordingGc::Interface( TUid /*aInterfaceId*/ ) + { + FUNC_LOG; + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::Interface +// From class CWindowGc +// --------------------------------------------------------------------------- +// +const TAny* CMRRecordingGc::Interface( TUid /*aInterfaceId*/ ) const + { + FUNC_LOG; + + return NULL; + } + + +// --------------------------------------------------------------------------- +// CMRRecordingGc::APIExtension +// From class CWindowGc +// --------------------------------------------------------------------------- +// +TInt CMRRecordingGc::APIExtension( + TUid aUid, + TAny*& /*aOutput*/, + TAny* aInput ) + { + FUNC_LOG; + + if (aUid == KDrawTextInContextUid) + { + __ASSERT_DEBUG( aInput, Panic( EBadArgument ) ); + TDrawTextInContextInternal* contextParam = + static_cast(aInput); + const TTextParameters* params = &contextParam->iParam; + __ASSERT_DEBUG( params, Panic( EBadArgument ) ); + TPtrC textToDraw = contextParam->iText.Mid( + params->iStart, + params->iEnd - params->iStart ); + DrawText( textToDraw, contextParam->iPosition ); + return KErrNone; + } + else + { + return KErrNotSupported; + } + } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdescriptionfield.h --- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdescriptionfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdescriptionfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -60,7 +60,6 @@ public: // From CCoeControl TKeyResponse OfferKeyEventL(const TKeyEvent& aEvent, TEventCode aType ); - void SetContainerWindowL( const CCoeControl& aContainer ); TSize MinimumSize(); void SizeChanged(); TInt CountComponentControls() const; diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdetailedsubjectfield.h --- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdetailedsubjectfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerdetailedsubjectfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -81,7 +81,6 @@ TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged(); - void SetContainerWindowL( const CCoeControl& aContainer ); public: // From MEikEdwinSizeObserver TBool HandleEdwinSizeEventL( diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerlocationfield.h --- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerlocationfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cesmrviewerlocationfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -75,7 +75,6 @@ TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged(); - void SetContainerWindowL( const CCoeControl& aContainer ); void GetCursorLineVerticalPos(TInt& aUpper, TInt& aLower); protected: // From MEikEdwinSizeObserver diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrmulticalenfield.h --- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrmulticalenfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrmulticalenfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -57,8 +57,7 @@ TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aIndex ) const; void SizeChanged(); - void SetContainerWindowL( const CCoeControl& aContainer ); - + private: /** * Constructor. diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrviewerattachmentfield.h --- a/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrviewerattachmentfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/inc/cmrviewerattachmentfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -78,7 +78,6 @@ CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged(); TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); - void SetContainerWindowL( const CCoeControl& aControl ); protected: // From MEikEdwinSizeObserver TBool HandleEdwinSizeEventL( CEikEdwin* aEdwin, TEdwinSizeEvent aType, TSize aDesirableEdwinSize); @@ -109,8 +108,6 @@ CMRImage* iLockIcon; // Owned. Attachment list. CESMRRichTextViewer* iRichTextViewer; - // Not owned. CBA. - CEikButtonGroupContainer* iButtonGroupContainer; // Own. Background control context. CAknsBasicBackgroundControlContext* iBgCtrlContext; // Attachment count diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description : ESMR location field implementation - * Version : %version: e002sa32#53.1.2 % + * Version : %version: e002sa32#53.1.3 % * */ @@ -410,8 +410,9 @@ if ( aEnabled ) { iWaypointIcon = CMRImage::NewL( - NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); - iWaypointIcon->SetParent( this ); + NMRBitmapManager::EMRBitmapLocationWaypoint, + this, + ETrue ); } SizeChanged(); diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsubjectfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -561,7 +561,9 @@ iPriorityIcon = NULL; iPriorityIcon = CMRImage::NewL( - NMRBitmapManager::EMRBitmapPriorityHigh, ETrue ); + NMRBitmapManager::EMRBitmapPriorityHigh, + this, + ETrue ); iPriorityIcon->SetParent( this ); if( iCurrentPriority == EFSCalenMRPriorityNormal ) { diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmdatefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmdatefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmdatefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -80,12 +80,10 @@ void CESMRViewerAlarmDateField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateStart ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateStart, this ); } // --------------------------------------------------------------------------- @@ -258,8 +256,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -86,12 +86,12 @@ void CESMRViewerAlarmField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAlarm ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapAlarm, + this ); } // --------------------------------------------------------------------------- @@ -302,8 +302,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmtimefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmtimefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralarmtimefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -78,12 +78,10 @@ void CESMRViewerAlarmTimeField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAlarmClock ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAlarmClock, this ); } // --------------------------------------------------------------------------- @@ -256,8 +254,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralldayeventfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralldayeventfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrvieweralldayeventfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -79,12 +79,12 @@ void CESMRViewerAllDayEventField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapCheckBoxOn ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapCheckBoxOn, + this ); } // --------------------------------------------------------------------------- @@ -232,8 +232,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -117,6 +117,7 @@ TPtrC text = aEntry.Entry().DescriptionL(); iRichTextViewer->SetTextL( &text, ETrue ); iRichTextViewer->SetMargins( KMargin ); + iRichTextViewer->ApplyLayoutChangesL(); } iDisableRedraw = ETrue; } @@ -148,17 +149,6 @@ } // --------------------------------------------------------------------------- -// CESMRViewerDescriptionField::SetContainerWindowL() -// --------------------------------------------------------------------------- -// -void CESMRViewerDescriptionField::SetContainerWindowL( const CCoeControl& aContainer ) - { - CESMRField::SetContainerWindowL( aContainer ); - iRichTextViewer->SetContainerWindowL( aContainer ); - iRichTextViewer->SetParent( this ); - } - -// --------------------------------------------------------------------------- // CESMRViewerDescriptionField::MinimumSize() // --------------------------------------------------------------------------- // @@ -271,6 +261,11 @@ iObserver->ControlSizeChanged ( this ); } + if ( !iOutlineFocus ) + { + RecordField(); + } + return iDisableRedraw; } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdetailedsubjectfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdetailedsubjectfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdetailedsubjectfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -115,9 +115,10 @@ void CESMRViewerDetailedSubjectField::ConstructL() { FUNC_LOG; - iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapOccasion ); - iFieldIcon->SetParent( this ); - + iFieldIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapOccasion, + this ); + iRichTextViewer = CESMRRichTextViewer::NewL( this ); CESMRField::ConstructL( iRichTextViewer ); // ownership transferred iRichTextViewer->SetEdwinSizeObserver( this ); @@ -199,14 +200,16 @@ if( entry.PriorityL() == EFSCalenMRPriorityHigh ) { iPriorityIcon = CMRImage::NewL( - NMRBitmapManager::EMRBitmapPriorityHigh, ETrue ); - iPriorityIcon->SetParent( this ); + NMRBitmapManager::EMRBitmapPriorityHigh, + this, + ETrue ); } if( entry.PriorityL() == EFSCalenMRPriorityLow ) { iPriorityIcon = CMRImage::NewL( - NMRBitmapManager::EMRBitmapPriorityLow, ETrue ); - iPriorityIcon->SetParent( this ); + NMRBitmapManager::EMRBitmapPriorityLow, + this, + ETrue ); } } @@ -265,12 +268,12 @@ delete iFieldIcon; iFieldIcon = NULL; - iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapSubject ); - iFieldIcon->SetParent( this ); - - DrawDeferred(); + iFieldIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapSubject, + this ); } - iDisableRedraw = ETrue; + + SizeChanged(); } // --------------------------------------------------------------------------- @@ -303,6 +306,12 @@ if ( iObserver && aEdwin == iRichTextViewer ) { iObserver->ControlSizeChanged( this ); + + if ( !iOutlineFocus ) + { + RecordField(); + } + reDraw = ETrue; } @@ -418,8 +427,10 @@ delete iPriorityIcon; iPriorityIcon = NULL; - iPriorityIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iPriorityIcon->SetParent( this ); + iPriorityIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- @@ -589,18 +600,6 @@ } // --------------------------------------------------------------------------- -// CESMRViewerDetailedSubjectField::SetContainerWindowL -// --------------------------------------------------------------------------- -// -void CESMRViewerDetailedSubjectField::SetContainerWindowL( - const CCoeControl& aContainer ) - { - CCoeControl::SetContainerWindowL( aContainer ); - iRichTextViewer->SetContainerWindowL( aContainer ); - iRichTextViewer->SetParent( this ); - } - -// --------------------------------------------------------------------------- // CESMRViewerDetailedSubjectField::SupportsLongTapFunctionalityL // --------------------------------------------------------------------------- // diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -120,6 +120,7 @@ else { iRichTextViewer->SetTextL( &text, ETrue ); + iRichTextViewer->ApplyLayoutChangesL(); } // If the geo value has set, the waypoint icon has to be shown on right @@ -130,9 +131,10 @@ { if( geoValue && geoValue->GetLatLong( dummy, dummy ) ) { - iWaypointIcon = - CMRImage::NewL( NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); - iWaypointIcon->SetParent( this ); + iWaypointIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLocationWaypoint, + this, + ETrue ); } } } @@ -163,6 +165,7 @@ if ( iObserver && aEdwin == iRichTextViewer ) { iObserver->ControlSizeChanged( this ); + RecordField(); reDraw = ETrue; } @@ -185,8 +188,9 @@ // void CESMRViewerLocationField::ConstructL( ) { - iFieldButton = CMRButton::NewL( NMRBitmapManager::EMRBitmapLocation ); - iFieldButton->SetParent( this ); + iFieldButton = CMRButton::NewL( + NMRBitmapManager::EMRBitmapLocation, + this ); iFieldButton->SetObserver(this); iRichTextViewer = CESMRRichTextViewer::NewL( this ); @@ -277,12 +281,19 @@ if ( aEnabled ) { - iWaypointIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); - iWaypointIcon->SetParent( this ); + iWaypointIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLocationWaypoint, + this, + ETrue ); } // Relayout SizeChanged(); + + if ( !iOutlineFocus ) + { + RecordField(); + } } // --------------------------------------------------------------------------- @@ -411,20 +422,6 @@ } // --------------------------------------------------------------------------- -// CESMRViewerLocationField::SetContainerWindowL -// --------------------------------------------------------------------------- -// -void CESMRViewerLocationField::SetContainerWindowL( - const CCoeControl& aContainer ) - { - CCoeControl::SetContainerWindowL( aContainer ); - iRichTextViewer->SetContainerWindowL( aContainer ); - iRichTextViewer->SetParent( this ); - iFieldButton->SetContainerWindowL( aContainer ); - iFieldButton->SetParent( this ); - } - -// --------------------------------------------------------------------------- // CESMRViewerLocationField::HandleLongtapEventL // --------------------------------------------------------------------------- // @@ -486,9 +483,11 @@ delete iWaypointIcon; iWaypointIcon = NULL; - iWaypointIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); + iWaypointIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); - iWaypointIcon->SetParent( this ); iWaypointIcon->SetObserver( this ); } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerpriorityfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerpriorityfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerpriorityfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -78,13 +78,11 @@ void CESMRViewerPriorityField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapPriorityNormal ); - iIcon->SetParent( this ); - + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapPriorityNormal, this ); + HBufC* priorityText = StringLoader::LoadLC( R_QTN_CALENDAR_MEETING_OPT_PRIORITY_NORMAL, iEikonEnv ); @@ -163,9 +161,8 @@ delete iIcon; iIcon = NULL; - iIcon = CMRImage::NewL( bitmapId ); - iIcon->SetParent( this ); - + iIcon = CMRImage::NewL( bitmapId, this ); + // This needs to be called so icon will be redrawn SizeChanged(); } @@ -291,8 +288,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencedatefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencedatefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencedatefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -85,8 +85,9 @@ void CESMRViewerRecurrenceDateField::ConstructL() { FUNC_LOG; - iRepeatTopic = CMRLabel::NewL(); - iRepeatDate = CMRLabel::NewL(); + CESMRField::ConstructL( NULL ); + iRepeatTopic = CMRLabel::NewL( this ); + iRepeatDate = CMRLabel::NewL( this ); iRepeatTopic->SetTextL( KNullDesC ); iRepeatDate->SetTextL( KNullDesC ); diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerrecurrencefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -87,12 +87,10 @@ void CESMRViewerRecurrenceField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapRecurrence ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapRecurrence, this ); } // ----------------------------------------------------------------------------- @@ -291,8 +289,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstartdatefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstartdatefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstartdatefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -96,12 +96,10 @@ { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateStart ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateStart, this ); } // ----------------------------------------------------------------------------- @@ -259,8 +257,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstopdatefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstopdatefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerstopdatefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -92,12 +92,10 @@ // void CESMRViewerStopDateField::ConstructL() { - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateEnd ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapDateEnd, this ); } // --------------------------------------------------------------------------- @@ -291,8 +289,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewersyncfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewersyncfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewersyncfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -76,12 +76,12 @@ void CESMRViewerSyncField::ConstructL() { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapSynchronization ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapSynchronization, + this ); } // --------------------------------------------------------------------------- @@ -264,8 +264,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewertimefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewertimefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewertimefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -99,12 +99,10 @@ { FUNC_LOG; - iLabel = CMRLabel::NewL(); - iLabel->SetParent( this ); + iLabel = CMRLabel::NewL( this ); CESMRField::ConstructL( iLabel ); // ownership transfered - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapClock ); - iIcon->SetParent( this ); + iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapClock, this ); } // --------------------------------------------------------------------------- @@ -303,8 +301,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -178,8 +178,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- @@ -228,16 +230,13 @@ { FUNC_LOG; - iCalenName = CMRLabel::NewL(); + iCalenName = CMRLabel::NewL( this ); CESMRField::ConstructL( iCalenName ); iCalenName->SetTextL( KNullDesC() ); - TGulAlignment align; - align.SetHAlignment( EHLeft ); - align.SetVAlignment( EVCenter ); - iCalenName->SetAlignment( align ); - - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapCalendarSelection ); + iIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapCalendarSelection, + this ); } @@ -291,12 +290,12 @@ { case 0: { - control = iCalenName; + control = iIcon; break; } case 1: { - control = iIcon; + control = iCalenName; break; } case 2: @@ -371,21 +370,6 @@ } // --------------------------------------------------------------------------- -// CMRMultiCalenField::SetContainerWindowL -// --------------------------------------------------------------------------- -// -void CMRMultiCalenField::SetContainerWindowL( - const CCoeControl& aContainer ) - { - FUNC_LOG; - CCoeControl::SetContainerWindowL( aContainer ); - iCalenName->SetContainerWindowL( aContainer ); - iCalenName->SetParent( this ); - iIcon->SetContainerWindowL( aContainer ); - iIcon->SetParent( this ); - } - -// --------------------------------------------------------------------------- // CMRMultiCalenField::SetTextDimmed // --------------------------------------------------------------------------- // diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -246,8 +246,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- @@ -288,18 +290,15 @@ void CMRUnifiedEditorField::ConstructL( ) { FUNC_LOG; - iType = CMRLabel::NewL(); + iType = CMRLabel::NewL( this ); CESMRField::ConstructL( iType ); iType->SetTextL( KNullDesC() ); - TGulAlignment align; - align.SetHAlignment( EHLeft ); - align.SetVAlignment( EVCenter ); - iType->SetAlignment( align ); - // An icon is required for layouting the field. Actual correct icon // is set after InternalizeL. - iIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapEventTypeMeeting ); + iIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapEventTypeMeeting, + this ); } // --------------------------------------------------------------------------- @@ -485,7 +484,7 @@ delete iIcon; iIcon = NULL; - iIcon = CMRImage::NewL( bitmapId ); + iIcon = CMRImage::NewL( bitmapId, this ); } // EOF diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -133,8 +133,9 @@ FUNC_LOG; SetComponentsToInheritVisibility( ETrue ); - iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAttachment ); - iFieldIcon->SetParent( this ); + iFieldIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapAttachment, + this ); iRichTextViewer = CESMRRichTextViewer::NewL( this ); CESMRField::ConstructL( iRichTextViewer ); // ownership transferred @@ -283,9 +284,9 @@ switch ( aInd ) { case 0: - return iRichTextViewer; + return iFieldIcon; case 1: - return iFieldIcon; + return iRichTextViewer; case 2: return iLockIcon; default: @@ -400,23 +401,6 @@ } // --------------------------------------------------------------------------- -// CMRViewerAttachmentsField::SetContainerWindowL() -// --------------------------------------------------------------------------- -// -void CMRViewerAttachmentsField::SetContainerWindowL( const CCoeControl& aControl ) - { - FUNC_LOG; - CESMRField::SetContainerWindowL( aControl ); - iRichTextViewer->SetContainerWindowL( aControl ); - iRichTextViewer->SetParent( this ); - - iFieldIcon->SetContainerWindowL( aControl ); - iFieldIcon->SetParent( this ); - - iButtonGroupContainer = CEikButtonGroupContainer::Current(); - } - -// --------------------------------------------------------------------------- // CMRViewerAttachmentsField::HandleEdwinSizeEventL // --------------------------------------------------------------------------- // @@ -435,6 +419,11 @@ { iObserver->ControlSizeChanged( this ); reDraw = ETrue; + + if ( !iOutlineFocus ) + { + RecordField(); + } } } @@ -642,11 +631,6 @@ iRichTextViewer->SetLineSpacingL( LineSpacing() ); } - iRichTextViewer->ApplyLayoutChangesL(); - - iRichTextViewer->SetMargins( KMargin ); // What's this? - iRichTextViewer->HandleTextChangedL(); - while ( attachmentLinks.Count() > 0 ) { CESMRRichTextLink* link = attachmentLinks[0]; @@ -655,6 +639,11 @@ iRichTextViewer->AddLinkL( link ); CleanupStack::Pop( link ); } + + iRichTextViewer->ApplyLayoutChangesL(); + + iRichTextViewer->SetMargins( KMargin ); // What's this? + iRichTextViewer->HandleTextChangedL(); } CleanupStack::PopAndDestroy( &attachmentLinks ); @@ -831,8 +820,10 @@ delete iLockIcon; iLockIcon = NULL; - iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); - iLockIcon->SetParent( this ); + iLockIcon = CMRImage::NewL( + NMRBitmapManager::EMRBitmapLockField, + this, + ETrue ); } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponsefield.h --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponsefield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponsefield.h Thu Jul 15 18:19:25 2010 +0300 @@ -46,12 +46,12 @@ * @return New response field object. */ static CESMRResponseField* NewL(MESMRResponseObserver* aResponseObserver); - + /** * C++ Destructor. */ ~CESMRResponseField(); - + public: // From CCoeControl TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aInd ) const; @@ -59,7 +59,7 @@ TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); void FocusChanged( TDrawNow aDrawNow ); TSize MinimumSize(); - + public: // From CESMRField void InitializeL(); void InternalizeL( MESMRCalEntry& aEntry ); @@ -67,7 +67,7 @@ void SetOutlineFocusL( TBool aFocus ); TBool HandleSingletapEventL( const TPoint& aPosition ); void HandleLongtapEventL( const TPoint& aPosition ); - + public: // New methods /** * Set the response observer for this class. @@ -75,27 +75,26 @@ * @param aResponseObserver - Response observer */ void AddObserver( MESMRResponseObserver* aResponseObserver ); - + /** * Calls onwards the SetFont() method for all the items in the array * * @param aFont - Font to be set. */ void SetFont( const CFont* aFont ); - + /** * Selects the current item. * @return ETrue if item is selectable */ TBool ItemSelectedL(); - + private: // Implementation CESMRResponseField(MESMRResponseObserver* aResponseObserver); void ConstructL(); void HandleCancelledEventItemsL( MESMRCalEntry& aEntry ); - CCoeControl* ControlItem( TInt aIndex ); TBool HandleTapEventL( const TPoint& aPosition ); - + private: /// Own: Conflict popup CESMRConflictPopup* iConfPopup ; @@ -103,7 +102,7 @@ RPointerArray iResponseItemArray; /// Observer for the response MESMRResponseObserver* iResponseObserver; - /// Currently selected index + /// Currently selected index TInt iSelectionIndex; /// Font for the label text const CFont* iFont; @@ -112,18 +111,18 @@ /// iESMRstatic accessed TBool iESMRStaticAccessed; /// whether a normal response - TBool iNormalResponse; + TBool iNormalResponse; /// whether a remove response - TBool iRemoveResponse; + TBool iRemoveResponse; /// Judge if there is any event conflict with current event. TBool iConflicted; /// Judge whether it has implemented HandleSingletapEventL TBool iPointEvent; - /// Judge whether the long tap have been consumed. + /// Judge whether the long tap have been consumed. /// To avoid the same event be handled by /// HandleSingletapEventL() when HandleLongtapEventL(). TBool iLongTapEventConsumed; - + }; diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponseitem.h --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponseitem.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrresponseitem.h Thu Jul 15 18:19:25 2010 +0300 @@ -49,6 +49,7 @@ TInt CountComponentControls() const; CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged(); + void SetContainerWindowL( const CCoeControl& aContainer ); public: // New methods /** diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerattendeesfield.h --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerattendeesfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerattendeesfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -54,7 +54,6 @@ CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged( ); TKeyResponse OfferKeyEventL( const TKeyEvent& aEvent, TEventCode aType ); - void SetContainerWindowL(const CCoeControl& aContainer); TSize MinimumSize(); protected: // From CESMRField diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerfromfield.h --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerfromfield.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/inc/cesmrviewerfromfield.h Thu Jul 15 18:19:25 2010 +0300 @@ -65,7 +65,6 @@ CCoeControl* ComponentControl( TInt aInd ) const; void SizeChanged(); TSize MinimumSize(); - void SetContainerWindowL(const CCoeControl& aContainer); protected: // From MEikEdwinSizeObserver TBool HandleEdwinSizeEventL( diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -97,9 +97,12 @@ { FUNC_LOG; + CESMRField::ConstructL( NULL ); + // Add pls resopond item to this field. CESMRResponseItem* responseItem = CESMRResponseItem::NewLC( EESMRCmdUndefined, KNullDesC, EFalse ); + responseItem->SetContainerWindowL( *this ); iResponseItemArray.AppendL( responseItem ); CleanupStack::Pop( responseItem ); } @@ -147,26 +150,23 @@ TInt count( iResponseItemArray.Count() ); TRect parentRect( Rect() ); TRect rect; - for( TInt i = 1; i <= count; ++i ) + for( TInt i = 0; i < count; ++i ) { TAknLayoutRect choiceLayoutRect = - NMRLayoutManager::GetFieldRowLayoutRect( parentRect, i ); + NMRLayoutManager::GetFieldRowLayoutRect( parentRect, i + 1 ); rect = parentRect; // Move the row down then it will be drawn to correct position. // controlIndex+1 tells the fields index. TInt movement = choiceLayoutRect.Rect().Height(); - rect.Move( 0, movement * ( i - 1 ) ); + rect.Move( 0, movement * i ); TInt leftMargin = choiceLayoutRect.Rect().iTl.iX; TInt rightMargin = choiceLayoutRect.Rect().iBr.iX; - if ( AknLayoutUtils::LayoutMirrored() ) - { - leftMargin -= parentRect.iTl.iX; - rightMargin -= parentRect.iTl.iX; - } + leftMargin -= parentRect.iTl.iX; + rightMargin -= parentRect.iTl.iX; AknLayoutUtils::LayoutControl( - ControlItem( i - 1 ), + ComponentControl( i ), rect, choiceLayoutRect.Color().Value(), leftMargin, @@ -176,6 +176,7 @@ choiceLayoutRect.Rect().Width(), choiceLayoutRect.Rect().Height() ); } + RecordField(); } // ----------------------------------------------------------------------------- @@ -301,6 +302,7 @@ // Construct the item to show conflicts info, and insert it to the beginning of array CESMRResponseItem* conflictItem = CESMRResponseItem::NewLC( EESMRCmdUndefined, KNullDesC, EFalse ); + conflictItem->SetContainerWindowL( *this ); iResponseItemArray.Insert( conflictItem, 0 ); CleanupStack::Pop( conflictItem ); @@ -689,20 +691,5 @@ return handled; } -// ----------------------------------------------------------------------------- -// CESMRResponseField::ControlItem -// ----------------------------------------------------------------------------- -// -CCoeControl* CESMRResponseField::ControlItem( TInt aIndex ) - { - CCoeControl* control = NULL; - if( aIndex < iResponseItemArray.Count() ) - { - control = static_cast( iResponseItemArray[aIndex] ); - } - - return control; - } - // EOF diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponseitem.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponseitem.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponseitem.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -94,7 +94,7 @@ void CESMRResponseItem::ConstructL( const TDesC& aItemText, TBool aHasIcon ) { FUNC_LOG; - iSelectionLabel = CMRLabel::NewL(); + iSelectionLabel = CMRLabel::NewL( this ); iSelectionLabel->SetTextL( aItemText ); // Response item might not have icon. e.g. topic line @@ -299,6 +299,24 @@ } // ----------------------------------------------------------------------------- +// CESMRResponseItem::SetContainerWindowL +// ----------------------------------------------------------------------------- +// +void CESMRResponseItem::SetContainerWindowL( const CCoeControl& aContainer ) + { + FUNC_LOG; + + CCoeControl::SetContainerWindowL( aContainer ); + + TInt count( CountComponentControls() ); + + for ( TInt i = 0; i < count; ++i ) + { + ComponentControl( i )->SetContainerWindowL( *this ); + } + } + +// ----------------------------------------------------------------------------- // CESMRResponseItem::IconL // ----------------------------------------------------------------------------- // @@ -312,7 +330,7 @@ { iconID = NMRBitmapManager::EMRBitmapCheckBoxOn; } - CMRImage* icon = CMRImage::NewL( iconID ); + CMRImage* icon = CMRImage::NewL( iconID, this ); return icon; } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattendeesfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattendeesfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattendeesfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -80,8 +80,7 @@ SetFieldId ( (iRole == CCalAttendee::EReqParticipant) ? EESMRFieldAttendee : EESMRFieldOptAttendee ); - iTitle = CMRLabel::NewL(); - iTitle->SetParent( this ); + iTitle = CMRLabel::NewL( this ); iRichTextViewer = CESMRRichTextViewer::NewL (this ); CESMRField::ConstructL( iRichTextViewer ); // ownership transferred @@ -341,18 +340,6 @@ } // --------------------------------------------------------------------------- -// CESMRViewerAttendeesField::SetContainerWindowL() -// --------------------------------------------------------------------------- -// -void CESMRViewerAttendeesField::SetContainerWindowL( - const CCoeControl& aContainer ) - { - CESMRField::SetContainerWindowL( aContainer ); - iRichTextViewer->SetContainerWindowL( aContainer ); - iRichTextViewer->SetParent( this ); - } - -// --------------------------------------------------------------------------- // CESMRViewerAttendeesField::MinimumSize() // --------------------------------------------------------------------------- // @@ -428,10 +415,17 @@ { FUNC_LOG; iExpandedSize = aSize; + if ( iObserver && iDisableRedraw ) { iObserver->ControlSizeChanged ( this ); + + if ( !iOutlineFocus ) + { + RecordField(); + } } + return iDisableRedraw; } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerfromfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerfromfield.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerfromfield.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -269,6 +269,11 @@ if ( iObserver ) { iObserver->ControlSizeChanged ( this ); + + if ( !iOutlineFocus ) + { + RecordField(); + } } return iDisableRedraw; } @@ -345,20 +350,5 @@ } } -// --------------------------------------------------------------------------- -// CESMRViewerFromField::SetContainerWindowL() -// --------------------------------------------------------------------------- -// -void CESMRViewerFromField::SetContainerWindowL(const CCoeControl& aContainer) - { - FUNC_LOG; - CESMRField::SetContainerWindowL( aContainer ); - if ( iRichTextViewer ) - { - iRichTextViewer->SetContainerWindowL( aContainer ); - iRichTextViewer->SetParent( this ); - } - } - //EOF diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/src/cesmrview.cpp --- a/meetingrequest/mrgui/src/cesmrview.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/src/cesmrview.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -968,7 +968,8 @@ FUNC_LOG; CCoeControl::HandleResourceChange( aType ); TInt error = KErrNone; - + TBool record = ETrue; + switch ( aType ) { case KAknsMessageSkinChange: @@ -989,14 +990,21 @@ } default: { + record = EFalse; break; } } if ( error != KErrNone ) { + record = EFalse; iCoeEnv->HandleError( error ); } + + if ( record ) + { + iListPane->RecordFields(); + } } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/src/cmrfieldcontainer.cpp --- a/meetingrequest/mrgui/src/cmrfieldcontainer.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/src/cmrfieldcontainer.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -24,6 +24,9 @@ namespace { // codescanner::namespace +// Off screen field x coordinate +const TInt KOffScreenPositionX = 1000; + /** * Vertical scroll margin */ @@ -79,8 +82,8 @@ // CMRFieldContainer::NewL // --------------------------------------------------------------------------- // -CMRFieldContainer* CMRFieldContainer::NewL( - MESMRFieldStorage& aFactory, +CMRFieldContainer* CMRFieldContainer::NewL( + MESMRFieldStorage& aFactory, const CCoeControl& aParent ) { FUNC_LOG; @@ -100,7 +103,7 @@ FUNC_LOG; CCoeControl::SetComponentsToInheritVisibility( ETrue ); SetContainerWindowL( aParent ); - + TBool focusSet( EFalse ); const TInt count( iFactory.Count() ); for ( TInt i = 0; i < count; i++ ) @@ -114,7 +117,6 @@ // Initialize field field->InitializeL(); - User::LeaveIfError( field->SetParent( this ) ); if ( !focusSet && field->IsVisible() @@ -161,10 +163,10 @@ { FUNC_LOG; /* - * Moves focus up after key event. If aHiddenFocus, moves focus + * Moves focus up after key event. If aHiddenFocus, moves focus * to the first visible field in the bottom of the viewable area. */ - + if( aHiddenFocus ) { return MoveFocusVisibleL(); @@ -194,17 +196,19 @@ iFocusedFieldIndex = ind; field->SetCurrentItemIndex( iFocusedFieldIndex ); - // Remove focus from previous position + // Remove focus from previous position focusedField->SetOutlineFocusL( EFalse ); focusedField->SetFocus( EFalse ); - + focusedField->MoveToScreen( EFalse ); + // Set focus to new position field->SetOutlineFocusL( ETrue ); field->SetFocus( ETrue ); + field->MoveToScreen( ETrue ); // Scrollbar and physics update is done here ScrollControlVisible( iFocusedFieldIndex ); - + DrawDeferred(); } @@ -224,10 +228,10 @@ { FUNC_LOG; /* - * Moves focus down after key event. If aHiddenFocus, moves focus + * Moves focus down after key event. If aHiddenFocus, moves focus * to the first visible field in the top of the viewable area. */ - + if( aHiddenFocus ) { return MoveFocusVisibleL(); @@ -258,17 +262,19 @@ iFocusedFieldIndex = ind; field->SetCurrentItemIndex( iFocusedFieldIndex ); - // Remove focus from previous position + // Remove focus from previous position focusedField->SetOutlineFocusL( EFalse ); focusedField->SetFocus( EFalse ); - + focusedField->MoveToScreen( EFalse ); + // Set focus to new position field->SetOutlineFocusL( ETrue ); field->SetFocus( ETrue ); + field->MoveToScreen( ETrue ); // Scrollbar and physics update is done here ScrollControlVisible( iFocusedFieldIndex ); - + DrawDeferred(); } @@ -287,13 +293,13 @@ { FUNC_LOG; /* - * Move focus to first completely visible field in the view, + * Move focus to first completely visible field in the view, * if focus was in a field that was not visible in the view. * Use case: After pointer scroll focus is hidden. User presses * arrow keys -> Focus appears to the first visible field on the upper * or bottom part of the viewable area. */ - + TKeyResponse response( EKeyWasNotConsumed ); CESMRField* focusedField = FocusedField(); @@ -355,16 +361,16 @@ // Remove existing focus focusedField->SetOutlineFocusL( EFalse ); focusedField->SetFocus( EFalse ); - + // Set focus to new field visibleField->SetOutlineFocusL( ETrue ); visibleField->SetFocus( ETrue ); response = EKeyWasConsumed; - + DrawDeferred(); } - + return response; } @@ -372,7 +378,7 @@ // CMRFieldContainer::SetFieldContainerObserver // --------------------------------------------------------------------------- // -void CMRFieldContainer::SetFieldContainerObserver( +void CMRFieldContainer::SetFieldContainerObserver( MMRFieldContainerObserver* aObserver ) { FUNC_LOG; @@ -386,7 +392,16 @@ TInt CMRFieldContainer::CountComponentControls() const { FUNC_LOG; - return iFactory.Count(); + + // If field container is scrolling, container will draw also children + TInt count( 0 ); + + if ( !iScrolling ) + { + count = iFactory.Count(); + } + + return count; } // --------------------------------------------------------------------------- @@ -409,11 +424,12 @@ /* * Returns the minimum size required by the field container */ - + TSize containerSize; - + + // Calculate height as the sum of the heights of the visible fields const TInt count( iFactory.Count() ); - + for ( TInt i(0); i < count; ++i ) { CESMRField* field = iFactory.Field( i ); @@ -423,9 +439,9 @@ containerSize.iHeight += rect.Height(); } } - + containerSize.iWidth = Parent()->Rect().Width(); - + return containerSize; } @@ -436,17 +452,12 @@ void CMRFieldContainer::SizeChanged() { FUNC_LOG; - - // TEST CODE: - TRect fieldcontainerRect = Rect(); - TRect parentRect = Parent()->Rect(); - - // For example when orientation changes, we might need to scroll + // For example when orientation changes, we might need to scroll // the currently focused control visible again. This handles also // scrollbar and physics updates. - ScrollControlVisible( KErrNotFound ); - + ScrollControlVisible( KErrNotFound ); + TPoint tl( Position() ); const TInt count( iFactory.Count() ); @@ -458,7 +469,15 @@ if ( field->IsVisible() ) { - LayoutField( *field, tl ); + TPoint pos( tl ); + + // If field is not focused, layout it outside screen + if ( i != iFocusedFieldIndex ) + { + pos.iX = KOffScreenPositionX; + } + + LayoutField( *field, pos ); TInt height = field->Size().iHeight; tl.iY += height; @@ -466,6 +485,29 @@ } } + +// --------------------------------------------------------------------------- +// CMRFieldContainer::HandlePointerEventL +// --------------------------------------------------------------------------- +// +void CMRFieldContainer::HandlePointerEventL( const TPointerEvent &aPointerEvent ) + { + FUNC_LOG; + + // Find out to which field this pointer event is intended to + TInt fieldCount( iFactory.Count() ); + + for( TInt i = 0; i < fieldCount; ++i ) + { + CCoeControl* field = iFactory.Field( i ); + if( field->Rect().Contains( aPointerEvent.iPosition ) && + field->IsVisible() ) + { + field->HandlePointerEventL( aPointerEvent ); + } + } + } + // --------------------------------------------------------------------------- // CMRFieldContainer::ControlSizeChanged // --------------------------------------------------------------------------- @@ -474,8 +516,8 @@ { FUNC_LOG; /* - * Called whenever a fields size has changed. Requires always - * relayouting. + * Called whenever a fields size has changed. Requires always + * relayouting. */ if ( !aField ) @@ -490,7 +532,7 @@ if( size != old ) { aField->SetSize( size ); - + TPoint tl( aField->Position() ); TInt index = IndexByFieldId( iFactory, aField->FieldId() ); @@ -500,19 +542,19 @@ // Fields have been re-layouted / moved. This requires resetting // the size of this field container. - SetSize( MinimumSize() ); - + SetSizeWithoutNotification( MinimumSize() ); + // Update also scrollbar and physics iObserver->UpdateScrollBarAndPhysics(); - - if( index == iFocusedFieldIndex ) + + if( index <= iFocusedFieldIndex ) { // Scroll this field completely visible, if required. - // This updates also scrollbar and physics if scrolling + // This updates also scrollbar and physics if scrolling // is done. ScrollControlVisible( iFocusedFieldIndex ); } - + DrawDeferred(); } } @@ -528,7 +570,7 @@ /* * Inserts field visible and layouts it. */ - + CESMRField* field = iFactory.FieldById( aFieldId ); if ( field && !field->IsVisible() ) @@ -541,8 +583,8 @@ TInt prevIndex = index - 1; // Get previous visible field position - // Index 0 must be included in attendee field case, - // to avoid field collision. But in response field, + // Index 0 must be included in attendee field case, + // to avoid field collision. But in response field, // causes misplacing of area. if ( ( prevIndex >= 0 ) && ( aFieldId != EESMRFieldResponseArea ) ) { @@ -558,19 +600,21 @@ // Layout field LayoutField( *field, tl); + // Move field off screen if it is not focused + field->MoveToScreen( index == iFocusedFieldIndex ); // Move following fields tl.iY += field->Size().iHeight; MoveFields( ++index, tl ); - // Set fieldcontainer size again, because + // Set fieldcontainer size again, because // the amount of fields has changed. - SetSize( MinimumSize() ); - + SetSizeWithoutNotification( MinimumSize() ); + // Scrollbar and physics require updating. iObserver->UpdateScrollBarAndPhysics(); } - + DrawDeferred(); } @@ -583,7 +627,7 @@ FUNC_LOG; /* * Sets field non-visible and moves other fields accordingly. - * Does not delete the field. + * Does not delete the field. */ CESMRField* field = iFactory.FieldById( aFieldId ); @@ -596,19 +640,19 @@ TPoint pos( field->Position() ); MoveFields( index, pos ); - // Set fieldcontainer size again, because + // Set fieldcontainer size again, because // the amount of fields has changed. - SetSize( MinimumSize() ); - + SetSizeWithoutNotification( MinimumSize() ); + // Scrollbar and physics require updating. iObserver->UpdateScrollBarAndPhysics(); - - if ( focused && !field->IsNonFocusing() ) + + if ( focused && !field->IsNonFocusing() ) { - // Set focus to next field, or if removed field was the last + // Set focus to next field, or if removed field was the last // field, then move focus to last visible field - TInt lastVisibleFieldIndex( LastVisibleField( aFieldId ) ); - + TInt lastVisibleFieldIndex( LastVisibleField( aFieldId ) ); + // If field was the last one... if( lastVisibleFieldIndex == index ) { @@ -633,10 +677,10 @@ { FUNC_LOG; /* - * Returns ETrue/EFalse if the field with given field id is + * Returns ETrue/EFalse if the field with given field id is * visible or not. */ - + TBool ret( EFalse ); CESMRField* field = iFactory.FieldById( aField ); @@ -685,9 +729,9 @@ { FUNC_LOG; /* - * Checks if focused field is completely visible in the viewable area. + * Checks if focused field is completely visible in the viewable area. */ - + // Fetch the position information about currently focused field: CESMRField* field = iFactory.Field( iFocusedFieldIndex ); TBool ret( EFalse ); @@ -710,7 +754,7 @@ /* * Scrolls the field with the given index visible */ - + CESMRField* field = NULL; if ( aInd == KErrNotFound ) { @@ -722,10 +766,10 @@ } ASSERT( field ); - + TRect fieldRect( field->Position(), field->Size() ); TRect parentRect( Parent()->Rect() ); - + /* * Case 1: Field's height is less than the viewable area height, * let's scroll the whole field visible. @@ -735,17 +779,17 @@ // Scrolling down, let's move fields up if( fieldRect.iBr.iY > parentRect.iBr.iY ) { - iObserver->ScrollFieldsUp( + iObserver->ScrollFieldsUp( fieldRect.iBr.iY - parentRect.iBr.iY ); } // scrolling up, let's move field down if( fieldRect.iTl.iY < parentRect.iTl.iY ) { - iObserver->ScrollFieldsDown( + iObserver->ScrollFieldsDown( parentRect.iTl.iY - fieldRect.iTl.iY ); } } - + /* * Case 2: Field's height is more than the viewable area's height. */ @@ -757,22 +801,22 @@ // Focus to this field is coming from above if( field->PreItemIndex() < field->CurrentItemIndex() ) { - // Let's scroll the top of the field to the + // Let's scroll the top of the field to the // top of the viewable area - iObserver->ScrollFieldsUp( + iObserver->ScrollFieldsUp( fieldRect.iTl.iY - parentRect.iTl.iY ); - + } // Focus to this field is coming from below if( field->PreItemIndex() > field->CurrentItemIndex() ) { // Let's scroll the bottom of the field to the // bottom of the viewable area - iObserver->ScrollFieldsDown( + iObserver->ScrollFieldsDown( parentRect.iBr.iY - fieldRect.iBr.iY ); } } - + // Field is in edit mode if( field->FieldMode() == EESMRFieldModeEdit ) { @@ -792,14 +836,14 @@ // move field focus line bottom to view bottom TInt px = focusFieldVisibleBottom - viewHeight; - + // if focus on last field: add margin height to // scroll amount. if ( iFocusedFieldIndex == iFactory.Count()-1 ) { px += KVerticalScrollMargin; } - + // Scrollbar and physics update is done here iObserver->ScrollFieldsUp( px ); } @@ -820,7 +864,7 @@ iObserver->ScrollFieldsDown( px ); } } - } + } } } @@ -831,7 +875,7 @@ void CMRFieldContainer::RePositionFields( TInt aAmount ) { FUNC_LOG; - + // Movement downwards if( aAmount >= 0 ) { @@ -864,20 +908,20 @@ { FUNC_LOG; /* - * Moves fields from the given index towards the last item. + * Moves fields from the given index towards the last item. * This function does not update scrollbar or physics. */ - + const TInt count( iFactory.Count() ); - + for ( TInt i = aIndex; i < count; ++i ) { CESMRField* field = iFactory.Field( i ); - + if ( field->IsVisible() ) { field->SetPosition( aTl ); - + aTl.iY += field->Size().iHeight; } } @@ -894,26 +938,25 @@ * Layouts given field according to the size required by the field and * given TPoint. This function does not update scrollbar or physics. */ - + TSize size( aField.MinimumSize() ); - aField.SetPosition( aTl ); - aField.SetSize( size ); + aField.SetExtent( aTl, size ); } // --------------------------------------------------------------------------- // CMRFieldContainer::IsLastVisibleField // --------------------------------------------------------------------------- // -TInt CMRFieldContainer::LastVisibleField( +TInt CMRFieldContainer::LastVisibleField( TESMREntryFieldId aFieldId ) { /* * Helper function to find out the last visible field in the list. */ - + TInt lastVisibleFieldIndex( 0 ); TInt count( iFactory.Count() ); - + // Go through fields from last field towards the first field for( TInt i( 1 ); i > count; ++i ) { @@ -923,22 +966,22 @@ // ... Compare it to the given field index ... if( iFactory.Field( count - i )->FieldId() == aFieldId ) { - // ... And if match is found, given fieldId is the + // ... And if match is found, given fieldId is the // the last visible field. - lastVisibleFieldIndex = + lastVisibleFieldIndex = IndexByFieldId( iFactory, aFieldId ); } else { // Otherwise return the found last visible field. - lastVisibleFieldIndex = - IndexByFieldId( iFactory, + lastVisibleFieldIndex = + IndexByFieldId( iFactory, iFactory.Field( count - i )->FieldId() ); } break; } } - + return lastVisibleFieldIndex; } @@ -952,7 +995,7 @@ /* * Sets the focus according to the given index. */ - + TInt count( iFactory.Count() ); aNewFocusIndex = Max( 0, Min( aNewFocusIndex, count - 1 ) ); @@ -963,7 +1006,7 @@ // Get next focused field CESMRField* field = iFactory.Field( aNewFocusIndex ); - + // Do sanity checks while ( aNewFocusIndex < count && !field->IsVisible() ) { @@ -980,27 +1023,133 @@ } ASSERT( field->IsVisible() ); - + // Update current and previous item indexes field->SetPreItemIndex( iFocusedFieldIndex ); iFocusedFieldIndex = aNewFocusIndex; field->SetCurrentItemIndex( iFocusedFieldIndex ); - + // Remove focus from old old->SetOutlineFocusL( EFalse ); old->SetFocus( EFalse ); - + old->MoveToScreen( EFalse ); + // update focus index to new index field->SetOutlineFocusL( ETrue ); field->SetFocus( ETrue ); - + field->MoveToScreen( ETrue ); + // This handles also scrollbar and physics updating, // if view scrolling is done. - ScrollControlVisible( iFocusedFieldIndex ); - + ScrollControlVisible( iFocusedFieldIndex ); + DrawDeferred(); } } +// --------------------------------------------------------------------------- +// CMRFieldContainer::SetScrolling +// --------------------------------------------------------------------------- +// +void CMRFieldContainer::SetScrolling( TBool aScrolling ) + { + FUNC_LOG; + + iScrolling = aScrolling; + + // Move focused field away from screen if container is scrolling. + // Otherwise move it to screen. + CESMRField* field = iFactory.Field( iFocusedFieldIndex ); + field->MoveToScreen( !iScrolling ); + } + + +// --------------------------------------------------------------------------- +// CMRFieldContainer::Draw +// --------------------------------------------------------------------------- +// +void CMRFieldContainer::Draw( const TRect& aRect ) const + { + FUNC_LOG; + + // Get visible screen area from parent (list pane) + TRect parent( Parent()->Rect() ); + + // Current container position used to calculate actual field positions + TPoint tl( iPosition ); + + // Field index to skip + TInt fieldToSkip = KErrNotFound; + + if ( !iScrolling ) + { + // Container is not scrolling. Don't draw focused field from buffer + fieldToSkip = iFocusedFieldIndex; + } + + // Draw all visible fields which are not on screen + TInt count( iFactory.Count() ); + + for ( TInt i = 0; i < count; ++i ) + { + CESMRField* field = iFactory.Field( i ); + if ( field->IsVisible() ) + { + // Calculate actual field rect on screen + TRect screenRect( tl, field->Size() ); + + // Draw field if it intersects with screen visible area + if ( i != fieldToSkip + && screenRect.Intersects( parent ) ) + { + field->Draw( screenRect ); + } + // Move next field top left corner + tl.iY += screenRect.Height(); + } + } + } + +// --------------------------------------------------------------------------- +// CMRFieldContainer::ScrollContainer +// --------------------------------------------------------------------------- +// +void CMRFieldContainer::ScrollContainer( const TPoint& aTl ) + { + FUNC_LOG; + + // Set scrolling flag and move focused field off screen + SetScrolling( ETrue ); + // Update control position, + // but dont propagate the change to component controls + iPosition = aTl; + } + +// --------------------------------------------------------------------------- +// CMRFieldContainer::Synchronize +// --------------------------------------------------------------------------- +// +void CMRFieldContainer::Synchronize() + { + FUNC_LOG; + + // Set actual control positions (y-coordinate) to visible fields + TPoint tl( iPosition ); + + TInt count( iFactory.Count() ); + + for ( TInt i = 0; i < count; ++i ) + { + CESMRField* field = iFactory.Field( i ); + if ( field->IsVisible() ) + { + TPoint pos( field->Position().iX, tl.iY ); + tl.iY += field->Size().iHeight; + field->SetPosition( pos ); + } + } + SetScrolling( EFalse ); + } + // End of file diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/src/cmrlistpane.cpp --- a/meetingrequest/mrgui/src/cmrlistpane.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/src/cmrlistpane.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -155,8 +155,12 @@ void CMRListPane::InternalizeL( MESMRCalEntry& aEntry ) { FUNC_LOG; + iFactory.InternalizeL( aEntry ); + // Record visible fields + RecordFields(); + // This is called to make sure everything is drawn correctly DrawDeferred(); } @@ -368,7 +372,6 @@ // Long tap functionality may vary between fields // ==> Command field to execute action related to long tap TInt count( iFactory.Count() ); - for ( TInt i = 0; i < count; ++i ) { CESMRField* field = iFactory.Field( i ); @@ -460,17 +463,19 @@ void CMRListPane::ScrollFieldsUp( TInt aPx ) { FUNC_LOG; - TPoint point = iFieldContainer->Position(); - point.iY -= aPx; + iPositionChanged = ETrue; - // This initializes Draw also - iFieldContainer->SetPosition( point ); + iUpdatedPanePoint = iFieldContainer->Position(); + iUpdatedPanePoint.iY -= aPx; - // Non-kinetic scrolling executed. Update - // new position to physics. - iPhysics->UpdateVerticalScrollIndex( UpdatedFocusPosition() ); - - DoUpdateScrollBar( UpdatedFocusPosition() ); + if ( !iPointerEventInProgress ) + { + // We can updace view only if pointer event processing + // is not ongoing. + // If pointer event processing is ongoing, view is updated + // in CMRListPane::HandlePointerEventL method. + UpdatePosition(); + } } // --------------------------------------------------------------------------- @@ -480,16 +485,20 @@ void CMRListPane::ScrollFieldsDown( TInt aPx ) { FUNC_LOG; - TPoint point = iFieldContainer->Position(); - point.iY += aPx; + + iPositionChanged = ETrue; + + iUpdatedPanePoint = iFieldContainer->Position(); + iUpdatedPanePoint.iY += aPx; - // This initializes Draw also - iFieldContainer->SetPosition( point ); - // Non-kinetic scrolling executed. Update - // new position to physics. - iPhysics->UpdateVerticalScrollIndex( UpdatedFocusPosition() ); - - DoUpdateScrollBar( UpdatedFocusPosition() ); + if ( !iPointerEventInProgress ) + { + // We can updace view only if pointer event processing + // is not ongoing. + // If pointer event processing is ongoing, view is updated + // in CMRListPane::HandlePointerEventL method. + UpdatePosition(); + } } @@ -499,6 +508,7 @@ // void CMRListPane::UpdateScrollBarAndPhysics() { + FUNC_LOG; // Update physics world size iPhysics->InitPhysics(); @@ -513,6 +523,7 @@ // void CMRListPane::ShowControl( TESMREntryFieldId aFieldId ) { + FUNC_LOG; iFieldContainer->ShowControl( aFieldId ); } @@ -522,6 +533,7 @@ // TBool CMRListPane::IsControlVisible( TESMREntryFieldId aFieldId ) { + FUNC_LOG; return iFieldContainer->IsControlVisible( aFieldId ); } // --------------------------------------------------------------------------- @@ -530,6 +542,7 @@ // TESMREntryFieldId CMRListPane::GetResponseFieldsFieldId() { + FUNC_LOG; CESMRField* rfield = iFactory.FieldById( EESMRFieldResponseArea ); if ( rfield && rfield->IsVisible() && !rfield->IsNonFocusing() ) @@ -577,6 +590,26 @@ } // --------------------------------------------------------------------------- +// CMRListPane::RecordFields +// --------------------------------------------------------------------------- +// +void CMRListPane::RecordFields() + { + FUNC_LOG; + + // Loop all visible fields and record them + TInt count( iFactory.Count() ); + for ( TInt i = 0; i < count; ++i ) + { + CESMRField* field = iFactory.Field( i ); + if ( field->IsVisible() ) + { + field->RecordField(); + } + } + } + +// --------------------------------------------------------------------------- // CMRListPane::HandlePointerEventL // --------------------------------------------------------------------------- // @@ -588,6 +621,8 @@ return; } + iPointerEventInProgress = ETrue; + // If new down event is received, and // iLongTapEventInProgess flag is still ETrue, we need to // set it back to EFalse -> Long tap event cannot be in progress @@ -610,7 +645,7 @@ } } - if( !iPhysicsActionOngoing ) + if( !iPhysicsActionOngoing && TPointerEvent::EDrag != aPointerEvent.iType ) { UpdateClickedField( aPointerEvent ); @@ -635,6 +670,15 @@ iLongTapEventInProgess = EFalse; } } + + if ( iPositionChanged ) + { + // Position has changed during pointer event processing + // ==> adjusting UI to correct position. + UpdatePosition(); + } + + iPointerEventInProgress = EFalse; } // --------------------------------------------------------------------------- @@ -689,7 +733,7 @@ if( FeedbackScrollMarginExceeded( Abs( verticalScrollIndex - iPreviousVerticalScrollIndex ) ) ) { - HandleTactileFeedback( ETouchFeedbackSlider ); + HandleTactileFeedback( ETouchFeedbackSensitiveList ); iPreviousVerticalScrollIndex = verticalScrollIndex; } @@ -731,8 +775,18 @@ for( TInt i = 0; i < count; ++i ) { CESMRField* field = iFactory.Field( i ); - if ( field->IsVisible() && - field->Rect().Contains( aPointerEvent.iPosition ) ) + + // Calculate actual screen rect for field. + // If field does not have focus, it is layouted off screen + TPoint pos( field->Position() ); + if ( !field->HasOutlineFocus() ) + { + pos.iX = field->Parent()->Position().iX; + } + TRect rect( pos, field->Size() ); + + if ( field->IsVisible() + && rect.Contains( aPointerEvent.iPosition ) ) { CESMRField* focusedField = iFieldContainer->FocusedField(); @@ -746,7 +800,18 @@ iFieldContainer->SetControlFocusedL( field->FieldId() ); } } - + else + { + // If field is not focused from coecontrol's point of view + // due to focus strategy, we have to set the field + // focused again. + if( !field->IsFocused() ) + { + field->SetOutlineFocusL( ETrue ); + field->SetFocus( ETrue ); + DrawDeferred(); + } + } break; } } @@ -764,12 +829,23 @@ for( TInt i = 0; i < fieldCount; ++i ) { - if( iFactory.Field( i )->Rect().Contains( - aPointerEvent.iPosition ) ) + CESMRField* field = iFactory.Field( i ); + + // Calculate actual screen rect for field. + // If field does not have focus, it is layouted off screen + TPoint pos( field->Position() ); + if ( !field->HasOutlineFocus() ) + { + pos.iX = field->Parent()->Position().iX; + } + TRect rect( pos, field->Size() ); + + if( rect.Contains( aPointerEvent.iPosition ) + && field->IsVisible() ) { if( aPointerEvent.iType == TPointerEvent::EButton1Down ) { - iClickedField = iFactory.Field( i ); + iClickedField = field; } } } @@ -840,4 +916,21 @@ return ret; } +// --------------------------------------------------------------------------- +// CMRListPane::UpdatePosition +// --------------------------------------------------------------------------- +// +void CMRListPane::UpdatePosition() + { + // This initializes Draw also + iFieldContainer->SetPosition( iUpdatedPanePoint ); + + // Non-kinetic scrolling executed. Update + // new position to physics. + iPhysics->UpdateVerticalScrollIndex( UpdatedFocusPosition() ); + DoUpdateScrollBar( UpdatedFocusPosition() ); + + iPositionChanged = EFalse; + } + // End of file diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrgui/src/cmrlistpanephysics.cpp --- a/meetingrequest/mrgui/src/cmrlistpanephysics.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrgui/src/cmrlistpanephysics.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -26,19 +26,13 @@ #include "emailtrace.h" -namespace { // codescanner::namespace - -const TInt KCustomDragTreshold( 10 ); - -} // namespace - // --------------------------------------------------------------------------- // CMRListPanePhysics::CMRListPanePhysics // --------------------------------------------------------------------------- // CMRListPanePhysics::CMRListPanePhysics( - CCoeControl& aParent, - CMRFieldContainer& aViewControl, + CCoeControl& aParent, + CMRFieldContainer& aViewControl, MMRPhysicsObserver& aPhysicsObserver ) : iParent( aParent ), iViewControl( aViewControl ), @@ -67,23 +61,23 @@ // CMRListPanePhysics::NewL // --------------------------------------------------------------------------- // -CMRListPanePhysics* CMRListPanePhysics::NewL( - CCoeControl& aParent, +CMRListPanePhysics* CMRListPanePhysics::NewL( + CCoeControl& aParent, CMRFieldContainer& aViewControl, MMRPhysicsObserver& aPhysicsObserver ) { FUNC_LOG; - CMRListPanePhysics* self = - new ( ELeave ) CMRListPanePhysics( - aParent, - aViewControl, + CMRListPanePhysics* self = + new ( ELeave ) CMRListPanePhysics( + aParent, + aViewControl, aPhysicsObserver ); CleanupStack::PushL( self ); self->ConstructL(); CleanupStack::Pop( self ); return self; } - + // --------------------------------------------------------------------------- // CMRListPanePhysics::~CMRListPanePhysics // --------------------------------------------------------------------------- @@ -93,7 +87,7 @@ FUNC_LOG; delete iPhysics; } - + // --------------------------------------------------------------------------- // CMRListPanePhysics::HandlePointerEventL // --------------------------------------------------------------------------- @@ -112,25 +106,28 @@ // Down if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) { + if ( iPhysics->OngoingPhysicsAction() + != CAknPhysics::EAknPhysicsActionNone ) + { + iPhysics->StopPhysics(); + } + // Save start time and start point iStartTime.HomeTime(); iStartPoint = aPointerEvent.iPosition; iDragPoint = iStartPoint; } - + // Drag else if ( aPointerEvent.iType == TPointerEvent::EDrag ) { // Check how position was changed and report to physics TPoint deltaPoint( iDragPoint - aPointerEvent.iPosition ); - if( Abs( deltaPoint.iY ) < KCustomDragTreshold ) + if( Abs( deltaPoint.iY ) > iPhysics->DragThreshold() ) { - deltaPoint.iX = 0; - deltaPoint.iY = 0; + iDragPoint = aPointerEvent.iPosition; + iPhysics->RegisterPanningPosition( deltaPoint ); } - - iDragPoint = aPointerEvent.iPosition; - iPhysics->RegisterPanningPosition( deltaPoint ); } // Up @@ -138,16 +135,13 @@ { // Calculate dragging distance TPoint drag( iStartPoint - aPointerEvent.iPosition ); - - if( Abs( drag.iY ) < KCustomDragTreshold ) + + if( Abs( drag.iY ) > iPhysics->DragThreshold() ) { - drag.iX = 0; - drag.iY = 0; + // Start physics + physicsStarted = iPhysics->StartPhysics( drag, iStartTime ); } - - // Start physics - physicsStarted = iPhysics->StartPhysics( drag, iStartTime ); - + if( physicsStarted ) { aEventsBlocked = ETrue; @@ -156,11 +150,11 @@ { aEventsBlocked = EFalse; } - } - + } + // Record previous pointer event iPreviousPointerEvent = aPointerEvent; - + return physicsStarted; } @@ -174,24 +168,24 @@ if ( !iFeatureEnabled ) { return; - } + } TRect parentRect( iParent.Rect() ); iWorldSize.iHeight = iViewControl.MinimumSize().iHeight; iWorldSize.iWidth = iViewControl.MinimumSize().iWidth; - + iViewSize.iHeight = parentRect.Height(); iViewSize.iWidth = parentRect.Width(); - + if( iWorldSize.iHeight < iViewSize.iHeight ) { iWorldSize.iHeight = iViewSize.iHeight; } - + + - iPhysics->ResetFriction(); - + TRAP_IGNORE( iPhysics->InitPhysicsL( iWorldSize, iViewSize, EFalse ) ); iPhysics->UpdateViewWindowControl( &iParent ); } @@ -206,7 +200,7 @@ if ( !iFeatureEnabled ) { return; - } + } iWorldSize.iHeight = aWorldHeight; } @@ -230,20 +224,21 @@ } iVerScrollIndex = aNewPosition.iY - iViewSize.iHeight / 2; - + // Parents position is taken into account, by // adding the extra x and y coordinates to field containers // new position. - iViewControl.SetPosition( TPoint( - iParent.Position().iX, - -iVerScrollIndex + iParent.Position().iY ) ); - + TPoint pos( + iParent.Position().iX, + -iVerScrollIndex + iParent.Position().iY ); + iViewControl.ScrollContainer( pos ); + // Draw only when drawing is allowed if ( aDrawNow ) { - iParent.DrawDeferred(); + iParent.DrawNow(); } - + // Vertical scroll index has changed, we need to update scroll bar also iPhysicsObserver.UpdateScrollBarDuringOngoingPhysics(); } @@ -256,6 +251,9 @@ { FUNC_LOG; iPhysicsObserver.PhysicsEmulationEnded(); + + // Synchronize field container position + iViewControl.Synchronize(); } // --------------------------------------------------------------------------- @@ -269,12 +267,12 @@ { return TPoint( iParent.Position() ); } - + // This is the default implementation - TPoint viewPosition( - iViewSize.iWidth / 2, + TPoint viewPosition( + iViewSize.iWidth / 2, iViewSize.iHeight / 2 + iVerScrollIndex ); - + return viewPosition; } @@ -287,7 +285,7 @@ FUNC_LOG; if ( iFeatureEnabled ) { - // Physics' new position is updated to this member, when field + // Physics' new position is updated to this member, when field // container is scrolled by someone else than physics. iVerScrollIndex = aVerScrollIndex; } diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/bwins/mrguicommonu.def --- a/meetingrequest/mrguicommon/bwins/mrguicommonu.def Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/bwins/mrguicommonu.def Thu Jul 15 18:19:25 2010 +0300 @@ -7,76 +7,76 @@ ?GetContactManager@CESMRContactManagerHandler@@QAEAAVCVPbkContactManager@@XZ @ 6 NONAME ; class CVPbkContactManager & CESMRContactManagerHandler::GetContactManager(void) ?SetCommandObserver@CESMRContactMenuHandler@@QAEXPAVMEikCommandObserver@@@Z @ 7 NONAME ; void CESMRContactMenuHandler::SetCommandObserver(class MEikCommandObserver *) ?AddObserverL@CESMRContactManagerHandler@@QAEXPAVMESMRContactManagerObserver@@@Z @ 8 NONAME ; void CESMRContactManagerHandler::AddObserverL(class MESMRContactManagerObserver *) - ?SetColor@NMRColorManager@@YAXAAVCCoeControl@@W4TMRColorId@1@@Z @ 9 NONAME ; void NMRColorManager::SetColor(class CCoeControl &, enum NMRColorManager::TMRColorId) - ?Color@NMRColorManager@@YA?AVTRgb@@W4TMRColorId@1@@Z @ 10 NONAME ; class TRgb NMRColorManager::Color(enum NMRColorManager::TMRColorId) - ?OptionsMenuAvailable@CESMRContactMenuHandler@@QAEHXZ @ 11 NONAME ; int CESMRContactMenuHandler::OptionsMenuAvailable(void) - ?IsReady@CESMRContactManagerHandler@@QAEHXZ @ 12 NONAME ; int CESMRContactManagerHandler::IsReady(void) - ?SendAsVCalendarL@CESMRSendUI@@QAEXHAAVCCalEntry@@@Z @ 13 NONAME ; void CESMRSendUI::SendAsVCalendarL(int, class CCalEntry &) - ??0CESMRRecurrence@@QAE@XZ @ 14 NONAME ; CESMRRecurrence::CESMRRecurrence(void) - ?LoadTextL@CESMRAlarm@@QAEXPAVCCoeEnv@@@Z @ 15 NONAME ; void CESMRAlarm::LoadTextL(class CCoeEnv *) - ?GetSkinBasedBitmapLC@NMRBitmapManager@@YAXW4TMRBitmapId@1@AAPAVCFbsBitmap@@1VTSize@@@Z @ 16 NONAME ; void NMRBitmapManager::GetSkinBasedBitmapLC(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, class TSize) - ??1RESMRStatic@@QAE@XZ @ 17 NONAME ; RESMRStatic::~RESMRStatic(void) - ??1CMRImage@@UAE@XZ @ 18 NONAME ; CMRImage::~CMRImage(void) - ?ExecuteL@CESMRGlobalNote@@SAXW4TESMGlobalNoteType@1@@Z @ 19 NONAME ; void CESMRGlobalNote::ExecuteL(enum CESMRGlobalNote::TESMGlobalNoteType) - ?ExecuteL@CESMRConfirmationQuery@@SAHW4TESMRConfirmationQueryType@1@@Z @ 20 NONAME ; int CESMRConfirmationQuery::ExecuteL(enum CESMRConfirmationQuery::TESMRConfirmationQueryType) - ?RecurrenceText@CESMRRecurrence@@QAEAAVHBufC16@@XZ @ 21 NONAME ; class HBufC16 & CESMRRecurrence::RecurrenceText(void) - ?NewL@CESMRGlobalNote@@SAPAV1@W4TESMGlobalNoteType@1@@Z @ 22 NONAME ; class CESMRGlobalNote * CESMRGlobalNote::NewL(enum CESMRGlobalNote::TESMGlobalNoteType) - ?ExecuteL@CESMRConfirmationQuery@@SAHABVTDesC16@@@Z @ 23 NONAME ; int CESMRConfirmationQuery::ExecuteL(class TDesC16 const &) - ?Id@CESMRAlarm@@QAEHXZ @ 24 NONAME ; int CESMRAlarm::Id(void) - ?ExecuteLD@CESMRGlobalNote@@QAEXXZ @ 25 NONAME ; void CESMRGlobalNote::ExecuteLD(void) - ?ExecuteLD@CESMRListQuery@@QAEHXZ @ 26 NONAME ; int CESMRListQuery::ExecuteLD(void) - ?GetFieldLayoutRect@NMRLayoutManager@@YA?AVTAknLayoutRect@@ABVTRect@@H@Z @ 27 NONAME ; class TAknLayoutRect NMRLayoutManager::GetFieldLayoutRect(class TRect const &, int) - ?SetValueL@CESMRContactMenuHandler@@QAEXABVTDesC16@@W4TValueType@1@@Z @ 28 NONAME ; void CESMRContactMenuHandler::SetValueL(class TDesC16 const &, enum CESMRContactMenuHandler::TValueType) - ?GetBitmapStruct@NMRBitmapManager@@YA?AVTMRBitmapStruct@1@W4TMRBitmapId@1@@Z @ 29 NONAME ; class NMRBitmapManager::TMRBitmapStruct NMRBitmapManager::GetBitmapStruct(enum NMRBitmapManager::TMRBitmapId) - ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@@Z @ 30 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType) - ?Close@RESMRStatic@@QAEXXZ @ 31 NONAME ; void RESMRStatic::Close(void) - ?LaunchPopupL@CMRStylusPopupMenu@@QAEXV?$TArray@VTMenuItem@CMRStylusPopupMenu@@@@ABVTPoint@@@Z @ 32 NONAME ; void CMRStylusPopupMenu::LaunchPopupL(class TArray, class TPoint const &) - ?NewL@CESMRListQuery@@SAPAV1@W4TESMRListQueryType@1@AAV?$RArray@H@@@Z @ 33 NONAME ; class CESMRListQuery * CESMRListQuery::NewL(enum CESMRListQuery::TESMRListQueryType, class RArray &) - ?ShowActionMenuL@CESMRContactMenuHandler@@QAEXXZ @ 34 NONAME ; void CESMRContactMenuHandler::ShowActionMenuL(void) - ?ContactMenuHandlerL@RESMRStatic@@QAEAAVCESMRContactMenuHandler@@XZ @ 35 NONAME ; class CESMRContactMenuHandler & RESMRStatic::ContactMenuHandlerL(void) - ??0TMenuItem@CMRStylusPopupMenu@@QAE@ABVTDesC16@@H@Z @ 36 NONAME ; CMRStylusPopupMenu::TMenuItem::TMenuItem(class TDesC16 const &, int) - ??1CESMRRecurrence@@UAE@XZ @ 37 NONAME ; CESMRRecurrence::~CESMRRecurrence(void) - ??0RESMRStatic@@QAE@XZ @ 38 NONAME ; RESMRStatic::RESMRStatic(void) - ?DisplaySendCascadeMenuL@CESMRSendUI@@QAEXAAVCEikMenuPane@@@Z @ 39 NONAME ; void CESMRSendUI::DisplaySendCascadeMenuL(class CEikMenuPane &) - ?ExecuteLD@CESMRListQuery@@QAEHAAV?$RArray@VTPtrC16@@@@@Z @ 40 NONAME ; int CESMRListQuery::ExecuteLD(class RArray &) - ?ExecuteOptionsMenuL@CESMRContactMenuHandler@@QAEXH@Z @ 41 NONAME ; void CESMRContactMenuHandler::ExecuteOptionsMenuL(int) - ?NewL@CESMRSendUI@@SAPAV1@H@Z @ 42 NONAME ; class CESMRSendUI * CESMRSendUI::NewL(int) - ??1CMRLabel@@UAE@XZ @ 43 NONAME ; CMRLabel::~CMRLabel(void) - ?CurrentFieldIndex@RESMRStatic@@QAEHXZ @ 44 NONAME ; int RESMRStatic::CurrentFieldIndex(void) - ?GetSkinBasedBitmap@NMRBitmapManager@@YAHW4TMRBitmapId@1@AAPAVCFbsBitmap@@1VTSize@@@Z @ 45 NONAME ; int NMRBitmapManager::GetSkinBasedBitmap(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, class TSize) - ?RemoveObserver@CESMRContactManagerHandler@@QAEXPAVMESMRContactManagerObserver@@@Z @ 46 NONAME ; void CESMRContactManagerHandler::RemoveObserver(class MESMRContactManagerObserver *) - ?ConstructFromResourceL@CESMRAlarm@@QAEXAAVTResourceReader@@@Z @ 47 NONAME ; void CESMRAlarm::ConstructFromResourceL(class TResourceReader &) - ?RecurrenceValue@CESMRRecurrence@@QAE?AW4TESMRRecurrenceValue@@XZ @ 48 NONAME ; enum TESMRRecurrenceValue CESMRRecurrence::RecurrenceValue(void) - ?RelativeTimeInMinutes@CESMRAlarm@@QAE?AVTTimeIntervalMinutes@@XZ @ 49 NONAME ; class TTimeIntervalMinutes CESMRAlarm::RelativeTimeInMinutes(void) - ?CanSendL@CESMRSendUI@@QAEHH@Z @ 50 NONAME ; int CESMRSendUI::CanSendL(int) - ?DisplaySendMenuItemL@CESMRSendUI@@QAEXAAVCEikMenuPane@@H@Z @ 51 NONAME ; void CESMRSendUI::DisplaySendMenuItemL(class CEikMenuPane &, int) - ??1CMRButton@@UAE@XZ @ 52 NONAME ; CMRButton::~CMRButton(void) - ?SetColor@NMRColorManager@@YAXAAVCEikTTimeEditor@@W4TMRColorId@1@@Z @ 53 NONAME ; void NMRColorManager::SetColor(class CEikTTimeEditor &, enum NMRColorManager::TMRColorId) - ?ContactManagerHandlerL@RESMRStatic@@QAEAAVCESMRContactManagerHandler@@XZ @ 54 NONAME ; class CESMRContactManagerHandler & RESMRStatic::ContactManagerHandlerL(void) - ?ExecuteEditBeforeSendL@CESMRListQuery@@SAHW4TESMRAttendeeStatus@@@Z @ 55 NONAME ; int CESMRListQuery::ExecuteEditBeforeSendL(enum TESMRAttendeeStatus) - ?NewL@CMRButton@@SAPAV1@W4TMRBitmapId@NMRBitmapManager@@W4TScaleMode@@@Z @ 56 NONAME ; class CMRButton * CMRButton::NewL(enum NMRBitmapManager::TMRBitmapId, enum TScaleMode) - ?GetLayoutRect@NMRLayoutManager@@YA?AVTAknLayoutRect@@ABVTRect@@W4TMRLayout@1@@Z @ 57 NONAME ; class TAknLayoutRect NMRLayoutManager::GetLayoutRect(class TRect const &, enum NMRLayoutManager::TMRLayout) - ?Reset@CESMRContactMenuHandler@@QAEXXZ @ 58 NONAME ; void CESMRContactMenuHandler::Reset(void) - ?SetContactMenuObserver@CESMRContactMenuHandler@@QAEXPAVMMRContactMenuObserver@@@Z @ 59 NONAME ; void CESMRContactMenuHandler::SetContactMenuObserver(class MMRContactMenuObserver *) - ?ExecuteL@CESMRGUIListQuery@@SAHW4TESMRListQueryType@1@@Z @ 60 NONAME ; int CESMRGUIListQuery::ExecuteL(enum CESMRGUIListQuery::TESMRListQueryType) - ?ConnectL@RESMRStatic@@QAEXXZ @ 61 NONAME ; void RESMRStatic::ConnectL(void) - ?ExecuteEditBeforeSendWithSendOptOnlyL@CESMRListQuery@@SAHW4TESMRAttendeeStatus@@@Z @ 62 NONAME ; int CESMRListQuery::ExecuteEditBeforeSendWithSendOptOnlyL(enum TESMRAttendeeStatus) - ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@AAV?$RArray@H@@@Z @ 63 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType, class RArray &) - ?NewL@CESMRListQuery@@SAPAV1@W4TESMRListQueryType@1@@Z @ 64 NONAME ; class CESMRListQuery * CESMRListQuery::NewL(enum CESMRListQuery::TESMRListQueryType) - ?GetTextComponentLayout@NMRLayoutManager@@YA?AVTAknTextComponentLayout@@W4TMRTextLayout@1@@Z @ 65 NONAME ; class TAknTextComponentLayout NMRLayoutManager::GetTextComponentLayout(enum NMRLayoutManager::TMRTextLayout) - ?ConstructFromResourceL@CESMRRecurrence@@QAEXPAVCCoeEnv@@AAVTResourceReader@@@Z @ 66 NONAME ; void CESMRRecurrence::ConstructFromResourceL(class CCoeEnv *, class TResourceReader &) - ?GetWindowComponentLayout@NMRLayoutManager@@YA?AVTAknWindowComponentLayout@@W4TMRLayout@1@@Z @ 67 NONAME ; class TAknWindowComponentLayout NMRLayoutManager::GetWindowComponentLayout(enum NMRLayoutManager::TMRLayout) - ?InitOptionsMenuL@CESMRContactMenuHandler@@QAEXPAVCEikMenuPane@@@Z @ 68 NONAME ; void CESMRContactMenuHandler::InitOptionsMenuL(class CEikMenuPane *) - ?Relative@CESMRAlarm@@QAEHXZ @ 69 NONAME ; int CESMRAlarm::Relative(void) - ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@AAV?$RArray@VTPtrC16@@@@@Z @ 70 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType, class RArray &) - ??0CESMRAlarm@@QAE@XZ @ 71 NONAME ; CESMRAlarm::CESMRAlarm(void) - ?SetCurrentFieldIndex@RESMRStatic@@QAEXH@Z @ 72 NONAME ; void RESMRStatic::SetCurrentFieldIndex(int) - ?GetMaskIconBitmapLC@NMRBitmapManager@@YAXW4TMRBitmapId@1@AAPAVCFbsBitmap@@1HVTSize@@@Z @ 73 NONAME ; void NMRBitmapManager::GetMaskIconBitmapLC(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, int, class TSize) - ??1CESMRSendUI@@UAE@XZ @ 74 NONAME ; CESMRSendUI::~CESMRSendUI(void) - ?NewL@CMRLabel@@SAPAV1@XZ @ 75 NONAME ; class CMRLabel * CMRLabel::NewL(void) - ??1CMRStylusPopupMenu@@UAE@XZ @ 76 NONAME ; CMRStylusPopupMenu::~CMRStylusPopupMenu(void) - ?NewL@CMRStylusPopupMenu@@SAPAV1@AAVMEikMenuObserver@@@Z @ 77 NONAME ; class CMRStylusPopupMenu * CMRStylusPopupMenu::NewL(class MEikMenuObserver &) - ??1CESMRAlarm@@UAE@XZ @ 78 NONAME ; CESMRAlarm::~CESMRAlarm(void) - ?NewL@CMRImage@@SAPAV1@W4TMRBitmapId@NMRBitmapManager@@HW4TScaleMode@@@Z @ 79 NONAME ; class CMRImage * CMRImage::NewL(enum NMRBitmapManager::TMRBitmapId, int, enum TScaleMode) + ?NewL@CMRButton@@SAPAV1@W4TMRBitmapId@NMRBitmapManager@@PBVCCoeControl@@W4TScaleMode@@@Z @ 9 NONAME ; class CMRButton * CMRButton::NewL(enum NMRBitmapManager::TMRBitmapId, class CCoeControl const *, enum TScaleMode) + ?SetColor@NMRColorManager@@YAXAAVCCoeControl@@W4TMRColorId@1@@Z @ 10 NONAME ; void NMRColorManager::SetColor(class CCoeControl &, enum NMRColorManager::TMRColorId) + ?Color@NMRColorManager@@YA?AVTRgb@@W4TMRColorId@1@@Z @ 11 NONAME ; class TRgb NMRColorManager::Color(enum NMRColorManager::TMRColorId) + ?OptionsMenuAvailable@CESMRContactMenuHandler@@QAEHXZ @ 12 NONAME ; int CESMRContactMenuHandler::OptionsMenuAvailable(void) + ?IsReady@CESMRContactManagerHandler@@QAEHXZ @ 13 NONAME ; int CESMRContactManagerHandler::IsReady(void) + ?SendAsVCalendarL@CESMRSendUI@@QAEXHAAVCCalEntry@@@Z @ 14 NONAME ; void CESMRSendUI::SendAsVCalendarL(int, class CCalEntry &) + ??0CESMRRecurrence@@QAE@XZ @ 15 NONAME ; CESMRRecurrence::CESMRRecurrence(void) + ?NewL@CMRLabel@@SAPAV1@PBVCCoeControl@@@Z @ 16 NONAME ; class CMRLabel * CMRLabel::NewL(class CCoeControl const *) + ?NewL@CMRImage@@SAPAV1@W4TMRBitmapId@NMRBitmapManager@@PBVCCoeControl@@HW4TScaleMode@@@Z @ 17 NONAME ; class CMRImage * CMRImage::NewL(enum NMRBitmapManager::TMRBitmapId, class CCoeControl const *, int, enum TScaleMode) + ?LoadTextL@CESMRAlarm@@QAEXPAVCCoeEnv@@@Z @ 18 NONAME ; void CESMRAlarm::LoadTextL(class CCoeEnv *) + ?GetSkinBasedBitmapLC@NMRBitmapManager@@YAXW4TMRBitmapId@1@AAPAVCFbsBitmap@@1VTSize@@@Z @ 19 NONAME ; void NMRBitmapManager::GetSkinBasedBitmapLC(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, class TSize) + ??1RESMRStatic@@QAE@XZ @ 20 NONAME ; RESMRStatic::~RESMRStatic(void) + ??1CMRImage@@UAE@XZ @ 21 NONAME ; CMRImage::~CMRImage(void) + ?ExecuteL@CESMRGlobalNote@@SAXW4TESMGlobalNoteType@1@@Z @ 22 NONAME ; void CESMRGlobalNote::ExecuteL(enum CESMRGlobalNote::TESMGlobalNoteType) + ?ExecuteL@CESMRConfirmationQuery@@SAHW4TESMRConfirmationQueryType@1@@Z @ 23 NONAME ; int CESMRConfirmationQuery::ExecuteL(enum CESMRConfirmationQuery::TESMRConfirmationQueryType) + ?RecurrenceText@CESMRRecurrence@@QAEAAVHBufC16@@XZ @ 24 NONAME ; class HBufC16 & CESMRRecurrence::RecurrenceText(void) + ?NewL@CESMRGlobalNote@@SAPAV1@W4TESMGlobalNoteType@1@@Z @ 25 NONAME ; class CESMRGlobalNote * CESMRGlobalNote::NewL(enum CESMRGlobalNote::TESMGlobalNoteType) + ?ExecuteL@CESMRConfirmationQuery@@SAHABVTDesC16@@@Z @ 26 NONAME ; int CESMRConfirmationQuery::ExecuteL(class TDesC16 const &) + ?Id@CESMRAlarm@@QAEHXZ @ 27 NONAME ; int CESMRAlarm::Id(void) + ?ExecuteLD@CESMRGlobalNote@@QAEXXZ @ 28 NONAME ; void CESMRGlobalNote::ExecuteLD(void) + ?ExecuteLD@CESMRListQuery@@QAEHXZ @ 29 NONAME ; int CESMRListQuery::ExecuteLD(void) + ?GetFieldLayoutRect@NMRLayoutManager@@YA?AVTAknLayoutRect@@ABVTRect@@H@Z @ 30 NONAME ; class TAknLayoutRect NMRLayoutManager::GetFieldLayoutRect(class TRect const &, int) + ?SetValueL@CESMRContactMenuHandler@@QAEXABVTDesC16@@W4TValueType@1@@Z @ 31 NONAME ; void CESMRContactMenuHandler::SetValueL(class TDesC16 const &, enum CESMRContactMenuHandler::TValueType) + ?GetBitmapStruct@NMRBitmapManager@@YA?AVTMRBitmapStruct@1@W4TMRBitmapId@1@@Z @ 32 NONAME ; class NMRBitmapManager::TMRBitmapStruct NMRBitmapManager::GetBitmapStruct(enum NMRBitmapManager::TMRBitmapId) + ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@@Z @ 33 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType) + ?Close@RESMRStatic@@QAEXXZ @ 34 NONAME ; void RESMRStatic::Close(void) + ?LaunchPopupL@CMRStylusPopupMenu@@QAEXV?$TArray@VTMenuItem@CMRStylusPopupMenu@@@@ABVTPoint@@@Z @ 35 NONAME ; void CMRStylusPopupMenu::LaunchPopupL(class TArray, class TPoint const &) + ?NewL@CESMRListQuery@@SAPAV1@W4TESMRListQueryType@1@AAV?$RArray@H@@@Z @ 36 NONAME ; class CESMRListQuery * CESMRListQuery::NewL(enum CESMRListQuery::TESMRListQueryType, class RArray &) + ?ShowActionMenuL@CESMRContactMenuHandler@@QAEXXZ @ 37 NONAME ; void CESMRContactMenuHandler::ShowActionMenuL(void) + ?ContactMenuHandlerL@RESMRStatic@@QAEAAVCESMRContactMenuHandler@@XZ @ 38 NONAME ; class CESMRContactMenuHandler & RESMRStatic::ContactMenuHandlerL(void) + ??0TMenuItem@CMRStylusPopupMenu@@QAE@ABVTDesC16@@H@Z @ 39 NONAME ; CMRStylusPopupMenu::TMenuItem::TMenuItem(class TDesC16 const &, int) + ??1CESMRRecurrence@@UAE@XZ @ 40 NONAME ; CESMRRecurrence::~CESMRRecurrence(void) + ??0RESMRStatic@@QAE@XZ @ 41 NONAME ; RESMRStatic::RESMRStatic(void) + ?DisplaySendCascadeMenuL@CESMRSendUI@@QAEXAAVCEikMenuPane@@@Z @ 42 NONAME ; void CESMRSendUI::DisplaySendCascadeMenuL(class CEikMenuPane &) + ?ExecuteLD@CESMRListQuery@@QAEHAAV?$RArray@VTPtrC16@@@@@Z @ 43 NONAME ; int CESMRListQuery::ExecuteLD(class RArray &) + ?ExecuteOptionsMenuL@CESMRContactMenuHandler@@QAEXH@Z @ 44 NONAME ; void CESMRContactMenuHandler::ExecuteOptionsMenuL(int) + ?NewL@CESMRSendUI@@SAPAV1@H@Z @ 45 NONAME ; class CESMRSendUI * CESMRSendUI::NewL(int) + ??1CMRLabel@@UAE@XZ @ 46 NONAME ; CMRLabel::~CMRLabel(void) + ?CurrentFieldIndex@RESMRStatic@@QAEHXZ @ 47 NONAME ; int RESMRStatic::CurrentFieldIndex(void) + ?GetSkinBasedBitmap@NMRBitmapManager@@YAHW4TMRBitmapId@1@AAPAVCFbsBitmap@@1VTSize@@@Z @ 48 NONAME ; int NMRBitmapManager::GetSkinBasedBitmap(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, class TSize) + ?RemoveObserver@CESMRContactManagerHandler@@QAEXPAVMESMRContactManagerObserver@@@Z @ 49 NONAME ; void CESMRContactManagerHandler::RemoveObserver(class MESMRContactManagerObserver *) + ?ConstructFromResourceL@CESMRAlarm@@QAEXAAVTResourceReader@@@Z @ 50 NONAME ; void CESMRAlarm::ConstructFromResourceL(class TResourceReader &) + ?RecurrenceValue@CESMRRecurrence@@QAE?AW4TESMRRecurrenceValue@@XZ @ 51 NONAME ; enum TESMRRecurrenceValue CESMRRecurrence::RecurrenceValue(void) + ?RelativeTimeInMinutes@CESMRAlarm@@QAE?AVTTimeIntervalMinutes@@XZ @ 52 NONAME ; class TTimeIntervalMinutes CESMRAlarm::RelativeTimeInMinutes(void) + ?CanSendL@CESMRSendUI@@QAEHH@Z @ 53 NONAME ; int CESMRSendUI::CanSendL(int) + ?DisplaySendMenuItemL@CESMRSendUI@@QAEXAAVCEikMenuPane@@H@Z @ 54 NONAME ; void CESMRSendUI::DisplaySendMenuItemL(class CEikMenuPane &, int) + ??1CMRButton@@UAE@XZ @ 55 NONAME ; CMRButton::~CMRButton(void) + ?SetColor@NMRColorManager@@YAXAAVCEikTTimeEditor@@W4TMRColorId@1@@Z @ 56 NONAME ; void NMRColorManager::SetColor(class CEikTTimeEditor &, enum NMRColorManager::TMRColorId) + ?ContactManagerHandlerL@RESMRStatic@@QAEAAVCESMRContactManagerHandler@@XZ @ 57 NONAME ; class CESMRContactManagerHandler & RESMRStatic::ContactManagerHandlerL(void) + ?ExecuteEditBeforeSendL@CESMRListQuery@@SAHW4TESMRAttendeeStatus@@@Z @ 58 NONAME ; int CESMRListQuery::ExecuteEditBeforeSendL(enum TESMRAttendeeStatus) + ?GetLayoutRect@NMRLayoutManager@@YA?AVTAknLayoutRect@@ABVTRect@@W4TMRLayout@1@@Z @ 59 NONAME ; class TAknLayoutRect NMRLayoutManager::GetLayoutRect(class TRect const &, enum NMRLayoutManager::TMRLayout) + ?Reset@CESMRContactMenuHandler@@QAEXXZ @ 60 NONAME ; void CESMRContactMenuHandler::Reset(void) + ?SetContactMenuObserver@CESMRContactMenuHandler@@QAEXPAVMMRContactMenuObserver@@@Z @ 61 NONAME ; void CESMRContactMenuHandler::SetContactMenuObserver(class MMRContactMenuObserver *) + ?ExecuteL@CESMRGUIListQuery@@SAHW4TESMRListQueryType@1@@Z @ 62 NONAME ; int CESMRGUIListQuery::ExecuteL(enum CESMRGUIListQuery::TESMRListQueryType) + ?ConnectL@RESMRStatic@@QAEXXZ @ 63 NONAME ; void RESMRStatic::ConnectL(void) + ?ExecuteEditBeforeSendWithSendOptOnlyL@CESMRListQuery@@SAHW4TESMRAttendeeStatus@@@Z @ 64 NONAME ; int CESMRListQuery::ExecuteEditBeforeSendWithSendOptOnlyL(enum TESMRAttendeeStatus) + ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@AAV?$RArray@H@@@Z @ 65 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType, class RArray &) + ?NewL@CESMRListQuery@@SAPAV1@W4TESMRListQueryType@1@@Z @ 66 NONAME ; class CESMRListQuery * CESMRListQuery::NewL(enum CESMRListQuery::TESMRListQueryType) + ?GetTextComponentLayout@NMRLayoutManager@@YA?AVTAknTextComponentLayout@@W4TMRTextLayout@1@@Z @ 67 NONAME ; class TAknTextComponentLayout NMRLayoutManager::GetTextComponentLayout(enum NMRLayoutManager::TMRTextLayout) + ?ConstructFromResourceL@CESMRRecurrence@@QAEXPAVCCoeEnv@@AAVTResourceReader@@@Z @ 68 NONAME ; void CESMRRecurrence::ConstructFromResourceL(class CCoeEnv *, class TResourceReader &) + ?GetWindowComponentLayout@NMRLayoutManager@@YA?AVTAknWindowComponentLayout@@W4TMRLayout@1@@Z @ 69 NONAME ; class TAknWindowComponentLayout NMRLayoutManager::GetWindowComponentLayout(enum NMRLayoutManager::TMRLayout) + ?InitOptionsMenuL@CESMRContactMenuHandler@@QAEXPAVCEikMenuPane@@@Z @ 70 NONAME ; void CESMRContactMenuHandler::InitOptionsMenuL(class CEikMenuPane *) + ?Relative@CESMRAlarm@@QAEHXZ @ 71 NONAME ; int CESMRAlarm::Relative(void) + ?ExecuteL@CESMRListQuery@@SAHW4TESMRListQueryType@1@AAV?$RArray@VTPtrC16@@@@@Z @ 72 NONAME ; int CESMRListQuery::ExecuteL(enum CESMRListQuery::TESMRListQueryType, class RArray &) + ??0CESMRAlarm@@QAE@XZ @ 73 NONAME ; CESMRAlarm::CESMRAlarm(void) + ?SetCurrentFieldIndex@RESMRStatic@@QAEXH@Z @ 74 NONAME ; void RESMRStatic::SetCurrentFieldIndex(int) + ?GetMaskIconBitmapLC@NMRBitmapManager@@YAXW4TMRBitmapId@1@AAPAVCFbsBitmap@@1HVTSize@@@Z @ 75 NONAME ; void NMRBitmapManager::GetMaskIconBitmapLC(enum NMRBitmapManager::TMRBitmapId, class CFbsBitmap * &, class CFbsBitmap * &, int, class TSize) + ??1CESMRSendUI@@UAE@XZ @ 76 NONAME ; CESMRSendUI::~CESMRSendUI(void) + ??1CMRStylusPopupMenu@@UAE@XZ @ 77 NONAME ; CMRStylusPopupMenu::~CMRStylusPopupMenu(void) + ?NewL@CMRStylusPopupMenu@@SAPAV1@AAVMEikMenuObserver@@@Z @ 78 NONAME ; class CMRStylusPopupMenu * CMRStylusPopupMenu::NewL(class MEikMenuObserver &) + ??1CESMRAlarm@@UAE@XZ @ 79 NONAME ; CESMRAlarm::~CESMRAlarm(void) ?GetColorStruct@NMRColorManager@@YA?AVTMRColorStruct@1@W4TMRColorId@1@@Z @ 80 NONAME ; class NMRColorManager::TMRColorStruct NMRColorManager::GetColorStruct(enum NMRColorManager::TMRColorId) diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/eabi/mrguicommonu.def --- a/meetingrequest/mrguicommon/eabi/mrguicommonu.def Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/eabi/mrguicommonu.def Thu Jul 15 18:19:25 2010 +0300 @@ -87,18 +87,16 @@ _ZN26CESMRContactManagerHandler14RemoveObserverEP27MESMRContactManagerObserver @ 86 NONAME _ZN26CESMRContactManagerHandler17GetContactManagerEv @ 87 NONAME _ZN26CESMRContactManagerHandler7IsReadyEv @ 88 NONAME - _ZN8CMRImage4NewLEN16NMRBitmapManager11TMRBitmapIdEi10TScaleMode @ 89 NONAME + _ZN8CMRImage4NewLEN16NMRBitmapManager11TMRBitmapIdEPK11CCoeControli10TScaleMode @ 89 NONAME _ZN8CMRImageD0Ev @ 90 NONAME _ZN8CMRImageD1Ev @ 91 NONAME _ZN8CMRImageD2Ev @ 92 NONAME - _ZN8CMRLabel4NewLEv @ 93 NONAME + _ZN8CMRLabel4NewLEPK11CCoeControl @ 93 NONAME _ZN8CMRLabelD0Ev @ 94 NONAME _ZN8CMRLabelD1Ev @ 95 NONAME _ZN8CMRLabelD2Ev @ 96 NONAME - _ZN9CMRButton4NewLEN16NMRBitmapManager11TMRBitmapIdE10TScaleMode @ 97 NONAME + _ZN9CMRButton4NewLEN16NMRBitmapManager11TMRBitmapIdEPK11CCoeControl10TScaleMode @ 97 NONAME _ZN9CMRButtonD0Ev @ 98 NONAME _ZN9CMRButtonD1Ev @ 99 NONAME _ZN9CMRButtonD2Ev @ 100 NONAME - _ZTI8CMRLabel @ 101 NONAME - _ZTV8CMRLabel @ 102 NONAME diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/inc/cmrbutton.h --- a/meetingrequest/mrguicommon/inc/cmrbutton.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/inc/cmrbutton.h Thu Jul 15 18:19:25 2010 +0300 @@ -34,11 +34,13 @@ * Two-phased constructor. * * @param aBitmapId + * @param aParent parent control * @param aScaleMode * @return Pointer to created and initialized mr image object. */ IMPORT_C static CMRButton* NewL( - NMRBitmapManager::TMRBitmapId aBitmapId, + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent = NULL, TScaleMode aScaleMode = EAspectRatioPreserved ); /** @@ -53,7 +55,9 @@ * C++ default constructor */ CMRButton( TScaleMode aScaleMode ); - void ConstructL( NMRBitmapManager::TMRBitmapId aBitmapId ); + void ConstructL( + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent ); private: TScaleMode iScaleMode; diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/inc/cmrimage.h --- a/meetingrequest/mrguicommon/inc/cmrimage.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/inc/cmrimage.h Thu Jul 15 18:19:25 2010 +0300 @@ -35,11 +35,13 @@ * Two-phased constructor. * * @param aBitmapId + * @param aParent parent control * @param aScaleMode * @return Pointer to created and initialized mr image object. */ IMPORT_C static CMRImage* NewL( NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent = NULL, TBool aIsMaskIcon = EFalse, TScaleMode aScaleMode = EAspectRatioPreserved ); @@ -56,7 +58,10 @@ * C++ default constructor */ CMRImage( TScaleMode aScaleMode ); - void ConstructL( NMRBitmapManager::TMRBitmapId aBitmapId, TBool aIsMaskIcon ); + void ConstructL( + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent, + TBool aIsMaskIcon ); void CreateIconL( NMRBitmapManager::TMRBitmapId aBitmapId ); void CreateMaskIconL( NMRBitmapManager::TMRBitmapId aBitmapId ); diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/inc/cmrlabel.h --- a/meetingrequest/mrguicommon/inc/cmrlabel.h Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/inc/cmrlabel.h Thu Jul 15 18:19:25 2010 +0300 @@ -25,14 +25,15 @@ // CLASS DECLARATIONS -class CMRLabel : public CEikLabel +NONSHARABLE_CLASS( CMRLabel ) : public CEikLabel { public: /** * Static construtor + * @param aParent parent control * @return New instance of this class */ - IMPORT_C static CMRLabel* NewL(); + IMPORT_C static CMRLabel* NewL( const CCoeControl* aParent = NULL ); /** * Destructor */ @@ -46,7 +47,7 @@ private: // Implementation CMRLabel(); - void ConstructL(); + void ConstructL( const CCoeControl* aParent ); private: // Data }; diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/src/cmrbutton.cpp --- a/meetingrequest/mrguicommon/src/cmrbutton.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/src/cmrbutton.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -30,11 +30,14 @@ // --------------------------------------------------------------------------- // EXPORT_C CMRButton* CMRButton::NewL( - NMRBitmapManager::TMRBitmapId aBitmapId, TScaleMode aScaleMode ) + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent, + TScaleMode aScaleMode + ) { CMRButton* self = new (ELeave) CMRButton( aScaleMode ); CleanupStack::PushL( self ); - self->ConstructL( aBitmapId ); + self->ConstructL( aBitmapId, aParent ); CleanupStack::Pop( self ); return self; } @@ -74,7 +77,9 @@ // CMRButton::ConstructL // --------------------------------------------------------------------------- // -void CMRButton::ConstructL( NMRBitmapManager::TMRBitmapId aBitmapId ) +void CMRButton::ConstructL( + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent ) { CFbsBitmap* bitMap( NULL ); CFbsBitmap* bitMapMask( NULL ); @@ -93,6 +98,11 @@ KNullDesC(), KNullDesC(), KAknButtonNoFrame | KAknButtonPressedDownFrame ); + + if ( aParent ) + { + SetContainerWindowL( *aParent ); + } } // EOF diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/src/cmrimage.cpp --- a/meetingrequest/mrguicommon/src/cmrimage.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/src/cmrimage.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -30,12 +30,13 @@ // EXPORT_C CMRImage* CMRImage::NewL( NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent, TBool aIsMaskIcon, TScaleMode aScaleMode ) { CMRImage* self = new (ELeave) CMRImage( aScaleMode ); CleanupStack::PushL( self ); - self->ConstructL( aBitmapId, aIsMaskIcon ); + self->ConstructL( aBitmapId, aParent, aIsMaskIcon ); CleanupStack::Pop( self ); return self; } @@ -74,10 +75,12 @@ // CMRImage::ConstructL // --------------------------------------------------------------------------- // -void CMRImage::ConstructL( NMRBitmapManager::TMRBitmapId aBitmapId, - TBool aIsMaskIcon ) +void CMRImage::ConstructL( + NMRBitmapManager::TMRBitmapId aBitmapId, + const CCoeControl* aParent, + TBool aIsMaskIcon ) { - if( aIsMaskIcon ) + if ( aIsMaskIcon ) { CreateMaskIconL( aBitmapId ); } @@ -85,6 +88,11 @@ { CreateIconL( aBitmapId ); } + + if ( aParent ) + { + SetContainerWindowL( *aParent ); + } } // --------------------------------------------------------------------------- diff -r efd4f1afd43e -r d620048b4810 meetingrequest/mrguicommon/src/cmrlabel.cpp --- a/meetingrequest/mrguicommon/src/cmrlabel.cpp Mon Jun 21 15:20:54 2010 +0300 +++ b/meetingrequest/mrguicommon/src/cmrlabel.cpp Thu Jul 15 18:19:25 2010 +0300 @@ -29,13 +29,13 @@ // CMRLabel::NewL // --------------------------------------------------------------------------- // -EXPORT_C CMRLabel* CMRLabel::NewL() +EXPORT_C CMRLabel* CMRLabel::NewL( const CCoeControl* aParent ) { FUNC_LOG; CMRLabel* self = new (ELeave) CMRLabel(); CleanupStack::PushL( self ); - self->ConstructL(); + self->ConstructL( aParent ); CleanupStack::Pop( self ); return self; } @@ -44,12 +44,17 @@ // CMRLabel::ConstructL // --------------------------------------------------------------------------- // -void CMRLabel::ConstructL() +void CMRLabel::ConstructL( const CCoeControl* aParent ) { FUNC_LOG; NMRColorManager::SetColor( *this, NMRColorManager::EMRMainAreaTextColor ); + + if ( aParent ) + { + SetContainerWindowL( *aParent ); + } } // ---------------------------------------------------------------------------