# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1271248935 -10800 # Node ID 8592a65ad3fbffedc24972634af6d794c09ff04c # Parent 4ce476e64c59436ad5c789ecc1786e514eac2d16 Revision: 201013 Kit: 201015 diff -r 4ce476e64c59 -r 8592a65ad3fb emailcontacts/contactactionmenu/src/cfsccontactactionmenulist.cpp --- a/emailcontacts/contactactionmenu/src/cfsccontactactionmenulist.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailcontacts/contactactionmenu/src/cfsccontactactionmenulist.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -27,14 +27,14 @@ #include #include #include -#include -#include -#include -#include +#include +#include +#include +#include #include -#include +#include #include -#include +#include #include #include diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailclientapi/src/emailmailbox.cpp --- a/emailservices/emailclientapi/src/emailmailbox.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailclientapi/src/emailmailbox.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -434,26 +434,26 @@ TAny* aParam3 ) { const TEventMapFunc KMailboxEventHandlers[] = { - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::IgnoreEventL, - CEmailMailbox::TObserverEventMapper::NewMessageL, - CEmailMailbox::TObserverEventMapper::MessageChangedL, - CEmailMailbox::TObserverEventMapper::MessageDeletedL, - CEmailMailbox::TObserverEventMapper::MessageMoved, - CEmailMailbox::TObserverEventMapper::MessageCopiedL, - CEmailMailbox::TObserverEventMapper::NewFolderL, - CEmailMailbox::TObserverEventMapper::FolderChangeL, - CEmailMailbox::TObserverEventMapper::FoldersDeletedL, - CEmailMailbox::TObserverEventMapper::FoldersMovedL, - CEmailMailbox::TObserverEventMapper::ExceptionL + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::IgnoreEventL, + &CEmailMailbox::TObserverEventMapper::NewMessageL, + &CEmailMailbox::TObserverEventMapper::MessageChangedL, + &CEmailMailbox::TObserverEventMapper::MessageDeletedL, + &CEmailMailbox::TObserverEventMapper::MessageMoved, + &CEmailMailbox::TObserverEventMapper::MessageCopiedL, + &CEmailMailbox::TObserverEventMapper::NewFolderL, + &CEmailMailbox::TObserverEventMapper::FolderChangeL, + &CEmailMailbox::TObserverEventMapper::FoldersDeletedL, + &CEmailMailbox::TObserverEventMapper::FoldersMovedL, + &CEmailMailbox::TObserverEventMapper::ExceptionL }; TMailboxId id( aMailbox.Id() ); diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailclientapi/src/emailmessage.cpp --- a/emailservices/emailclientapi/src/emailmessage.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailclientapi/src/emailmessage.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -643,8 +643,7 @@ CleanupStack::PushL( part ); CEmailAttachment* att = CEmailAttachment::NewLC(iPluginData, iMsgContentId, part, EAPIOwns); iAttachments.AppendL( att ); - - CleanupStack::Pop(); // part, att + CleanupStack::Pop(2); // part, att return att; } diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailframework/commonlib/inc/cmailboxstateext.h --- a/emailservices/emailframework/commonlib/inc/cmailboxstateext.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailframework/commonlib/inc/cmailboxstateext.h Wed Apr 14 15:42:15 2010 +0300 @@ -19,7 +19,7 @@ #define CMAILBOXSTATEEXT_H #include "cemailextensionbase.h" -#include "CFSMailCommon.h" +#include "cfsmailcommon.h" // interface UID value passed to CFSMailClient::ExtensionL const TUid KEmailMailboxStateExtensionUid = { 0x2001E28B }; diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailframework/src/CFSClientAPIRequestHandler.cpp --- a/emailservices/emailframework/src/CFSClientAPIRequestHandler.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailframework/src/CFSClientAPIRequestHandler.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -27,12 +27,9 @@ // ----------------------------------------------------------------------------- CFSClientAPIRequestHandler::CFSClientAPIRequestHandler( MEmailClientPluginManager* aPluginManager ) : iPluginManager(aPluginManager) -{ + { FUNC_LOG; - - // store pointer to TLS - TInt err = Dll::SetTls(static_cast(this)); -} + } // ----------------------------------------------------------------------------- // CFSMailRequestHandler::~CFSMailRequestHandler diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/data/emailwidget.rss --- a/emailservices/emailserver/cmailhandlerplugin/data/emailwidget.rss Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/data/emailwidget.rss Wed Apr 14 15:42:15 2010 +0300 @@ -35,4 +35,5 @@ // RESOURCE TBUF r_emailwidget_text_setup_email { buf=qtn_hscr_ew_configure_email; } RESOURCE TBUF r_emailwidget_text_mailbox_and_mailcount { buf=qtn_hscr_ew_email_count; } +RESOURCE TBUF r_emailwidget_text_hs_page_full { buf=qtn_cmail_hs_widget_full_notification; } // diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/group/cmailhandlerplugin.mmp --- a/emailservices/emailserver/cmailhandlerplugin/group/cmailhandlerplugin.mmp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/group/cmailhandlerplugin.mmp Wed Apr 14 15:42:15 2010 +0300 @@ -103,3 +103,7 @@ LIBRARY apparc.lib LIBRARY cmaillogger.lib LIBRARY flogger.lib +LIBRARY hsccapiclient.lib +LIBRARY hscontentcontrol.lib +LIBRARY hscontentinfo.lib +LIBRARY aknnotify.lib diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpshandler.h Wed Apr 14 15:42:15 2010 +0300 @@ -21,6 +21,7 @@ #include #include // base class +#include // FSMailServer classes (base classes and callback interfaces) #include "fsnotificationhandlerbase.h" @@ -133,9 +134,40 @@ /** * - */ + */ void CleanWaitingForNewMailbox(); + /** + * + */ + void SetWaitingForNewWidget( const TFSMailMsgId aMailbox ); + + /** + * + */ + void CleanWaitingForNewWidget(); + + /** + * + */ + TFSMailMsgId WaitingForNewWidget(); + + /** + * + */ + void AssociateWidgetToSetting( const TDesC& aContentId, + const TFSMailMsgId aMailbox ); + + /** + * + */ + TBool Associated( const TDesC& aContentId ); + + /** + * + */ + void DisplayHSPageFullNoteL(); + protected: /** * From CFSNotificationHandlerBase @@ -410,6 +442,10 @@ // tells if email wizard is started from widget and it is still running // and to which widget next added account is added. HBufC* iWaitingForNewMailbox; + // + TFSMailMsgId iWaitingForNewWidget; + // + CAknGlobalNote* iQuery; }; #endif //__CMAILCPSHANDLER_H__ diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsif.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsif.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsif.h Wed Apr 14 15:42:15 2010 +0300 @@ -25,6 +25,10 @@ #include #include #include +#include +#include +#include +#include #include "cmailcpshandler.h" #include "cmailcpsifconsts.h" @@ -36,7 +40,9 @@ * @lib fsmailserver.exe * @since S60 v5.1 */ -NONSHARABLE_CLASS( CMailCpsIf ) : public CBase, public MLiwNotifyCallback +NONSHARABLE_CLASS( CMailCpsIf ) : public CBase, + public MHsContentControl, + public MLiwNotifyCallback { public: /** @@ -170,6 +176,11 @@ * */ TInt GetWidgetInstanceCount(); + + /** + * + */ + void AddWidgetToHomescreenL( const TFSMailMsgId aMailbox ); private: @@ -247,6 +258,13 @@ */ void ResetPublishedDataL( const TDesC& aContentId ); + // + // -------------------------- from base classes----------------------------- + // + virtual void NotifyWidgetListChanged(); // MHsContentControl + virtual void NotifyViewListChanged(); // MHsContentControl + virtual void NotifyAppListChanged(); // MHsContentControl + public: // RPointerArray iInstIdList; @@ -272,6 +290,8 @@ TBool iAllowedToPublish[KMaxMailboxCount]; // From configuration: are homescreen notifications observed or ignored TBool iIgnoreHsNotifications; + + CHsCcApiClient* iContentControlClient; }; #endif /*CMAILCPSIF_H_*/ diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsifconsts.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsifconsts.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpsifconsts.h Wed Apr 14 15:42:15 2010 +0300 @@ -34,6 +34,9 @@ _LIT( KLessThan,"<"); _LIT( KAt,"@"); _LIT( KDot,"."); +_LIT( KSkinPrefix, "SKIN(" ); + +_LIT( KSkinPostfix, "):"); _LIT( KMifPrefix, "mif("); // Mif file name and path, drive letter need to be parsed run time _LIT( KMifPath, "\\resource\\apps\\cmailhandlerplugin.mif"); @@ -50,6 +53,8 @@ // _LIT(KPubId, "0x2001F413:CMailWidget"); +_LIT8(KConfId8, "0x2001e272"); + _LIT(KContTypeText, "text"); _LIT(KContTypeImage, "image"); diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/inc/cmailcpssettings.h --- a/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpssettings.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/inc/cmailcpssettings.h Wed Apr 14 15:42:15 2010 +0300 @@ -102,13 +102,6 @@ void RemoveMailboxL( const TFSMailMsgId aMailbox ); /** - * Removes mailbox from widget settings - * @param aIndex refers to index in mailbox array that is returned by - * CMailCpsSettings::Mailboxes() - */ - void RemoveMailboxL( const TInt aIndex ); - - /** * Gets maximum row count * @return maximum row count */ @@ -188,6 +181,13 @@ * */ TBool GetNewMailState( const TFSMailMsgId& aMailBox ); + + /** + * Find next free CenRep key to store setting. + * @param aContentId Id of widget instance + * @return true if account is associated to content id, false if not + */ + TBool Associated( const TDesC& aContentId ); protected: /** diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpshandler.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -50,9 +50,12 @@ // CMailCpsHandler::CMailCpsHandler( MFSNotificationHandlerMgr& aOwner ): CFSNotificationHandlerBase( aOwner ), - iWaitingForNewMailbox(NULL) + iWaitingForNewMailbox( NULL ), + iWaitingForNewWidget() { FUNC_LOG; + iWaitingForNewWidget.SetPluginId( KNullUid ); + iWaitingForNewWidget.SetId( 0 ); } // --------------------------------------------------------- @@ -140,14 +143,7 @@ { mailboxId = mailbox->GetId().Id(); } - if ( !mailboxId ) - { - // Remove box from settings - iSettings->RemoveMailboxL( ii ); - // Array indexing changes now since one item was deleted - ii--; - } - else + if ( mailboxId ) { CleanupStack::PushL( mailbox ); CMailMailboxDetails* mailboxDetails = CreateMailboxDetailsL( *mailbox ); @@ -863,6 +859,10 @@ { iSettings->AssociateWidgetToSetting( iWaitingForNewMailbox->Des(), aMailbox ); } + else + { + iLiwIf->AddWidgetToHomescreenL( aMailbox ); + } } // --------------------------------------------------------- @@ -1828,3 +1828,76 @@ iWaitingForNewMailbox = NULL; } } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::SetWaitingForNewWidget() +// ----------------------------------------------------------------------------- +// +void CMailCpsHandler::SetWaitingForNewWidget( const TFSMailMsgId aMailbox ) + { + FUNC_LOG; + iWaitingForNewWidget.SetPluginId( aMailbox.PluginId() ); + iWaitingForNewWidget.SetId( aMailbox.Id() ); + } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::CleanWaitingForNewWidget() +// ----------------------------------------------------------------------------- +// +void CMailCpsHandler::CleanWaitingForNewWidget() + { + FUNC_LOG; + iWaitingForNewWidget.SetPluginId( KNullUid ); + iWaitingForNewWidget.SetId( 0 ); + } + +// ----------------------------------------------------------------------------- +// CMailCpsHandler::WaitingForNewWidget() +// ----------------------------------------------------------------------------- +// +TFSMailMsgId CMailCpsHandler::WaitingForNewWidget() + { + FUNC_LOG; + return iWaitingForNewWidget; + } + +// --------------------------------------------------------------------------- +// CMailCpsSettings::AssociateWidgetToSetting +// --------------------------------------------------------------------------- +// +void CMailCpsHandler::AssociateWidgetToSetting( const TDesC& aContentId, + const TFSMailMsgId aMailbox ) + { + FUNC_LOG; + iSettings->AssociateWidgetToSetting( aContentId, aMailbox ); + } + + +// --------------------------------------------------------------------------- +// CMailCpsHandler::Associated +// --------------------------------------------------------------------------- +// +TBool CMailCpsHandler::Associated( const TDesC& aContentId ) + { + FUNC_LOG; + return iSettings->Associated( aContentId ); + } + +// --------------------------------------------------------------------------- +// CMailCpsSettings::DisplayHSPageFullNoteL +// --------------------------------------------------------------------------- +// +void CMailCpsHandler::DisplayHSPageFullNoteL() + { + FUNC_LOG; + if (!iQuery) + { + iQuery = CAknGlobalNote::NewL(); + iQuery->SetSoftkeys(R_AVKON_SOFTKEYS_OK_EMPTY); + } + HBufC* str( NULL ); + str = StringLoader::LoadLC( R_EMAILWIDGET_TEXT_HS_PAGE_FULL ); + iQuery->ShowNoteL(EAknGlobalConfirmationNote, str->Des()); + CleanupStack::PopAndDestroy( str ); + } + diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpsif.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -75,6 +75,8 @@ PublisherRegisteryActionL(); ResetPublishedDataL( KCPAll ); + + iContentControlClient = CHsCcApiClient::NewL( this ); } // --------------------------------------------------------------------------- @@ -95,6 +97,10 @@ delete iServiceHandler; iInstIdList.ResetAndDestroy(); CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset ); + if ( iContentControlClient ) + { + delete iContentControlClient; + } } // --------------------------------------------------------- @@ -624,8 +630,28 @@ if (!iconIds.Length()) { - TBuf id; - iconIds.Copy( KMifPrefix ); + TBuf id; + if ( aBitmapId == EMbmCmailhandlerpluginQgn_stat_message_mail_uni ) + { + iconIds.Append( KSkinPrefix ); + id.Num( EAknsMajorGeneric ); + iconIds.Append( id ); + iconIds.Append( KSpace ); + id.Num( EAknsMinorGenericQgnStatMessageMailUni ); + iconIds.Append( id ); + iconIds.Append( KSkinPostfix ); + } + else if ( aBitmapId == EMbmCmailhandlerpluginQgn_indi_cmail_outbox_msg ) + { + iconIds.Append( KSkinPrefix ); + id.Num( EAknsMajorGeneric ); + iconIds.Append( id ); + iconIds.Append( KSpace ); + id.Num( EAknsMinorGenericQgnIndiCmailOutboxMsg ); + iconIds.Append( id ); + iconIds.Append( KSkinPostfix ); + } + iconIds.Append( KMifPrefix ); iconIds.Append( mifParse.FullName() ); iconIds.Append( KSpace ); id.Num( aBitmapId ); @@ -869,8 +895,9 @@ { // Publishing to homescreen suspended. HBufC* cid = contentid.AllocLC(); - TInt widgetInstance = FindWidgetInstanceId(cid->Des()); - iAllowedToPublish[widgetInstance] = EFalse; + TInt widgetInstance = FindWidgetInstanceId(cid->Des()); + if(widgetInstance>=0) + iAllowedToPublish[widgetInstance] = EFalse; CleanupStack::PopAndDestroy( cid ); } else if (trigger.Compare(KResume16) == 0) @@ -894,14 +921,26 @@ { // Widget added to homescreen HBufC* cid = contentid.AllocLC(); - iInstIdList.AppendL( contentid.AllocL() ); - if ( iMailCpsHandler->TotalMailboxCountL() ) + if ( cid->Length() > 0 ) { - iMailCpsHandler->LaunchWidgetSettingsL(cid->Des()); - } - else - { - iMailCpsHandler->LaunchEmailWizardL(cid->Des()); + iInstIdList.AppendL( contentid.AllocL() ); + TFSMailMsgId mailBox( iMailCpsHandler->WaitingForNewWidget() ); + if ( mailBox.Id() > 0 ) + { + // Associate new mailbox to widget setting + iMailCpsHandler->AssociateWidgetToSetting( + cid->Des(), + mailBox ); + iMailCpsHandler->CleanWaitingForNewWidget(); + } + else if ( iMailCpsHandler->TotalMailboxCountL() ) + { + iMailCpsHandler->LaunchWidgetSettingsL(cid->Des()); + } + else + { + iMailCpsHandler->LaunchEmailWizardL(cid->Des()); + } } CleanupStack::PopAndDestroy( cid ); } @@ -1042,3 +1081,79 @@ outParam->Reset(); inParam->Reset(); } + +// --------------------------------------------------------------------------- +// CMailCpsIf::AddWidgetToHomescreenL +// --------------------------------------------------------------------------- +// +void CMailCpsIf::AddWidgetToHomescreenL( const TFSMailMsgId aMailbox ) + { + FUNC_LOG; + + for ( TInt i = 0; i < iInstIdList.Count(); i++ ) + { + if ( !iMailCpsHandler->Associated(iInstIdList[i]->Des()) ) + { + // Empty e-mail widget found. Associate new account to it. + iMailCpsHandler->AssociateWidgetToSetting( + iInstIdList[i]->Des(), + aMailbox ); + return; + } + } + + CHsContentInfoArray* widgets = CHsContentInfoArray::NewL(); + CleanupStack::PushL( widgets ); + iContentControlClient->WidgetListL( *widgets ); + CHsContentInfo* widgetContentInfo( NULL ); + + for ( TInt i = 0; i < widgets->Array().Count(); i++ ) + { + widgetContentInfo = widgets->Array()[i]; + if (!widgetContentInfo->Uid().Compare(KConfId8)) + { + // E-mail widget found + widgetContentInfo->SetCanBeRemoved( ETrue ); + if ( iContentControlClient->AddWidgetL( *widgetContentInfo ) == KErrNone ) + { + // Widget added succesfully. Wait PluginStartup event from HS. + iMailCpsHandler->SetWaitingForNewWidget( aMailbox ); + } + else + { + iMailCpsHandler->DisplayHSPageFullNoteL(); + } + break; + } + } + CleanupStack::PopAndDestroy(); + } + + +// --------------------------------------------------------------------------- +// CMailCpsIf::NotifyWidgetListChanged +// --------------------------------------------------------------------------- +// +void CMailCpsIf::NotifyWidgetListChanged() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMailCpsIf::NotifyViewListChanged +// --------------------------------------------------------------------------- +// +void CMailCpsIf::NotifyViewListChanged() + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CMailCpsIf::NotifyAppListChanged +// --------------------------------------------------------------------------- +// +void CMailCpsIf::NotifyAppListChanged() + { + FUNC_LOG; + } + diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp --- a/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/cmailhandlerplugin/src/cmailcpssettings.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -145,6 +145,7 @@ ret = ResolveMailbox( value, mailbox ); if ( ret ) { + INFO("CMailCpsSettings::LoadSettingsL(): Error: ignore this entry"); // Resolving encountered error, ignore this entry ret = iCenRep->Reset( KCMailMailboxIdBase+ii ); ret = iCenRep->Reset( KCMailPluginIdBase+ii ); @@ -216,7 +217,8 @@ FUNC_LOG; RPointerArray mailboxarray; TInt err = iMailClient.ListMailBoxes( TFSMailMsgId(), mailboxarray ); - if( !err ) + INFO_1("CMailCpsSettings::ResolveMailbox(): : ListMailBoxes() returns %d", err); + if( !err ) // KErrNone = 0 { err = KErrNotFound; aMsg.SetId( aMailboxId ); @@ -227,13 +229,11 @@ { // Mailbox found aMsg.SetPluginId( mailboxarray[ii]->GetId().PluginId() ); - return err = KErrNone; + err = KErrNone; + break; } } } - else - { - } mailboxarray.ResetAndDestroy(); return err; } @@ -386,40 +386,16 @@ { if( iMailboxArray[ii].Id() == aMailbox.Id() ) { - RemoveMailboxL( ii ); + TBuf cid; + GetContentId( aMailbox.Id(), 1, cid ); + DissociateWidgetFromSettingL( cid ); + iMailboxArray.Remove( ii ); break; } } } // --------------------------------------------------------------------------- -// CMailCpsSettings::RemoveMailboxL -// --------------------------------------------------------------------------- -// -void CMailCpsSettings::RemoveMailboxL( const TInt aIndex ) - { - FUNC_LOG; - - // Remove mailbox from local array - TFSMailMsgId mailboxId = iMailboxArray[aIndex]; - iMailboxArray.Remove( aIndex ); - - // Remove mailbox from widget settings - RArray keys; - GetMailboxNonZeroKeysL( keys ); - const TInt iiMax( keys.Count() ); - for ( TInt ii = 0; ii < iiMax; ii++ ) - { - TInt value( 0 ); - iCenRep->Get( keys[ii], value ); - if( value == mailboxId.Id() ) - { - iCenRep->Set( keys[ii], 0 ); - } - } - } - -// --------------------------------------------------------------------------- // CMailCpsSettings::MaxRowCount // --------------------------------------------------------------------------- // @@ -466,21 +442,17 @@ void CMailCpsSettings::DissociateWidgetFromSettingL( const TDesC& aContentId ) { FUNC_LOG; - TUint32 key(0); - TUint32 mailboxKey(0); - - for (TInt i = 0; i < KMaxMailboxCount; i++) + for ( TInt i = 0; i < KMaxMailboxCount; i++ ) { TBuf value; - TUint32 tempKey(KCMailWidgetContentIdBase+i); - iCenRep->Get( tempKey, value ); + TUint32 key( KCMailWidgetContentIdBase + i ); + iCenRep->Get( key, value ); TInt result = value.Compare(aContentId); if (!result) { - key = tempKey; - mailboxKey = KCMailMailboxIdBase + i; - iCenRep->Reset(key); - iCenRep->Reset(mailboxKey); + iCenRep->Reset( key ); + iCenRep->Reset( KCMailMailboxIdBase + i ); + iCenRep->Reset( KCMailPluginIdBase + i ); break; } } @@ -526,6 +498,30 @@ } // --------------------------------------------------------------------------- +// CMailCpsSettings::Associated +// --------------------------------------------------------------------------- +// +TBool CMailCpsSettings::Associated( const TDesC& aContentId ) + { + FUNC_LOG; + TBool ret(EFalse); + + for (TInt i = 0; i < KMaxMailboxCount; i++) + { + TBuf value; + TUint32 key(KCMailWidgetContentIdBase+i); + iCenRep->Get( key, value ); + TInt result = value.Compare(aContentId); + if (!result) + { + ret = ETrue; + break; + } + } + return ret; + } + +// --------------------------------------------------------------------------- // CMailCpsSettings::GetContentId // --------------------------------------------------------------------------- // diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailserver/src/FsEmailGlobalDialogsAppUi.cpp --- a/emailservices/emailserver/src/FsEmailGlobalDialogsAppUi.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailserver/src/FsEmailGlobalDialogsAppUi.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -28,7 +28,7 @@ // is hided from task list so it's not possible switch FSMailServer back to // foreground if user switches to Idle before dismissing the note. // '- 1' is needed for the VKB to work correctly -const TInt KFsEmailDialogsWinPriorityActive = ECoeWinPriorityAlwaysAtFront - 1; +const TInt KFsEmailDialogsWinPriorityActive = ECoeWinPriorityNormal; // To be used as FSMailServer window group priority when there is no displayable // content. diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/BWINS/basepluginU.DEF --- a/emailservices/emailstore/base_plugin/BWINS/basepluginU.DEF Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/BWINS/basepluginU.DEF Wed Apr 14 15:42:15 2010 +0300 @@ -192,4 +192,5 @@ ?Load2L@CResourceLoader@@QAEPAVHBufC16@@HH@Z @ 191 NONAME ; class HBufC16 * CResourceLoader::Load2L(int, int) ?Load2LC@CResourceLoader@@QAEPAVHBufC16@@H@Z @ 192 NONAME ; class HBufC16 * CResourceLoader::Load2LC(int) ?Load2L@CResourceLoader@@QAEPAVHBufC16@@HABVTDesC16@@@Z @ 193 NONAME ; class HBufC16 * CResourceLoader::Load2L(int, class TDesC16 const &) + ?CalendarFileName@CBasePlugin@@MBEABVTDesC16@@XZ @ 194 NONAME ; class TDesC16 const & CBasePlugin::CalendarFileName(void) const diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/EABI/basepluginU.DEF --- a/emailservices/emailstore/base_plugin/EABI/basepluginU.DEF Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/EABI/basepluginU.DEF Wed Apr 14 15:42:15 2010 +0300 @@ -296,4 +296,5 @@ _ZN15CResourceLoader7Load2LCEi @ 295 NONAME _ZN15CResourceLoader7Load2LCEiRK7TDesC16 @ 296 NONAME _ZN15CResourceLoader7Load2LCEii @ 297 NONAME + _ZNK11CBasePlugin16CalendarFileNameEv @ 298 NONAME diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/group/BasePlugin.mmp --- a/emailservices/emailstore/base_plugin/group/BasePlugin.mmp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/group/BasePlugin.mmp Wed Apr 14 15:42:15 2010 +0300 @@ -77,6 +77,7 @@ LIBRARY bafl.lib LIBRARY efsrv.lib LIBRARY gdi.lib +LIBRARY calinterimapi.lib LIBRARY messagestoreclient.lib LIBRARY fsfwcommonlib.lib diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/inc/BasePlugin.h --- a/emailservices/emailstore/base_plugin/inc/BasePlugin.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/inc/BasePlugin.h Wed Apr 14 15:42:15 2010 +0300 @@ -742,6 +742,8 @@ TMsgStoreId aId, TMsgStoreId aParentId, TMsgStoreId aOtherId ); + + IMPORT_C virtual const TDesC& CBasePlugin::CalendarFileName() const; public: @@ -774,7 +776,7 @@ TCacheLine iCacheLine; private: - + protected: MDelayedOpsManager* iDelayedOpsManager; /** diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/src/BasePlugin.cpp --- a/emailservices/emailstore/base_plugin/src/BasePlugin.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/src/BasePlugin.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -30,6 +30,7 @@ //Freestyle. #include "cfsmailcommon.h" #include "cfsmailmessage.h" +#include "cmrcalendarinfo.h" // //Base plugin. #include "baseplugin.h" @@ -40,6 +41,7 @@ // Other #include #include +#include // #include "FreestyleEmailUiConstants.h" @@ -258,6 +260,37 @@ MMRInfoProcessor* infoProcessor = CBaseMrInfoProcessor::NewL( *this ); result->SetMRInfoProcessorL( infoProcessor ); + //JOJA-83VJ4L Plugins need to set the correct Calendar Database ID for MRUI to work + //get the calendar file name from the derived class + const TDesC& calFileName = CalendarFileName(); + if ( calFileName != KNullDesC ) + { + //the derived class does use its own calendar file, check if that file exists + //the file may not exist because cal sync was disabled, or the file was deleted from the calendar UI + CCalSession* calSession = CCalSession::NewL(); + CleanupStack::PushL( calSession ); + + TRAPD( error, calSession->OpenL( calFileName ) ); + if ( error == KErrNone ) + { + //calendar file exists, get its file id, and set it to cMail Celendar Info via the extention + TCalFileId fileId = KNullFileId; + calSession->FileIdL( fileId ); + + //get the extention api for the MR info, set the cal db id, and release the extention + CEmailExtension* extension = NULL; + TRAP( error, extension = result->ExtensionL( KMailboxExtMrCalInfo ) ); + if ( error == KErrNone ) + { + CMRCalendarInfo* calInfo = reinterpret_cast( extension ); + calInfo->SetCalendarDatabaseIdL( fileId ); // cannot actually leave + result->ReleaseExtension( calInfo ); + } + } + + CleanupStack::PopAndDestroy( calSession ); + } + CleanupStack::Pop( result ); __LOG_EXIT diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/src/basepluginmisc.cpp --- a/emailservices/emailstore/base_plugin/src/basepluginmisc.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/src/basepluginmisc.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -644,3 +644,8 @@ { return *iDelayedOpsManager; } + +/*protected*/ EXPORT_C const TDesC& CBasePlugin::CalendarFileName() const + { + return KNullDesC(); + } diff -r 4ce476e64c59 -r 8592a65ad3fb emailservices/emailstore/base_plugin/src/baseplugintranslator.cpp --- a/emailservices/emailstore/base_plugin/src/baseplugintranslator.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailservices/emailstore/base_plugin/src/baseplugintranslator.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -768,6 +768,10 @@ TTime sentTime; sentTime.UniversalTime(); aDst.AddOrUpdatePropertyL( KMsgStorePropertySent, sentTime ); + // same date needs to be set as received date , because of sorting + // feature in message store, which enable sorting only according to + // received date. + aDst.AddOrUpdatePropertyL( KMsgStorePropertyReceivedAt, sentTime ); aSrc.SetDate( sentTime ); } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/data/FreestyleEmailUi.rss --- a/emailuis/emailui/data/FreestyleEmailUi.rss Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/data/FreestyleEmailUi.rss Wed Apr 14 15:42:15 2010 +0300 @@ -34,6 +34,7 @@ #include #include #include +#include #define EMAILUI_ICON_FILE BITMAP_DIR"\\FreestyleEmailUi.mif" #ifndef qtn_cmail_options_moveto_folder @@ -83,8 +84,9 @@ { helptxt = qtn_msg_tb_tooltip_send; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_msg_send; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_msg_send_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_msg_send; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_msg_send_mask; + extension = r_cmail_button_state_ext_tb_msg_send; } }; }; @@ -99,6 +101,8 @@ bmpFile = EMAILUI_ICON_FILE; bmpId = EMbmFreestyleemailuiQgn_indi_tb_extension; bmpMask = EMbmFreestyleemailuiQgn_indi_tb_extension_mask; + bmpSkinIdMajor = EAknsMajorGeneric; + bmpSkinIdMinor = EAknsMinorGenericQgnIndiTbExtension; items = { TBAR_CTRL @@ -116,6 +120,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_high_priority; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_high_priority_mask; + extension = r_cmail_button_state_ext_tb_high_priority; }, AVKON_BUTTON_STATE { @@ -123,6 +128,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_high_priority_selected; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_high_priority_selected_mask; + extension = r_cmail_button_state_ext_tb_high_priority_selected; } }; }; @@ -142,6 +148,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_low_priority; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_low_priority_mask; + extension = r_cmail_button_state_ext_tb_low_priority; }, AVKON_BUTTON_STATE { @@ -149,6 +156,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_low_priority_selected; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_low_priority_selected_mask; + extension = r_cmail_button_state_ext_tb_low_priority_selected; } }; }; @@ -168,6 +176,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_follow_up; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_follow_up_mask; + extension = r_cmail_button_state_ext_follow_up; }, AVKON_BUTTON_STATE { @@ -175,6 +184,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_follow_up_selected; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_follow_up_selected_mask; + extension = r_cmail_button_state_ext_tb_follow_up_selected; } }; }; @@ -196,6 +206,7 @@ //bmpmask = EMbmFreestyleemailuiQgn_indi_tb_show_cc_mask; bmpid = EMbmFreestyleemailuiQgn_indi_tb_hide_cc; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_hide_cc_mask; + extension = r_cmail_button_state_ext_tb_show_cc; }, AVKON_BUTTON_STATE { @@ -203,6 +214,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_hide_cc; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_hide_cc_mask; + extension = r_cmail_button_state_ext_tb_hide_cc; } }; }; @@ -224,6 +236,7 @@ //bmpmask = EMbmFreestyleemailuiQgn_indi_tb_show_bcc_mask; bmpid = EMbmFreestyleemailuiQgn_indi_tb_hide_bcc; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_hide_bcc_mask; + extension = r_cmail_button_state_ext_tb_show_bcc; }, AVKON_BUTTON_STATE { @@ -231,6 +244,7 @@ bmpfile = EMAILUI_ICON_FILE; bmpid = EMbmFreestyleemailuiQgn_indi_tb_hide_bcc; bmpmask = EMbmFreestyleemailuiQgn_indi_tb_hide_bcc_mask; + extension = r_cmail_button_state_ext_tb_hide_bcc; } }; }; @@ -248,6 +262,8 @@ bmpFile = EMAILUI_ICON_FILE; bmpId = EMbmFreestyleemailuiQgn_indi_tb_expand_insert; bmpMask = EMbmFreestyleemailuiQgn_indi_tb_expand_insert_mask; + bmpSkinIdMajor = EAknsMajorGeneric; + bmpSkinIdMinor = EAknsMinorGenericQgnIndiTbExpandInsert; items = { TBAR_CTRL @@ -264,8 +280,9 @@ txt = qtn_msg_insert_tb_image; helptxt = qtn_msg_insert_tb_tooltip_image; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_mce_tb_image; - bmpmask=EMbmFreestyleemailuiQgn_indi_mce_tb_image_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_mce_tb_image; + bmpmask = EMbmFreestyleemailuiQgn_indi_mce_tb_image_mask; + extension = r_cmail_button_state_ext_mce_tb_image; } }; }; @@ -284,8 +301,9 @@ txt = qtn_msg_insert_tb_video; helptxt = qtn_msg_insert_tb_tooltip_video; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_mce_tb_video; - bmpmask=EMbmFreestyleemailuiQgn_indi_mce_tb_video_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_mce_tb_video; + bmpmask = EMbmFreestyleemailuiQgn_indi_mce_tb_video_mask; + extension = r_cmail_button_state_ext_mce_tb_video; } }; }; @@ -304,8 +322,9 @@ txt = qtn_msg_insert_tb_sound; helptxt = qtn_msg_insert_tb_tooltip_sound; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_mce_tb_audio; - bmpmask=EMbmFreestyleemailuiQgn_indi_mce_tb_audio_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_mce_tb_audio; + bmpmask = EMbmFreestyleemailuiQgn_indi_mce_tb_audio_mask; + extension = r_cmail_button_state_ext_mce_tb_audio; } }; }; @@ -344,8 +363,9 @@ txt = qtn_msg_insert_tb_note; helptxt = qtn_fse_msg_insert_tb_tooltip_note_att; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_note; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_note_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_note; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_note_mask; + extension = r_cmail_button_state_ext_tb_note; } }; }; @@ -386,8 +406,9 @@ txt = qtn_msg_insert_tb_other; helptxt = qtn_msg_insert_tb_tooltip_other; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_mce_tb_other; - bmpmask=EMbmFreestyleemailuiQgn_indi_mce_tb_other_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_mce_tb_other; + bmpmask = EMbmFreestyleemailuiQgn_indi_mce_tb_other_mask; + extension = r_cmail_button_state_ext_mce_tb_other; } }; }; @@ -399,6 +420,113 @@ } //------------------------------------------------------------------------------ +// Button state extensions for mail editor toolbar +//------------------------------------------------------------------------------ +// + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_msg_send + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbMsgSend; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_high_priority + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbHighPriority; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_high_priority_selected + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbHighPrioritySelected; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_low_priority + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbLowPriority; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_low_priority_selected + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbLowPrioritySelected; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_follow_up + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbFollowUp; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_follow_up_selected + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbFollowUpSelected; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_show_cc + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbShowCc; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_hide_cc + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbHideCc; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_show_bcc + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbShowBcc; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_hide_bcc + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbHideBcc; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_add_recipient + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbAddRecipient; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_mce_tb_image + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiMceTbImage; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_mce_tb_video + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiMceTbVideo; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_mce_tb_audio + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiMceTbAudio; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_note + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbNote; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_mce_tb_other + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiMceTbOther; + } + +//------------------------------------------------------------------------------ // Folder list toolbar //------------------------------------------------------------------------------ // @@ -410,25 +538,6 @@ TBAR_CTRL { type = EAknCtButton; - id = EFsEmailUiTbCmdSelect; - control = AVKON_BUTTON - { - flags = KAknButtonSizeFitText; - states = - { - AVKON_BUTTON_STATE - { - helptxt = qtn_ncs_softkey_select_text; - bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_mark; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_mark_mask; - } - }; - }; - }, - TBAR_CTRL - { - type = EAknCtButton; id = EFsEmailUiTbCmdExpandAll; control = AVKON_BUTTON { @@ -439,10 +548,19 @@ { helptxt = qtn_fse_message_list_options_expand_all; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_expand_all; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_expand_all_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_expand_all; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_expand_all_mask; + extension = r_cmail_button_state_ext_tb_expand_all; } - }; + }; + }; + }, + TBAR_CTRL + { + type = EAknCtButton; + control = AVKON_BUTTON + { + flags = KAknButtonPressedDownFrame; }; }, TBAR_CTRL @@ -458,16 +576,33 @@ { helptxt = qtn_fse_message_list_options_collapse_all; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_collapse_all; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_collapse_all_mask; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_collapse_all; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_collapse_all_mask; + extension = r_cmail_button_state_ext_tb_collapse_all; } - }; + }; }; } }; } //------------------------------------------------------------------------------ +// Button state extensions for folder list toolbar +//------------------------------------------------------------------------------ +// +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_expand_all + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbExpandAll; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_collapse_all + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbCollapseAll; + } + +//------------------------------------------------------------------------------ // Html message viewer toolbar with Reply all //------------------------------------------------------------------------------ // @@ -486,6 +621,8 @@ bmpFile = EMAILUI_ICON_FILE; bmpId = EMbmFreestyleemailuiQgn_indi_tb_email_extend; bmpMask = EMbmFreestyleemailuiQgn_indi_tb_email_extend_mask; + bmpSkinIdMajor = EAknsMajorGeneric; + bmpSkinIdMinor = EAknsMinorGenericQgnIndiTbEmailExtend; items = { TBAR_CTRL @@ -501,10 +638,11 @@ { txt = qtn_fse_tb_ext_reply; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_reply; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_email_reply; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; + extension = r_cmail_button_state_ext_tb_email_reply; + } + }; }; }, TBAR_CTRL @@ -520,10 +658,11 @@ { txt = qtn_fse_tb_ext_reply_all; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_reply_all; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_reply_all_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_email_reply_all; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_email_reply_all_mask; + extension = r_cmail_button_state_ext_tb_email_reply_all; + } + }; }; } }; // eof extension items @@ -542,10 +681,11 @@ { helptxt = qtn_fse_tb_forward; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_email_forward; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; + extension = r_cmail_button_state_ext_tb_email_forward; + } + }; }; }, TBAR_CTRL @@ -561,16 +701,16 @@ { helptxt = qtn_fse_tb_delete; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_delete; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_delete_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_delete; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_delete_mask; + extension = r_cmail_button_state_ext_tb_delete; + } + }; }; } }; } - //------------------------------------------------------------------------------ // Html message viewer toolbar without Reply all //------------------------------------------------------------------------------ @@ -593,12 +733,13 @@ { helptxt = qtn_fse_tb_reply; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_reply; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_email_reply; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_email_reply_mask; + extension = r_cmail_button_state_ext_tb_email_reply; + } + }; }; - }, + }, TBAR_CTRL { type = EAknCtButton; @@ -612,10 +753,11 @@ { helptxt = qtn_fse_tb_forward; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_email_forward; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_email_forward; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_email_forward_mask; + extension = r_cmail_button_state_ext_tb_email_forward; + } + }; }; }, TBAR_CTRL @@ -631,16 +773,45 @@ { helptxt = qtn_fse_tb_delete; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_indi_tb_delete; - bmpmask=EMbmFreestyleemailuiQgn_indi_tb_delete_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_indi_tb_delete; + bmpmask = EMbmFreestyleemailuiQgn_indi_tb_delete_mask; + extension = r_cmail_button_state_ext_tb_delete; + } + }; }; } }; } //------------------------------------------------------------------------------ +// Button state extensions for HTML message viewer toolbar +//------------------------------------------------------------------------------ +// +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_email_reply + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbEmailReply; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_email_reply_all + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbEmailReplyAll; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_email_forward + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbEmailForward; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_tb_delete + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnIndiTbDelete; + } + +//------------------------------------------------------------------------------ // Attachment list toolbar //------------------------------------------------------------------------------ // @@ -662,10 +833,11 @@ { helptxt = qtn_fse_tb_attachment_list_download_all; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all; - bmpmask=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all; + bmpmask = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all_mask; + extension = r_cmail_button_state_ext_attachment_download_all; + } + }; }; }, TBAR_CTRL @@ -681,13 +853,14 @@ { helptxt = qtn_fse_tb_attachment_list_cancel_download; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download; - bmpmask=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download; + bmpmask = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download_mask; + extension = r_cmail_button_state_ext_attachment_cancel_download; + } + }; }; }, - TBAR_CTRL + TBAR_CTRL { type = EAknCtButton; id = EFsEmailUiTbCmdSaveAll; @@ -700,15 +873,42 @@ { helptxt = qtn_fse_tb_attachment_list_save_all; bmpfile = EMAILUI_ICON_FILE; - bmpid=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all; - bmpmask=EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all_mask; - } - }; + bmpid = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all; + bmpmask = EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all_mask; + extension = r_cmail_button_state_ext_attachment_save_all; + } + }; }; } }; } +//------------------------------------------------------------------------------ +// Button state extensions for message list toolbar +//------------------------------------------------------------------------------ +// +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_attachment_download_all + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnPropCmailActionAttachmentDownloadAll; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_attachment_cancel_download + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnPropCmailActionAttachmentCancelDownload; + } + +RESOURCE AVKON_BUTTON_STATE_EXTENSION r_cmail_button_state_ext_attachment_save_all + { + bmbSkinIdMajor = EAknsMajorGeneric; + bmbSkinIdMinor = EAknsMinorGenericQgnPropCmailActionAttachmentSaveAll; + } + +//------------------------------------------------------------------------------ +// Localisable registration information +//------------------------------------------------------------------------------ +// RESOURCE LOCALISABLE_APP_INFO r_freestyle_email_ui_loc_app_info { short_caption = qtn_fse_short_app_name; @@ -1504,6 +1704,7 @@ RESOURCE TBUF r_fse_wait_opening_text { buf=qtn_gen_note_opening; } RESOURCE TBUF r_fse_wait_fetching_text { buf=qtn_gen_note_fetching; } RESOURCE TBUF r_fse_wait_removing_text { buf=qtn_gen_note_removing; } +RESOURCE TBUF r_fse_wait_inserting_text { buf=qtn_gen_note_inserting;} RESOURCE TBUF r_fse_wait_deleting_text { buf=qtn_fse_wait_note_deleting; } RESOURCE TBUF r_fse_wait_cancelling_sync_text { buf=qtn_fse_wait_note_canceling_synch; } RESOURCE TBUF r_fse_wait_sorting_text { buf=qtn_fse_wait_note_sorting; } @@ -2218,7 +2419,6 @@ listbox = AVKON_LIST_QUERY_LIST { }; - heading = qtn_fse_editor_close_message_query_prompt; }; } }; @@ -2295,6 +2495,7 @@ RESOURCE TBUF r_ncs_flag_clear { buf=qtn_fse_editor_list_flag_clear; } RESOURCE TBUF r_ncs_draft_save { buf=qtn_fse_editor_close_message_quey_save_to_drafts; } RESOURCE TBUF r_ncs_draft_delete { buf=qtn_fse_editor_close_message_query_delete_message; } +RESOURCE TBUF r_ncs_draft_discard { buf=qtn_fse_editor_close_message_query_discard_message; } RESOURCE TBUF r_fse_editor_address_list_remote_lookup_search { buf=qtn_fse_editor_address_list_remote_lookup_search; } RESOURCE TBUF r_fse_editor_confirm_attachment_download { buf=qtn_fse_editor_confirm_attachment_download; } RESOURCE TBUF r_fse_editor_smart_tag { buf=qtn_fse_editor_smart_tag; } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/data/FreestyleEmailUiSettingsList.rssi --- a/emailuis/emailui/data/FreestyleEmailUiSettingsList.rssi Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/data/FreestyleEmailUiSettingsList.rssi Wed Apr 14 15:42:15 2010 +0300 @@ -66,11 +66,11 @@ { items = { - MENU_ITEM +/* MENU_ITEM { command = EFsEmailUiCmdOpen; txt = qtn_options_open; - }, + },*/ MENU_ITEM { command = EFsEmailUiCmdSettingsAddAccount; diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h --- a/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiHtmlViewerContainer.h Wed Apr 14 15:42:15 2010 +0300 @@ -25,6 +25,8 @@ #include #include +#include + #include "FreestyleEmailUiAknStatusIndicator.h" #include "FreestyleEmailDownloadInformationMediator.h" #include "freestyleemailcenrepkeys.h" @@ -323,6 +325,8 @@ HBufC8* GetCharacterSetL( CFSMailMessagePart& aHtmlBodyPart ); TBool IsMessageBodyURLL(const TDesC& aUrl); void CreateHyperlinksFromUrlsL( RBuf& aSource ); + TInt TotalLengthOfItems( CFindItemEngine& aItemEngine ) const; + //Returns ETrue of clicking on a link requires a browser to be launched TBool NeedToLaunchBrowserL( const TDesC& aUrl ); //Launch the browser as a standalone app diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/FreestyleEmailUiLayoutHandler.h --- a/emailuis/emailui/inc/FreestyleEmailUiLayoutHandler.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiLayoutHandler.h Wed Apr 14 15:42:15 2010 +0300 @@ -24,10 +24,10 @@ #include #include #include -#include -#include +#include +#include // INTERNAL INCLUDES -#include "FreestyleEmailUiLayoutData.h" +#include "freestyleemailuilayoutdata.h" // FORWARD DECLARATIONS class CFsTreeList; diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/FreestyleEmailUiSendAttachmentsListControl.h --- a/emailuis/emailui/inc/FreestyleEmailUiSendAttachmentsListControl.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/FreestyleEmailUiSendAttachmentsListControl.h Wed Apr 14 15:42:15 2010 +0300 @@ -24,6 +24,7 @@ // LOCAL INCLUDES #include "FreestyleEmailUiAttachmentsListModel.h" +#include "FreestyleEmailUiUtilities.h" #include "fsccontactactionmenudefines.h" // FORWARD DECLARATIONS @@ -43,7 +44,7 @@ */ // class CFreestyleEmailUiSendAttachmentsListControl - : public CAlfControl, public MFsActionMenuPositionGiver, public MMGFetchVerifier + : public CAlfControl, public MFsActionMenuPositionGiver, public MMGFetchVerifier, public MFSEmailUiGenericTimerCallback { // public: @@ -87,6 +88,11 @@ */ TBool OfferEventL( const TAlfEvent& aEvent ); + TBool IsAttachmentAddingLocked() const; + + // Fire timer callback + void TimerEventL( CFSEmailUiGenericTimer* aTriggeredTimer ); + /** * AppendAttachmentToListL * Adds new attachment to list and email body @@ -235,6 +241,12 @@ // Wait note for long running operations. Owns itself. CAknWaitDialog* iWaitNote; + + // adding attachment locked + TBool iAttachmentAddingLocked; + + // Timer to postpone the Info Dialog + CFSEmailUiGenericTimer* iDialogTimer; }; #endif /*FREESTYLEMAILUI_SENDATTACHMENTSLISTCONTROL_H_*/ diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/ncsaddressinputfield.h --- a/emailuis/emailui/inc/ncsaddressinputfield.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/ncsaddressinputfield.h Wed Apr 14 15:42:15 2010 +0300 @@ -29,6 +29,8 @@ // #include "ncscontrol.h" +class CAknPhysics; + // Temporary hardcoded layout values //Horizontal values const TInt KButtonXa = 5; @@ -214,6 +216,8 @@ TInt LayoutLineCount() const; // Platform layout change + void EnableKineticScrollingL( CAknPhysics* aPhysics ); + // private: @@ -283,6 +287,11 @@ // for keeping buttons in view while scrolling TPoint iOriginalFieldPos; TPoint iOriginalButtonPos; + + // panning related + CAknPhysics* iPhysics; + TBool iIsDraggingStarted; + TPoint iStartPosition; }; #endif // CNCSADDRESSINPUTFIELD_H diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/ncscomposeview.h --- a/emailuis/emailui/inc/ncscomposeview.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/ncscomposeview.h Wed Apr 14 15:42:15 2010 +0300 @@ -171,15 +171,22 @@ /** * NewMessage * Returns pointer to current composer message - */ + */ CFSMailMessage* NewMessage(); /** - * CommitL - * Commits changes to message + * Commits changes to message. This method sets the field contents from + * the UI to the message object, but does not save the message unless + * explicitely requested. */ - void CommitL( TBool aParseAddresses = ETrue, - TFieldToCommit aFieldToCommit = EAllFields ); + void CommitL( TBool aParseAddresses = ETrue, + TFieldToCommit aFieldToCommit = EAllFields, TBool aSaveNow = EFalse ); + + /** + * Saves the message content, if it has been changed since the last save. + */ + TInt SaveMessage(); + void SaveMessageL(); void DialogDismissedL( TInt aButtonId ); @@ -641,6 +648,12 @@ // Popup menu for attachment list. CAknStylusPopUpMenu* iStylusPopUpMenu; + + // Flag to indicate whether message text part has been modified. + TBool iMessageTextPartModified; + + // Flag to indicate whether message has been modified. + TBool iMessageModified; }; /** diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/ncsheadercontainer.h --- a/emailuis/emailui/inc/ncsheadercontainer.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/ncsheadercontainer.h Wed Apr 14 15:42:15 2010 +0300 @@ -34,6 +34,7 @@ class CNcsEmailAddressObject; class CNcsPopupListBox; class CNcsSubjectField; +class CAknPhysics; /** * CNcsHeaderContainer @@ -59,7 +60,7 @@ * @return a pointer to the created instance of CNcsHeaderContainer. */ static CNcsHeaderContainer* NewL( CCoeControl& aParent, - CFSMailBox& aMailBox, TInt aFlags = NULL ); + CFSMailBox& aMailBox, TInt aFlags = NULL, CAknPhysics* aPhysics = NULL ); /** * ~CNcsHeaderContainer @@ -67,6 +68,8 @@ */ virtual ~CNcsHeaderContainer(); + void EnableKineticScrollingL(CAknPhysics* aPhysics); + private: // constructor/destructor /** @@ -75,7 +78,7 @@ * @param aParent Parent control. * @param aMailBox reference to current mailbox item */ - CNcsHeaderContainer( CCoeControl& aParent, CFSMailBox& aMailBox ); + CNcsHeaderContainer( CCoeControl& aParent, CFSMailBox& aMailBox, CAknPhysics* aPhysics ); /** * ConstructL @@ -334,6 +337,8 @@ void HandleDynamicVariantSwitchL(); + void HandleSkinChangeL(); + // sets up iSwitchChangeMskOff falg void SwitchChangeMskOff(TBool aTag); @@ -348,7 +353,7 @@ * * @param aShow ETrue - shows, EFalse - hides cursor. */ - void ShowCursor( TBool aShow ); + void ShowCursor( TBool aShow, TDrawNow aDrawNow = ENoDrawNow ); void DoScrollL(); private: // Function members @@ -442,6 +447,9 @@ // Currently focused control CCoeControl* iFocused; + + // panning related + CAknPhysics* iPhysics; }; diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/ncspopuplistbox.h --- a/emailuis/emailui/inc/ncspopuplistbox.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/ncspopuplistbox.h Wed Apr 14 15:42:15 2010 +0300 @@ -27,7 +27,7 @@ // FORWARD DECLARATION class CNcsEmailAddressObject; -class CAknsBasicBackgroundControlContext; +class CAknsFrameBackgroundControlContext; class CFSEmailUiContactHandler; class CFSMailBox; class CNcsHeaderContainer; @@ -41,7 +41,7 @@ */ class CNcsPopupListBox : public CEikTextListBox, public MEikListBoxObserver, - public MFSEmailUiContactHandlerObserver + public MFSEmailUiContactHandlerObserver { public: // Constructors and destructor @@ -52,12 +52,10 @@ CNcsHeaderContainer& aHeaderContainer, TBool aRemoteLookupSupported ); - /* * @param aMailBox reference to current mailbox item */ void ConstructL( const CCoeControl* aParent ); - /* * @@ -72,24 +70,25 @@ public: // from CEikTextListBox TKeyResponse OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ); - - virtual TTypeUid::Ptr MopSupplyObject(TTypeUid aId); - + + TTypeUid::Ptr MopSupplyObject( TTypeUid aId ); + void SizeChanged(); + void HandleResourceChange( TInt aType ); + void HandlePointerEventL( const TPointerEvent& aPointerEvent ); public: // from MEikListBoxObserver void HandleListBoxEventL( CEikListBox* aListBox, TListBoxEvent aEventType ); public: // from MFSEmailUiContactHandlerObserver - + void OperationCompleteL( TContactHandlerCmd aCmd, - const RPointerArray& aMatchingItems ); + const RPointerArray& aMatchingItems ); void OperationErrorL( TContactHandlerCmd aCmd, TInt aError ); - public: // new methods for the header container - + /* * * @param aText @@ -143,7 +142,7 @@ private: // to populate new list void SetListItemsFromArrayL(); - + TInt RoundToItemHeight(const TInt aPopupHeight) const; void SetPopupHeight(); @@ -164,21 +163,26 @@ private: - CNcsPopupListBox( CNcsHeaderContainer& aHeaderContainer, TBool aRemoteLookupSupported, - CFSMailBox& aMailbox ); + CNcsPopupListBox( CNcsHeaderContainer& aHeaderContainer, + TBool aRemoteLookupSupported, CFSMailBox& aMailbox ); virtual void CreateItemDrawerL(); void UpdateListL(); - + + void UpdateTextColors(); + + // From CCoeControl. + void Draw( const TRect& aRect ) const; + private: // data - CNcsHeaderContainer& iHeaderContainer; - - CAknsBasicBackgroundControlContext* iBaseBackroundContext; - + CNcsHeaderContainer& iHeaderContainer; + + CAknsFrameBackgroundControlContext* iBackgroundContext; + RPointerArray iMatchingItems; - + CFSEmailUiContactHandler* iContactHandler; // Owned CFSMailBox& iMailBox; diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/inc/ncssubjectfield.h --- a/emailuis/emailui/inc/ncssubjectfield.h Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/inc/ncssubjectfield.h Wed Apr 14 15:42:15 2010 +0300 @@ -31,7 +31,7 @@ class CEikImage; class MNcsFieldSizeObserver; class CNcsHeaderContainer; - +class CAknPhysics; // CLASS DECLARATION /** @@ -93,6 +93,8 @@ void SetTextColorL( TLogicalRgb aColor ); + void EnableKineticScrollingL(CAknPhysics* aPhysics ); + public: // from CoeControl /** * SetContainerWinowL diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/loc/freestyleemailui.loc --- a/emailuis/emailui/loc/freestyleemailui.loc Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/loc/freestyleemailui.loc Wed Apr 14 15:42:15 2010 +0300 @@ -1465,6 +1465,12 @@ // #define qtn_fse_editor_close_message_query_delete_message "Delete message" +// d:Discard item text in draft dialog +// l:list_single_graphic_pane_t1_cp2 +// r:TB9.1 +// +#define qtn_fse_editor_close_message_query_discard_message "Discard changes" + // d:Upmost item in addressfield match popup list. For selecting Remote lookup server search // l:list_single_cmail_header_detail_pane_t1 // r:TB9.1 diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/sendasmtm/inc/cfssendashelper.h --- a/emailuis/emailui/sendasmtm/inc/cfssendashelper.h Wed Mar 31 21:08:33 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,179 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Definition of the class CFsSendAsHelper. -* -*/ - - -#ifndef CFSSENDASHELPER_H -#define CFSSENDASHELPER_H - -#include -#include - -#include -// -#include "cfsmailcommon.h" -// -// --------------------------------------------------------------------------- - -class CFSMailAddress; - -/** - * This class is having functions which are used by Integration MTM to create - * a message and to launch Freestyle UI editor. - * - * @since S60 3.1 - * @lib fssendashelper.lib - */ -class CFsSendAsHelper : public CBase -{ -public: // constructors and destructor - /** - * Constructs new object. - * @return created object. - */ - IMPORT_C static CFsSendAsHelper* NewL(); - - /** - * Destructor - */ - IMPORT_C ~CFsSendAsHelper(); - -public: - /** - * Called from MTM when a file is selected to through sendas functionality. - * The file full path and mimetype are stored which will be later used to - * create mail and launch FS UI. - * @param aFileName Filename including full path - * @param aMimeType Mime type of the file that need to be attached - * @param aCharSet Charcaterset of the file - */ - IMPORT_C void AddAttachmentL(const TDesC& aFileName, - const TDesC8& aMimeType, TUint aCharSet); - /** - * Called from MTM when a file is selected to through sendas functionality. - * The file full path and mimetype are stored which will be later used to - * create mail and launch FS UI. - * @param aFile Handle to an attachment file. Ownership is transferred - * @param aMimeType Mime type of the file that need to be attached - * @param aCharSet Charcaterset of the file - */ - IMPORT_C void AddAttachmentL( RFile& aFile, - const TDesC8& aMimeType, TUint aCharSet); - - /** - * Called from MTM when a address is selected to send an e-mail. - * The Address and Alias of the address if present are stored - * which will be later used to create mail and launch FS UI - * @param aAddress Mail address of the recipient - * @param aAlias Alias of the address, this can be NULL - * @param aType Type of recipient. - */ - IMPORT_C void AddRecipientL(const TDesC& aAddress, const TDesC& aAlias, - TMsvRecipientType aType); - - /** - * Called from MTM when a subject need to be set for the mail. The subject - * will be stored which will be later used to create mail and launch FS UI. - * @param aSubject Subject of the mail. - */ - IMPORT_C void SetSubjectL(const TDesC& aSubject); - - /** - * Called from MTM when certain text need to be made as body of the mail. - * Usually the case when notepad file is selected to send using sendas - * functionality. The contents of body will be stored which will be later - * used to create mail while launching FS UI. - * @param aBody body part of the mail. - */ - IMPORT_C void SetBodyL(const TDesC& aBody); - - /** - * Called from MTM after either of setting subject, recipients, - * attachments or/and body. The message will be created with the right - * data and will be stored to drafts of mail box. The messageid of the - * createdmessage will be externalized which is used later to launch UI. - * - * @param aPluginId Plug-in Id - * @param aId Mailbox Id. - */ - IMPORT_C void StoreDataL( TUint aPluginId, TUint aId ); - - /** - * Called from MTM either to create empty mail or to create mail with some - * contents. - * @param aPluginId Plug-in Id - * @param aId Mailbox Id. - * @param aIsEmptyMail True if empty message need to be created. - * @param aIsSettings True if settings view need to be launched. - */ - IMPORT_C void LaunchUiL(TUint aPluginId, TUint aId, - TBool aIsEmptyMail = EFalse, TBool aIsSettings = EFalse ); - -private: // constructors - /** - * Constructor - */ - CFsSendAsHelper(); - - /** - * Second-phase constructor. - */ - void ConstructL(); - - /* - * Displays mailbox not available note. - */ - void DisplayMailboxNotAvailableNoteL(); - - /* - * Checks whether the mailbox is available or not - * @param aPluginId Plugin ID or the mailbox. - * @return KErrNone if mailbox available, KErrNotSupported otherwise. - */ - TInt IsMailboxAvailable( TInt aPluginId ); -private: // data - // Subject of the message - HBufC* iSubject; - - // Body of the message - HBufC* iBody; - - // Filehandles that need to be attached. - RArray< RFile > iFiles; - - // Filenames that need to be attached - RPointerArray iFileNames; - - // Mimetypes of the attached filehandles - RPointerArray iMimeTypesFile; - // Mimetypes of the attached filenames - RPointerArray iMimeTypesFileName; - - // To recipients of the mail - RPointerArray iToAddresses; - // Cc recipients of the mail - RPointerArray iCcAddresses; - // Bcc recipients of the mail - RPointerArray iBccAddresses; - - //If Filehandles are passed to the framework (plugin) - TBool isPassed; - - // Message to be displayed when trying to use MfE or Ozone mailbox - // while in mass storage mode. Own. - HBufC* iMassStorageNote; -}; -#endif //CFSSENDASHELPER_H diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp --- a/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailDownloadInformationMediator.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -397,7 +397,14 @@ { if ( iObserverArray[i].iObserver == aObserver && iObserverArray[i].iMessageId == aMessageId ) { - RemoveObserver(i); + + TDownloadCount countObject( aMessageId ); + TInt idx = iDownloadCountArray.Find( countObject, + TIdentityRelation(EqualMessageId) ); + if ( idx == KErrNotFound ) + { + RemoveObserver(i); + } } } } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiAppui.cpp --- a/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiAppui.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -1361,8 +1361,13 @@ { iCurrentActiveView->HandleAppForegroundEventL( EFalse ); } + // in case the popupmenu is shown propagate event to it + if( iFolderListVisualiser && iFolderListVisualiser->IsPopupShown() ) + { + iFolderListVisualiser->HandleAppForegroundEventL( EFalse ); + } + } break; - } case KAknFullOrPartialForegroundGained: { if ( iCurrentActiveView && !iSettingsViewActive ) @@ -1374,17 +1379,21 @@ iPendingLayoutSwitch = EFalse; } } - - // Call status indicator's foreground event to resize the connection screen after the screensaver - if ( iStatusIndicator ) + // Call status indicator's foreground event to resize the connection screen after the screensaver + if ( iStatusIndicator ) { iStatusIndicator->HandleForegroundEventL(); } - } - break; + // in case the popupmenu is shown propagate event to it + if( iFolderListVisualiser && iFolderListVisualiser->IsPopupShown() ) + { + iFolderListVisualiser->HandleAppForegroundEventL( ETrue ); + } + } + break; default: break; - } + } // Close menu if ( closeMenu && iCurrentActiveView != NULL ) diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiFolderListVisualiser.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -499,8 +499,9 @@ { FUNC_LOG; CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - cba->AddCommandSetToStackL( R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT); + cba->AddCommandSetToStackL( R_AVKON_SOFTKEYS_SELECT_CANCEL__SELECT ); cba->UpdateCommandObserverL( cba->PositionById( EAknSoftkeySelect ), *this ); + cba->MakeCommandVisible( EAknSoftkeySelect , EFalse ); cba->UpdateCommandObserverL( cba->PositionById( EEikBidCancel ), *this ); cba->DrawNow(); } @@ -513,7 +514,7 @@ { FUNC_LOG; CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - + cba->MakeCommandVisible( EAknSoftkeySelect , ETrue ); if (cba->UpdatedCommandObserverExists(CEikButtonGroupContainer::ELeftSoftkeyPosition)) { cba->RemoveCommandObserver( cba->PositionById( EAknSoftkeySelect ) ); @@ -523,10 +524,12 @@ cba->RemoveCommandObserver( cba->PositionById( EEikBidCancel ) ); } TInt pos = -1; + if ((pos = cba->PositionById( EAknSoftkeySelect )) >= 0) { cba->RemoveCommandFromStack( pos, EAknSoftkeySelect ); } + if ((pos = cba->PositionById( EEikBidCancel )) >= 0) { cba->RemoveCommandFromStack( pos, EEikBidCancel ); @@ -871,9 +874,9 @@ { switch( aCommand ) { - case EFsEmailUiTbCmdSelect: + /*case EFsEmailUiTbCmdSelect: HandleCommandL( EFsEmailUiCmdSelect ); - break; + break;*/ case EFsEmailUiTbCmdCollapseAll: HandleCommandL( EFsEmailUiCmdActionsCollapseAll ); break; @@ -3001,8 +3004,7 @@ void CFSEmailUiFolderListVisualiser::UpdateToolbarButtons() { FUNC_LOG; - Toolbar()->SetItemDimmed( - EFsEmailUiTbCmdSelect, ( iModel == NULL ) || ( iModel->Count() == 0 ), ETrue ); + //Toolbar()->SetItemDimmed(EFsEmailUiTbCmdSelect, ( iModel == NULL ) || ( iModel->Count() == 0 ), ETrue ); Toolbar()->SetItemDimmed( EFsEmailUiTbCmdExpandAll, AllNodesExpanded(), ETrue ); Toolbar()->SetItemDimmed( EFsEmailUiTbCmdCollapseAll, AllNodesCollapsed(), ETrue ); } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerContainer.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -1373,7 +1373,6 @@ TInt maxlength = bodyBuf.MaxSize(); TInt position( 0 ); - TText previous = 0; TBool EndOfString( EFalse ); while ( !EndOfString ) @@ -1442,7 +1441,6 @@ i++; break; } - previous = ch; } position += segment.Length(); if ( ( bodyBuf.Length() - position ) <= 0 ) @@ -1504,252 +1502,69 @@ void CFsEmailUiHtmlViewerContainer::CreateHyperlinksFromUrlsL( RBuf& aSource ) { FUNC_LOG; - const TInt urlMaxLength = 2048; - _LIT( KHttp, "http://" ); - _LIT( KHttps, "https://"); - _LIT( KWww, "www."); - - TBool eos( aSource.Size() <= 0 ); - TInt position( 0 ); - TInt carryOverInc( 0 ); - TInt maxlength = aSource.Length(); - while ( !eos ) + const TInt searhCases( CFindItemEngine::EFindItemSearchURLBin ); + CFindItemEngine* itemEngine = CFindItemEngine::NewL( aSource, CFindItemEngine::TFindItemSearchCase( searhCases ) ); + CleanupStack::PushL ( itemEngine ); + if ( itemEngine->ItemCount() > 0 ) { - while ( carryOverInc >= aSource.MidTPtr( position ).Length() && aSource.Size() != 0 ) - { // Skip segments of overlapping url string - carryOverInc -= aSource.MidTPtr( position ).Length(); - position += aSource.MidTPtr( position ).Length(); - } + _LIT( KHttp, "http://" ); + _LIT( KUrlFormat, "%S" ); + _LIT( KUrlFormatWithHttp, "%S" ); - TPtr16 segment( aSource.MidTPtr( position ) ); - TLex16 lexSegment( segment ); - lexSegment.Inc( carryOverInc ); - carryOverInc = 0; + const TInt sourceLength( aSource.Length() ); + // Allocate enough space for the final result + aSource.ReAllocL( sourceLength + TotalLengthOfItems( *itemEngine ) + KUrlFormatWithHttp().Length() * itemEngine->ItemCount() ); + aSource.SetMax(); + // Organize buffer so that original data is in the back of the aSource + aSource.RightTPtr( sourceLength ).Copy( aSource.Left( sourceLength ) ); + // Set source to new original data's position + const TPtrC source( aSource.RightTPtr( sourceLength ) ); + // Set target to aSource's beginning + TPtr target( aSource.MidTPtr( 0 ) ); + // Reset length, we now have an empty buffer to fill + target.SetLength( 0 ); - while (!lexSegment.Eos()) + TInt currentSourcePosition( 0 ); + CFindItemEngine::SFoundItem item; + for ( TBool available( itemEngine->Item( item ) ); available; available = itemEngine->NextItem( item ) ) { - TPtrC nextToken( lexSegment.NextToken() ); - TInt foundAt( KErrNotFound ); - - // Find HTTP, HTTPS, or WWW link in CBufSeg segment of size 1024 bytes. - if ( ( ( foundAt = nextToken.FindC( KHttp ) ) != KErrNotFound ) || - ( ( foundAt = nextToken.FindC( KHttps ) ) != KErrNotFound ) || - ( ( foundAt = nextToken.FindC( KWww ) ) != KErrNotFound ) ) + target.Append( source.Mid( currentSourcePosition, item.iStartPos - currentSourcePosition ) ); + const TPtrC url( source.Mid( item.iStartPos, item.iLength ) ); + TPtrC format( KUrlFormat() ); + if ( url.FindF( KHttp() ) == KErrNotFound ) { - if ( !lexSegment.Eos() ) - { - if ( !foundAt ) - { // Token starts with http/https/www.x - TPtrC url; - TInt lineBreakPos( KErrNotFound ); - if ( ( lineBreakPos = nextToken.FindC( KHtmlLineBreak ) ) != KErrNotFound ) - { // Token contains html line break -> remove - url.Set( nextToken.Left( lineBreakPos ) ); - } - else - { - url.Set( nextToken ); - } - - if ( url.CompareC( KWww ) != KErrNone ) // if token=www., validate format - { // www.x - RBuf urlBuf; - TBool wwwLink( EFalse ); - if ( url.Left( KWww().Length() ).CompareF( KWww ) == 0 ) - { - wwwLink = ETrue; - //Hyperlinks beginning with www. needs http:// prefix - urlBuf.CreateL( KHtmlLinkTagWWW().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() + KHttp().Length() ); - } - else - { - urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); - } - urlBuf.CleanupClosePushL(); - // Format html link - if ( wwwLink ) - { - urlBuf.AppendFormat( KHtmlLinkTagWWW, &KHttp, &url ); - } - else - { - urlBuf.AppendFormat( KHtmlLinkTag, &url ); - } - urlBuf.Append( url ); - urlBuf.Append( KHtmlLinkEndTag ); - if ( lineBreakPos != KErrNotFound ) - { // Add line break if removed earlier - urlBuf.Append( KHtmlLineBreak ); - } - //Test - TInt nextTokenLength = nextToken.Length(); - TInt segOffset = lexSegment.Offset(); - TInt urlLength = urlBuf.Length(); - - //Test - TInt offset = lexSegment.Offset() - nextToken.Length(); - TLexMark tokenMark; - // Move next character last token back - lexSegment.Inc( - nextToken.Length() ); - lexSegment.Mark( tokenMark ); - aSource.Delete( offset + position, nextToken.Length() ); - aSource.ReAlloc( maxlength + urlBuf.Length() ); - aSource.Insert( offset + position, urlBuf ); - segment.Set( aSource.MidTPtr( position ) ); - lexSegment.Assign( segment ); - // Set next character to the position of inserted hyperlink - lexSegment.UnGetToMark( tokenMark ); - - // If Max segment length is reached, set carry over value to - // properly set next character in following CBufSeg segment - if ( ( offset + urlBuf.Length() ) >= segment.Length() ) - { - carryOverInc = offset + urlBuf.Length() - segment.Length(); - while ( !lexSegment.Eos() ) - { // Set to segment's end - lexSegment.NextToken(); - } - } - else - { - lexSegment.Inc( urlBuf.Length() ); - } - - CleanupStack::PopAndDestroy( &urlBuf ); - } - } - } - else - // Next token is end of string, here we handle the last token of a segment - { - _LIT( KUrlEnd, "<" ); - - TInt endOfUrlPos( KErrNotFound ); - TText ch = segment[ segment.Length() - 1]; - RBuf url; - url.CreateL( urlMaxLength ); - url.CleanupClosePushL(); - - // Find if hyperlink ends within this segment boundaries - if ( ch == KSOH || ch == KCR || ch == KLF || ch == KHT || ch == KCharacterSpace ) - { - endOfUrlPos = nextToken.Length() - 1; - } - else if ( ( endOfUrlPos = nextToken.Right( KHtmlLineBreak().Length() ).Find( KUrlEnd ) ) != KErrNotFound ) - { - endOfUrlPos = nextToken.Length() - KHtmlLineBreak().Length() + endOfUrlPos; - } - else - { // Handle hyperlink spread in multiple segments - TInt nextPos = position; - TPtrC nextSegment( aSource.MidTPtr( nextPos ) ); - TLex lexNextSegment( nextSegment ); - TPtrC nextNextToken( nextToken ); - TBool firstPass( ETrue ); - - while ( endOfUrlPos == KErrNotFound || nextPos >= aSource.Length() ) - { - if ( ( url.Length() + nextNextToken.Length() ) > urlMaxLength ) - { // URL exceeds limit of 2K, do nothing - break; - } - - url.Append( nextNextToken ); - if ( ( nextSegment.Length() == nextNextToken.Length() ) || firstPass ) - { // Token takes up the whole segment, or first pass( first segment - // with last token where hyperlink does not end within segment's - // boundaries, move to next segment - nextPos += nextSegment.Length(); - nextSegment.Set( aSource.MidTPtr( nextPos ) ); - if( nextSegment.Length() == 0 ) - { - break; - } - lexNextSegment.Assign( nextSegment ); - nextNextToken.Set( lexNextSegment.NextToken() ); - if ( firstPass ) - { - firstPass = EFalse; - } - } - else - { // Last segment's token with hyperlink's end - if ( ( endOfUrlPos = url.Find( KHtmlLineBreak ) ) != KErrNotFound ) - { // Remove line break - url.Delete( endOfUrlPos, KHtmlLineBreak().Length() ); - endOfUrlPos = nextNextToken.Length() - KHtmlLineBreak().Length(); - } - else - { - endOfUrlPos = nextNextToken.Length(); - } - } - } - - if ( endOfUrlPos != KErrNotFound ) - { // Handle hyperlink that is within 2K limit - RBuf urlBuf; - TBool wwwLink( EFalse ); - - if ( url.Left( KWww().Length() ).CompareF( KWww ) == 0 ) - { - wwwLink = ETrue; - urlBuf.CreateL( KHtmlLinkTagWWW().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() + KHttp().Length() ); - } - else - { - urlBuf.CreateL( KHtmlLinkTag().Length() + url.Length() * 2 - + KHtmlLinkEndTag().Length() + KHtmlLineBreak().Length() ); - } - - urlBuf.CleanupClosePushL(); - // Format html link - if ( wwwLink ) - { - urlBuf.AppendFormat( KHtmlLinkTagWWW, &KHttp, &url ); - } - else - { - urlBuf.AppendFormat( KHtmlLinkTag, &url ); - } - - urlBuf.Append( url ); - urlBuf.Append( KHtmlLinkEndTag ); - urlBuf.Append( KHtmlLineBreak ); - - TInt offset = lexSegment.Offset() - nextToken.Length(); - // Remove hyperlink from the original message body - aSource.Delete( offset + position, url.Length() ); - // Insert html formated hyperlink - aSource.ReAlloc( maxlength + urlBuf.Length() ); - aSource.Insert( offset + position, urlBuf ); - segment.Set( aSource.MidTPtr( position ) ); - - // Set carry on value to mark where new token should start in following segment - carryOverInc = endOfUrlPos; - position = nextPos; - - CleanupStack::PopAndDestroy( &urlBuf ); - } - } - CleanupStack::PopAndDestroy( &url ); - } + format.Set( KUrlFormatWithHttp() ); } - } - position += segment.Length(); - if ( ( aSource.Length() - position ) <= 0 ) + HBufC* formatBuffer = HBufC::NewLC( format.Length() + url.Length() * 2 ); + formatBuffer->Des().Format( format, &url, &url ); + target.Append( *formatBuffer ); + CleanupStack::PopAndDestroy(); // formatBuffer + currentSourcePosition = item.iStartPos + item.iLength; + } + // Append characters that are left in buffer + if ( currentSourcePosition < sourceLength ) { - eos = ETrue; + target.Append( source.Mid( currentSourcePosition, sourceLength - currentSourcePosition ) ); } + aSource.SetLength( target.Length() ); } - - + CleanupStack::PopAndDestroy(); // itemEngine } +TInt CFsEmailUiHtmlViewerContainer::TotalLengthOfItems( CFindItemEngine& aItemEngine ) const + { + TInt totalLength( 0 ); + CFindItemEngine::SFoundItem item; + aItemEngine.ResetPosition(); + for ( TBool available( aItemEngine.Item( item ) ); available; available = aItemEngine.NextItem( item ) ) + { + totalLength += item.iLength; + } + aItemEngine.ResetPosition(); + return totalLength; + } + // --------------------------------------------------------------------------- // Get Character set from CFSMailMessagePart // --------------------------------------------------------------------------- diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp --- a/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiHtmlViewerView.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -1189,6 +1189,8 @@ if ( reallyDelete ) { + CancelFetchings(); + // Reset container content, so that plugins may really delete files if ( iContainer ) { @@ -1402,8 +1404,12 @@ { case EFsEmailUiCmdActionsReply: { - if ( iMessage && !iActivationData.iEmbeddedMessageMode ) + if ( iMessage ) { + if ( iActivationData.iEmbeddedMessageMode ) + { + iCreateNewMsgFromEmbeddedMsg = ETrue; + } delete iNewMailTempAddress; iNewMailTempAddress = NULL; iNewMailTempAddress = CFSMailAddress::NewL(); @@ -2596,8 +2602,9 @@ case EESMRCmdMailFlagMessage: ret = TFsEmailUiUtility::IsFollowUpSupported( *iMailBox ); break; + //Changed to EFalse to fix defect EJZG-83CDRX case EESMRCmdMailMessageDetails: - ret = ETrue; + ret = EFalse; break; case EESMRCmdMailDelete: ret = ETrue; diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiMailListVisualiser.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -87,7 +87,7 @@ #include "FreestyleEmailUiHtmlViewerView.h" #include "FSDelayedLoader.h" #include "FSEmail.pan" -#include "fsemailstatuspaneindicatorhandler.h" + #include "ipsplgcommon.h" // CONST VALUES @@ -1592,8 +1592,9 @@ iCurrentClientRect = clientRect; iThisViewActive = ETrue; - //emailindicator handling, we dont care if something goes wrong in the mailindicator update. User can still open the mailbox - TRAP_IGNORE(TFsEmailStatusPaneIndicatorHandler::StatusPaneMailIndicatorHandlingL( activationData.iMailBoxId.Id())); + + //emailindicator handling, is removed from 9.2 + //TRAP_IGNORE(TFsEmailStatusPaneIndicatorHandler::StatusPaneMailIndicatorHandlingL( activationData.iMailBoxId.Id())); //Update mailbox widget index status in homescreen TFsEmailUiUtility::ToggleEmailIconL(EFalse, activationData.iMailBoxId ); @@ -3490,8 +3491,8 @@ FUNC_LOG; if( iMailFolder ) { - //emailindicator handling, we dont care if something goes wrong in the mailindicator update. User can still open the mailbox - TRAP_IGNORE(TFsEmailStatusPaneIndicatorHandler::StatusPaneMailIndicatorHandlingL( iMailFolder->GetMailBoxId().Id())); + //emailindicator handling, is removed from 9.2 + //TRAP_IGNORE(TFsEmailStatusPaneIndicatorHandler::StatusPaneMailIndicatorHandlingL( iMailFolder->GetMailBoxId().Id())); //Update mailbox widget index status in homescreen TFsEmailUiUtility::ToggleEmailIconL(EFalse, iMailFolder->GetMailBoxId() ); } @@ -5931,7 +5932,8 @@ msgPtr.SaveMessageL(); // Save flag // Switch icon to correct one if mail list is visible - UpdateMsgIconAndBoldingL( aIndex ); + TBool needRefresh = ( iAppUi.CurrentActiveView()->Id() == MailListId ); + UpdateMsgIconAndBoldingL( aIndex, needRefresh); if ( iCurrentSortCriteria.iField == EFSMailSortByUnread ) { @@ -6256,43 +6258,16 @@ if ( item && item->ModelItemType() == ETypeMailItem ) { CFSMailMessage& messagePtr = item->MessagePtr(); - - TInt okToDelete(ETrue); - if ( iAppUi.GetCRHandler()->WarnBeforeDelete() ) - { - TInt queryTextId(0); - if ( messagePtr.IsFlagSet( EFSMsgFlag_CalendarMsg )) - { - queryTextId = R_FREESTYLE_EMAIL_DELETE_CALEVENT_NOTE; - } - else - { - queryTextId = R_FREESTYLE_EMAIL_DELETE_MAIL_NOTE; - } - HBufC* msgSubject = TFsEmailUiUtility::CreateSubjectTextLC( &messagePtr ); - - okToDelete = TFsEmailUiUtility::ShowConfirmationQueryL( queryTextId, *msgSubject ); - - CleanupStack::PopAndDestroy( msgSubject ); - } - - if ( okToDelete ) - { - // Delete message from framework, and perform internal housekeeping - TFSMailMsgId msgId = messagePtr.GetMessageId(); - RArray msgIds; - CleanupClosePushL( msgIds ); - msgIds.Append( msgId ); - TFSMailMsgId folderId = FolderId(); - TFSMailMsgId mailBox = iAppUi.GetActiveMailbox()->GetId(); - iAppUi.GetMailClient()->DeleteMessagesByUidL( mailBox, folderId, msgIds ); - RemoveMsgItemsFromListIfFoundL( msgIds ); - CleanupStack::PopAndDestroy( &msgIds ); - } - else - { - UnmarkAllItemsL(); - } + // Delete message from framework, and perform internal housekeeping + TFSMailMsgId msgId = messagePtr.GetMessageId(); + RArray msgIds; + CleanupClosePushL( msgIds ); + msgIds.Append( msgId ); + TFSMailMsgId folderId = FolderId(); + TFSMailMsgId mailBox = iAppUi.GetActiveMailbox()->GetId(); + iAppUi.GetMailClient()->DeleteMessagesByUidL( mailBox, folderId, msgIds ); + RemoveMsgItemsFromListIfFoundL( msgIds ); + CleanupStack::PopAndDestroy( &msgIds ); } } } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp --- a/emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiSearchListVisualiser.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -395,7 +395,7 @@ // Update settings and set list mode according to settings UpdateMailListSettingsL(); - + if ( iMailBox ) { delete iMailBox; @@ -438,6 +438,9 @@ // Need to make sure that return to this view works even if following function leaves. TRAP_IGNORE( CheckAndUpdateFocusedMessageL() ); } + + // Set mailbox name to status pane + iAppUi.SetActiveMailboxNameToStatusPaneL(); } CAknEnv::Static()->GetCurrentGlobalUiZoom( iCurrentZoomLevel ); // Set msk always empty when view is activated. diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListControl.cpp --- a/emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListControl.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleEmailUiSendAttachmentsListControl.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -62,6 +62,8 @@ // CLASS IMPLEMENTATION +TInt KGenericTimerDialogInterval = 1000; // Interval for iDialogTimer + // --------------------------------------------------------------------------- // Two-phased constructor. // --------------------------------------------------------------------------- @@ -119,6 +121,8 @@ CAlfControl::ConstructL( aEnv ); iService = CFscContactActionService::NewL( iAppUi->GetVPbkManagerL() ); iModel = CFSEmailUiSendAttachmentsListModel::NewL( iAppUi, Env(), this ); + iAttachmentAddingLocked = EFalse; + iDialogTimer = CFSEmailUiGenericTimer::NewL( this ); } // --------------------------------------------------------------------------- @@ -128,6 +132,11 @@ CFreestyleEmailUiSendAttachmentsListControl::~CFreestyleEmailUiSendAttachmentsListControl() { FUNC_LOG; + if(iDialogTimer) + { + iDialogTimer->Cancel(); + delete iDialogTimer; + } delete iService; } @@ -324,6 +333,30 @@ return iModel; } + +// --------------------------------------------------------------------------- +// IsAttachmentAddingLocked +// +// --------------------------------------------------------------------------- +// +TBool CFreestyleEmailUiSendAttachmentsListControl::IsAttachmentAddingLocked() const +{ + FUNC_LOG; + return iAttachmentAddingLocked; +} + + +// --------------------------------------------------------------------------- +// TimerEventL +// Timer that delays the dialog will open the dialog here +// --------------------------------------------------------------------------- +// +void CFreestyleEmailUiSendAttachmentsListControl::TimerEventL( CFSEmailUiGenericTimer* /*aTriggeredTimer*/ ) + { + TFsEmailUiUtility::ShowWaitNoteL( iWaitNote, R_FSE_WAIT_INSERTING_TEXT, EFalse,ETrue ); + iDialogTimer->Cancel(); + } + // --------------------------------------------------------------------------- // AppendAttachmentToListL // @@ -338,6 +371,11 @@ // TBool fetchOK = EFalse; + if(iAttachmentAddingLocked) + { + return ret; + } + if (aType != MsgAttachmentUtils::EUnknown) { CAiwGenericParamList* paramList = CAiwGenericParamList::NewLC(); @@ -373,8 +411,12 @@ fetchOK = TFsEmailUiUtility::ShowSelectFileDialogL( filePath ); } + iAttachmentAddingLocked = ETrue; + if ( fetchOK && filePath.Length() > 0 ) // { + iDialogTimer->Start(KGenericTimerDialogInterval); + if ( !FileDrmProtectedL( filePath ) ) { // add file as a email message part @@ -425,6 +467,14 @@ ret = ETrue; } } + + iDialogTimer->Cancel(); + if(iWaitNote) + { + iWaitNote->ProcessFinishedL(); + } + iAttachmentAddingLocked = EFalse; + return ret; } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp --- a/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/FreestyleMessageHeaderHTML.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -64,7 +64,6 @@ _LIT8( KPriorityHighImageName, "todo_high_add_img"); _LIT8( KPriorityLowImageName, "todo_low_add_img"); -_LIT8( KAttachmentSizeUnit, "kb"); _LIT8( KSpace8, " "); _LIT8( KHTMLImgTagId, " sizeText; + 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 @@ -985,7 +984,10 @@ sizeText.Append( KSpace8 ); sizeText.Append( _L8("(") ); - sizeText.Append( sizeDesc->Des() ); + HBufC8* sizeDesc8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L( sizeDesc->Des() ); + CleanupStack::PushL( sizeDesc8 ); + sizeText.Append( sizeDesc8->Des() ); + CleanupStack::PopAndDestroy( sizeDesc8 ); CleanupStack::PopAndDestroy( sizeDesc ); sizeText.Append( _L8(")") ); diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncsaddressinputfield.cpp --- a/emailuis/emailui/src/ncsaddressinputfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncsaddressinputfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -32,6 +32,8 @@ #include #include #include +#include + #include "FreestyleEmailUiAppui.h" #include "FreestyleEmailUiLayoutData.h" #include "FreestyleEmailUiLayoutHandler.h" @@ -53,10 +55,8 @@ MNcsAddressPopupList* aAddressPopupList, CNcsHeaderContainer* aParentControl ): MNcsControl( aSizeObserver ), - // iParentControl( aParentControl ), iAddressPopupList( aAddressPopupList ), - // iFieldType( aFieldType ) { FUNC_LOG; @@ -352,7 +352,32 @@ { iButton->HandlePointerEventL( aPointerEvent ); } - iTextEditor->HandleTextChangedL(); + iTextEditor->HandleTextChangedL(); + + switch( aPointerEvent.iType ) + { + case TPointerEvent::EButton1Down: + { + // Save start position so that it can be used in + // drag/scrolling calculations + iStartPosition = aPointerEvent.iPosition; + iIsDraggingStarted = EFalse; + break; + } + + case TPointerEvent::EDrag: + { + if ( !iIsDraggingStarted && iPhysics ) + { + TInt drag( iStartPosition.iY - aPointerEvent.iPosition.iY ); + if ( Abs( drag ) > iPhysics->DragThreshold() ) + { + iIsDraggingStarted = ETrue; + } + } + break; + } + } } // ----------------------------------------------------------------------------- @@ -364,7 +389,7 @@ { if( aEventType == EEventStateChanged ) { - if( aControl == iButton ) + if( aControl == iButton && !iIsDraggingStarted ) { iParentControl->OpenPhonebookL(); } @@ -832,3 +857,9 @@ } } } + +void CNcsAddressInputField::EnableKineticScrollingL( CAknPhysics* aPhysics ) + { + iPhysics = aPhysics; + iTextEditor->EnableKineticScrollingL( aPhysics ); + } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncscomposeview.cpp --- a/emailuis/emailui/src/ncscomposeview.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncscomposeview.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -84,7 +84,8 @@ iMailClient( aMailClient ), iOrigMessage( NULL ), iNewMessage( NULL ), iMsvSession( aMsvSession ), iEnv( aEnv ), iFakeSyncGoingOn(EFalse), iFetchDialogCancelled(EFalse), - iExecutingDoExitL( EFalse ) + iExecutingDoExitL( EFalse ), + iMessageTextPartModified( EFalse ), iMessageModified( EFalse ) { FUNC_LOG; @@ -1007,6 +1008,7 @@ iNewMessage->ResetFlag( EFSMsgFlag_Low ); iNewMessage->SetFlag( EFSMsgFlag_Important ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; iStatusPaneIndicators->SetPriorityFlag( EMsgPriorityHigh ); } break; @@ -1015,6 +1017,7 @@ iNewMessage->ResetFlag( EFSMsgFlag_Low ); iNewMessage->ResetFlag( EFSMsgFlag_Important ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; iStatusPaneIndicators->SetPriorityFlag( EMsgPriorityNormal ); } break; @@ -1023,6 +1026,7 @@ iNewMessage->ResetFlag( EFSMsgFlag_Important ); iNewMessage->SetFlag( EFSMsgFlag_Low ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; iStatusPaneIndicators->SetPriorityFlag( EMsgPriorityLow ); } break; @@ -1145,7 +1149,7 @@ User::Leave( KErrNotFound ); } - CommitL(); + CommitL( ETrue, EAllFields, ETrue ); TRAPD(r, iMailBox->SendMessageL( *iNewMessage ) ); if ( KErrNone != r ) @@ -1194,7 +1198,7 @@ array->AppendL( *saveItem ); CleanupStack::PopAndDestroy( saveItem ); - HBufC* deleteItem = StringLoader::LoadLC( R_NCS_DRAFT_DELETE ); + HBufC* deleteItem = StringLoader::LoadLC( R_NCS_DRAFT_DISCARD ); array->AppendL( *deleteItem ); CleanupStack::PopAndDestroy( deleteItem ); @@ -1339,14 +1343,28 @@ CFreestyleEmailUiSendAttachmentsListControl* attachmentControl; attachmentControl = self->AttachmentsListControl(); - // show file dialog and get file name - TBool ok = EFalse; - TRAPD( error, ok = attachmentControl->AppendAttachmentToListL( + // show file dialog and get file name + TBool ok = EFalse; + TInt error = KErrNone; + if( ! self->Toolbar()->IsDimmed()) + { + self->Toolbar()->SetDimmed(ETrue); + } + + self->iContainer->SwitchChangeMskOff( ETrue ); + TRAP( error, ok = attachmentControl->AppendAttachmentToListL( self->iAttachmentAddType) ); + self->iContainer->SwitchChangeMskOff( EFalse ); + if ( ok && error == KErrNone ) { - TRAPD( error, self->SetAttachmentLabelContentL() ); - return error; + TRAP( error, self->SetAttachmentLabelContentL() ); + } + + if(! attachmentControl->IsAttachmentAddingLocked()) + { + self->Toolbar()->SetDimmed(EFalse); + TRAP( error, self->UpdateToolbarL()); } return error; } @@ -1521,6 +1539,7 @@ { iNewMessage->SetContentType( KFSMailContentTypeMultipartMixed ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; } TFsEmailUiUtility::CreatePlainTextPartL( @@ -1598,6 +1617,7 @@ iOrigMessage = NULL; iNewMessage->SetContentType( KFSMailContentTypeMultipartMixed ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; TFsEmailUiUtility::CreatePlainTextPartL( *iNewMessage, iNewMessageTextPart ); InitFieldsL(); @@ -1627,6 +1647,7 @@ } iNewMessage->SetContentType( KFSMailContentTypeMultipartMixed ); iNewMessage->SaveMessageL(); + iMessageModified = EFalse; TFsEmailUiUtility::CreatePlainTextPartL( *iNewMessage, iNewMessageTextPart ); @@ -2000,8 +2021,8 @@ // // ----------------------------------------------------------------------------- // -void CNcsComposeView::CommitL( - TBool aParseAddresses, TFieldToCommit aFieldToCommit ) +void CNcsComposeView::CommitL( TBool aParseAddresses, + TFieldToCommit aFieldToCommit, TBool aSaveNow ) { FUNC_LOG; __ASSERT_DEBUG( iNewMessage, Panic( ENcsBasicUi ) ); @@ -2037,64 +2058,36 @@ case ESubjectField: commitSubjectField = ETrue; break; - default: - break; - } - - if ( commitToField ) - { - // get addresses from UI to MSG object - RPointerArray toAddresses; - CleanupResetAndDestroyClosePushL( toAddresses ); - NcsUtility::ConvertAddressArrayL( - iContainer->GetToFieldAddressesL( aParseAddresses ), - toAddresses ); - iNewMessage->GetToRecipients().ResetAndDestroy(); - for ( TInt i = 0 ; i < toAddresses.Count() ; i++ ) - { - iNewMessage->AppendToRecipient( toAddresses[i] ); - // Ownership of the message pointer was transferred from our array - // to iNewMessage - toAddresses[i] = NULL; - } - CleanupStack::PopAndDestroy( &toAddresses ); - } - - if ( commitCcField ) - { - RPointerArray ccAddresses; - CleanupResetAndDestroyClosePushL( ccAddresses ); - NcsUtility::ConvertAddressArrayL( - iContainer->GetCcFieldAddressesL( aParseAddresses ), - ccAddresses ); - iNewMessage->GetCCRecipients().ResetAndDestroy(); - for ( TInt i = 0 ; i < ccAddresses.Count() ; i++ ) - { - iNewMessage->AppendCCRecipient( ccAddresses[i] ); - // Ownership of the message pointer was transferred from - // our array to iNewMessage - ccAddresses[i] = NULL; - } - CleanupStack::PopAndDestroy( &ccAddresses ); - } - - if ( commitBccField ) - { - RPointerArray bccAddresses; - CleanupResetAndDestroyClosePushL( bccAddresses ); - NcsUtility::ConvertAddressArrayL( - iContainer->GetBccFieldAddressesL( aParseAddresses ), - bccAddresses ); - iNewMessage->GetBCCRecipients().ResetAndDestroy(); - for ( TInt i = 0; i < bccAddresses.Count() ; i++ ) - { - iNewMessage->AppendBCCRecipient( bccAddresses[i] ); - // Ownership of the message pointer was transferred from - // our array to iNewMessage - bccAddresses[i] = NULL; - } - CleanupStack::PopAndDestroy( &bccAddresses ); - } + default: + break; + } + + if ( commitToField ) + { + RPointerArray& recipients = + iNewMessage->GetToRecipients(); + recipients.ResetAndDestroy(); + NcsUtility::ConvertAddressArrayL( + iContainer->GetToFieldAddressesL( aParseAddresses ), recipients ); + } + + if ( commitCcField ) + { + RPointerArray& recipients = + iNewMessage->GetCCRecipients(); + recipients.ResetAndDestroy(); + NcsUtility::ConvertAddressArrayL( + iContainer->GetCcFieldAddressesL( aParseAddresses ), recipients ); + } + + if ( commitBccField ) + { + RPointerArray& recipients = + iNewMessage->GetBCCRecipients(); + recipients.ResetAndDestroy(); + NcsUtility::ConvertAddressArrayL( + iContainer->GetBccFieldAddressesL( aParseAddresses ), recipients ); + } if ( commitSubjectField ) { @@ -2116,24 +2109,42 @@ // incorrect argument type in FW API, can be removed when API fixed iNewMessageTextPart->SetContent( bodyPtr ); CleanupStack::PopAndDestroy( body ); - - TInt error = KErrNone; - if ( iNewMessageTextPart ) - { - TRAP( error, iNewMessageTextPart->SaveL() ); - } + iMessageTextPartModified = ETrue; + } + + iMessageModified = ETrue; + RefreshToolbar(); + + if ( aSaveNow ) + { + SaveMessageL(); } - - // Save message if at least one field committed - if ( iNewMessage || commitToField || commitCcField || commitBccField - || commitSubjectField || commitBodyField ) + } + +TInt CNcsComposeView::SaveMessage() + { + FUNC_LOG; + TInt error = KErrNone; + TRAP( error, SaveMessageL() ); + return error; + } + +// ----------------------------------------------------------------------------- +// Saves the new message if it has been modifed since the last save. +// ----------------------------------------------------------------------------- +void CNcsComposeView::SaveMessageL() + { + FUNC_LOG; + if ( iNewMessageTextPart && iMessageTextPartModified ) { - TInt error = KErrNone; - if(iNewMessage) // Coverity error fix: - { - TRAP( error, iNewMessage->SaveMessageL() ); - } - RefreshToolbar(); + iNewMessageTextPart->SaveL(); + iMessageTextPartModified = EFalse; + } + + if ( iNewMessage && iMessageModified ) + { + iNewMessage->SaveMessageL(); + iMessageModified = EFalse; } } @@ -2143,7 +2154,6 @@ void CNcsComposeView::DoSafeExit( TExitMode aMode ) { FUNC_LOG; - if ( !iExecutingDoExitL ) { iExecutingDoExitL = ETrue; @@ -2660,11 +2670,11 @@ { iNewMessage->SetContentType( KFSMailContentTypeMultipartMixed ); iNewMessage->SaveMessageL(); - } - - TFsEmailUiUtility::CreatePlainTextPartL( *iNewMessage, iNewMessageTextPart ); - - } + iMessageModified = EFalse; + } + + TFsEmailUiUtility::CreatePlainTextPartL( *iNewMessage, iNewMessageTextPart ); + } // ----------------------------------------------------------------------------- // CNcsComposeView::GenerateForwardMessageL @@ -2862,7 +2872,7 @@ if ( iFirstStartCompleted && iNewMessage && iMailBox && aActionCommand.Id() == KCmdEditorAutoSave ) { - CommitL( EFalse ); + CommitL( EFalse, EAllFields, ETrue ); } } @@ -2879,7 +2889,7 @@ __ASSERT_DEBUG( iNewMessage, Panic( ENcsBasicUi ) ); iFakeSyncGoingOn = ETrue; - TRAPD( error, CommitL( aParseAddresses ) ); + TRAPD( error, CommitL( aParseAddresses, EAllFields, ETrue ) ); iFakeSyncGoingOn = EFalse; User::LeaveIfError( error ); diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncscomposeviewcontainer.cpp --- a/emailuis/emailui/src/ncscomposeviewcontainer.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncscomposeviewcontainer.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -102,13 +102,18 @@ SetMopParent( &iView ); CreateWindowL(); + if ( CAknPhysics::FeatureEnabled() ) + { + iPhysics = CAknPhysics::NewL( *this, this ); + } + // Setup the control array InitComponentArrayL(); CCoeControlArray& controls = Components(); controls.SetControlsOwnedExternally( ETrue ); // Create the header field - iHeader = CNcsHeaderContainer::NewL( *this, iMailBox, aFlags ); + iHeader = CNcsHeaderContainer::NewL( *this, iMailBox, aFlags, iPhysics ); controls.AppendLC( iHeader ); CleanupStack::Pop( iHeader ); @@ -118,6 +123,7 @@ iMessageField->ConstructL( this, 0, 0 ); iMessageField->SetAlignment( EAknEditorAlignBidi ); iMessageField->SetAknEditorInputMode( EAknEditorTextInputMode ); + iMessageField->EnableKineticScrollingL( iPhysics ); controls.AppendLC( iMessageField ); CleanupStack::Pop( iMessageField ); @@ -140,13 +146,16 @@ // Listen edwin events and size events from smart quote field iReadOnlyQuoteField->AddEdwinObserverL( this ); iReadOnlyQuoteField->SetEdwinSizeObserver( this ); + iReadOnlyQuoteField->EnableKineticScrollingL( iPhysics ); // Create the scroll bar iScrollBar = new( ELeave ) CAknDoubleSpanScrollBar( this ); - iScrollBar->ConstructL( - this, this, CEikScrollBar::EVertical, aRect.Height() ); - iScrollBar->MakeVisible( ETrue ); + iScrollBar->ConstructL( ETrue, this, this, CEikScrollBar::EVertical, + aRect.Height() ); + iScrollBar->MakeVisible( EFalse ); iScrollBar->SetModelL( &iScrollBarModel ); + controls.AppendLC( iScrollBar ); + CleanupStack::Pop( iScrollBar ); iMessageField->SetupEditorL(); iReadOnlyQuoteField->SetupEditorL(); @@ -158,17 +167,12 @@ iLongTapDetector = CAknLongTapDetector::NewL( this ); - UpdateScrollBarL(); - ActivateL(); + DrawDeferred(); // activate auto save functionality iAutoSaver.Enable( ETrue ); - if ( CAknPhysics::FeatureEnabled() ) - { - iPhysics = CAknPhysics::NewL( *this, this ); - } } // --------------------------------------------------------------------------- @@ -224,8 +228,8 @@ { iFocused->SetFocus( ETrue, aDrawNow ); } - - iView.HandleContainerChangeRequiringToolbarRefresh(); + + iView.HandleContainerChangeRequiringToolbarRefresh(); if ( aDrawNow ) { @@ -252,7 +256,7 @@ void CNcsComposeViewContainer::HandlePointerEventL( const TPointerEvent& aPointerEvent ) { - FUNC_LOG; + FUNC_LOG; CCoeControl::HandlePointerEventL( aPointerEvent ); @@ -269,7 +273,7 @@ // Save current and original position so that those can be used in // drag/scrolling calculations iPreviousPosition = iOriginalPosition = - aPointerEvent.iParentPosition; + aPointerEvent.iPosition; iIsDragging = EFalse; iIsFlicking = EFalse; @@ -289,9 +293,9 @@ { iMessageField->ClearSelectionL(); } - iMessageField->SetFocus( EFalse, EDrawNow ); + iMessageField->SetFocus( EFalse, ENoDrawNow ); iFocused = iHeader; - iHeader->SetFocus( ETrue,EDrawNow ); + iHeader->SetFocus( ETrue,ENoDrawNow ); iHeader->MakeVisible( ETrue ); CommitL( EBodyField ); iView.HandleContainerChangeRequiringToolbarRefresh(); @@ -299,8 +303,8 @@ else if ( iFocused == iReadOnlyQuoteField ) { iFocused = iMessageField; - iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow ); - iHeader->SetFocus( ETrue, EDrawNow ); + iReadOnlyQuoteField->SetFocus( EFalse, ENoDrawNow ); + iHeader->SetFocus( ETrue, ENoDrawNow ); iView.HandleContainerChangeRequiringToolbarRefresh(); } } @@ -310,16 +314,16 @@ if ( iFocused == iMessageField ) { iFocused = iReadOnlyQuoteField; - iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow ); - iMessageField->SetFocus( EFalse, EDrawNow ); + iReadOnlyQuoteField->SetFocus( ETrue, ENoDrawNow ); + iMessageField->SetFocus( EFalse, ENoDrawNow ); iReadOnlyQuoteField->SetCursorPosL( 0, EFalse ); iView.HandleContainerChangeRequiringToolbarRefresh(); } else if ( iFocused == iHeader ) { iFocused = iReadOnlyQuoteField; - iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow ); - iHeader->SetFocus( EFalse, EDrawNow ); + iReadOnlyQuoteField->SetFocus( ETrue, ENoDrawNow ); + iHeader->SetFocus( EFalse, ENoDrawNow ); iReadOnlyQuoteField->SetCursorPosL( 0, EFalse ); iView.HandleContainerChangeRequiringToolbarRefresh(); } @@ -330,20 +334,22 @@ { //TRAP_IGNORE( DoUpdateSubjectL() ); - iHeader->SetFocus( EFalse, EDrawNow ); - iFocused = iMessageField; - iMessageField->SetFocus( ETrue, EDrawNow ); + iHeader->SetFocus( EFalse, ENoDrawNow ); + iFocused = iMessageField; + iMessageField->SetFocus( ETrue, ENoDrawNow ); iView.HandleContainerChangeRequiringToolbarRefresh(); } else if ( iFocused == iReadOnlyQuoteField ) { iFocused = iMessageField; - iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow ); - iMessageField->SetFocus( ETrue, EDrawNow ); + iReadOnlyQuoteField->SetFocus( EFalse, ENoDrawNow ); + iMessageField->SetFocus( ETrue, ENoDrawNow ); iView.HandleContainerChangeRequiringToolbarRefresh(); } else { + iMessageField->ClearSelectionL(); + const TRect messageFieldRect( iMessageField->Rect() ); if ( !messageFieldRect.Contains( aPointerEvent.iPosition ) && aPointerEvent.iPosition.iY >= messageFieldRect.iTl.iY ) @@ -370,16 +376,28 @@ case TPointerEvent::EDrag: { - // Get current pointer position - TPoint position = aPointerEvent.iParentPosition; + if ( !iIsDragging ) + { + TInt drag( iOriginalPosition.iY - aPointerEvent.iPosition.iY ); + if ( Abs( drag ) > iPhysics->DragThreshold() ) + { + // If user started dragging, cancel hotspot actions + iIsDragging = ETrue; + } + } - // If user started dragging, cancel hotspot actions - iIsDragging = ETrue; + // Get current pointer position + TPoint position = aPointerEvent.iPosition; + if( iPhysics ) - { - TPoint delta( 0, iPreviousPosition.iY - position.iY ); - iPhysics->RegisterPanningPosition( delta ); + { + if ( iIsDragging ) + { + TPoint delta( 0, iPreviousPosition.iY - position.iY ); + if ( !iMessageField->SelectionLength() ) + iPhysics->RegisterPanningPosition( delta ); + } } else { @@ -418,11 +436,6 @@ } } - if( iFocused == iMessageField ) - { - iMessageField->HandleTextChangedL(); - } - if ( aPointerEvent.iType == TPointerEvent::EButton1Down && iHeader->NeedsLongTapL( aPointerEvent.iPosition ) ) { @@ -495,13 +508,15 @@ if ( ret != EKeyWasConsumed ) { - DrawNow(); + DrawDeferred(); } } if ( ret == EKeyWasNotConsumed ) { - ret = iFocused->OfferKeyEventL( aKeyEvent, aType ); + if ( iFocused ) + ret = iFocused->OfferKeyEventL( aKeyEvent, aType ); + if( aType == EEventKeyUp ) iView.HandleContainerChangeRequiringToolbarRefresh(); @@ -655,37 +670,38 @@ if ( iFocused == iReadOnlyQuoteField && aKeyEvent.iCode == EKeyUpArrow ) { iFocused = iMessageField; - iReadOnlyQuoteField->SetFocus( EFalse, EDrawNow ); - iMessageField->SetFocus( ETrue, EDrawNow ); + iReadOnlyQuoteField->SetFocus( EFalse, ENoDrawNow ); + iMessageField->SetFocus( ETrue, ENoDrawNow ); ret = EKeyWasConsumed; } else if ( iFocused == iMessageField ) - { - if ( aKeyEvent.iCode == EKeyUpArrow ) - { + { + if ( aKeyEvent.iCode == EKeyUpArrow ) + { iFocused = iHeader; - iHeader->SetFocus( ETrue,EDrawNow ); - iMessageField->SetFocus( EFalse, EDrawNow ); - iHeader->MakeVisible( ETrue ); + iHeader->SetFocus( ETrue, ENoDrawNow ); + iMessageField->SetFocus( EFalse, ENoDrawNow ); + iHeader->MakeVisible( ETrue ); + iHeader->ShowCursor( ETrue ); CommitL( EBodyField ); ret = EKeyWasConsumed; - } - else if ( aKeyEvent.iCode == EKeyDownArrow && - iReadOnlyQuoteField->TextLength() ) - { - // Focus move to read-only quote only if there is some text in it. - iFocused = iReadOnlyQuoteField; - iReadOnlyQuoteField->SetFocus( ETrue, EDrawNow ); - iMessageField->SetFocus( EFalse, EDrawNow ); - iReadOnlyQuoteField->SetCursorPosL( 0, EFalse ); - ret = EKeyWasConsumed; - } + } + else if ( aKeyEvent.iCode == EKeyDownArrow && + iReadOnlyQuoteField->TextLength() ) + { + // Focus move to read-only quote only if there is some text in it. + iFocused = iReadOnlyQuoteField; + iReadOnlyQuoteField->SetFocus( ETrue, ENoDrawNow ); + iMessageField->SetFocus( EFalse, ENoDrawNow ); + iReadOnlyQuoteField->SetCursorPosL( 0, EFalse ); + ret = EKeyWasConsumed; + } } - else if ( iFocused == iHeader && aKeyEvent.iCode == EKeyDownArrow ) + else if ( iFocused == iHeader && aKeyEvent.iCode == EKeyDownArrow ) { - iFocused = iMessageField; - iHeader->SetFocus( EFalse, EDrawNow ); - iMessageField->SetFocus( ETrue, EDrawNow ); + iFocused = iMessageField; + iHeader->SetFocus( EFalse, ENoDrawNow ); + iMessageField->SetFocus( ETrue, ENoDrawNow ); iMessageField->SetCursorPosL( 0, EFalse ); ret = EKeyWasConsumed; } @@ -802,24 +818,21 @@ // Draws the display // ----------------------------------------------------------------------------- // -void CNcsComposeViewContainer::Draw( const TRect& /*aRect*/ ) const +void CNcsComposeViewContainer::Draw( const TRect& aRect ) const { FUNC_LOG; - if ( iBgContext ) - { - CWindowGc& gc = SystemGc(); - - MAknsSkinInstance* skin = AknsUtils::SkinInstance(); - - if ( skin ) - { - AknsDrawUtils::Background( skin, iBgContext, this, gc, Rect() ); - } - } + if ( iBgContext ) + { + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( skin ) + { + AknsDrawUtils::Background( skin, iBgContext, this, gc, aRect ); + } + } } - // ----------------------------------------------------------------------------- // CNcsComposeViewContainer::SetBodyContentL() // ----------------------------------------------------------------------------- @@ -1074,7 +1087,7 @@ // ----------------------------------------------------------------------------- // void CNcsComposeViewContainer::UpdateScrollBarL() - { + { FUNC_LOG; TRect headerRect = iHeader->Rect(); @@ -1093,8 +1106,8 @@ iScrollBarModel.SetFocusPosition( visiblePosition ); iScrollBar->SetModelL( &iScrollBarModel ); - iScrollBar->DrawNow(); - } + iScrollBar->MakeVisible( IsVisible() ); + } // ----------------------------------------------------------------------------- // CNcsComposeViewContainer::SetFocusToMessageFieldL() @@ -1108,12 +1121,11 @@ { iHeader->SetFocus( EFalse, ENoDrawNow ); iMessageField->SetCursorPosL( 0, EFalse ); - iMessageField->SetFocus( ETrue, EDrawNow ); + iMessageField->SetFocus( ETrue, ENoDrawNow ); iFocused = iMessageField; UpdateScreenPositionL(); DrawDeferred(); } - } // ----------------------------------------------------------------------------- @@ -1809,7 +1821,7 @@ FUNC_LOG; if ( iHeader ) { - iHeader->HandleDynamicVariantSwitchL(); + iHeader->HandleSkinChangeL(); } if ( iMessageField ) @@ -1914,9 +1926,6 @@ FUNC_LOG; TPoint headerPos( iHeader->Position() ); - aTargetPos = Max( 0, Min( aTargetPos, - ContentTotalHeight() - Rect().Height()) ); - TInt moveY = -headerPos.iY - aTargetPos; if( moveY ) @@ -1938,7 +1947,7 @@ iSeparatorLineYPos += moveY; UpdateScrollBarL(); - DrawNow(); + DrawDeferred(); } } @@ -1953,12 +1962,9 @@ TUint /*aFlags*/ ) { FUNC_LOG; - if( iIsFlicking ) - { - TInt scrollOffset = aNewPosition.iY - Rect().Size().iHeight / 2; + TInt scrollOffset = aNewPosition.iY - Rect().Size().iHeight / 2; - TRAP_IGNORE( ScrollL( scrollOffset ) ); - } + TRAP_IGNORE( ScrollL( scrollOffset ) ); } // ----------------------------------------------------------------------------- diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncsheadercontainer.cpp --- a/emailuis/emailui/src/ncsheadercontainer.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncsheadercontainer.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -22,6 +22,7 @@ #include #include //CAknInformationNote #include +#include #include "cfsmailbox.h" #include @@ -57,11 +58,11 @@ // --------------------------------------------------------------------------- // CNcsHeaderContainer* CNcsHeaderContainer::NewL( CCoeControl& aParent, - CFSMailBox& aMailBox, TInt aFlags ) + CFSMailBox& aMailBox, TInt aFlags, CAknPhysics* aPhysics ) { FUNC_LOG; CNcsHeaderContainer* self = - new ( ELeave ) CNcsHeaderContainer( aParent, aMailBox ); + new ( ELeave ) CNcsHeaderContainer( aParent, aMailBox, aPhysics ); CleanupStack::PushL( self ); self->ConstructL( aFlags ); CleanupStack::Pop( self ); @@ -74,11 +75,13 @@ // CNcsHeaderContainer::CNcsHeaderContainer( CCoeControl& aParent, - CFSMailBox& aMailBox ): + CFSMailBox& aMailBox, + CAknPhysics* aPhysics ): iParent( aParent ), iFieldSizeObserver( static_cast< CNcsComposeViewContainer& >( aParent ) ), iMailBox( aMailBox ), - iLongTapEventConsumed( EFalse ) + iLongTapEventConsumed( EFalse ), + iPhysics( aPhysics ) { FUNC_LOG; } @@ -171,6 +174,11 @@ KAknsIIDQsnBgAreaMain, Rect(), EFalse ); iRALInProgress = EFalse; + + iToField->EnableKineticScrollingL( iPhysics ); + iCcField->EnableKineticScrollingL( iPhysics ); + iBccField->EnableKineticScrollingL( iPhysics ); + iSubjectField->EnableKineticScrollingL( iPhysics ); } // --------------------------------------------------------------------------- @@ -235,7 +243,7 @@ // CNcsHeaderContainer::ShowCursor // --------------------------------------------------------------------------- // -void CNcsHeaderContainer::ShowCursor( TBool aShow ) +void CNcsHeaderContainer::ShowCursor( TBool aShow, TDrawNow aDrawNow ) { CCoeControl* focused = FindFocused(); if ( focused ) @@ -244,7 +252,7 @@ } if ( iFocused ) { - iFocused->SetFocus( aShow, EDrawNow ); + iFocused->SetFocus( aShow, aDrawNow ); } } @@ -307,32 +315,36 @@ void CNcsHeaderContainer::SetMskL() { FUNC_LOG; + + // msk change disabled - probably some dialog/popup is visible + if( iSwitchChangeMskOff ) + { + return; + } + CCoeControl* focused = FindFocused(); if ( focused == iToField || focused == iCcField || focused == iBccField ) { - if( iSwitchChangeMskOff == EFalse ) - { - ChangeMskCommandL( R_FSE_QTN_MSK_ADD ); - } + ChangeMskCommandL( R_FSE_QTN_MSK_ADD ); } else if ( focused == iAttachmentField ) { - if ( GetAttachmentCount() > 1 ) - { + if ( GetAttachmentCount() > 1 ) + { ChangeMskCommandL( R_FSE_QTN_MSK_VIEWATTACHMENTS ); - } - else if ( !HasRemoteAttachments() ) - { - ChangeMskCommandL( R_FSE_QTN_MSK_VIEWATTACHMENT ); - } - else // message has single remote attachment => no MSK function - { + } + else if ( !HasRemoteAttachments() ) + { + ChangeMskCommandL( R_FSE_QTN_MSK_VIEWATTACHMENT ); + } + else // message has single remote attachment => no MSK function + { ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); } } else if ( focused == iSubjectField ) { - ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); + ChangeMskCommandL( R_FSE_QTN_MSK_EMPTY ); } else { @@ -348,67 +360,75 @@ const TPointerEvent& aPointerEvent ) { FUNC_LOG; - CCoeControl* clicked = 0; - for ( TInt i=0; i < Components().Count(); ++i ) - { - TRect rc = Components().At( i ).iControl->Rect(); - if ( rc.Contains( aPointerEvent.iPosition ) ) - { - clicked = Components().At( i ).iControl; - } - } - if ( clicked ) + if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) { - if ( aPointerEvent.iType == TPointerEvent::EButton1Up ) - { - CCoeControl* pOldCtrl = FindFocused(); - CCoeControl* pNewCtrl= clicked; - - if ( pOldCtrl != pNewCtrl ) - { - // Unfocus the control - if ( pOldCtrl ) - { - pOldCtrl->SetFocus( EFalse, ENoDrawNow ); - } - pNewCtrl->SetFocus( ETrue, ENoDrawNow ); - iFocused = pNewCtrl; - // Commit changes to previously focused field. - if ( pOldCtrl ) - { - CommitFieldL( pOldCtrl ); - } + CCoeControl* clicked = 0; + for ( TInt i=0; i < Components().Count(); ++i ) + { + TRect rc = Components().At( i ).iControl->Rect(); + if ( rc.Contains( aPointerEvent.iPosition ) ) + { + clicked = Components().At( i ).iControl; + } + } + + if ( clicked ) + { + CCoeControl* pOldCtrl = FindFocused(); + CCoeControl* pNewCtrl= clicked; + + if ( pOldCtrl != pNewCtrl ) + { + // Unfocus the control + if ( pOldCtrl ) + { + pOldCtrl->SetFocus( EFalse, ENoDrawNow ); + } + pNewCtrl->SetFocus( ETrue, ENoDrawNow ); + iFocused = pNewCtrl; + // Commit changes to previously focused field. + if ( pOldCtrl ) + { + CommitFieldL( pOldCtrl ); + } - // If the attachments label has changed focus - if ( pOldCtrl == iAttachmentField || - pNewCtrl == iAttachmentField ) - { - DrawAttachmentFocusNow(); - } - - CNcsComposeViewContainer* container = - static_cast( &iParent ); - container->UpdateScrollBarL(); - } - - if( iLongTapEventConsumed ) - { - iLongTapEventConsumed = EFalse; - return; - } - - if( pNewCtrl == iAttachmentField ) - { + // If the attachments label has changed focus + if ( pOldCtrl == iAttachmentField || + pNewCtrl == iAttachmentField ) + { + DrawAttachmentFocusNow(); + } + + CNcsComposeViewContainer* container = + static_cast( &iParent ); + container->UpdateScrollBarL(); + } + + if( iLongTapEventConsumed ) + { + iLongTapEventConsumed = EFalse; + return; + } + + TBool physicsActionOngoing( EFalse ); + if ( iPhysics && iPhysics->OngoingPhysicsAction() != CAknPhysics::EAknPhysicsActionNone ) + { + physicsActionOngoing = ETrue; + } + + if( pNewCtrl == iAttachmentField && !physicsActionOngoing ) + { CNcsComposeViewContainer& parent = - static_cast( iParent ); + static_cast( iParent ); parent.HandleAttachmentsOpenCommandL(); - } - } + } + } } - for ( TInt i=0; i < Components().Count(); ++i ) - { - Components().At( i ).iControl->HandlePointerEventL( aPointerEvent ); - } + + if ( aPointerEvent.iType != TPointerEvent::EDrag ) + { + CCoeControl::HandlePointerEventL( aPointerEvent ); + } } // ----------------------------------------------------------------------------- @@ -671,16 +691,16 @@ } CCoeControlArray::TCursor cur = Components().Find( aAnchor ); - ASSERT( cur.IsValid() ); - // figure out the new top position of the container TInt top = aAnchor->Rect().iTl.iY; - while ( cur.Prev() ) + if( cur.IsValid() ) { - CCoeControl* ctrl = cur.Control(); - top -= ctrl->Rect().Height(); + while ( cur.Prev() ) + { + CCoeControl* ctrl = cur.Control(); + top -= ctrl->Rect().Height(); + } } - // Then check we didn't move too much and composer still fills the whole // visible area on the screen (i.e. don't scroll below the bottom of the // body field) @@ -1840,6 +1860,19 @@ } // --------------------------------------------------------------------------- +// CNcsHeaderContainer::HandleSkinChangeL +// --------------------------------------------------------------------------- +// +void CNcsHeaderContainer::HandleSkinChangeL() + { + FUNC_LOG; + if ( iAacListBox ) + { + iAacListBox->HandleResourceChange( KAknsMessageSkinChange ); + } + } + +// --------------------------------------------------------------------------- // CNcsHeaderContainer::LayoutLineCount // --------------------------------------------------------------------------- // diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncspopuplistbox.cpp --- a/emailuis/emailui/src/ncspopuplistbox.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncspopuplistbox.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -19,11 +19,13 @@ // INCLUDE FILES #include "emailtrace.h" #include -#include +#include #include // R_FSE_EDITOR_ADDRESS_LIST_REMOTE_LOOKUP_SEARCH #include // StringLoader #include #include //For LanguageNotSupported errorNote +#include +#include #include "ncspopuplistbox.h" #include "ncsemailaddressobject.h" // CNcsEmailAddressObject @@ -37,6 +39,9 @@ #include "FSDelayedLoader.h" #include "FreestyleEmailUiCLSItem.h" +const TInt KBackgroundFrameWidth = 4; +const TInt KHighlightFrameWidth = 2; + // ========================= MEMBER FUNCTIONS ================================== // ----------------------------------------------------------------------------- @@ -46,15 +51,15 @@ CFSMailBox& aMailBox, CNcsHeaderContainer& aHeaderContainer, TBool aRemoteLookupSupported ) - { + { FUNC_LOG; - CNcsPopupListBox* self = - new (ELeave) CNcsPopupListBox( aHeaderContainer, aRemoteLookupSupported, aMailBox ); - CleanupStack::PushL( self ); - self->ConstructL( aParent ); - CleanupStack::Pop( self ); - return self; - } + CNcsPopupListBox* self = new (ELeave) CNcsPopupListBox( aHeaderContainer, + aRemoteLookupSupported, aMailBox ); + CleanupStack::PushL( self ); + self->ConstructL( aParent ); + CleanupStack::Pop( self ); + return self; + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::CNcsPopupListBox @@ -75,42 +80,40 @@ { FUNC_LOG; CEikTextListBox::ConstructL( aParent, CEikListBox::EPopout ); - CreateScrollBarFrameL(); + // Create non-window-owning scrollbar to avoid flickering. + CEikScrollBarFrame* frame = CreateScrollBarFrameL( EFalse, EFalse, EFalse ); - CEikTextListBox::SetBorder( TGulBorder::ESingleGray ); + CEikTextListBox::SetBorder( TGulBorder::ENone ); - const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); - CEikTextListBox::SetItemHeightL( font->HeightInPixels() + 8 ); + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); + CEikTextListBox::SetItemHeightL( font->FontMaxHeight() + 12 ); - iBaseBackroundContext = CAknsBasicBackgroundControlContext::NewL( - KAknsIIDQgnFsGrafEmailContent, - Rect(), - EFalse ); - iContactHandler = CFsDelayedLoader::InstanceL()->GetContactHandlerL(); - if ( !iContactHandler->IsLanguageSupportedL() ) - { - iContactHandler = NULL; - } - - iAppUi = static_cast(iEikonEnv->AppUi()); // - - // + iBackgroundContext = CAknsFrameBackgroundControlContext::NewL( + KAknsIIDQsnFrPopup, Rect(), Rect(), EFalse ); + UpdateTextColors(); + + iContactHandler = CFsDelayedLoader::InstanceL()->GetContactHandlerL(); + if ( !iContactHandler->IsLanguageSupportedL() ) + { + iContactHandler = NULL; + } + + iAppUi = static_cast( iEikonEnv->AppUi() ); SetListBoxObserver( this ); - // } // ----------------------------------------------------------------------------- // CNcsPopupListBox::InitAndSearchL // ----------------------------------------------------------------------------- void CNcsPopupListBox::InitAndSearchL( const TDesC& aText ) - { + { FUNC_LOG; - SetSearchTextL( aText ); - RPointerArray emptyArray; - CleanupClosePushL( emptyArray ); - OperationCompleteL( ESearchContacts, emptyArray ); - CleanupStack::PopAndDestroy( &emptyArray ); - } + SetSearchTextL( aText ); + RPointerArray emptyArray; + CleanupClosePushL( emptyArray ); + OperationCompleteL( ESearchContacts, emptyArray ); + CleanupStack::PopAndDestroy( &emptyArray ); + } // --------------------------------------------------------------------------- // CNcsPopupListBox::~CNcsPopupListBox @@ -118,21 +121,20 @@ CNcsPopupListBox::~CNcsPopupListBox() { FUNC_LOG; - delete iBaseBackroundContext; - delete iItemTextsArray; - delete iCurrentSearchText; - iMatchingItems.ResetAndDestroy(); - } + delete iBackgroundContext; + delete iItemTextsArray; + delete iCurrentSearchText; + iMatchingItems.ResetAndDestroy(); + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::CreateItemDrawerL // ----------------------------------------------------------------------------- void CNcsPopupListBox::CreateItemDrawerL() - { + { FUNC_LOG; - CNcsListItemDrawer* drawer = new (ELeave) CNcsListItemDrawer( *this ); - iItemDrawer = drawer; - } + iItemDrawer = new (ELeave) CNcsListItemDrawer( *this ); + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::MopSupplyObject @@ -142,7 +144,7 @@ FUNC_LOG; if ( aId.iUid == MAknsControlContext::ETypeId ) { - return MAknsControlContext::SupplyMopObject( aId, iBaseBackroundContext ); + return MAknsControlContext::SupplyMopObject( aId, iBackgroundContext ); } return CCoeControl::MopSupplyObject( aId ); } @@ -153,15 +155,59 @@ void CNcsPopupListBox::SizeChanged() { FUNC_LOG; - CEikTextListBox::SizeChanged(); - iBaseBackroundContext->SetRect( Rect() ); + TRect outerRect = Rect(); + TRect innerRect = outerRect; + innerRect.Shrink( KBackgroundFrameWidth, KBackgroundFrameWidth ); + SetViewRectFromClientRect( innerRect ); + TRAP_IGNORE( HandleViewRectSizeChangeL() ); + iBackgroundContext->SetFrameRects( outerRect, innerRect ); + } + +void CNcsPopupListBox::HandleResourceChange( TInt aType ) + { + FUNC_LOG; + if ( aType == KAknsMessageSkinChange ) + { + UpdateTextColors(); + } + } + +void CNcsPopupListBox::HandlePointerEventL( const TPointerEvent& aPointerEvent ) + { + // When scrollbar is non-window-owning, the pointer events should be passed + // to it through control hierachy, but the CEikTextListBox does not seem to + // do that, so that is handled here. + CEikScrollBar* sb = iSBFrame->VerticalScrollBar(); + if ( aPointerEvent.iType == TPointerEvent::EButton1Down ) + { + if ( sb && sb->Rect().Contains( aPointerEvent.iPosition ) ) + { + sb->ClaimPointerGrab( EFalse ); + sb->HandlePointerEventL( aPointerEvent ); + } + else + { + ClaimPointerGrab( EFalse ); + } + } + + CCoeControl* pointerRecipient = GrabbingComponent(); + if ( sb && pointerRecipient == sb ) + { + sb->HandlePointerEventL( aPointerEvent ); + } + else + { + CEikTextListBox::HandlePointerEventL( aPointerEvent ); + } } // ----------------------------------------------------------------------------- // CNcsPopupListBox::OfferKeyEventL // ----------------------------------------------------------------------------- // -TKeyResponse CNcsPopupListBox::OfferKeyEventL( const TKeyEvent& aKeyEvent, TEventCode aType ) +TKeyResponse CNcsPopupListBox::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) { FUNC_LOG; TKeyResponse ret( EKeyWasNotConsumed ); @@ -206,12 +252,12 @@ return ret; } -// Touch // --------------------------------------------------------------------------- // CNcsPopupListBox::HandleListBoxEventL // --------------------------------------------------------------------------- // -void CNcsPopupListBox::HandleListBoxEventL( CEikListBox* /*aListBox*/, TListBoxEvent aEventType ) +void CNcsPopupListBox::HandleListBoxEventL( CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) { if ( aEventType == EEventItemClicked || aEventType == EEventItemSingleClicked ) @@ -219,7 +265,6 @@ iHeaderContainer.DoPopupSelectL(); } } -// // ----------------------------------------------------------------------------- // CNcsPopupListBox::OperationComplete @@ -324,55 +369,54 @@ // CNcsPopupListBox::SetPopupMaxRect // ----------------------------------------------------------------------------- void CNcsPopupListBox::SetPopupMaxRect( const TRect& aPopupMaxRect ) - { + { FUNC_LOG; - iPopupMaxRect = aPopupMaxRect; - SetPopupHeight(); - TRAP_IGNORE( UpdateScrollBarsL() ); - TRAP_IGNORE( SetScrollBarVisibilityL() ); - } - + iPopupMaxRect = aPopupMaxRect; + SetPopupHeight(); + TRAP_IGNORE( UpdateScrollBarsL() ); + TRAP_IGNORE( SetScrollBarVisibilityL() ); + } + // ----------------------------------------------------------------------------- // CNcsPopupListBox::IsPopupEmpty // ----------------------------------------------------------------------------- TBool CNcsPopupListBox::IsPopupEmpty() const - { + { FUNC_LOG; - if( Model()->NumberOfItems() > 0 ) - return EFalse; - else - return ETrue; - } + if ( Model()->NumberOfItems() > 0 ) + return EFalse; + else + return ETrue; + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::IsRemoteLookupItemSelected // ----------------------------------------------------------------------------- TBool CNcsPopupListBox::IsRemoteLookupItemSelected() const - { + { FUNC_LOG; - if( CurrentItemIndex() == iRemoteLookupItemPos && iRemoteLookupSupported ) - return ETrue; - else - return EFalse; - } + if ( CurrentItemIndex() == iRemoteLookupItemPos && iRemoteLookupSupported ) + return ETrue; + else + return EFalse; + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::CurrentPopupClsItemsArray // ----------------------------------------------------------------------------- - const RPointerArray& CNcsPopupListBox::CurrentPopupClsItemsArray() const - { - return iMatchingItems; - } + { + return iMatchingItems; + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::RemoteLookupItemPos // ----------------------------------------------------------------------------- TInt CNcsPopupListBox::RemoteLookupItemPos() const - { + { FUNC_LOG; - return iRemoteLookupItemPos; - } + return iRemoteLookupItemPos; + } // ----------------------------------------------------------------------------- // CNcsPopupListBox::LayoutHandler @@ -380,9 +424,7 @@ CFSEmailUiLayoutHandler& CNcsPopupListBox::LayoutHandler() const { FUNC_LOG; - CFreestyleEmailUiAppUi* appUi = - static_cast( ControlEnv()->AppUi() ); - return *appUi->LayoutHandler(); + return *iAppUi->LayoutHandler(); } // ----------------------------------------------------------------------------- @@ -436,15 +478,16 @@ // CNcsPopupListBox::SetPopupHeight // ----------------------------------------------------------------------------- void CNcsPopupListBox::SetPopupHeight() - { + { FUNC_LOG; // This is the total height in pixels needed to show all items - TInt minimumHeight = CalcHeightBasedOnNumOfItems( Model()->NumberOfItems()); + TInt minimumHeight = 2 * KBackgroundFrameWidth + + CalcHeightBasedOnNumOfItems( Model()->NumberOfItems() ); TRect newRect = iPopupMaxRect; TInt areaHeight = Parent()->Parent()->Rect().Height(); TInt halfAreaHeight = areaHeight/2; - // Get height of one line in Address field + // Get height of one line in Address field CNcsHeaderContainer* headerObj = static_cast(Parent()); TInt toLineHeight = headerObj->GetToLineHeight(); // height of one line height if(toLineHeight == 0) @@ -514,7 +557,8 @@ FUNC_LOG; if( iRemoteLookupSupported ) { - HBufC* rmluText = StringLoader::LoadLC( R_FSE_EDITOR_ADDRESS_LIST_REMOTE_LOOKUP_SEARCH, *iCurrentSearchText ); + HBufC* rmluText = StringLoader::LoadLC( + R_FSE_EDITOR_ADDRESS_LIST_REMOTE_LOOKUP_SEARCH, *iCurrentSearchText ); iItemTextsArray->InsertL( 0, *rmluText ); CleanupStack::PopAndDestroy( rmluText ); @@ -591,83 +635,80 @@ // CNcsListItemDrawer::CNcsListItemDrawer // ----------------------------------------------------------------------------- CNcsListItemDrawer::CNcsListItemDrawer( const CNcsPopupListBox& aListBox ) -:CListItemDrawer(), iListBox(aListBox) - { +:CListItemDrawer(), iListBox( aListBox ) + { FUNC_LOG; - // Store a GC for later use - iGc = &CCoeEnv::Static()->SystemGc(); - SetGc(iGc); - } + // Store a GC for later use + iGc = &CCoeEnv::Static()->SystemGc(); + SetGc(iGc); + } // ----------------------------------------------------------------------------- // CNcsListItemDrawer::DrawActualItem // ----------------------------------------------------------------------------- void CNcsListItemDrawer::DrawActualItem(TInt aItemIndex, - const TRect& aActualItemRect, TBool aItemIsCurrent, - TBool /*aViewIsEmphasized*/, TBool /*aViewIsDimmed*/, - TBool /*aItemIsSelected*/) const - { + const TRect& aActualItemRect, TBool aItemIsCurrent, + TBool /*aViewIsEmphasized*/, TBool /*aViewIsDimmed*/, + TBool /*aItemIsSelected*/) const + { FUNC_LOG; - // - iGc->Reset(); - // - - // Get reference to curren popup cls item list. - const RPointerArray& clsItemArray = iListBox.CurrentPopupClsItemsArray(); - TInt rmluPosition = iListBox.RemoteLookupItemPos(); + iGc->DiscardFont(); - // Sets all the attributes, like font, text color and background color. - const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); - iGc->UseFont(font); + // Get reference to curren popup cls item list. + const RPointerArray& clsItemArray = + iListBox.CurrentPopupClsItemsArray(); + TInt rmluPosition = iListBox.RemoteLookupItemPos(); - // We have to draw the item in layered fassion in order to do the skin - // First clear the backround by drawing a solid white rect. - iGc->SetPenColor(iBackColor); - iGc->SetPenStyle(CGraphicsContext::ESolidPen); - iGc->SetBrushColor(iBackColor); - iGc->SetBrushStyle(CGraphicsContext::ESolidBrush); - - // draw the background - TRect backgroundRect( aActualItemRect ); + // Sets all the attributes, like font, text color and background color. + const CFont* font = AknLayoutUtils::FontFromId( EAknLogicalFontPrimarySmallFont ); + iGc->UseFont( font ); + iGc->SetPenStyle( CGraphicsContext::ESolidPen ); + iGc->SetBrushStyle( CGraphicsContext::ENullBrush ); - if ( !aItemIndex ) - { - backgroundRect.iTl.iY = 0; - } - else if ( aItemIndex == iListBox.Model()->NumberOfItems() - 1 ) - { - backgroundRect.iBr.iY = iListBox.Size().iHeight; - } - - iGc->DrawRect( backgroundRect ); - - - TRect textRect( aActualItemRect ); - { - // temporary const_cast to get scroll width - CNcsPopupListBox& tmpListBox = const_cast(iListBox); - textRect.Resize( -tmpListBox.ScrollBarFrame()->ScrollBarBreadth(CEikScrollBar::EVertical), 0 ); + TRect itemRect = aActualItemRect; + { + // temporary const_cast to get the scrollbar width + CNcsPopupListBox& tmpListBox = const_cast( iListBox ); + itemRect.Resize( -tmpListBox.ScrollBarFrame()->ScrollBarBreadth( + CEikScrollBar::EVertical ) + KBackgroundFrameWidth, 0 ); } + TRect textRect = itemRect; + textRect.Shrink( KHighlightFrameWidth, KHighlightFrameWidth ); - // Now draw the highlight - if( aItemIsCurrent ) - { - TRgb highlightColor = iListBox.LayoutHandler().PcsPopupHighlightColor(); - iGc->SetBrushColor(highlightColor); -// AknsDrawUtils::DrawFrame( AknsUtils::SkinInstance(), *iGc, -// aActualItemRect, aActualItemRect, -// KNcsIIDHighlightBackground, KNcsIIDHighlightBackground ); - iGc->DrawRect(textRect); - } + // Get skin instance. + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + // Draw background using the control context from the list box. + MAknsControlContext* cc = AknsDrawUtils::ControlContext( &iListBox ); + if ( cc ) + { + AknsDrawUtils::Background( skin, cc, *iGc, itemRect ); + } + else + { + iGc->Clear( itemRect ); + } - iGc->SetPenColor(iTextColor); - iGc->SetPenStyle(CGraphicsContext::ESolidPen); - iGc->SetBrushStyle(CGraphicsContext::ENullBrush); - TInt topToBaseline = ( textRect.Height() - font->HeightInPixels() ) / 2 - + font->AscentInPixels(); + // Draw the highlight, when necessary. + if ( aItemIsCurrent ) + { + AknsDrawUtils::DrawFrame( skin, *iGc, itemRect, textRect, + KAknsIIDQsnFrList, KAknsIIDQsnFrListCenter ); + } - TPtrC itemText = iListBox.Model()->ItemText( aItemIndex ); + // Get text color. + TRgb textColor = TextColor(); + if ( aItemIsCurrent ) + { + textColor = HighlightedTextColor(); + } + + iGc->SetPenColor( textColor ); + TInt topToBaseline = ( textRect.Height() - font->FontMaxHeight() ) / 2 + + font->FontMaxAscent(); + + TPtrC itemText = iListBox.Model()->ItemText( aItemIndex ); // Construct bidirectional text object // Removed leave from non-leaving function. @@ -820,5 +861,40 @@ } } +void CNcsPopupListBox::UpdateTextColors() + { + if ( iItemDrawer ) + { + // Get skin instance. + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + // Get color for popup text from current skin. + TRgb textColor = KRgbBlack; + AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG20 ); + iItemDrawer->SetTextColor( textColor ); + + // Get text color for highlighted list item from current skin. + AknsUtils::GetCachedColor( skin, textColor, KAknsIIDQsnTextColors, + EAknsCIQsnTextColorsCG10 ); + iItemDrawer->SetHighlightedTextColor( textColor ); + } + } + +void CNcsPopupListBox::Draw( const TRect& aRect ) const + { + CWindowGc& gc = SystemGc(); + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + if ( iBackgroundContext ) + { + AknsDrawUtils::Background( skin, iBackgroundContext, gc, aRect ); + } + else + { + gc.Clear( aRect ); + } + CEikListBox::Draw( aRect ); + } + // End of File diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/emailui/src/ncssubjectfield.cpp --- a/emailuis/emailui/src/ncssubjectfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/emailui/src/ncssubjectfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -597,3 +597,7 @@ } } +void CNcsSubjectField::EnableKineticScrollingL(CAknPhysics* aPhysics) + { + iTextEditor->EnableKineticScrollingL(aPhysics); + } diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/uicomponents/group/fs_generic.mmp --- a/emailuis/uicomponents/group/fs_generic.mmp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/uicomponents/group/fs_generic.mmp Wed Apr 14 15:42:15 2010 +0300 @@ -141,5 +141,6 @@ LIBRARY aknphysics.lib LIBRARY cmaillogger.lib LIBRARY aknicon.lib +LIBRARY touchfeedback.lib DEFFILE fs_generic_alf.def diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/uicomponents/src/fscontrolbutton.cpp --- a/emailuis/uicomponents/src/fscontrolbutton.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/uicomponents/src/fscontrolbutton.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -28,6 +28,8 @@ #include +#include // for MTouchFeedback + #include "fscontrolbutton.h" #include "fscontrolbuttonmodel.h" #include "fscontrolbuttonvisualiser.h" @@ -665,6 +667,13 @@ if( HitTest( aEvent.PointerEvent().iParentPosition ) ) { iTouchPressed = ETrue; + // added for tactile feedback + MTouchFeedback* feedback = MTouchFeedback::Instance(); + if (feedback) + { + feedback->InstantFeedback(ETouchFeedbackBasic); + } + GrabPointerEvents( ETrue ); result = iParent.HandleButtonEvent( MFsControlButtonObserver::EEventButtonTouchPressed, diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/widget/hsps/00/manifest.dat --- a/emailuis/widget/hsps/00/manifest.dat Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/widget/hsps/00/manifest.dat Wed Apr 14 15:42:15 2010 +0300 @@ -34,6 +34,6 @@ - 5 + 6 \ No newline at end of file diff -r 4ce476e64c59 -r 8592a65ad3fb emailuis/widget/loc/emailwidget.loc --- a/emailuis/widget/loc/emailwidget.loc Wed Mar 31 21:08:33 2010 +0300 +++ b/emailuis/widget/loc/emailwidget.loc Wed Apr 14 15:42:15 2010 +0300 @@ -29,3 +29,9 @@ // r: TB9.1 #define qtn_hscr_ew_email_count "%0U (%1N)" +//d: Notifies user that active homescreen is full +//l: popup_note_window +//w: +//r: TB9.2 +// +#define qtn_cmail_hs_widget_full_notification "Active homescreen is full. Mail widget should be added manually to homescreen." diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssosplugin/src/ipsplgsmtpservice.cpp --- a/ipsservices/ipssosplugin/src/ipsplgsmtpservice.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/ipsservices/ipssosplugin/src/ipsplgsmtpservice.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -554,7 +554,7 @@ { //const TUid KCRUidEMailCharsets = {0x20018441}; // korea needs different default charset - const TInt KoreanMib = 36; // magic number to read from cen rep would be better + const TInt KoreanMib = 38; // magic number to read from cen rep would be better CCnvCharacterSetConverter* charConv = NULL; TRAPD( err, charConv = CCnvCharacterSetConverter::NewL() ); diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssossettings/data/ipssetuimailsettings.ra --- a/ipsservices/ipssossettings/data/ipssetuimailsettings.ra Wed Mar 31 21:08:33 2010 +0300 +++ b/ipsservices/ipssossettings/data/ipssetuimailsettings.ra Wed Apr 14 15:42:15 2010 +0300 @@ -62,7 +62,7 @@ MENU_ITEM { command = EAknCmdHelp; - txt = qtn_clipb_litxt_help; + txt = qtn_options_help; }, MENU_ITEM { diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssossettings/inc/ipssetuifolderlistarray.h --- a/ipsservices/ipssossettings/inc/ipssetuifolderlistarray.h Wed Mar 31 21:08:33 2010 +0300 +++ b/ipsservices/ipssossettings/inc/ipssetuifolderlistarray.h Wed Apr 14 15:42:15 2010 +0300 @@ -23,6 +23,27 @@ #include // TMsvId #include // MDesCArray +/** + * Help class to be used for transfering tree structure of folders + * to list structure of visible items - inline class + */ +class TArrayFolderItem + { +private: + TMsvId iId; // folder id + TMsvId iParent; // parent folder or mailbox id for root + TInt iIndentLevel; // level of indentation +public: + TArrayFolderItem ( TMsvId aId, TInt32 aParent, TInt32 aIndentLevel ); + ~TArrayFolderItem(); + TMsvId Id( void ); + TInt32 Parent( void ); + TInt32 IndentLevel( void ); + }; // TArrayFolderItem + +// CIpsSetUiFolderListArray does not have inline definitions +#include "ipssetuifolderlistarray.inl" + class CMsvEntry; /** * Array class to be used by CIpsSetUiSubscriptionDialog @@ -138,6 +159,14 @@ */ TBool DoContextHasChildFoldersL( TMsvId aId ) const; + /** + * RefreshFolderListArrayL - for recursive filling in the iArrayBuf + * @param aIdFolder, id of folder to be checked for children + * @param aArrayIndex, id of the array index to be written to + * @param aIndentLevel, indent level for new item - increases with recursion + * @return void + */ + void RefreshFolderListArrayL( TMsvId aIdFolder, TInt & aArrayIndex, TInt aIndentLevel ); private: // data @@ -168,8 +197,14 @@ * Number of items. */ TInt iCount; + + /** + * transform tree to list buffer + */ + RPointerArray iArrayBuf; + }; #endif -// End of File \ No newline at end of file +// End of File diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssossettings/inc/ipssetuifolderlistarray.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ipsservices/ipssossettings/inc/ipssetuifolderlistarray.inl Wed Apr 14 15:42:15 2010 +0300 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: class TArrayFolderItem inline functions +* +*/ + + +inline TArrayFolderItem::TArrayFolderItem ( + TMsvId aId, TInt32 aParent, TInt32 aIndentLevel ) : + iId( aId ), iParent( aParent ), iIndentLevel( aIndentLevel ) + { + FUNC_LOG; + }; + +inline TArrayFolderItem::~TArrayFolderItem() + { + FUNC_LOG; + }; + +inline TMsvId TArrayFolderItem::Id( void ) + { + return iId; + }; + +inline TInt32 TArrayFolderItem::Parent( void ) + { + return iParent; + }; + +inline TInt32 TArrayFolderItem::IndentLevel( void ) + { + return iIndentLevel; + }; diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssossettings/src/ipssetuifolderlistarray.cpp --- a/ipsservices/ipssossettings/src/ipssetuifolderlistarray.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/ipsservices/ipssossettings/src/ipssetuifolderlistarray.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -27,6 +27,11 @@ #include "ipssetuifolderlistarray.h" +// how the indentation is done +_LIT( KIndentString, ".." ); +const TInt KIndentStringLength = 2; // KIndentString().Length(); +#define KMaxIndentLevel 3 + // ---------------------------------------------------------------------------- // CIpsSetUiFolderListArray::NewL // ---------------------------------------------------------------------------- @@ -51,6 +56,7 @@ CIpsSetUiFolderListArray::~CIpsSetUiFolderListArray() { FUNC_LOG; + iArrayBuf.ResetAndDestroy(); delete iText; delete iEntry; } @@ -83,18 +89,50 @@ // ---------------------------------------------------------------------------- // CIpsSetUiFolderListArray::MdcaPoint +// list item contains: icon_index separator item_text // ---------------------------------------------------------------------------- // TPtrC CIpsSetUiFolderListArray::MdcaPoint( TInt aIndex ) const { FUNC_LOG; - const TMsvEmailEntry emailEntry( (*iEntry)[aIndex] ); - + // const TMsvEmailEntry emailEntry( (*iEntry)[aIndex] ); + +// firstly switch to correct directory to search for folders + TMsvId origFolder = iEntry->EntryId(); + TArrayFolderItem * const pArrayItem = iArrayBuf[aIndex]; // not owning + TMsvId targetFolder = pArrayItem->Parent(); + // if item has subitem it follows immediately + TBool itemHasChildFolders( ( aIndex < (iCount - 1) ) + && (iArrayBuf[aIndex+1]->Parent() == pArrayItem->Id() ) ); +// return value init TPtr tempText = iText->Des(); tempText.Zero(); + TInt result( KErrNone ); + if ( origFolder != targetFolder ) + { + TRAP( result, iEntry->SetEntryL( targetFolder ) ); + } + TMsvEmailEntry emailEntry; + if ( KErrNone == result ) + { + TRAP( result, emailEntry = iEntry->ChildDataL( pArrayItem->Id() ) ); + } + + if ( KErrNone != result ) + { // Handle error. + // item index dir or item + tempText.AppendNum( ( itemHasChildFolders + ? EIpsSetUiFolderSubfoldersUnsubbed + : EIpsSetUiFolderSingleUnsubbed ) ); + tempText.Append( KColumnListSeparator ); + // but name can't be find + return tempText; + } +// const TMsvEmailEntry emailEntry( curentEntry ); + TInt iconIndex = 0; - if ( ContextHasChildFolders( emailEntry.Id() ) ) + if ( itemHasChildFolders ) { iconIndex = ( emailEntry.LocalSubscription() ? EIpsSetUiFolderSubfoldersSubbed : EIpsSetUiFolderSubfoldersUnsubbed ); @@ -104,14 +142,27 @@ iconIndex = ( emailEntry.LocalSubscription() ? EIpsSetUiFolderSingleSubbed : EIpsSetUiFolderSingleUnsubbed ); } + tempText.AppendNum( iconIndex ); tempText.Append( KColumnListSeparator ); - tempText.Append( - emailEntry.iDetails.Left( KIpsSetUiMaxSettingsTextLength ) ); + // add indentation text of subfolders 2,4 or 6 dots + TInt i = ( ( pArrayItem->IndentLevel() >= KMaxIndentLevel ) + ? KMaxIndentLevel : pArrayItem->IndentLevel() ); + TInt siz ( KIpsSetUiMaxSettingsTextLength - i * KIndentStringLength ); + for ( ; i > 0; i-- ) + { + tempText.Append(KIndentString); + } + + // add item text + tempText.Append( emailEntry.iDetails.Left( siz ) ); + return tempText; + } + // ---------------------------------------------------------------------------- // CIpsSetUiFolderListArray::MdcaCount // ---------------------------------------------------------------------------- @@ -129,7 +180,8 @@ TMsvId CIpsSetUiFolderListArray::Id( TInt aIndex ) { FUNC_LOG; - return (*iEntry)[aIndex].Id(); +// return (*iEntry)[aIndex].Id(); + return iArrayBuf[aIndex]->Id(); } // ---------------------------------------------------------------------------- @@ -140,12 +192,6 @@ { FUNC_LOG; iEntry->SetEntryL( aFolderId ); - - CMsvEntrySelection* sel = iEntry->ChildrenWithTypeL( KUidMsvFolderEntry ); - iCount = sel->Count(); - delete sel; - sel = NULL; - } // ---------------------------------------------------------------------------- @@ -185,20 +231,9 @@ KMsvGroupByType, EMsvSortByDetails, ETrue ); CMsvEntry* entry = CMsvEntry::NewL(iSession, aId, selectionOrdering); CleanupStack::PushL( entry ); - TInt index=entry->Count()-1; - while (index>=0 && (*entry)[index].iType!=KUidMsvFolderEntry) - { - index--; - } - + TBool retval ( ( entry->Count() > 0 ) && ( KUidMsvFolderEntry == (*entry)[0].iType ) ); CleanupStack::PopAndDestroy( entry ); - - if(index!=-1) - { - return ETrue; - } - - return EFalse; + return retval; } // ---------------------------------------------------------------------------- @@ -239,7 +274,6 @@ } } - CleanupStack::Pop( sel ); return sel; } @@ -254,10 +288,12 @@ return ( iEntry->Count() > 0 ? ETrue : EFalse ); } + // ---------------------------------------------------------------------------- // CIpsSetUiFolderListArray::RefreshFolderListArrayL +// original function // ---------------------------------------------------------------------------- -// + void CIpsSetUiFolderListArray::RefreshFolderListArrayL() { FUNC_LOG; @@ -266,7 +302,8 @@ delete iEntry; iEntry = NULL; } - + iCount = 0; + iEntry = iSession.GetEntryL( iMailboxId ); const TMsvSelectionOrdering originalOrdering=iEntry->SortType(); TMsvSelectionOrdering newOrdering=originalOrdering; @@ -275,10 +312,59 @@ newOrdering.SetSorting( EMsvSortByDetails ); iEntry->SetSortTypeL(newOrdering); + // code to fill in internal array + TInt arrayIndex(0); + TInt size = iArrayBuf.Count(); + iArrayBuf.ResetAndDestroy(); + if ( size > 8 ) + { + iArrayBuf.ReserveL(size); + } + RefreshFolderListArrayL(iMailboxId, arrayIndex, 0); + iArrayBuf.Compress(); + iCount = iArrayBuf.Count(); + + } + +// ---------------------------------------------------------------------------- +// CIpsSetUiFolderListArray::RefreshFolderListArrayL( +// TMsvId aIdFolder, TInt & aArrayIndex, TInt aIndentLevel) +// recursion function to fill in / refresh iArrayBuf. +// ---------------------------------------------------------------------------- +void CIpsSetUiFolderListArray::RefreshFolderListArrayL( + TMsvId aIdFolder, TInt & aArrayIndex, TInt aIndentLevel) + { + TMsvId origFolder = iEntry->EntryId(); + if ( origFolder != aIdFolder ) + iEntry->SetEntryL( aIdFolder ); CMsvEntrySelection* sel = iEntry->ChildrenWithTypeL( KUidMsvFolderEntry ); - iCount = sel->Count(); - delete sel; - sel = NULL; + CleanupStack::PushL( sel ); + TInt count = sel->Count(); + for (TInt i = 0; i < count; i++) + { + const TMsvEmailEntry emailEntry( (*iEntry)[i] ); + TArrayFolderItem * item = new (ELeave) TArrayFolderItem( emailEntry.Id(), aIdFolder, aIndentLevel ); + CleanupStack::PushL( item ); + if ( iArrayBuf.Count() > aArrayIndex + 1 ) + { + if ( iArrayBuf[aArrayIndex] ) + { + delete iArrayBuf[aArrayIndex]; + } + iArrayBuf[aArrayIndex] = item; + } + else + { + iArrayBuf.AppendL( item ); + } +// iArrayBuf.Insert( item, aArrayIndex ); + aArrayIndex++; + CleanupStack::Pop( item ); + // recursion is here + RefreshFolderListArrayL(emailEntry.Id(), aArrayIndex, aIndentLevel + 1 ); + } + CleanupStack::PopAndDestroy( sel ); + iEntry->SetEntryL( origFolder ); } // End of File diff -r 4ce476e64c59 -r 8592a65ad3fb ipsservices/ipssossettings/src/ipssetuifoldersubscription.cpp --- a/ipsservices/ipssossettings/src/ipssetuifoldersubscription.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/ipsservices/ipssossettings/src/ipssetuifoldersubscription.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -179,21 +179,7 @@ void CIpsSetUiSubscriptionDialog::PreLayoutDynInitL() { FUNC_LOG; - // - - /*TBool refreshed = EFalse; - CAknQueryDialog* confDialog = CAknQueryDialog::NewL(); - if( confDialog->ExecuteLD( R_IPS_SET_CONNECT_FOR_UPDATE ) ) - { - refreshed = ETrue; - CreateOperationL( EIpsSetUiRefreshFolderList ); - } - - if( refreshed ) - { - iFolderListArray->RefreshFolderListArrayL(); - }*/ - // + CEikColumnListBox* listBox = static_cast< CEikColumnListBox* >( Control( EIpsSetUiIdFolderListBox ) ); @@ -261,7 +247,12 @@ { FUNC_LOG; TMsvId folderId = CurrentFolder(); - if ( folderId == KErrNotFound ) + TInt flags = static_cast( + Control( EIpsSetUiIdFolderListBox ) )->ItemDrawer()->Flags(); + TBool bSelectionVisible( (flags & CListItemDrawer::EPaintedSelection ) + && !( flags & CListItemDrawer::EDisableHighlight ) ); + + if ( folderId == KErrNotFound || !bSelectionVisible ) { if ( aResourceId == R_IPS_SET_SETTINGS_SUBSCRIBE_MENUPANE ) { @@ -325,19 +316,13 @@ // ---------------------------------------------------------------------------- // void CIpsSetUiSubscriptionDialog::HandleSessionEventL(TMsvSessionEvent aEvent, - TAny* aArg1, TAny* /*aArg2*/, TAny* /*aArg3*/) + TAny* /*aArg1*/, TAny* /*aArg2*/, TAny* /*aArg3*/) { FUNC_LOG; if(aEvent!=EMsvEntriesChanged) return; - - CMsvEntrySelection& sel=*static_cast(aArg1); - if(sel.Find(CurrentFolder())!=KErrNotFound) - { - CEikColumnListBox* listBox = static_cast( - Control(EIpsSetUiIdFolderListBox)); - listBox->DrawNow(); - } + static_cast( + Control(EIpsSetUiIdFolderListBox))->DrawDeferred(); } // ---------------------------------------------------------------------------- @@ -368,27 +353,9 @@ break; case EIpsSetUiFolderOpenFolder: - // open folder which has subfolders... + // open folder which has subfolders.- no need to change the list now iContextEntry->SetEntryL( CurrentFolder() ); - if ( ContextHasChildFolders() ) - { - iOpenedFolderId = CurrentFolder(); - iFolderListArray->ChangEIpsSetUiFolderL( CurrentFolder() ); - if ( listBox->Model()->NumberOfItems() ) - { - listBox->SetTopItemIndex( 0 ); - listBox->SetCurrentItemIndex( 0 ); - } - if ( oldCount > listBox->Model()->NumberOfItems() ) - { - listBox->HandleItemRemovalL(); - } - else - { - listBox->HandleItemAdditionL(); - } - } - break; + break; case EIpsSetUiRefreshFolderList: // Always after successfull update go to root view, @@ -497,13 +464,7 @@ Control( EIpsSetUiIdFolderListBox ) ); iContextEntry->SetEntryL( CurrentFolder() ); - if ( listBox->Model()->NumberOfItems() && - ContextHasChildFolders() ) - { - //if has childs, open folder - OkToExitL( EIpsSetUiFolderOpenFolder ); - } - else + if ( listBox->Model()->NumberOfItems() ) { //if not, change subs state of the folder const TMsvEmailEntry emailEntry( iContextEntry->Entry() ); @@ -1077,7 +1038,6 @@ TInt CIpsSetUiSubscriptionDialog::GetResourceForMiddlekey() { FUNC_LOG; -//#ifdef MSK TInt resource = KErrNotFound; switch( CheckMSKState() ) @@ -1097,11 +1057,6 @@ } return resource; -/* -#else - return KErrNotFound; -#endif -*/ } // diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/inc/cmrlistpane.h --- a/meetingrequest/mrgui/inc/cmrlistpane.h Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/inc/cmrlistpane.h Wed Apr 14 15:42:15 2010 +0300 @@ -21,6 +21,8 @@ // INCLUDES #include #include +#include + #include "mmrphysicsobserver.h" #include "mmrfieldcontainerobserver.h" @@ -33,6 +35,7 @@ class MMRScrollBarObserver; class CESMRField; class MESMRCalEntry; +class MTouchFeedback; // CLASS DECLARATIONS NONSHARABLE_CLASS( CMRListPane ) : @@ -159,6 +162,7 @@ private: // From MMRPhysicsObserver void PhysicsEmulationEnded(); + void UpdateScrollBarDuringOngoingPhysics(); private: // From MAknLongTapDetectorCallBack void HandleLongTapEventL( @@ -178,6 +182,8 @@ void UpdateClickedField( const TPointerEvent &aPointerEvent ); TBool HiddenFocus(); void ForwardReceivedPointerEventsToChildrenL(); + void HandleTactileFeedback( const TTouchLogicalFeedback& aType ); + TBool FeedbackScrollMarginExceeded( TInt aMargin ); private: // Data /// Ref: Storage for list items. @@ -204,6 +210,12 @@ /// Own: Record if the long tapping event have been comsumed, if yes, /// then do not handle signal pointer event anymore. TBool iLongTapEventConsumed; + /// Ref: Reference to tactile feedback + MTouchFeedback* iTactileFeedback; + /// Own: This records vertical scroll index for tactile feedback + TInt iPreviousVerticalScrollIndex; + /// Own: This records default field height for tactile feedback during scroll + TInt iDefaultFieldHeight; }; #endif // CMRLISTPANE_H diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/inc/mmrphysicsobserver.h --- a/meetingrequest/mrgui/inc/mmrphysicsobserver.h Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/inc/mmrphysicsobserver.h Wed Apr 14 15:42:15 2010 +0300 @@ -37,6 +37,12 @@ * scroll bar and focus. */ virtual void PhysicsEmulationEnded() = 0; + + /** + * Method to be called when physics wants to notify scroll bar that + * view position has changed, so that scroll bar can update itself + */ + virtual void UpdateScrollBarDuringOngoingPhysics() = 0; }; #endif // MMRPHYSICSOBSERVER_H diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp --- a/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuildercommon/src/cesmrrichtextviewer.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description : CEikRichTextEditor based Rich Text viewer -* Version : %version: e002sa32#36 % +* Version : %version: e002sa32#37 % * */ @@ -348,6 +348,7 @@ { if ( link != GetSelectedLink() ) { + iCntMenuHdlr->Reset(); iCntMenuHdlr->SetContactMenuObserver( this ); HighlightLinkL( *link ); DrawDeferred(); diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmralarmfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmralarmfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmralarmfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -425,10 +425,10 @@ if(aCommand == EESMRCmdOpenAlarmQuery || aCommand == EAknCmdOpen ) { + HandleTactileFeedbackL(); + ExecuteMSKCommandL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrcheckbox.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrcheckbox.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrcheckbox.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -124,12 +124,12 @@ // EAknCmdOpen is added for the Pointer events, see ListPane if( aCommand == EESMRCmdCheckEvent || aCommand == EAknCmdOpen ) { + HandleTactileFeedbackL(); + HandleCheckEventL(); SwitchMSKLabelL(); SendFieldChangeEventL( EESMRFieldAllDayEvent ); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrlocationfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -12,7 +12,7 @@ * Contributors: * * Description : ESMR location field implementation - * Version : %version: e002sa33#52 % + * Version : %version: e002sa32#53 % * */ @@ -648,8 +648,8 @@ if( iTitle->Rect().Contains( aPosition ) || iFieldButton->Rect().Contains( aPosition ) ) { + HandleTactileFeedbackL(); NotifyEventL( EAknSoftkeyContextOptions ); - HandleTactileFeedbackL(); ret = ETrue; } @@ -729,8 +729,8 @@ if( iTitle->Rect().Contains( aPosition ) || iFieldButton->Rect().Contains( aPosition ) ) { + HandleTactileFeedbackL(); NotifyEventL( EAknSoftkeyContextOptions ); - HandleTactileFeedbackL(); } } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrpriorityfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrpriorityfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrpriorityfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -264,10 +264,10 @@ if( aCommand == EESMRCmdOpenPriorityQuery || aCommand == EAknCmdOpen ) { + HandleTactileFeedbackL(); + ExecutePriorityQueryL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrrecurencefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrrecurencefield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrrecurencefield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -195,10 +195,10 @@ if (aCommand == EESMRCmdOpenRecurrenceQuery || aCommand == EAknCmdOpen ) { + HandleTactileFeedbackL(); + ExecuteRecurrenceQueryL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsyncfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsyncfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrsyncfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -176,10 +176,10 @@ if(aCommand == EESMRCmdOpenSyncQuery || aCommand == EAknCmdOpen ) { + HandleTactileFeedbackL(); + ExecuteSyncQueryL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -134,7 +134,7 @@ CMRImage::NewL( NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); iWaypointIcon->SetParent( this ); } - } + } } // --------------------------------------------------------------------------- @@ -393,7 +393,7 @@ // Move focus rect so that it's relative to field's position. bgRect.Move( -Position() ); SetFocusRect( bgRect ); - + // Failures are ignored. TRAP_IGNORE( // Try setting font @@ -428,11 +428,6 @@ { HandleTapEventL( aPosition ); } - else - { - // Reset action menu after link selection - iRichTextViewer->ResetActionMenuL(); - } } // --------------------------------------------------------------------------- @@ -479,7 +474,7 @@ { return; } - + CESMRField::LockL(); delete iWaypointIcon; @@ -487,7 +482,7 @@ iWaypointIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); iWaypointIcon->SetParent( this ); - iWaypointIcon->SetObserver( this ); + iWaypointIcon->SetObserver( this ); } // --------------------------------------------------------------------------- @@ -524,7 +519,8 @@ // Clear viewer selection iRichTextViewer->ClearSelectionL(); iRichTextViewer->DrawDeferred(); - + iRichTextViewer->ResetActionMenuL(); + // Show context menu HandleTactileFeedbackL(); NotifyEventL( EAknSoftkeyContextOptions ); diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cmralarmonofffield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmralarmonofffield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmralarmonofffield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -237,11 +237,11 @@ // EAknCmdOpen is added for the Pointer events, see ListPane if( aCommand == EESMRCmdAlarmOn || aCommand == EESMRCmdAlarmOff || aCommand == EAknCmdOpen ) - { + { + HandleTactileFeedbackL(); + SwitchMiddleSoftKeyL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } return isUsed; } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -491,10 +491,6 @@ else if ( aCommand == EESMREditorAddAttachment ) { handled = AddAttachmentL(); - if( handled ) - { - HandleTactileFeedbackL(); - } } else if ( IsValidAttachmentEditorCommand(aCommand) && @@ -851,11 +847,9 @@ { if( Rect().Contains( aPosition ) ) { + HandleTactileFeedbackL(); + ret = AddAttachmentL(); - if( ret ) - { - HandleTactileFeedbackL(); - } } } // Otherwise only the title and the fieldIcon will @@ -865,11 +859,9 @@ if( iTitle->Rect().Contains( aPosition ) || iFieldIcon->Rect().Contains( aPosition ) ) { - ret = AddAttachmentL(); - if( ret ) - { - HandleTactileFeedbackL(); - } + HandleTactileFeedbackL(); + + ret = AddAttachmentL(); } } @@ -888,29 +880,20 @@ { if( Rect().Contains( aPosition ) ) { - if( AddAttachmentL() ) - { - HandleTactileFeedbackL(); - } + AddAttachmentL(); } } else { if ( iRichTextViewer->Rect().Contains( aPosition ) ) { - if( iRichTextViewer->LinkSelectedL() ) - { - HandleTactileFeedbackL(); - } + iRichTextViewer->LinkSelectedL(); } if( iTitle->Rect().Contains( aPosition ) || iFieldIcon->Rect().Contains( aPosition ) ) { - if( AddAttachmentL() ) - { - HandleTactileFeedbackL(); - } + AddAttachmentL(); } } } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrmulticalenfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -152,10 +152,10 @@ else if( iTypeChangeEnabled ) { + HandleTactileFeedbackL(); + ExecuteTypeQueryL(); isUsed = ETrue; - - HandleTactileFeedbackL(); } } @@ -355,7 +355,19 @@ // Move focus rect so that it's relative to field's position. viewerRect.Move( -Position() ); - SetFocusRect( viewerRect ); + + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + rect, NMRLayoutManager::EMRLayoutTextEditorBg ); + TRect bgRect( bgLayoutRect.Rect() ); + + // Adjust background rect according to viewerRect + bgRect.SetWidth( viewerRect.Width() ); + + // Move focus rect so that it's relative to field's position. + bgRect.Move( -Position() ); + + SetFocusRect( bgRect ); } // --------------------------------------------------------------------------- diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrunifiededitorfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -410,7 +410,20 @@ // Move focus rect so that it's relative to field's position. viewerRect.Move( -Position() ); - SetFocusRect( viewerRect ); + + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + rect, NMRLayoutManager::EMRLayoutTextEditorBg ); + TRect bgRect( bgLayoutRect.Rect() ); + + // Adjust background rect according to viewerRect + bgRect.SetWidth( viewerRect.Width() ); + + // Move focus rect so that it's relative to field's position. + bgRect.Move( -Position() ); + + SetFocusRect( bgRect ); + TAknTextComponentLayout editorLayout( NMRLayoutManager::GetTextComponentLayout( diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -776,10 +776,7 @@ if ( iRichTextViewer->Rect().Contains( aPosition ) ) { - if( iRichTextViewer->LinkSelectedL() ) - { - HandleTactileFeedbackL(); - } + iRichTextViewer->LinkSelectedL(); } } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrattendeefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrattendeefield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrattendeefield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -1077,10 +1077,10 @@ if( iTitle->Rect().Contains( aPosition ) || iFieldButton->Rect().Contains( aPosition ) ) { + HandleTactileFeedbackL(); + iContactHandler->GetAddressesFromPhonebookL( this ); ret = ETrue; - - HandleTactileFeedbackL(); } return ret; @@ -1098,7 +1098,6 @@ iFieldButton->Rect().Contains( aPosition ) ) { NotifyEventL( EAknSoftkeyContextOptions ); - HandleTactileFeedbackL(); } } diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrresponsefield.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -592,6 +592,7 @@ if ( Rect().Contains( aPosition ) ) { + HandleTactileFeedbackL(); if ( iConflicted ) { TRect conflictItemRect = iResponseItemArray[KConflictItemIndex]->Rect(); diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/src/cmrlistpane.cpp --- a/meetingrequest/mrgui/src/cmrlistpane.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/src/cmrlistpane.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -21,9 +21,11 @@ #include "cesmrfield.h" #include "cmrfieldcontainer.h" #include "cmrlistpanephysics.h" +#include "nmrlayoutmanager.h" #include #include +#include //DEBUG #include "emailtrace.h" @@ -54,7 +56,6 @@ return index; } - } //----- MEMBER FUNCTIONS ---- @@ -600,9 +601,12 @@ if( !iPhysicsActionOngoing ) { - // Offer pointer event to long tap detector - iLongtapDetector->PointerEventL( aPointerEvent ); - + // Offer pointer event to long tap detector if event occures within fields + if( iFieldContainer->Rect().Contains( aPointerEvent.iPosition ) ) + { + iLongtapDetector->PointerEventL( aPointerEvent ); + } + SetFocusAfterPointerEventL( aPointerEvent ); // If longtap event has been handled, then do not handle signal event anymore. @@ -650,6 +654,55 @@ } // --------------------------------------------------------------------------- +// CMRListPane::UpdateScrollBarDuringOngoingPhysics +// --------------------------------------------------------------------------- +// +void CMRListPane::UpdateScrollBarDuringOngoingPhysics() + { + FUNC_LOG; + TInt verticalScrollIndex( iPhysics->VerticalScrollIndex() ); + iScrollModel.SetFocusPosition( verticalScrollIndex ); + + iScroll.SetModel( &iScrollModel ); + + // Update the new thumb position to view's + // iScrollBarThumbPosition member. + iScrollBarObserver.ScrollBarPositionChanged( + iScroll.ThumbPosition() ); + + iScroll.DrawDeferred(); + + if( FeedbackScrollMarginExceeded( + Abs( verticalScrollIndex - iPreviousVerticalScrollIndex ) ) ) + { + HandleTactileFeedback( ETouchFeedbackSlider ); + + iPreviousVerticalScrollIndex = verticalScrollIndex; + } + } + +// --------------------------------------------------------------------------- +// CESMRField::HandleTactileFeedback +// --------------------------------------------------------------------------- +// +void CMRListPane::HandleTactileFeedback( + const TTouchLogicalFeedback& aType ) + { + FUNC_LOG; + + if( !iTactileFeedback ) + { + // Aquire tactile feedback pointer from TLS + iTactileFeedback = MTouchFeedback::Instance(); + } + + if ( iTactileFeedback && iTactileFeedback->FeedbackEnabledForThisApp() ) + { + iTactileFeedback->InstantFeedback( aType ); + } + } + +// --------------------------------------------------------------------------- // CMRListPane::SetFocusAfterPointerEventL // --------------------------------------------------------------------------- // @@ -742,4 +795,34 @@ return hiddenFocus; } +// --------------------------------------------------------------------------- +// CMRListPane::FeedbackScrollMarginExceeded +// --------------------------------------------------------------------------- +// +TBool CMRListPane::FeedbackScrollMarginExceeded( TInt aMargin ) + { + /* + * This compares given margin to default one row + * field height, and returns ETrue if margin is exceeded. + * Otherwise EFalse. + */ + TBool ret( EFalse ); + + if( !iDefaultFieldHeight ) + { + TAknLayoutRect fieldLayoutRect( + NMRLayoutManager::GetFieldLayoutRect( + iFieldContainer->Rect(), 1 ) ); + + iDefaultFieldHeight = fieldLayoutRect.Rect().Height(); + } + + if( aMargin > iDefaultFieldHeight ) + { + ret = ETrue; + } + + return ret; + } + // End of file diff -r 4ce476e64c59 -r 8592a65ad3fb meetingrequest/mrgui/src/cmrlistpanephysics.cpp --- a/meetingrequest/mrgui/src/cmrlistpanephysics.cpp Wed Mar 31 21:08:33 2010 +0300 +++ b/meetingrequest/mrgui/src/cmrlistpanephysics.cpp Wed Apr 14 15:42:15 2010 +0300 @@ -242,7 +242,10 @@ if ( aDrawNow ) { iParent.DrawDeferred(); - } + } + + // Vertical scroll index has changed, we need to update scroll bar also + iPhysicsObserver.UpdateScrollBarDuringOngoingPhysics(); } // ---------------------------------------------------------------------------