# HG changeset patch # User hgs # Date 1287468016 -19800 # Node ID 60a8a215b0ec304e707e72543c8ed626c7b9ce4d # Parent ecf6a73a9186e75ad6562aea449659c704de13f8 201041 diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapprotocolcontroller/inc/cimapprotocolcontroller.h --- a/email/imap4mtm/imapprotocolcontroller/inc/cimapprotocolcontroller.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapprotocolcontroller/inc/cimapprotocolcontroller.h Tue Oct 19 11:30:16 2010 +0530 @@ -124,6 +124,7 @@ void MobilityError(TUint aError); const TDesC8& MobilityProgress(); + inline void SetSilentConnection(TBool aIsSilent); private: CImapProtocolController(CMsvServerEntry& aEntry,CImapOfflineControl& aImapOfflineControl); @@ -262,6 +263,13 @@ TBool iCancelInProgress; TImapPcMigrateState iMigrateState; TImap4ProgressBuf iProgressBuffer; + TBool iIsSilent; }; - + + +inline void CImapProtocolController::SetSilentConnection(TBool aIsSilent) + { + iIsSilent = aIsSilent; + } + #endif //__CIMAPPROTOCOLCONTROLLER_H__ diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapprotocolcontroller/src/cimapprotocolcontroller.cpp --- a/email/imap4mtm/imapprotocolcontroller/src/cimapprotocolcontroller.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapprotocolcontroller/src/cimapprotocolcontroller.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -197,6 +197,7 @@ iImapSessionArray.AppendL(imapSession); // Request the session manager to connect the session + iImapSessionManager->SetSilentConnection(iIsSilent); iImapSessionManager->GetSessionL(iStatus, iImapSessionArray[0]); iForegroundSession = 0; diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapservermtm/src/cimap4servermtm.cpp --- a/email/imap4mtm/imapservermtm/src/cimap4servermtm.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapservermtm/src/cimap4servermtm.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -641,10 +641,19 @@ } case KIMAP4MTMConnect: + case KIMAP4MTMSilentConnect: { __LOG_TEXT(KDefaultLog, " - KIMAP4MTMConnect"); - // Completes with KErrServerBusy if already connected, otherwise - // establishes a connected IMAP session. + if(aCommand==KIMAP4MTMSilentConnect) + { + iImapProtocolController->SetSilentConnection(ETrue); + } + else + { + iImapProtocolController->SetSilentConnection(EFalse); + } + // Completes with KErrServerBusy if already connected, otherwise + // establishes a connected IMAP session. if (iImapProtocolController->Connected()) { Queue(aStatus); @@ -665,8 +674,17 @@ } case KIMAP4MTMConnectAndSynchronise: + case KIMAP4MTMSilentConnectAndSynchronise: { __LOG_TEXT(KDefaultLog, " - KIMAP4MTMConnectAndSynchronise"); + if(aCommand==KIMAP4MTMSilentConnectAndSynchronise) + { + iImapProtocolController->SetSilentConnection(ETrue); + } + else + { + iImapProtocolController->SetSilentConnection(EFalse); + } // Completes with KErrServerBusy if already connected, otherwise // establishes a connected IMAP session. diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapservermtm/src/cimapupsresponsewaiter.cpp --- a/email/imap4mtm/imapservermtm/src/cimapupsresponsewaiter.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapservermtm/src/cimapupsresponsewaiter.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -67,11 +67,11 @@ { __ASSERT_DEBUG(iState==EIMAP4MTMDisConnected, User::Invariant()); - if(aCommand == KIMAP4MTMConnect) + if(aCommand == KIMAP4MTMConnect || aCommand == KIMAP4MTMSilentConnect) { iState = EIMAP4MTMConnect; } - else if(aCommand == KIMAP4MTMConnectAndSynchronise) + else if(aCommand == KIMAP4MTMConnectAndSynchronise || aCommand == KIMAP4MTMSilentConnectAndSynchronise) { iState = EIMAP4MTMConnectAndSynchronise; } diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapsession/inc/cimapsessionmanager.h --- a/email/imap4mtm/imapsession/inc/cimapsessionmanager.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapsession/inc/cimapsessionmanager.h Tue Oct 19 11:30:16 2010 +0530 @@ -86,7 +86,9 @@ IMPORT_C TInt GetAccessPointIdForConnection(TUint32& aAccessPointId) const; // Close the current network connection IMPORT_C void CloseNetworkConnection(); - + // Set whether silent connection is required or not + inline void SetSilentConnection(TBool aIsSilent); + private: // Construction routines CImapSessionManager(CImapSettings& aImapSettings, CImapMailStore& aImapMailStore); @@ -236,9 +238,20 @@ // Flag to indicate if there was an error while upgrading the socket to SSL/TLS. TBool iErrorUpgradingSSLSocket; + //Silent Connection + TBool iIsSilent; #if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT) CImapAuthMechanismHelper::TImapAuthProfileFlag iCurrentAuthProfile; #endif }; +/** +Sets whether silent connection is required or not. If ETrue, Connection is established +without prompting the user. +*/ +inline void CImapSessionManager::SetSilentConnection(TBool aIsSilent) + { + iIsSilent = aIsSilent; + } + #endif // __CIMAPSESSIONMANAGER_H__ diff -r ecf6a73a9186 -r 60a8a215b0ec email/imap4mtm/imapsession/src/cimapsessionmanager.cpp --- a/email/imap4mtm/imapsession/src/cimapsessionmanager.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/imap4mtm/imapsession/src/cimapsessionmanager.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -1024,7 +1024,7 @@ { iImConnect = CImConnect::NewL(iImapSettings.IAPPreferences(), iSocketServ); } - + iImConnect->SetSilentConnection(iIsSilent); iImConnect->StartL(iStatus); iState = EStateCreatingNetworkConnection; SetActive(); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/group/bld.inf --- a/email/pop3andsmtpmtm/clientmtms/group/bld.inf Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/group/bld.inf Tue Oct 19 11:30:16 2010 +0530 @@ -18,7 +18,7 @@ PRJ_EXPORTS ../inc/MIUTHDR.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(miuthdr.h) -../inc/MIUTHDR.INL SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(miuthdr.inl) +../inc/MIUTHDR.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(miuthdr.inl) ../inc/MIUTSET.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(miutset.h) ../inc/MIUTPARS.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(miutpars.h) ../inc/POP3SET.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(pop3set.h) diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/CACHEMAN.H --- a/email/pop3andsmtpmtm/clientmtms/inc/CACHEMAN.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/CACHEMAN.H Tue Oct 19 11:30:16 2010 +0530 @@ -21,7 +21,6 @@ #if !defined (__CACHEMAN_H__) #define __CACHEMAN_H__ -#include #include #include #ifndef SYMBIAN_ENABLE_SPLIT_HEADERS diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/CONSYNC.H --- a/email/pop3andsmtpmtm/clientmtms/inc/CONSYNC.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/CONSYNC.H Tue Oct 19 11:30:16 2010 +0530 @@ -174,6 +174,7 @@ TInt aPriority, TRequestStatus& aStatus, TImapConnectionCompletionState aCompletionState, + TInt aFunctionId, MMsvImapConnectionObserver* aConnectionObserver=NULL ); @@ -205,7 +206,7 @@ TImapConnectionCompletionState aCompletionState, MMsvImapConnectionObserver* aConnectionObserver ); - void ConstructL(const CMsvEntrySelection& aSelection); + void ConstructL(const CMsvEntrySelection& aSelection, TInt aFunctionId); void Completed(TInt aError); TInt GetServiceProgress(); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/IMAPCMDS.H --- a/email/pop3andsmtpmtm/clientmtms/inc/IMAPCMDS.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/IMAPCMDS.H Tue Oct 19 11:30:16 2010 +0530 @@ -48,6 +48,7 @@ - Connect and logon to remote server: - #KIMAP4MTMConnect - #KIMAP4MTMDisconnect + - #KIMAP4MTMSilentConnect - Synchronise headers: - #KIMAP4MTMCancelBackgroundSynchronise - #KIMAP4MTMConnectAndSyncCompleteAfterConnect @@ -59,6 +60,8 @@ - #KIMAP4MTMInboxNewSync - #KIMAP4MTMSynchronise - #KIMAP4MTMWaitForBackground + - #KIMAP4MTMSilentConnectAndSynchronise + - #KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync - Subscribe to mailboxes: - #KIMAP4MTMLocalSubscribe - #KIMAP4MTMLocalUnsubscribe @@ -153,6 +156,8 @@ This makes a network connection and logs on the IMAP server specified in the settings for the service. + Command KIMAP4MTMSilentConnect is also available to silently connect to the network. + @c aSelection: @c aSelection[0] should contain the entry ID of the service to connect to. @@ -175,6 +180,8 @@ The call completes when the connection occurs and the synchronisation starts. See CImap4ClientMtm for a description of a background synchronisation. + Command KIMAP4MTMSilentConnectAndSynchronise is also available to silently connect to the network. + @c aSelection: @c aSelection[0] should contain the entry ID of the service to connect to. @@ -491,6 +498,9 @@ This is similar to KIMAP4MTMConnectAndSynchronise, except that the operation does not complete until synchronisation is complete. + Command KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync is also available to + silently connect to the network. + @c aSelection: @c aSelection[0] should contain the entry ID of the service to connect to. @@ -1076,7 +1086,72 @@ The operation object returned is a CImEmailOperation. Final progress information from this contains the ID of the newly created message. */ - KIMAP4MTMCreateReceiptEmailMessage + KIMAP4MTMCreateReceiptEmailMessage, + + /** Connects to the specified IMAP service. + + This makes a network connection and logs on the IMAP server specified + in the settings for the service. + + This differs from KIMAP4MTMConnect by connecting to the network silently, without prompting the user. + + @c aSelection: @c aSelection[0] should contain the entry ID of the service + to connect to. + + @c aParameter: packages a pointer to an implementation of the connection observer + interface, MMsvImapConnectionObserver. Callbacks are made to this interface + to notify the client of the stages of connection. + + Completion: KErrBusy if the device is already connected to the specified server. + + Example: + @code + TBuf8<1> parameter; + iOperation = iClientMtm->InvokeAsyncFunctionL(KIMAP4MTMSilentConnect, *iServiceSelection, parameter, iStatus); + @endcode + */ + KIMAP4MTMSilentConnect, + + /** Connects to the specified IMAP service, and starts a background synchronisation. + + The call completes when the connection occurs and the synchronisation starts. See + CImap4ClientMtm for a description of a background synchronisation. + + This differs from KIMAP4MTMConnectAndSynchronise by connecting to the network silently, without prompting the user. + + @c aSelection: @c aSelection[0] should contain the entry ID of the service + to connect to. + + @c aParameter: packages a pointer to an implementation of the connection observer + interface, MMsvImapConnectionObserver. Callbacks are made to this interface + to notify the client of the stages of connection and synchronisation. + + Completion: KErrBusy if the device is already connected to the specified server. + + Example: + @code + TPckg parameter(this); + iOperation = iClientMtm->InvokeAsyncFunctionL(KIMAP4MTMSilentConnectAndSynchronise, *iServiceSelection, parameter, iStatus); + @endcode + */ + KIMAP4MTMSilentConnectAndSynchronise, + + /** Connect and synchronise the specified service, and complete after synchronisation. + + This is similar to KIMAP4MTMConnectAndSyncCompleteAfterFullSync except that it will not + prompt the user while connecting. + + @c aSelection: @c aSelection[0] should contain the entry ID of the service + to connect to. + + @c aParameter: packages a pointer to an implementation of the connection observer + interface, MMsvImapConnectionObserver. Callbacks are made to this interface + to notify the client of the stages of connection and synchronisation. + + Completion: KErrBusy if a connected session already exists. + */ + KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync + }; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/IMPCMTM.H --- a/email/pop3andsmtpmtm/clientmtms/inc/IMPCMTM.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/IMPCMTM.H Tue Oct 19 11:30:16 2010 +0530 @@ -39,9 +39,7 @@ #include #endif -#if !defined(__OFFOP_H__) -#include -#endif + #if !defined(__MIUTMSG_H__) #include @@ -53,6 +51,20 @@ class CImap4ClientSessionObserver; class CImImap4GetMail; class CImEmailAutoSend; +class CImOffLineOperation; +class CImOperationQueueList; + +class MImUndoOffLineOperation +/** +@publishedAll +@released +*/ + { + public: + virtual void UndoOffLineChangesL(const CImOffLineOperation& aDeleted, TMsvId aFolderId) = 0; + }; + + // // Imap4 Client MTM diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/MIUTMSG.H --- a/email/pop3andsmtpmtm/clientmtms/inc/MIUTMSG.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/MIUTMSG.H Tue Oct 19 11:30:16 2010 +0530 @@ -19,7 +19,6 @@ #include #include // TMsvEntry, CMsvOperation etc -#include // CMsgActive #include // CImHeader, CImMimeHeader #include // CRichText etc #include // CImHeader, CImMimeHeader @@ -31,10 +30,6 @@ #include // RResourceFile #include #include - -#include - -//#include #include //Content-Transfer-Encoding: types @@ -90,7 +85,7 @@ #endif class CImHtmlConverter; - +class CMsgActive; class CImAttachmentManager; class CMsvMimeHeaders; class CImPlainBodyText; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/OFFOP.H --- a/email/pop3andsmtpmtm/clientmtms/inc/OFFOP.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/OFFOP.H Tue Oct 19 11:30:16 2010 +0530 @@ -27,7 +27,7 @@ #if !defined(__MSVSTORE_H__) #include #endif - +#include #include const TInt KCurrentOfflineOperationArrayVersion = 2; @@ -225,15 +225,7 @@ CArrayFixFlat *iArray; }; -class MImUndoOffLineOperation -/** -@internalTechnology -@released -*/ - { - public: - virtual void UndoOffLineChangesL(const CImOffLineOperation& aDeleted, TMsvId aFolderId) = 0; - }; + class CImOperationQueueList : public CBase /** diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/POP3CMDS.H --- a/email/pop3andsmtpmtm/clientmtms/inc/POP3CMDS.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/POP3CMDS.H Tue Oct 19 11:30:16 2010 +0530 @@ -28,7 +28,8 @@ { /** Unsupported. */ KPOP3MTMIsConnected = KMtmFirstFreeMtmFunctionId, - /** Attempt to connect to the current service. */ + /** Attempt to connect to the current service. + Command KPOP3MTMSilentConnect is also available to connect silently to network.*/ KPOP3MTMConnect, /** Disconnect from the current service. */ KPOP3MTMDisconnect, @@ -107,7 +108,9 @@ KPOP3MTMPopulateNew, /** Populates all messages from the current service, assuming a new connection does not need to be made. */ - KPOP3MTMPopulateAll + KPOP3MTMPopulateAll, + /** Attempt to connect to the current service silently without prompting the user. */ + KPOP3MTMSilentConnect }; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/SMTPCMDS.H --- a/email/pop3andsmtpmtm/clientmtms/inc/SMTPCMDS.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/SMTPCMDS.H Tue Oct 19 11:30:16 2010 +0530 @@ -39,7 +39,11 @@ If an Internet connection has already been established by another client, then this function may fail with KSmtpNoMsgsToSendWithActiveSettings if none - of the messages specified in aSelection match the IAP currently in use. */ + of the messages specified in aSelection match the IAP currently in use. + + Command KSMTPMTMSilentlySendOnNextConnection is also available to silently connect + to the network. + */ KSMTPMTMSendOnNextConnection, /** Creates a new message. */ KSMTPMTMCreateNewEmailMessage, @@ -50,7 +54,21 @@ /** Creates a new forwarded message as an attachment. */ KSMTPMTMCreateForwardAsAttachmentEmailMessage, /** Creates a new message-receipt message. */ - KSMTPMTMCreateReceiptEmailMessage + KSMTPMTMCreateReceiptEmailMessage, + + /** Send messages on next connection silently without prompting the user. + + The first entry in aSelection specifies the SMTP service entry that is to + be used to send the email messages. aSelection may contain only one entry + ID. The SMTP MTM will append the Ids of all "ready" email messages which exist + in the outbox that match the IAP of the specified SMTP service. Whether an + email message is "ready" is determined from its TMsvEntry::SendingState() + flag. + + If an Internet connection has already been established by another client, + then this function may fail with KSmtpNoMsgsToSendWithActiveSettings if none + of the messages specified in aSelection match the IAP currently in use. */ + KSMTPMTMSilentlySendOnNextConnection }; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h --- a/email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/inc/cimmessagepart.h Tue Oct 19 11:30:16 2010 +0530 @@ -23,6 +23,8 @@ #ifndef __CIMMESSAGEPART_H__ #define __CIMMESSAGEPART_H__ + +#include class CImEmailMessage; class CImMimeHeader; class CMsvMimeHeaders; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/src/CONSYNC.CPP --- a/email/pop3andsmtpmtm/clientmtms/src/CONSYNC.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/src/CONSYNC.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -39,6 +39,7 @@ CBaseMtm& aBaseMtm, TInt aPriority, TRequestStatus& aStatus, TImapConnectionCompletionState aCompletionState, + TInt aFunctionId, MMsvImapConnectionObserver* aConnectionObserver) // // @@ -46,7 +47,7 @@ { CImapConnectAndSyncOp* self=new(ELeave) CImapConnectAndSyncOp(aSession, aSelection, aBaseMtm, aPriority, aStatus, aCompletionState, aConnectionObserver); CleanupStack::PushL(self); - self->ConstructL(aSelection); + self->ConstructL(aSelection, aFunctionId); CleanupStack::Pop(); // self return self; } @@ -68,7 +69,7 @@ iMtm=KUidMsgTypeIMAP4; } -void CImapConnectAndSyncOp::ConstructL(const CMsvEntrySelection& aSelection) +void CImapConnectAndSyncOp::ConstructL(const CMsvEntrySelection& aSelection, TInt aFunctionId) // // // @@ -97,7 +98,15 @@ // Start the connection operation iSelection = aSelection.CopyL(); TBuf8<4> buf; - iOperation = iBaseMtm.InvokeAsyncFunctionL(KIMAP4MTMConnectAndSynchronise, *iSelection, buf, iStatus); + if(aFunctionId == KIMAP4MTMConnectAndSyncCompleteAfterFullSync) + { + iOperation = iBaseMtm.InvokeAsyncFunctionL(KIMAP4MTMConnectAndSynchronise, *iSelection, buf, iStatus); + } + else if(aFunctionId == KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync) + { + iOperation = iBaseMtm.InvokeAsyncFunctionL(KIMAP4MTMSilentConnectAndSynchronise, *iSelection, buf, iStatus); + } + SetActive(); iState = EConnecting; iObserverRequestStatus=KRequestPending; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/src/IMPCMTM.CPP --- a/email/pop3andsmtpmtm/clientmtms/src/IMPCMTM.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/src/IMPCMTM.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -24,7 +24,7 @@ #include #include #include - +#include #include "MIUTMSG.H" //CImEmailOperation #include "CONSYNC.H" #include @@ -583,6 +583,8 @@ { case KIMAP4MTMConnect: case KIMAP4MTMConnectAndSynchronise: + case KIMAP4MTMSilentConnect: + case KIMAP4MTMSilentConnectAndSynchronise: case KIMAP4MTMDisconnect: if (aFunctionId!=KIMAP4MTMDisconnect) { @@ -624,6 +626,7 @@ case KIMAP4MTMConnectAndSyncCompleteAfterConnect: case KIMAP4MTMConnectAndSyncCompleteAfterFullSync: case KIMAP4MTMConnectAndSyncCompleteAfterDisconnect: + case KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync: { TImapConnectionCompletionState connectAndSyncCompleteState = EAfterConnect; switch (aFunctionId) @@ -632,6 +635,7 @@ connectAndSyncCompleteState = EAfterConnect; break; case KIMAP4MTMConnectAndSyncCompleteAfterFullSync: + case KIMAP4MTMSilentConnectAndSyncCompleteAfterFullSync: connectAndSyncCompleteState = EAfterFullSync; break; case KIMAP4MTMConnectAndSyncCompleteAfterDisconnect: @@ -652,6 +656,7 @@ CActive::EPriorityStandard, aCompletionStatus, connectAndSyncCompleteState, + aFunctionId, connectionObserver); } break; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/src/MIUTMSG.CPP --- a/email/pop3andsmtpmtm/clientmtms/src/MIUTMSG.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/src/MIUTMSG.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -36,6 +36,7 @@ #include #include #include +#include // CMsgActive #include #include //Converting from UTC to local time #include diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/src/POPCMTM.CPP --- a/email/pop3andsmtpmtm/clientmtms/src/POPCMTM.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/src/POPCMTM.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -568,9 +568,10 @@ switch(aFunctionId) { case KPOP3MTMConnect: + case KPOP3MTMSilentConnect: case KPOP3MTMDisconnect: case KPOP3MTMCancelOfflineOperations: - if (aFunctionId==KPOP3MTMConnect) + if (aFunctionId==KPOP3MTMConnect || aFunctionId==KPOP3MTMSilentConnect) { RestoreSettingsL(); if (iImPop3Settings->AutoSendOnConnect()) diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/clientmtms/src/SMTCMTM.CPP --- a/email/pop3andsmtpmtm/clientmtms/src/SMTCMTM.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/clientmtms/src/SMTCMTM.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -724,6 +724,7 @@ case KMTMStandardFunctionsSendMessage: return CMsvSmtpProgressOperation::NewL(Session(), aSelection, KSMTPMTMSendOnNextConnection, aParameter, aCompletionStatus); case KSMTPMTMSendOnNextConnection: + case KSMTPMTMSilentlySendOnNextConnection: return (Session().TransferCommandL(aSelection, aFunctionId, aParameter, aCompletionStatus)); case KSMTPMTMCreateNewEmailMessage: case KSMTPMTMCreateReplyEmailMessage: diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/inc/POPS.H --- a/email/pop3andsmtpmtm/popservermtm/inc/POPS.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/inc/POPS.H Tue Oct 19 11:30:16 2010 +0530 @@ -125,7 +125,7 @@ CImCaf* iCaf; CImPop3Capa* iPopCapabilities; - TBuf8 iResponseBuffer; + TBuf8 iResponseBuffer; #if (defined SYMBIAN_EMAIL_CAPABILITY_SUPPORT) TBool iSaslAuthLogin; CPopAuthMechanismHelper* iPopAuthHelper; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/inc/POPSMTM.H --- a/email/pop3andsmtpmtm/popservermtm/inc/POPSMTM.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/inc/POPSMTM.H Tue Oct 19 11:30:16 2010 +0530 @@ -129,7 +129,7 @@ void DoCancelCurrentOp(); void CheckMailboxStateL(); - void DoConnectL(TRequestStatus& aStatus, CMsvEntrySelection& aSelection); + void DoConnectL(TRequestStatus& aStatus, CMsvEntrySelection& aSelection, TInt aCommand); void DoRefreshL(); void DoCopyMoveL(const CMsvEntrySelection& aSelection, TMsvId aDestination, TRequestStatus& aStatus, TImppCopyMethod aCopyMethod); void DoQuitL(TRequestStatus& aStatus); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/inc/cpopsessionmanager.h --- a/email/pop3andsmtpmtm/popservermtm/inc/cpopsessionmanager.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/inc/cpopsessionmanager.h Tue Oct 19 11:30:16 2010 +0530 @@ -45,7 +45,8 @@ TBool HasConnection(); RConnection& GetConnection(); TInt GetAccessPointIdForConnection(TUint32& aAccessPointId) const; - + void SetSilentConnection(TBool aIsSilent); + private: enum TState { @@ -92,6 +93,9 @@ // State machine state TState iState; + + //Silent Connection + TBool iIsSilent; }; #endif // __CPOPSESSIONMANAGER_H__ diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/src/POPS.CPP --- a/email/pop3andsmtpmtm/popservermtm/src/POPS.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/src/POPS.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -249,7 +249,7 @@ if(iPopSettings->Apop() && iState==EWaitingForReply) { - HBufC8* connectReply = HBufC8::NewL(KImMailMaxBufferSize); + HBufC8* connectReply = HBufC8::NewL(KMailMaxBufferSize); // Delete iConnectReply if not NULL & assign newly created delete iConnectReply; iConnectReply = connectReply; diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/src/POPSMTM.CPP --- a/email/pop3andsmtpmtm/popservermtm/src/POPSMTM.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/src/POPSMTM.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -260,7 +260,8 @@ switch(aCommand) { case KPOP3MTMConnect: // KPop3MtmConnectUID - DoConnectL(aStatus, aSelection); + case KPOP3MTMSilentConnect: + DoConnectL(aStatus, aSelection, aCommand); MOBILITY_TEST_MTM_STATE(iServiceId, KMobilityTestMtmStatePopConnecting); break; case KPOP3MTMDisconnect: @@ -294,7 +295,7 @@ // // // -void CImppServerMtm::DoConnectL(TRequestStatus& aStatus, CMsvEntrySelection& aSelection) +void CImppServerMtm::DoConnectL(TRequestStatus& aStatus, CMsvEntrySelection& aSelection, TInt aCommand) { __ASSERT_ALWAYS(iServerEntry, Panic(EPopNullPointer)); if(IsActive()) @@ -332,7 +333,14 @@ { iSessionManager = CPopSessionManager::NewL(); } - + if(aCommand == KPOP3MTMSilentConnect) + { + iSessionManager->SetSilentConnection(ETrue); + } + else + { + iSessionManager->SetSilentConnection(EFalse); + } #if (defined SYMBIAN_USER_PROMPT_SERVICE) // Connect to UPS server and check if connection to remote server is permitted. iWaiter->AuthoriseAndConnectL(iPopSettings, iClientThreadId, iHasCapability, iStatus); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp --- a/email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/popservermtm/src/cpopsessionmanager.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -245,6 +245,7 @@ else { iConnect = CImConnect::NewL(*iIAPPrefs, iServ); + iConnect->SetSilentConnection(iIsSilent); iConnect->StartL(iStatus); } SetActive(); @@ -321,3 +322,12 @@ return KErrNotFound; } + +/** +Sets whether connection to the network has to be established silently or not. +@param aIsSilent If ETrue then silent connection is required. +*/ +void CPopSessionManager::SetSilentConnection(TBool aIsSilent) + { + iIsSilent = aIsSilent; + } diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/group/IMUT.mmp --- a/email/pop3andsmtpmtm/servermtmutils/group/IMUT.mmp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/group/IMUT.mmp Tue Oct 19 11:30:16 2010 +0530 @@ -37,7 +37,7 @@ LIBRARY insock.lib charconv.lib commsdat.lib msgs.lib imcm.lib LIBRARY commdb.lib LIBRARY caf.lib cafutils.lib -LIBRARY esocksvr.lib netmeta.lib +LIBRARY esocksvr.lib netmeta.lib extendedconnpref.lib LIBRARY mobilitypolicyprovider.lib #ifdef __MOBILITY_TEST_FRAMEWORK diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/inc/IMCVCODC.H --- a/email/pop3andsmtpmtm/servermtmutils/inc/IMCVCODC.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/inc/IMCVCODC.H Tue Oct 19 11:30:16 2010 +0530 @@ -27,11 +27,6 @@ #include #include #include -#include // CMsgActive - -#include -#include -#include #define KBase64 _L("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=") #define KCharFormat _L("%c") diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/inc/IMSK.H --- a/email/pop3andsmtpmtm/servermtmutils/inc/IMSK.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/inc/IMSK.H Tue Oct 19 11:30:16 2010 +0530 @@ -28,14 +28,9 @@ #include #include #include -#include -#include #include #include - -#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS -#include "timrfc822datefield.h" -#endif +#include // CMsgActive #ifdef _DEBUG #define __IMSK_SIMULATION @@ -46,6 +41,8 @@ #define __IMSK_SCRIPTING #endif +const TInt KMailMaxBufferSize = 1000; // 1000 is defined by the SMTP spec as max space + /** @publishedAll @released @@ -66,7 +63,7 @@ @publishedAll @released */ -typedef TBuf8 TImMailBuffer; +typedef TBuf8 TImMailBuffer; /** received buffer data line type @publishedAll @@ -87,7 +84,7 @@ class CImConnect; class CSecureSocket; class CImSocketIdleTimer; - +class CMsgActive; /** Creates/opens socket and sends and receives data. @@ -384,7 +381,7 @@ //Do not call SetSecurity. Call SetSSLTLSResponseL IMPORT_C TInt SetSecurity(TBool aSecurityOn, TBool aUnattendedMode = FALSE); IMPORT_C void PerformLogging(TBool aLogging); - + inline void SetSilentConnection(TBool aIsSilent); private: /** //cat Construction and Destruction @@ -613,6 +610,14 @@ /** SSL domain name for secure sockets */ HBufC8* iSSLDomainName; TBool iSocketIdleTimeSet; // iSocketIdleTimeSet=ETrue, if smtp server did not responds within 10 seconds after sending "." + TBool iIsSilent; //Silent Connection }; + +// Sets if Silent connection is required or not +inline void CImTextServerSession::SetSilentConnection(TBool aIsSilent) + { + iIsSilent = aIsSilent; + } + #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/inc/imutcon.h --- a/email/pop3andsmtpmtm/servermtmutils/inc/imutcon.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/inc/imutcon.h Tue Oct 19 11:30:16 2010 +0530 @@ -94,6 +94,14 @@ */ IMPORT_C TInt GetLastSocketActivityTimeout(TUint32& aTimeout); + /** + @fn SetSilentConnection(TBool aSilent) + Intended Usage : Sets value for silent connection. + @since 10.1 + @param aSilent is true if silent connection is required. + */ + inline void SetSilentConnection(TBool aIsSilentConn); + #ifdef __IMSK_SIMULATION // the code will ignore the first aIAPsToFail iaps in the preferences passed in. // if this is more than the number of iaps then it will fail with KErrEtelModemNotDetected @@ -147,7 +155,16 @@ // if this is more than the number of iaps then it will fail with KErrEtelModemNotDetected TInt iIAPsToFail; #endif + + //Indicates whether silent connection is chosen. + TBool iIsSilentConn; }; +// Silent Connection +inline void CImConnect::SetSilentConnection(TBool aIsSilentConn) + { + iIsSilentConn = aIsSilentConn; + } + #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/src/IMCVCODC.CPP --- a/email/pop3andsmtpmtm/servermtmutils/src/IMCVCODC.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/src/IMCVCODC.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -17,6 +17,9 @@ #include "IMCVCODC.H" #include "IMUTDLL.H" #include "IMCVSEND.H" +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "timrfc822datefield.h" +#endif const TInt8 AsciiToBase64[80]= { diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/src/IMSK.CPP --- a/email/pop3andsmtpmtm/servermtmutils/src/IMSK.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/src/IMSK.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -18,16 +18,19 @@ #include "IMSKSCR.H" #include "IMUTDLL.H" #include "cimsocketidletimer.h" - +#include #include #include #include #include - +#include // CMsgActive #include #include +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include "timrfc822datefield.h" +#endif /************************************************************* * Notes: @@ -219,7 +222,7 @@ // void CImTextServerSession::ConstructL() { - iBuffer = HBufC8::NewL(KImMailMaxBufferSize*2 +2); + iBuffer = HBufC8::NewL(KMailMaxBufferSize*2 +2); if (!iClientOwnsConnection) { @@ -338,7 +341,8 @@ #if defined(__IMSK_SIMULATION) iConnect->SetIAPsToFail(ReadConfigNum(KFailIAPConfigFile)); #endif //(__IMSK_SIMULATION) - + + iConnect->SetSilentConnection(iIsSilent); // if local textseversession is active, then connect the session using existing RConnection if(iPrimaryTextServerSession) { @@ -510,7 +514,7 @@ { VA_LIST list; VA_START(list,aFmt); - TBuf8<2*KImMailMaxBufferSize+2>aBuf; + TBuf8<2*KMailMaxBufferSize+2>aBuf; aBuf.AppendFormatList(aFmt,list); Send(aStatus, aBuf); @@ -543,7 +547,7 @@ { VA_LIST list; VA_START(list,aFmt); - TBuf8<2*KImMailMaxBufferSize+2>aBuf; + TBuf8<2*KMailMaxBufferSize+2>aBuf; aBuf.AppendFormatList(aFmt,list); SendQueueReceive(aStatus, aBuf); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/servermtmutils/src/imutcon.cpp --- a/email/pop3andsmtpmtm/servermtmutils/src/imutcon.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/servermtmutils/src/imutcon.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -17,7 +17,9 @@ #include #include -#include +#include +#include + #include #include // For TConnectionInfo #include @@ -95,14 +97,36 @@ void CImConnect::ConnectWithSNAP() { - TConnSnapPref snapPref(iIAPPreferences.SNAPPreference()); - iConn.Start(snapPref, iStatus); + // Create connection preferences + TConnPrefList prefList; + TExtendedConnPref prefs; + + prefs.SetSnapPurpose( CMManager::ESnapPurposeInternet ); + if(iIsSilentConn) + { + prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent ); + } + prefs.SetSnapId(iIAPPreferences.SNAPPreference()); + prefList.AppendL( &prefs ); + + // Start a connection with connection preferences + iConn.Start( prefList, iStatus ); } void CImConnect::ConnectWithIAPListL() { TInt iapCount=iIAPPreferences.NumberOfIAPs(); + // Create connection preferences + TConnPrefList prefList; + TExtendedConnPref prefs; + prefs.SetSnapPurpose( CMManager::ESnapPurposeInternet ); + if(iIsSilentConn) + { + prefs.SetNoteBehaviour( TExtendedConnPref::ENoteBehaviourConnSilent ); + } + + if(iapCount==0) { #ifdef __IMSK_LOGGING @@ -112,7 +136,9 @@ iTextSession->LogText(KImConDefault); } #endif - iConn.Start(iStatus); + prefList.AppendL( &prefs ); + // Start a connection with connection preferences + iConn.Start( prefList, iStatus ); } else { @@ -141,32 +167,11 @@ } #endif - TInt rank=1; -#ifdef __IMSK_SIMULATION - for(TInt i=iIAPsToFail;iLogError(_L8("\t\tEnd of POP3 test session; completion code="),iStatus.Int()); - TBuf8 buffer; + TBuf8 buffer; iLineStatus=iImSocket->GetCurrentTextLine(buffer); test.Printf(TRefByValue_L("Final %S\n "),&buffer); CActiveScheduler::Stop(); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/inc/IMSM.H --- a/email/pop3andsmtpmtm/smtpservermtm/inc/IMSM.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/inc/IMSM.H Tue Oct 19 11:30:16 2010 +0530 @@ -57,9 +57,9 @@ ~CMsgImOutboxSend(); #if (defined SYMBIAN_USER_PROMPT_SERVICE) - void StartL(TRequestStatus& aStatus, TThreadId aClientThreadId, TBool aHasCapability); + void StartL(TRequestStatus& aStatus, TThreadId aClientThreadId, TBool aHasCapability, TBool aIsSilent); #endif - void StartL(TRequestStatus& aStatus); + void StartL(TRequestStatus& aStatus, TBool aIsSilent); const TImSmtpProgress& Progress(); TBool SessionIsConnected(); @@ -157,6 +157,8 @@ TBool iDecrementMessageCountAfterMigration; TPckgBuf iMobilityProgressBuffer; + TBool iIsSilent; + }; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/inc/SMTS.H --- a/email/pop3andsmtpmtm/smtpservermtm/inc/SMTS.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/inc/SMTS.H Tue Oct 19 11:30:16 2010 +0530 @@ -92,7 +92,8 @@ #endif TNonOperationMtmDataAccessPointIdBuffer iMtmDataAccessPointIdBuffer; - + TBool iIsSilent; + }; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/inc/csmtpsessionmanager.h --- a/email/pop3andsmtpmtm/smtpservermtm/inc/csmtpsessionmanager.h Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/inc/csmtpsessionmanager.h Tue Oct 19 11:30:16 2010 +0530 @@ -48,7 +48,8 @@ TBool IsSessionConnected(); TBool IsConnectionStarted(); TInt GetAccessPointIdForConnection(TUint32& aAccessPointId) const; - + void SetSilentConnection(TBool aIsSilent); + private: enum TState { @@ -102,6 +103,9 @@ // State machine state TState iState; + + // Silent Connection + TBool iIsSilent; }; #endif // __CSMTPSESSIONMANAGER_H__ diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/IMSM.CPP --- a/email/pop3andsmtpmtm/smtpservermtm/src/IMSM.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/IMSM.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -110,8 +110,9 @@ } #if (defined SYMBIAN_USER_PROMPT_SERVICE) -void CMsgImOutboxSend::StartL(TRequestStatus& aStatus, TThreadId aClientThreadId, TBool aHasCapability) +void CMsgImOutboxSend::StartL(TRequestStatus& aStatus, TThreadId aClientThreadId, TBool aHasCapability, TBool aIsSilent) { + iIsSilent = aIsSilent; SetupStartL(); iState = EStateUserPrompting; @@ -123,8 +124,9 @@ } #endif -void CMsgImOutboxSend::StartL(TRequestStatus& aStatus) +void CMsgImOutboxSend::StartL(TRequestStatus& aStatus, TBool aIsSilent) { + iIsSilent = aIsSilent; SetupStartL(); StartConnectingL(); @@ -164,6 +166,7 @@ { iSessionManager = CSmtpSessionManager::NewL(iMobilityManager, iProgress.ServiceId()); } + iSessionManager->SetSilentConnection(iIsSilent); iSessionManager->GetSessionL(iServerEntry, *iSettings, iSession, iStatus); SetActive(); } diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.CPP --- a/email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -56,8 +56,9 @@ Connect the session to the server @param aClientStatus Client status to be completed +@param aIsSilent If ETrue then Silent Connection is required */ -void CImSmtpSession::ConnectL(TRequestStatus& aClientStatus) +void CImSmtpSession::ConnectL(TRequestStatus& aClientStatus, TBool aIsSilent) { __ASSERT_DEBUG(!iSocketIsConnected, gPanic(EImsmSocketAlreadyConnected)); @@ -72,7 +73,7 @@ iCompleted = KErrNone; iState = EConnectingToSmtp; // Initialise to 1st state of state machine - DoStateL(); // Here we go... + DoStateL(aIsSilent); // Here we go... Queue(aClientStatus); } else @@ -316,16 +317,19 @@ TInt numberRcpts = rcptArray->Count(); if(numberRcpts) - { - iSendFiles->BccRcptArray().AppendL((*rcptArray)[0]); - CDesCArray& tempArr = iSendFiles->BccRcptArray(); - for(TInt counter=1; counter 0) - iSendFiles->BccRcptArray().AppendL((*rcptArray)[counter]); - } + { + iSendFiles->BccRcptArray().AppendL((*rcptArray)[0]); + CDesCArray& tempArr = iSendFiles->BccRcptArray(); + for(TInt counter=1; counter 0) + { + iSendFiles->BccRcptArray().AppendL((*rcptArray)[counter]); + } + + } } rcptArray->Reset(); } @@ -820,7 +824,7 @@ return EClosingSmtp; } -void CImSmtpSession::DoStateL() +void CImSmtpSession::DoStateL(TBool aIsSilent) // performs the operation required by iState { switch (iState) @@ -830,6 +834,7 @@ i8BitMimeAcceptedHere = EFalse; iSizeAcceptedHere = EFalse; iStartTlsAcceptedHere = EFalse; + iSocket->SetSilentConnection(aIsSilent); if(iSettings.SSLWrapper()) { // Open secure socket on port 465 for SMTP session diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.H --- a/email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.H Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/IMSMSEND.H Tue Oct 19 11:30:16 2010 +0530 @@ -126,7 +126,7 @@ ~CImSmtpSession(); public: - void ConnectL(TRequestStatus& aStatus); + void ConnectL(TRequestStatus& aStatus, TBool aIsSilent); void SendFilesL(CMsgImOutboxSend& aSendFiles, TRequestStatus& aStatus); void QuitL(TRequestStatus& aStatus); TImImailFileProgress FileProgress(); // Return snapshot of session progress to client @@ -147,7 +147,7 @@ private: void SendFileL(); - void DoStateL(); // the state machine engine + void DoStateL(TBool aIsSilent = EFalse); // the state machine engine TInt NextStateL(); // logic which calculates next state from result of current operation TInt NextStateFromWaitingForReply(); TInt NextStateFromAuthorisingSmtpL(); diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/SMTS.CPP --- a/email/pop3andsmtpmtm/smtpservermtm/src/SMTS.CPP Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/SMTS.CPP Tue Oct 19 11:30:16 2010 +0530 @@ -103,9 +103,9 @@ iOutboxSend = CMsgImOutboxSend::NewL(*iSendSelection,*iServerEntry,iServiceId); #if (defined SYMBIAN_USER_PROMPT_SERVICE) - iOutboxSend->StartL(iStatus, iClientThreadId, iHasCapability); + iOutboxSend->StartL(iStatus, iClientThreadId, iHasCapability, iIsSilent); #else - iOutboxSend->StartL(iStatus); + iOutboxSend->StartL(iStatus, iIsSilent); #endif SetActive(); @@ -197,6 +197,15 @@ error = KErrDisconnected; break; case KSMTPMTMSendOnNextConnection: + case KSMTPMTMSilentlySendOnNextConnection: + if(aCommand == KSMTPMTMSilentlySendOnNextConnection) + { + iIsSilent = ETrue; + } + else + { + iIsSilent = EFalse; + } CopyFromLocalL(aSelection, aSelection.At(0), aStatus); return; default: diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/csmtpsessionmanager.cpp --- a/email/pop3andsmtpmtm/smtpservermtm/src/csmtpsessionmanager.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/csmtpsessionmanager.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -291,6 +291,7 @@ iState = EStateCreatingConnection; iConnect = CImConnect::NewL(iSettings->IapPrefs(), iServ); + iConnect->SetSilentConnection(iIsSilent); iConnect->StartL(iStatus); SetActive(); } @@ -319,7 +320,7 @@ iState = EStateCreatingSession; iSession = CImSmtpSession::NewL(*iServerEntry, *iSettings, iServ, *iConnect, iServiceId); - iSession->ConnectL(iStatus); + iSession->ConnectL(iStatus, iIsSilent); SetActive(); } @@ -370,3 +371,13 @@ return KErrNotFound; } + +/** +Sets whether connection to the network has to be established silently or not + +@param aIsSilent If ETrue then Silent connection is chosen. +*/ +void CSmtpSessionManager::SetSilentConnection(TBool aIsSilent) + { + iIsSilent = aIsSilent; + } diff -r ecf6a73a9186 -r 60a8a215b0ec email/pop3andsmtpmtm/smtpservermtm/src/csmtpupsresponsewaiter.cpp --- a/email/pop3andsmtpmtm/smtpservermtm/src/csmtpupsresponsewaiter.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/email/pop3andsmtpmtm/smtpservermtm/src/csmtpupsresponsewaiter.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -13,7 +13,7 @@ // Description: // -#include "IMSMSEND.H" + #include "csmtpupsresponsewaiter.h" #include diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgnotifications/msgindicatorplugin/msgindicatorplugin.pro --- a/messagingapp/msgnotifications/msgindicatorplugin/msgindicatorplugin.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgnotifications/msgindicatorplugin/msgindicatorplugin.pro Tue Oct 19 11:30:16 2010 +0530 @@ -49,8 +49,8 @@ BLD_INF_RULES.prj_exports += \ "$${LITERAL_HASH}include " \ - "rom/msgindicatorplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(msgindicatorplugin.iby)" \ - "resources/message.svg /epoc32/winscw/c/resource/messaging/message.svg" + "rom/msgindicatorplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(msgindicatorplugin.iby)" + LIBS += -lxqservice \ -lcsserverclientapi \ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgnotifications/msgindicatorplugin/resources/message.svg --- a/messagingapp/msgnotifications/msgindicatorplugin/resources/message.svg Tue Oct 05 13:58:47 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgnotifications/msgindicatorplugin/rom/msgindicatorplugin.iby --- a/messagingapp/msgnotifications/msgindicatorplugin/rom/msgindicatorplugin.iby Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgnotifications/msgindicatorplugin/rom/msgindicatorplugin.iby Tue Oct 19 11:30:16 2010 +0530 @@ -20,5 +20,4 @@ REM DLL file=ABI_DIR\UREL\msgindicatorplugin.dll SHARED_LIB_DIR\msgindicatorplugin.dll UNPAGED data=\epoc32\data\z\resource\plugins\indicators\msgindicatorplugin.qtplugin \resource\plugins\indicators\msgindicatorplugin.qtplugin -data=\epoc32\winscw\c\resource\messaging\message.svg \resource\messaging\message.svg #endif \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp --- a/messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgnotifications/msgnotifier/src/msgnotifier_p.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -360,7 +360,11 @@ "displayErrorNote(QVariantList)", false); snd << args; - snd.send(); + if (!snd.send()) + { + int lastErr = snd.latestError(); + QDEBUG_WRITE_FORMAT("MsgNotifierPrivate displayFailedNote failed", lastErr); + } QDEBUG_WRITE("MsgNotifierPrivate::displayFailedNote end.") } diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgservices/msgserviceapp/src/msgserviceviewmanager.cpp --- a/messagingapp/msgservices/msgserviceapp/src/msgserviceviewmanager.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgservices/msgserviceapp/src/msgserviceviewmanager.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -90,7 +90,6 @@ { case MsgBaseView::UNIEDITOR: { - mUniEditor->saveContentToDrafts(); HbApplication::quit(); break; } diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgservices/msgserviceapp/tsrc/tsrc.pro --- a/messagingapp/msgservices/msgserviceapp/tsrc/tsrc.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgservices/msgserviceapp/tsrc/tsrc.pro Tue Oct 19 11:30:16 2010 +0530 @@ -19,7 +19,7 @@ CONFIG += ordered #Sub .pro files -SUBDIRS += msgserviceapptest/msgserviceapptest.pro +SUBDIRS += msgserviceapptest # Platforms SYMBIAN_PLATFORMS = DEFAULT \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/bwins/unifiededitoru.def --- a/messagingapp/msgui/bwins/unifiededitoru.def Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/bwins/unifiededitoru.def Tue Oct 19 11:30:16 2010 +0530 @@ -1,69 +1,62 @@ EXPORTS - ?fetchImages@MsgUnifiedEditorView@@AAEXXZ @ 1 NONAME ; void MsgUnifiedEditorView::fetchImages(void) - ?handleViewExtnActivated@MsgUnifiedEditorView@@AAEXPAVHbListWidgetItem@@@Z @ 2 NONAME ; void MsgUnifiedEditorView::handleViewExtnActivated(class HbListWidgetItem *) - ?fetchMessageFromStore@MsgUnifiedEditorView@@AAEXAAVConvergedMessageId@@W4MessageType@ConvergedMessage@@H@Z @ 3 NONAME ; void MsgUnifiedEditorView::fetchMessageFromStore(class ConvergedMessageId &, enum ConvergedMessage::MessageType, int) - ?onContentChanged@MsgUnifiedEditorView@@AAEXXZ @ 4 NONAME ; void MsgUnifiedEditorView::onContentChanged(void) - ?staticMetaObject@MsgUnifiedEditorView@@2UQMetaObject@@B @ 5 NONAME ; struct QMetaObject const MsgUnifiedEditorView::staticMetaObject - ?resizeEvent@MsgUnifiedEditorView@@MAEXPAVQGraphicsSceneResizeEvent@@@Z @ 6 NONAME ; void MsgUnifiedEditorView::resizeEvent(class QGraphicsSceneResizeEvent *) - ?ScaleImageL@CUniImageProcessor@@QAEXPAVCFbsBitmap@@0H@Z @ 7 NONAME ; void CUniImageProcessor::ScaleImageL(class CFbsBitmap *, class CFbsBitmap *, int) - ?vkbAboutToClose@MsgUnifiedEditorView@@AAEXXZ @ 8 NONAME ; void MsgUnifiedEditorView::vkbAboutToClose(void) - ?onDialogSmsSettings@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 9 NONAME ; void MsgUnifiedEditorView::onDialogSmsSettings(class HbAction *) - ?addCcBcc@MsgUnifiedEditorView@@AAEXXZ @ 10 NONAME ; void MsgUnifiedEditorView::addCcBcc(void) - ?saveContentToDrafts@MsgUnifiedEditorView@@QAEHXZ @ 11 NONAME ; int MsgUnifiedEditorView::saveContentToDrafts(void) - ?generateFileName@MsgUnifiedEditorView@@AAE?AVQString@@AAV2@@Z @ 12 NONAME ; class QString MsgUnifiedEditorView::generateFileName(class QString &) - ?createVCards@MsgUnifiedEditorView@@AAEHABVQVariant@@AAVQStringList@@@Z @ 13 NONAME ; int MsgUnifiedEditorView::createVCards(class QVariant const &, class QStringList &) - ?addSubject@MsgUnifiedEditorView@@AAEXXZ @ 14 NONAME ; void MsgUnifiedEditorView::addSubject(void) - ?createTempFolder@MsgUnifiedEditorView@@AAE_NXZ @ 15 NONAME ; bool MsgUnifiedEditorView::createTempFolder(void) - ?imagesFetched@MsgUnifiedEditorView@@AAEXABVQVariant@@@Z @ 16 NONAME ; void MsgUnifiedEditorView::imagesFetched(class QVariant const &) - ?setFocus@MsgUnifiedEditorView@@AAEXPAVMsgUnifiedEditorBaseWidget@@@Z @ 17 NONAME ; void MsgUnifiedEditorView::setFocus(class MsgUnifiedEditorBaseWidget *) - ?serviceRequestError@MsgUnifiedEditorView@@AAEXHABVQString@@@Z @ 18 NONAME ; void MsgUnifiedEditorView::serviceRequestError(int, class QString const &) - ?isReplyPathBroken@MsgUnifiedEditorView@@AAE_NXZ @ 19 NONAME ; bool MsgUnifiedEditorView::isReplyPathBroken(void) - ?removeTempFolder@MsgUnifiedEditorView@@AAEXXZ @ 20 NONAME ; void MsgUnifiedEditorView::removeTempFolder(void) - ?vkbOpened@MsgUnifiedEditorView@@AAEXXZ @ 21 NONAME ; void MsgUnifiedEditorView::vkbOpened(void) - ?addMenu@MsgUnifiedEditorView@@AAEXXZ @ 22 NONAME ; void MsgUnifiedEditorView::addMenu(void) - ??_EMsgUnifiedEditorView@@UAE@I@Z @ 23 NONAME ; MsgUnifiedEditorView::~MsgUnifiedEditorView(unsigned int) - ?setAttachOptionEnabled@MsgUnifiedEditorView@@AAEXW4TBE_AttachOption@1@_N@Z @ 24 NONAME ; void MsgUnifiedEditorView::setAttachOptionEnabled(enum MsgUnifiedEditorView::TBE_AttachOption, bool) - ?ScaleImageL@CUniImageProcessor@@QAEXPAVCFbsBitmap@@AAVRFile@@ABVTSize@@ABVTDesC8@@H@Z @ 25 NONAME ; void CUniImageProcessor::ScaleImageL(class CFbsBitmap *, class RFile &, class TSize const &, class TDesC8 const &, int) - ?send@MsgUnifiedEditorView@@AAEXXZ @ 26 NONAME ; void MsgUnifiedEditorView::send(void) - ?populateContentIntoEditor@MsgUnifiedEditorView@@AAEXABVConvergedMessage@@_N@Z @ 27 NONAME ; void MsgUnifiedEditorView::populateContentIntoEditor(class ConvergedMessage const &, bool) - ?addToolBar@MsgUnifiedEditorView@@AAEXXZ @ 28 NONAME ; void MsgUnifiedEditorView::addToolBar(void) - ?onDialogDeleteMsg@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 29 NONAME ; void MsgUnifiedEditorView::onDialogDeleteMsg(class HbAction *) - ?onAudioSelected@MsgUnifiedEditorView@@AAEXAAVQString@@@Z @ 30 NONAME ; void MsgUnifiedEditorView::onAudioSelected(class QString &) - ?fetchContacts@MsgUnifiedEditorView@@AAEXXZ @ 31 NONAME ; void MsgUnifiedEditorView::fetchContacts(void) - ?formatAddresses@MsgUnifiedEditorView@@AAEXAAV?$QList@PAVConvergedMessageAddress@@@@@Z @ 32 NONAME ; void MsgUnifiedEditorView::formatAddresses(class QList &) - ?addAttachments@MsgUnifiedEditorView@@AAEXVQStringList@@@Z @ 33 NONAME ; void MsgUnifiedEditorView::addAttachments(class QStringList) - ??0CUniImageProcessor@@QAE@PAVMUniImageProcessorCallback@@@Z @ 34 NONAME ; CUniImageProcessor::CUniImageProcessor(class MUniImageProcessorCallback *) - ?fetchAudio@MsgUnifiedEditorView@@AAEXXZ @ 35 NONAME ; void MsgUnifiedEditorView::fetchAudio(void) - ?changePriority@MsgUnifiedEditorView@@AAEXXZ @ 36 NONAME ; void MsgUnifiedEditorView::changePriority(void) - ?qt_metacall@MsgUnifiedEditorView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 37 NONAME ; int MsgUnifiedEditorView::qt_metacall(enum QMetaObject::Call, int, void * *) - ?updateOtherRecipientCount@MsgUnifiedEditorView@@AAEX_N@Z @ 38 NONAME ; void MsgUnifiedEditorView::updateOtherRecipientCount(bool) - ?addAttachment@MsgUnifiedEditorView@@AAEHABVQString@@@Z @ 39 NONAME ; int MsgUnifiedEditorView::addAttachment(class QString const &) - ?vkbAboutToOpen@MsgUnifiedEditorView@@AAEXXZ @ 40 NONAME ; void MsgUnifiedEditorView::vkbAboutToOpen(void) - ?doDelayedConstruction@MsgUnifiedEditorView@@AAEXXZ @ 41 NONAME ; void MsgUnifiedEditorView::doDelayedConstruction(void) - ?activateInputBlocker@MsgUnifiedEditorView@@AAEXXZ @ 42 NONAME ; void MsgUnifiedEditorView::activateInputBlocker(void) - ?onDialogMmsSettings@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 43 NONAME ; void MsgUnifiedEditorView::onDialogMmsSettings(class HbAction *) - ?populateContent@MsgUnifiedEditorView@@QAEXABV?$QList@VQVariant@@@@@Z @ 44 NONAME ; void MsgUnifiedEditorView::populateContent(class QList const &) - ?ProcessImageL@CUniImageProcessor@@QAEXAAVRFile@@0AAVTSize@@ABVTDesC8@@HH@Z @ 45 NONAME ; void CUniImageProcessor::ProcessImageL(class RFile &, class RFile &, class TSize &, class TDesC8 const &, int, int) - ?metaObject@MsgUnifiedEditorView@@UBEPBUQMetaObject@@XZ @ 46 NONAME ; struct QMetaObject const * MsgUnifiedEditorView::metaObject(void) const - ?vkbClosed@MsgUnifiedEditorView@@AAEXXZ @ 47 NONAME ; void MsgUnifiedEditorView::vkbClosed(void) - ?qt_metacast@MsgUnifiedEditorView@@UAEPAXPBD@Z @ 48 NONAME ; void * MsgUnifiedEditorView::qt_metacast(char const *) - ?enableSendButton@MsgUnifiedEditorView@@AAEX_N@Z @ 49 NONAME ; void MsgUnifiedEditorView::enableSendButton(bool) - ?ScaleImageL@CUniImageProcessor@@QAEXAAVRFile@@AAPAVCFbsBitmap@@1AAVTSize@@H@Z @ 50 NONAME ; void CUniImageProcessor::ScaleImageL(class RFile &, class CFbsBitmap * &, class CFbsBitmap * &, class TSize &, int) - ?handleKeyEvent@MsgUnifiedEditorView@@UAE_NH@Z @ 51 NONAME ; bool MsgUnifiedEditorView::handleKeyEvent(int) - ?initView@MsgUnifiedEditorView@@AAEXXZ @ 52 NONAME ; void MsgUnifiedEditorView::initView(void) - ?packMessage@MsgUnifiedEditorView@@AAEHAAVConvergedMessage@@_N@Z @ 53 NONAME ; int MsgUnifiedEditorView::packMessage(class ConvergedMessage &, bool) - ??1MsgUnifiedEditorView@@UAE@XZ @ 54 NONAME ; MsgUnifiedEditorView::~MsgUnifiedEditorView(void) - ?hideChrome@MsgUnifiedEditorView@@AAEX_N@Z @ 55 NONAME ; void MsgUnifiedEditorView::hideChrome(bool) - ?getStaticMetaObject@MsgUnifiedEditorView@@SAABUQMetaObject@@XZ @ 56 NONAME ; struct QMetaObject const & MsgUnifiedEditorView::getStaticMetaObject(void) - ?tr@MsgUnifiedEditorView@@SA?AVQString@@PBD0@Z @ 57 NONAME ; class QString MsgUnifiedEditorView::tr(char const *, char const *) - ?trUtf8@MsgUnifiedEditorView@@SA?AVQString@@PBD0@Z @ 58 NONAME ; class QString MsgUnifiedEditorView::trUtf8(char const *, char const *) - ?tr@MsgUnifiedEditorView@@SA?AVQString@@PBD0H@Z @ 59 NONAME ; class QString MsgUnifiedEditorView::tr(char const *, char const *, int) - ?Reset@CUniImageProcessor@@QAEXXZ @ 60 NONAME ; void CUniImageProcessor::Reset(void) - ?openDraftsMessage@MsgUnifiedEditorView@@QAEXABV?$QList@VQVariant@@@@@Z @ 61 NONAME ; void MsgUnifiedEditorView::openDraftsMessage(class QList const &) - ?contactsFetched@MsgUnifiedEditorView@@AAEXABVQVariant@@@Z @ 62 NONAME ; void MsgUnifiedEditorView::contactsFetched(class QVariant const &) - ?removeAttachmentContainer@MsgUnifiedEditorView@@AAEXXZ @ 63 NONAME ; void MsgUnifiedEditorView::removeAttachmentContainer(void) - ??0MsgUnifiedEditorView@@QAE@PAVQGraphicsItem@@@Z @ 64 NONAME ; MsgUnifiedEditorView::MsgUnifiedEditorView(class QGraphicsItem *) - ?trUtf8@MsgUnifiedEditorView@@SA?AVQString@@PBD0H@Z @ 65 NONAME ; class QString MsgUnifiedEditorView::trUtf8(char const *, char const *, int) - ?deleteMessage@MsgUnifiedEditorView@@AAEXXZ @ 66 NONAME ; void MsgUnifiedEditorView::deleteMessage(void) - ?deactivateInputBlocker@MsgUnifiedEditorView@@AAEXXZ @ 67 NONAME ; void MsgUnifiedEditorView::deactivateInputBlocker(void) + ?fetchAudio@MsgUnifiedEditorView@@AAEXXZ @ 1 NONAME ; void MsgUnifiedEditorView::fetchAudio(void) + ??0CUniImageProcessor@@QAE@PAVMUniImageProcessorCallback@@@Z @ 2 NONAME ; CUniImageProcessor::CUniImageProcessor(class MUniImageProcessorCallback *) + ?populateContentIntoEditor@MsgUnifiedEditorView@@AAEXABVConvergedMessage@@_N1@Z @ 3 NONAME ; void MsgUnifiedEditorView::populateContentIntoEditor(class ConvergedMessage const &, bool, bool) + ?qt_metacall@MsgUnifiedEditorView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 4 NONAME ; int MsgUnifiedEditorView::qt_metacall(enum QMetaObject::Call, int, void * *) + ?fetchImages@MsgUnifiedEditorView@@AAEXXZ @ 5 NONAME ; void MsgUnifiedEditorView::fetchImages(void) + ?focusChanged@MsgUnifiedEditorView@@AAEXXZ @ 6 NONAME ; void MsgUnifiedEditorView::focusChanged(void) + ?doDelayedConstruction@MsgUnifiedEditorView@@AAEXXZ @ 7 NONAME ; void MsgUnifiedEditorView::doDelayedConstruction(void) + ?fetchMessageFromStore@MsgUnifiedEditorView@@AAEXAAVConvergedMessageId@@W4MessageType@ConvergedMessage@@H@Z @ 8 NONAME ; void MsgUnifiedEditorView::fetchMessageFromStore(class ConvergedMessageId &, enum ConvergedMessage::MessageType, int) + ?onContentChanged@MsgUnifiedEditorView@@AAEXXZ @ 9 NONAME ; void MsgUnifiedEditorView::onContentChanged(void) + ?doLayout@MsgUnifiedEditorView@@AAEXXZ @ 10 NONAME ; void MsgUnifiedEditorView::doLayout(void) + ?staticMetaObject@MsgUnifiedEditorView@@2UQMetaObject@@B @ 11 NONAME ; struct QMetaObject const MsgUnifiedEditorView::staticMetaObject + ?activateInputBlocker@MsgUnifiedEditorView@@AAEXXZ @ 12 NONAME ; void MsgUnifiedEditorView::activateInputBlocker(void) + ?resetLayout@MsgUnifiedEditorView@@AAEXXZ @ 13 NONAME ; void MsgUnifiedEditorView::resetLayout(void) + ?ScaleImageL@CUniImageProcessor@@QAEXPAVCFbsBitmap@@0H@Z @ 14 NONAME ; void CUniImageProcessor::ScaleImageL(class CFbsBitmap *, class CFbsBitmap *, int) + ?onDialogSmsSettings@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 15 NONAME ; void MsgUnifiedEditorView::onDialogSmsSettings(class HbAction *) + ?populateContent@MsgUnifiedEditorView@@QAEXABV?$QList@VQVariant@@@@@Z @ 16 NONAME ; void MsgUnifiedEditorView::populateContent(class QList const &) + ?onDialogMmsSettings@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 17 NONAME ; void MsgUnifiedEditorView::onDialogMmsSettings(class HbAction *) + ?ensureVisibility@MsgUnifiedEditorView@@AAEXXZ @ 18 NONAME ; void MsgUnifiedEditorView::ensureVisibility(void) + ?addCcBcc@MsgUnifiedEditorView@@AAEX_N@Z @ 19 NONAME ; void MsgUnifiedEditorView::addCcBcc(bool) + ?saveContentToDrafts@MsgUnifiedEditorView@@QAEHXZ @ 20 NONAME ; int MsgUnifiedEditorView::saveContentToDrafts(void) + ?ProcessImageL@CUniImageProcessor@@QAEXAAVRFile@@0AAVTSize@@ABVTDesC8@@HH@Z @ 21 NONAME ; void CUniImageProcessor::ProcessImageL(class RFile &, class RFile &, class TSize &, class TDesC8 const &, int, int) + ?generateFileName@MsgUnifiedEditorView@@AAE?AVQString@@AAV2@@Z @ 22 NONAME ; class QString MsgUnifiedEditorView::generateFileName(class QString &) + ?metaObject@MsgUnifiedEditorView@@UBEPBUQMetaObject@@XZ @ 23 NONAME ; struct QMetaObject const * MsgUnifiedEditorView::metaObject(void) const + ?createVCards@MsgUnifiedEditorView@@AAEHABVQVariant@@AAVQStringList@@@Z @ 24 NONAME ; int MsgUnifiedEditorView::createVCards(class QVariant const &, class QStringList &) + ?createTempFolder@MsgUnifiedEditorView@@AAE_NXZ @ 25 NONAME ; bool MsgUnifiedEditorView::createTempFolder(void) + ?imagesFetched@MsgUnifiedEditorView@@AAEXABVQVariant@@@Z @ 26 NONAME ; void MsgUnifiedEditorView::imagesFetched(class QVariant const &) + ?enableMenuAction@MsgUnifiedEditorView@@AAEXH_N@Z @ 27 NONAME ; void MsgUnifiedEditorView::enableMenuAction(int, bool) + ?setFocus@MsgUnifiedEditorView@@AAEXPAVMsgUnifiedEditorBaseWidget@@@Z @ 28 NONAME ; void MsgUnifiedEditorView::setFocus(class MsgUnifiedEditorBaseWidget *) + ?vkbClosed@MsgUnifiedEditorView@@AAEXXZ @ 29 NONAME ; void MsgUnifiedEditorView::vkbClosed(void) + ?serviceRequestError@MsgUnifiedEditorView@@AAEXHABVQString@@@Z @ 30 NONAME ; void MsgUnifiedEditorView::serviceRequestError(int, class QString const &) + ?qt_metacast@MsgUnifiedEditorView@@UAEPAXPBD@Z @ 31 NONAME ; void * MsgUnifiedEditorView::qt_metacast(char const *) + ?isReplyPathBroken@MsgUnifiedEditorView@@AAE_NXZ @ 32 NONAME ; bool MsgUnifiedEditorView::isReplyPathBroken(void) + ?addSubject@MsgUnifiedEditorView@@AAEX_N@Z @ 33 NONAME ; void MsgUnifiedEditorView::addSubject(bool) + ?removeTempFolder@MsgUnifiedEditorView@@AAEXXZ @ 34 NONAME ; void MsgUnifiedEditorView::removeTempFolder(void) + ?vkbOpened@MsgUnifiedEditorView@@AAEXXZ @ 35 NONAME ; void MsgUnifiedEditorView::vkbOpened(void) + ?ScaleImageL@CUniImageProcessor@@QAEXAAVRFile@@AAPAVCFbsBitmap@@1AAVTSize@@H@Z @ 36 NONAME ; void CUniImageProcessor::ScaleImageL(class RFile &, class CFbsBitmap * &, class CFbsBitmap * &, class TSize &, int) + ?addMenu@MsgUnifiedEditorView@@AAEXXZ @ 37 NONAME ; void MsgUnifiedEditorView::addMenu(void) + ?handleKeyEvent@MsgUnifiedEditorView@@UAE_NH@Z @ 38 NONAME ; bool MsgUnifiedEditorView::handleKeyEvent(int) + ?packMessage@MsgUnifiedEditorView@@AAEHAAVConvergedMessage@@_N@Z @ 39 NONAME ; int MsgUnifiedEditorView::packMessage(class ConvergedMessage &, bool) + ?initView@MsgUnifiedEditorView@@AAEXXZ @ 40 NONAME ; void MsgUnifiedEditorView::initView(void) + ??_EMsgUnifiedEditorView@@UAE@I@Z @ 41 NONAME ; MsgUnifiedEditorView::~MsgUnifiedEditorView(unsigned int) + ??1MsgUnifiedEditorView@@UAE@XZ @ 42 NONAME ; MsgUnifiedEditorView::~MsgUnifiedEditorView(void) + ?hideChrome@MsgUnifiedEditorView@@AAEX_N@Z @ 43 NONAME ; void MsgUnifiedEditorView::hideChrome(bool) + ?trUtf8@MsgUnifiedEditorView@@SA?AVQString@@PBD0@Z @ 44 NONAME ; class QString MsgUnifiedEditorView::trUtf8(char const *, char const *) + ?tr@MsgUnifiedEditorView@@SA?AVQString@@PBD0@Z @ 45 NONAME ; class QString MsgUnifiedEditorView::tr(char const *, char const *) + ?ScaleImageL@CUniImageProcessor@@QAEXPAVCFbsBitmap@@AAVRFile@@ABVTSize@@ABVTDesC8@@H@Z @ 46 NONAME ; void CUniImageProcessor::ScaleImageL(class CFbsBitmap *, class RFile &, class TSize const &, class TDesC8 const &, int) + ?getStaticMetaObject@MsgUnifiedEditorView@@SAABUQMetaObject@@XZ @ 47 NONAME ; struct QMetaObject const & MsgUnifiedEditorView::getStaticMetaObject(void) + ?tr@MsgUnifiedEditorView@@SA?AVQString@@PBD0H@Z @ 48 NONAME ; class QString MsgUnifiedEditorView::tr(char const *, char const *, int) + ?send@MsgUnifiedEditorView@@AAEXXZ @ 49 NONAME ; void MsgUnifiedEditorView::send(void) + ?Reset@CUniImageProcessor@@QAEXXZ @ 50 NONAME ; void CUniImageProcessor::Reset(void) + ?openDraftsMessage@MsgUnifiedEditorView@@QAEXABV?$QList@VQVariant@@@@@Z @ 51 NONAME ; void MsgUnifiedEditorView::openDraftsMessage(class QList const &) + ?contactsFetched@MsgUnifiedEditorView@@AAEXABVQVariant@@@Z @ 52 NONAME ; void MsgUnifiedEditorView::contactsFetched(class QVariant const &) + ?trUtf8@MsgUnifiedEditorView@@SA?AVQString@@PBD0H@Z @ 53 NONAME ; class QString MsgUnifiedEditorView::trUtf8(char const *, char const *, int) + ?onDialogDeleteMsg@MsgUnifiedEditorView@@AAEXPAVHbAction@@@Z @ 54 NONAME ; void MsgUnifiedEditorView::onDialogDeleteMsg(class HbAction *) + ??0MsgUnifiedEditorView@@QAE@PAVQGraphicsItem@@@Z @ 55 NONAME ; MsgUnifiedEditorView::MsgUnifiedEditorView(class QGraphicsItem *) + ?onAudioSelected@MsgUnifiedEditorView@@AAEXAAVQString@@@Z @ 56 NONAME ; void MsgUnifiedEditorView::onAudioSelected(class QString &) + ?fetchContacts@MsgUnifiedEditorView@@AAEXXZ @ 57 NONAME ; void MsgUnifiedEditorView::fetchContacts(void) + ?deleteMessage@MsgUnifiedEditorView@@AAEXXZ @ 58 NONAME ; void MsgUnifiedEditorView::deleteMessage(void) + ?addAttachments@MsgUnifiedEditorView@@AAEXVQStringList@@@Z @ 59 NONAME ; void MsgUnifiedEditorView::addAttachments(class QStringList) + ?deactivateInputBlocker@MsgUnifiedEditorView@@AAEXXZ @ 60 NONAME ; void MsgUnifiedEditorView::deactivateInputBlocker(void) diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/conversationview.pro --- a/messagingapp/msgui/conversationview/conversationview.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/conversationview.pro Tue Oct 19 11:30:16 2010 +0530 @@ -58,6 +58,7 @@ inc/msgcontactcardwidget.h \ inc/msgeditorwidget.h \ inc/msgconversationbaseview.h \ + inc/msgbodytextedit.h \ ../inc/msgbaseview.h @@ -67,7 +68,8 @@ src/msgviewutils.cpp \ src/msgcontactcardwidget.cpp \ src/msgeditorwidget.cpp \ - src/msgconversationbaseview.cpp + src/msgconversationbaseview.cpp \ + src/msgbodytextedit.cpp RESOURCES += conversationview.qrc diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/conversationview.qrc --- a/messagingapp/msgui/conversationview/conversationview.qrc Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/conversationview.qrc Tue Oct 19 11:30:16 2010 +0530 @@ -13,5 +13,6 @@ resources/layouts/msgeditorwidget.css resources/layouts/msgeditorwidget.widgetml resources/layouts/msgcontactcardwidget_color.css + resources/layouts/msgbodytextedit.css diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/inc/msgbodytextedit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/inc/msgbodytextedit.h Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2009 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: Widget for BodyText. + * + */ + +#ifndef MSG_BODY_TEXT_EDIT_H +#define MSG_BODY_TEXT_EDIT_H + +// SYSTEM INCLUDES +#include + +// FORWORD DECLARATIONS +class MsgConversationViewItem; + + +/** + * @class MsgBodyTextEdit + * @brief This class is a widget for Text Item in the conversation View. + */ +class MsgBodyTextEdit: public HbTextEdit +{ +Q_OBJECT + +public: + + /** + * Constructor + */ + MsgBodyTextEdit(MsgConversationViewItem* item, QGraphicsItem *parent =0); + + /** + * Destructor + */ + virtual ~MsgBodyTextEdit(); + +protected: + + /* + * Handle Gestures + * @param event gesture event + */ + void gestureEvent(QGestureEvent* event); + + +private: + + /* + * Conversation View Item + * Not Own + */ + MsgConversationViewItem* mItem; + +#ifdef MSGUI_UNIT_TEST + /** + * Unit Testing + */ + friend class TestMsgBodyTextEdit; +#endif + +}; + +#endif // MSG_BODY_TEXT_EDIT_H +// EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/inc/msgcontactcardwidget.h --- a/messagingapp/msgui/conversationview/inc/msgcontactcardwidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/inc/msgcontactcardwidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -163,11 +163,6 @@ void call(); /** - * Adds unknown number to phonebook - */ - void addToContacts(); - - /** * Called after service request is completed. */ void onServiceRequestCompleted(); diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/inc/msgconversationviewitem.h --- a/messagingapp/msgui/conversationview/inc/msgconversationviewitem.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/inc/msgconversationviewitem.h Tue Oct 19 11:30:16 2010 +0530 @@ -78,6 +78,12 @@ * @return bool */ bool isIncoming(); + + /** + * Handle Gesture Event + * @param event, Event + */ + void gestureEvent(QGestureEvent *event); private: diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/inc/msgconversationwidget.h --- a/messagingapp/msgui/conversationview/inc/msgconversationwidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/inc/msgconversationwidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -26,6 +26,8 @@ class HbFrameItem; class HbIconItem; class HbTextItem; +class MsgBodyTextEdit; +class MsgConversationViewItem; /** * This class represents the custom layouted widget to show @@ -290,7 +292,7 @@ /** * Initialize the widget. */ - void init(); + void init(MsgConversationViewItem* item); public: @@ -403,7 +405,7 @@ * Graphics Item to hold body text content. * Owned */ - HbTextItem *mBodyTextItem; + MsgBodyTextEdit *mBodyTextItem; /** * Graphics Item to hold Time stamp. diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/resources/layouts/msgbodytextedit.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/resources/layouts/msgbodytextedit.css Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,8 @@ + +MsgBodyTextEdit::text +{ + left: var(hb-param-margin-gene-middle-horizontal); + right: -var(hb-param-margin-gene-middle-horizontal); + top: var(hb-param-margin-gene-middle-vertical); + bottom: -var(hb-param-margin-gene-middle-vertical); +} \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/src/msgbodytextedit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/conversationview/src/msgbodytextedit.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2009 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: + * + */ + +#include "msgbodytextedit.h" +#include "msgconversationviewitem.h" + +// SYSTEM INCLUDES + +//--------------------------------------------------------------- +// MsgBodyTextEdit::MsgBodyTextEdit +// @see header +//--------------------------------------------------------------- +MsgBodyTextEdit::MsgBodyTextEdit(MsgConversationViewItem* item, QGraphicsItem *parent): +HbTextEdit(parent), mItem(item) +{ + //set textedit properties + setCursorVisibility(Hb::TextCursorHidden); + setFlag(QGraphicsItem::ItemIsFocusable,false); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + setBackgroundItem(0); + setSmileysEnabled(true); + setReadOnly(true); + setScrollable(false); + + // grab gestures + grabGesture(Qt::TapGesture); +} + +//--------------------------------------------------------------- +// MsgBodyTextEdit::~MsgBodyTextEdit +// @see header +//--------------------------------------------------------------- +MsgBodyTextEdit::~MsgBodyTextEdit() +{ + +} + +//--------------------------------------------------------------- +// MsgBodyTextEdit::gestureEvent +// @see header file +//--------------------------------------------------------------- +void MsgBodyTextEdit::gestureEvent(QGestureEvent *event) +{ + mItem->gestureEvent(event); +} + +// EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp --- a/messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/src/msgcontactcardwidget.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -57,7 +58,6 @@ #define LOC_RECEIVED_FILES hbTrId("txt_messaging_title_received_files") #define LOC_MENU_CONTACT_INFO hbTrId("txt_messaging_menu_contact_info") #define LOC_COMMON_MENU_CALL hbTrId("txt_common_menu_call_verb") -#define LOC_SAVETO_CONTACTS hbTrId("txt_messaging_menu_save_to_contacts") // LOCAL FUNCTIONS @@ -87,7 +87,6 @@ void MsgContactCardWidget::init() { this->setProperty("state", "normal"); - this->grabGesture(Qt::TapGesture); HbFrameItem *frameItem = new HbFrameItem(BG_FRAME_NORMAL, HbFrameDrawer::NinePieces, this); this->setBackgroundItem(frameItem); @@ -230,13 +229,12 @@ if (KBluetoothMsgsConversationId == convId) { setAddress(LOC_RECEIVED_FILES); setAvatar(HbIcon(BT_ICON)); + this->ungrabGesture(Qt::TapGesture); } else { //Set the Contact Name/Number - qint64 convId; QString displayName; QString contactAddress; - convId = ConversationsEngine::instance()->getCurrentConversationId(); ConversationsEngine::instance()->getContactDetails(convId, displayName, contactAddress); mContactNumber = contactAddress; @@ -263,6 +261,8 @@ // Set default avatar till actual is set. setAvatar(HbIcon(DEFAULT_AVATAR_ICON)); + + this->grabGesture(Qt::TapGesture); } } @@ -357,24 +357,15 @@ //--------------------------------------------------------------- void MsgContactCardWidget::handleLongTap(const QPointF &position) { - if (KBluetoothMsgsConversationId != ConversationsEngine::instance()->getCurrentConversationId()) { - HbMenu* contextMenu = new HbMenu(); - contextMenu->setDismissPolicy(HbPopup::TapAnywhere); - contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); - contextMenu->setPreferredPos(position); + HbMenu* contextMenu = new HbMenu(); + contextMenu->setDismissPolicy(HbPopup::TapAnywhere); + contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); + contextMenu->setPreferredPos(position); - //If contact doesn't exist in phonebook then add another menu item "Save to Contacts" - int contactId = resolveContactId(mContactNumber); - if (contactId < 0) { - contextMenu->addAction(LOC_SAVETO_CONTACTS, this, SLOT(addToContacts())); - } - else{ - contextMenu->addAction(LOC_MENU_CONTACT_INFO, this, SLOT(openContactInfo())); - } - contextMenu->addAction(LOC_COMMON_MENU_CALL, this, SLOT(call())); + contextMenu->addAction(LOC_MENU_CONTACT_INFO, this, SLOT(openContactInfo())); + contextMenu->addAction(LOC_COMMON_MENU_CALL, this, SLOT(call())); - contextMenu->show(); - } + contextMenu->show(); } //--------------------------------------------------------------- @@ -383,19 +374,11 @@ //--------------------------------------------------------------- void MsgContactCardWidget::handleShortTap(const QPointF &position) { + Q_UNUSED(position) + this->ungrabGesture(Qt::TapGesture); - int contactId = resolveContactId(mContactNumber); - if(contactId > 0) - { - //resolved contact open contact card. - openContactInfo(); - } - else - { - //unresolved contact show longpress options menu. - handleLongTap(position); - } + openContactInfo(); //fire timer to regrab gesture after some delay. QTimer::singleShot(300,this,SLOT(regrabGesture())); @@ -407,46 +390,39 @@ //--------------------------------------------------------------- void MsgContactCardWidget::openContactInfo() { - //service stuff. - QString service("phonebookservices"); - QString interface; - QString operation; QList args; - if (KBluetoothMsgsConversationId != ConversationsEngine::instance()->getCurrentConversationId()) { - int contactId = resolveContactId(mContactNumber); - if (contactId > 0) { - //open existing contact card - interface = QString("com.nokia.symbian.IContactsView"); - operation = QString("openContactCard(int)"); - args << contactId; - } - else { - //populate data and open unknown contact template - interface = QString("com.nokia.symbian.IContactsEdit"); - operation = QString("editCreateNew(QString,QString)"); - QString type = QContactPhoneNumber::DefinitionName; - args << type; - args << mAddress; - } - XQAiwRequest* request; - XQApplicationManager appManager; - request = appManager.create(service, interface, operation, true); // embedded - if (request == NULL) { - return; - } + XQAiwRequest* request = NULL; + XQApplicationManager appManager; - // Result handlers - connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); - connect(request, SIGNAL(requestError(const QVariant&)), this, - SLOT(handleError(const QVariant&))); + int contactId = resolveContactId(mContactNumber); + if (contactId > 0) { + // open existing contact card + request = appManager.create(XQI_CONTACTS_VIEW, XQOP_CONTACTS_VIEW_CONTACT_CARD, true); // Embedded + args << contactId; + } + else { + // open temp contact card + request = appManager.create(XQI_CONTACTS_VIEW, + XQOP_CONTACTS_VIEW_TEMP_CONTACT_CARD_WITH_DETAIL, true); // Embedded + args << QContactPhoneNumber::DefinitionName; // Type + args << mAddress; // Actual data + } - //disbale subscritption for the CV events - ConversationsEngine::instance()->disableRegisterationForCVEvents(); + if (request == NULL) { + return; + } - request->setArguments(args); - request->send(); - delete request; - } + // Result handlers + connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(request, SIGNAL(requestError(const QVariant&)), this, + SLOT(handleError(const QVariant&))); + + //disbale subscritption for the CV events + ConversationsEngine::instance()->disableRegisterationForCVEvents(); + + request->setArguments(args); + request->send(); + delete request; } //--------------------------------------------------------------- @@ -483,15 +459,6 @@ } //--------------------------------------------------------------- -// MsgContactCardWidget::addToContacts -// @see header -//--------------------------------------------------------------- -void MsgContactCardWidget::addToContacts() -{ - openContactInfo(); -} - -//--------------------------------------------------------------- // MsgContactCardWidget::handleOk // @see header //--------------------------------------------------------------- diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp --- a/messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/src/msgconversationviewitem.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -28,6 +28,7 @@ #include #include #include +#include // USER INCLUDES #include "msgconversationwidget.h" @@ -153,6 +154,7 @@ mConversation->setIncoming(true); mIncomingMsgStateIconItem->setVisible(false); + HbEffect::add(this,"chatincoming_appear", "appear"); } else if (direction == ConvergedMessage::Outgoing) { @@ -162,7 +164,8 @@ int sendingState = index.data(SendingState).toInt(); mConversation->setSendingState(sendingState); setMessageStateIcon(sendingState); - } + HbEffect::add(this,"chatoutgoing_appear", "appear"); + } bool unreadStatus = index.data(UnReadStatus).toBool(); mConversation->setUnread(unreadStatus); @@ -220,8 +223,9 @@ else { mIncomingMsgStateIconItem->setVisible(false); - } } + HbEffect::add(this,"chatincoming_appear", "appear"); + } else if (direction == ConvergedMessage::Outgoing) { setIncoming(false); @@ -230,7 +234,8 @@ int sendingState = index.data(SendingState).toInt(); mConversation->setSendingState(sendingState); setMessageStateIcon(sendingState); - } + HbEffect::add(this,"chatoutgoing_appear", "appear"); + } bool unreadStatus = index.data(UnReadStatus).toBool(); mConversation->setUnread(unreadStatus); @@ -555,7 +560,8 @@ QString msgTimeStamp; if (ConvergedMessage::Resend == index.data(SendingState).toInt()) { - msgTimeStamp = LOC_RESEND_AT.arg(timeStampStr); + msgTimeStamp = LOC_RESEND_AT; + msgTimeStamp.append(" "+timeStampStr); } else { msgTimeStamp = timeStampStr; @@ -563,4 +569,13 @@ return msgTimeStamp; } +//--------------------------------------------------------------- +// MsgConversationViewItem::gestureEvent +// @see header file +//--------------------------------------------------------------- +void MsgConversationViewItem::gestureEvent(QGestureEvent *event) +{ + HbListViewItem::gestureEvent(event); +} + // EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/src/msgconversationwidget.cpp --- a/messagingapp/msgui/conversationview/src/msgconversationwidget.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/src/msgconversationwidget.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -15,7 +15,8 @@ * */ #include "msgconversationwidget.h" - +#include "msgconversationviewitem.h" +#include "msgbodytextedit.h" #include #include #include @@ -89,7 +90,8 @@ { - init(); + MsgConversationViewItem* item = static_cast(parent); + init(item); } //--------------------------------------------------------------- @@ -105,7 +107,7 @@ // MsgConversationWidget::init // @see header file //--------------------------------------------------------------- -void MsgConversationWidget::init() +void MsgConversationWidget::init(MsgConversationViewItem* item) { // Common to SMS/MMS @@ -121,8 +123,9 @@ mSubjectTextItem->setTextWrapping(Hb::TextNoWrap); HbStyle::setItemName(mSubjectTextItem, "subject"); - mBodyTextItem = new HbTextItem(this); - mBodyTextItem->setTextWrapping(Hb::TextWordWrap); + //passing MsgConversationViewItem object for handling gestures + mBodyTextItem = new MsgBodyTextEdit(item, this); + HbStyle::setItemName(mBodyTextItem, "bodyText"); mPreviewIconItem = new HbIconItem(this); @@ -176,7 +179,7 @@ } HbStyle::setItemName(mBodyTextItem, "bodyText"); - mBodyTextItem->setText(body); + mBodyTextItem->setPlainText(body); mBodyTextItem->show(); } @@ -622,8 +625,8 @@ mSendingState =Unknown; mNotificationState =0; - if(mBodyTextItem){ - mBodyTextItem->setText(QString()); + if(mBodyTextItem){ + mBodyTextItem->setPlainText(QString()); mBodyTextItem->hide(); HbStyle::setItemName(mBodyTextItem, ""); } diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/conversationview/src/msgeditorwidget.cpp --- a/messagingapp/msgui/conversationview/src/msgeditorwidget.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/conversationview/src/msgeditorwidget.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -373,8 +373,9 @@ MsgEditor::MsgEditor(QGraphicsItem *parent) :HbLineEdit(parent) { - this->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); - this->setPlaceholderText(LOC_HINT_TEXT); + setFontSpec(HbFontSpec(HbFontSpec::Secondary)); + setPlaceholderText(LOC_HINT_TEXT); + setSmileysEnabled(true); } //--------------------------------------------------------------- diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/eabi/unifiededitoru.def --- a/messagingapp/msgui/eabi/unifiededitoru.def Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/eabi/unifiededitoru.def Tue Oct 19 11:30:16 2010 +0530 @@ -6,69 +6,62 @@ _ZN18CUniImageProcessor5ResetEv @ 5 NONAME _ZN18CUniImageProcessorC1EP26MUniImageProcessorCallback @ 6 NONAME _ZN18CUniImageProcessorC2EP26MUniImageProcessorCallback @ 7 NONAME - _ZN20MsgUnifiedEditorView10addSubjectEv @ 8 NONAME - _ZN20MsgUnifiedEditorView10addToolBarEv @ 9 NONAME - _ZN20MsgUnifiedEditorView10fetchAudioEv @ 10 NONAME - _ZN20MsgUnifiedEditorView10hideChromeEb @ 11 NONAME - _ZN20MsgUnifiedEditorView11fetchImagesEv @ 12 NONAME - _ZN20MsgUnifiedEditorView11packMessageER16ConvergedMessageb @ 13 NONAME - _ZN20MsgUnifiedEditorView11qt_metacallEN11QMetaObject4CallEiPPv @ 14 NONAME - _ZN20MsgUnifiedEditorView11qt_metacastEPKc @ 15 NONAME - _ZN20MsgUnifiedEditorView11resizeEventEP25QGraphicsSceneResizeEvent @ 16 NONAME - _ZN20MsgUnifiedEditorView12createVCardsERK8QVariantR11QStringList @ 17 NONAME - _ZN20MsgUnifiedEditorView13addAttachmentERK7QString @ 18 NONAME - _ZN20MsgUnifiedEditorView13deleteMessageEv @ 19 NONAME - _ZN20MsgUnifiedEditorView13fetchContactsEv @ 20 NONAME - _ZN20MsgUnifiedEditorView13imagesFetchedERK8QVariant @ 21 NONAME - _ZN20MsgUnifiedEditorView14addAttachmentsE11QStringList @ 22 NONAME - _ZN20MsgUnifiedEditorView14changePriorityEv @ 23 NONAME - _ZN20MsgUnifiedEditorView14handleKeyEventEi @ 24 NONAME - _ZN20MsgUnifiedEditorView14vkbAboutToOpenEv @ 25 NONAME - _ZN20MsgUnifiedEditorView15contactsFetchedERK8QVariant @ 26 NONAME - _ZN20MsgUnifiedEditorView15formatAddressesER5QListIP23ConvergedMessageAddressE @ 27 NONAME - _ZN20MsgUnifiedEditorView15onAudioSelectedER7QString @ 28 NONAME - _ZN20MsgUnifiedEditorView15populateContentERK5QListI8QVariantE @ 29 NONAME - _ZN20MsgUnifiedEditorView15vkbAboutToCloseEv @ 30 NONAME - _ZN20MsgUnifiedEditorView16createTempFolderEv @ 31 NONAME - _ZN20MsgUnifiedEditorView16enableSendButtonEb @ 32 NONAME - _ZN20MsgUnifiedEditorView16generateFileNameER7QString @ 33 NONAME - _ZN20MsgUnifiedEditorView16onContentChangedEv @ 34 NONAME - _ZN20MsgUnifiedEditorView16removeTempFolderEv @ 35 NONAME - _ZN20MsgUnifiedEditorView16staticMetaObjectE @ 36 NONAME DATA 16 - _ZN20MsgUnifiedEditorView17isReplyPathBrokenEv @ 37 NONAME - _ZN20MsgUnifiedEditorView17onDialogDeleteMsgEP8HbAction @ 38 NONAME - _ZN20MsgUnifiedEditorView17openDraftsMessageERK5QListI8QVariantE @ 39 NONAME - _ZN20MsgUnifiedEditorView19getStaticMetaObjectEv @ 40 NONAME - _ZN20MsgUnifiedEditorView19onDialogMmsSettingsEP8HbAction @ 41 NONAME - _ZN20MsgUnifiedEditorView19onDialogSmsSettingsEP8HbAction @ 42 NONAME - _ZN20MsgUnifiedEditorView19saveContentToDraftsEv @ 43 NONAME - _ZN20MsgUnifiedEditorView19serviceRequestErrorEiRK7QString @ 44 NONAME - _ZN20MsgUnifiedEditorView20activateInputBlockerEv @ 45 NONAME - _ZN20MsgUnifiedEditorView21doDelayedConstructionEv @ 46 NONAME - _ZN20MsgUnifiedEditorView21fetchMessageFromStoreER18ConvergedMessageIdN16ConvergedMessage11MessageTypeEi @ 47 NONAME - _ZN20MsgUnifiedEditorView22deactivateInputBlockerEv @ 48 NONAME - _ZN20MsgUnifiedEditorView22setAttachOptionEnabledENS_16TBE_AttachOptionEb @ 49 NONAME - _ZN20MsgUnifiedEditorView23handleViewExtnActivatedEP16HbListWidgetItem @ 50 NONAME - _ZN20MsgUnifiedEditorView25populateContentIntoEditorERK16ConvergedMessageb @ 51 NONAME - _ZN20MsgUnifiedEditorView25removeAttachmentContainerEv @ 52 NONAME - _ZN20MsgUnifiedEditorView25updateOtherRecipientCountEb @ 53 NONAME - _ZN20MsgUnifiedEditorView4sendEv @ 54 NONAME - _ZN20MsgUnifiedEditorView7addMenuEv @ 55 NONAME - _ZN20MsgUnifiedEditorView8addCcBccEv @ 56 NONAME - _ZN20MsgUnifiedEditorView8initViewEv @ 57 NONAME - _ZN20MsgUnifiedEditorView8setFocusEP26MsgUnifiedEditorBaseWidget @ 58 NONAME - _ZN20MsgUnifiedEditorView9vkbClosedEv @ 59 NONAME - _ZN20MsgUnifiedEditorView9vkbOpenedEv @ 60 NONAME - _ZN20MsgUnifiedEditorViewC1EP13QGraphicsItem @ 61 NONAME - _ZN20MsgUnifiedEditorViewC2EP13QGraphicsItem @ 62 NONAME - _ZN20MsgUnifiedEditorViewD0Ev @ 63 NONAME - _ZN20MsgUnifiedEditorViewD1Ev @ 64 NONAME - _ZN20MsgUnifiedEditorViewD2Ev @ 65 NONAME - _ZNK20MsgUnifiedEditorView10metaObjectEv @ 66 NONAME - _ZTI20MsgUnifiedEditorView @ 67 NONAME - _ZTV20MsgUnifiedEditorView @ 68 NONAME - _ZThn16_N20MsgUnifiedEditorViewD0Ev @ 69 NONAME - _ZThn16_N20MsgUnifiedEditorViewD1Ev @ 70 NONAME - _ZThn8_N20MsgUnifiedEditorViewD0Ev @ 71 NONAME - _ZThn8_N20MsgUnifiedEditorViewD1Ev @ 72 NONAME + _ZN20MsgUnifiedEditorView10addSubjectEb @ 8 NONAME + _ZN20MsgUnifiedEditorView10fetchAudioEv @ 9 NONAME + _ZN20MsgUnifiedEditorView10hideChromeEb @ 10 NONAME + _ZN20MsgUnifiedEditorView11fetchImagesEv @ 11 NONAME + _ZN20MsgUnifiedEditorView11packMessageER16ConvergedMessageb @ 12 NONAME + _ZN20MsgUnifiedEditorView11qt_metacallEN11QMetaObject4CallEiPPv @ 13 NONAME + _ZN20MsgUnifiedEditorView11qt_metacastEPKc @ 14 NONAME + _ZN20MsgUnifiedEditorView11resetLayoutEv @ 15 NONAME + _ZN20MsgUnifiedEditorView12createVCardsERK8QVariantR11QStringList @ 16 NONAME + _ZN20MsgUnifiedEditorView12focusChangedEv @ 17 NONAME + _ZN20MsgUnifiedEditorView13deleteMessageEv @ 18 NONAME + _ZN20MsgUnifiedEditorView13fetchContactsEv @ 19 NONAME + _ZN20MsgUnifiedEditorView13imagesFetchedERK8QVariant @ 20 NONAME + _ZN20MsgUnifiedEditorView14addAttachmentsE11QStringList @ 21 NONAME + _ZN20MsgUnifiedEditorView14handleKeyEventEi @ 22 NONAME + _ZN20MsgUnifiedEditorView15contactsFetchedERK8QVariant @ 23 NONAME + _ZN20MsgUnifiedEditorView15onAudioSelectedER7QString @ 24 NONAME + _ZN20MsgUnifiedEditorView15populateContentERK5QListI8QVariantE @ 25 NONAME + _ZN20MsgUnifiedEditorView16createTempFolderEv @ 26 NONAME + _ZN20MsgUnifiedEditorView16enableMenuActionEib @ 27 NONAME + _ZN20MsgUnifiedEditorView16ensureVisibilityEv @ 28 NONAME + _ZN20MsgUnifiedEditorView16generateFileNameER7QString @ 29 NONAME + _ZN20MsgUnifiedEditorView16onContentChangedEv @ 30 NONAME + _ZN20MsgUnifiedEditorView16removeTempFolderEv @ 31 NONAME + _ZN20MsgUnifiedEditorView16staticMetaObjectE @ 32 NONAME DATA 16 + _ZN20MsgUnifiedEditorView17isReplyPathBrokenEv @ 33 NONAME + _ZN20MsgUnifiedEditorView17onDialogDeleteMsgEP8HbAction @ 34 NONAME + _ZN20MsgUnifiedEditorView17openDraftsMessageERK5QListI8QVariantE @ 35 NONAME + _ZN20MsgUnifiedEditorView19getStaticMetaObjectEv @ 36 NONAME + _ZN20MsgUnifiedEditorView19onDialogMmsSettingsEP8HbAction @ 37 NONAME + _ZN20MsgUnifiedEditorView19onDialogSmsSettingsEP8HbAction @ 38 NONAME + _ZN20MsgUnifiedEditorView19saveContentToDraftsEv @ 39 NONAME + _ZN20MsgUnifiedEditorView19serviceRequestErrorEiRK7QString @ 40 NONAME + _ZN20MsgUnifiedEditorView20activateInputBlockerEv @ 41 NONAME + _ZN20MsgUnifiedEditorView21doDelayedConstructionEv @ 42 NONAME + _ZN20MsgUnifiedEditorView21fetchMessageFromStoreER18ConvergedMessageIdN16ConvergedMessage11MessageTypeEi @ 43 NONAME + _ZN20MsgUnifiedEditorView22deactivateInputBlockerEv @ 44 NONAME + _ZN20MsgUnifiedEditorView25populateContentIntoEditorERK16ConvergedMessagebb @ 45 NONAME + _ZN20MsgUnifiedEditorView4sendEv @ 46 NONAME + _ZN20MsgUnifiedEditorView7addMenuEv @ 47 NONAME + _ZN20MsgUnifiedEditorView8addCcBccEb @ 48 NONAME + _ZN20MsgUnifiedEditorView8doLayoutEv @ 49 NONAME + _ZN20MsgUnifiedEditorView8initViewEv @ 50 NONAME + _ZN20MsgUnifiedEditorView8setFocusEP26MsgUnifiedEditorBaseWidget @ 51 NONAME + _ZN20MsgUnifiedEditorView9vkbClosedEv @ 52 NONAME + _ZN20MsgUnifiedEditorView9vkbOpenedEv @ 53 NONAME + _ZN20MsgUnifiedEditorViewC1EP13QGraphicsItem @ 54 NONAME + _ZN20MsgUnifiedEditorViewC2EP13QGraphicsItem @ 55 NONAME + _ZN20MsgUnifiedEditorViewD0Ev @ 56 NONAME + _ZN20MsgUnifiedEditorViewD1Ev @ 57 NONAME + _ZN20MsgUnifiedEditorViewD2Ev @ 58 NONAME + _ZNK20MsgUnifiedEditorView10metaObjectEv @ 59 NONAME + _ZTI20MsgUnifiedEditorView @ 60 NONAME + _ZTV20MsgUnifiedEditorView @ 61 NONAME + _ZThn16_N20MsgUnifiedEditorViewD0Ev @ 62 NONAME + _ZThn16_N20MsgUnifiedEditorViewD1Ev @ 63 NONAME + _ZThn8_N20MsgUnifiedEditorViewD0Ev @ 64 NONAME + _ZThn8_N20MsgUnifiedEditorViewD1Ev @ 65 NONAME diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msgactivityhandler.h --- a/messagingapp/msgui/msgapp/inc/msgactivityhandler.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msgactivityhandler.h Tue Oct 19 11:30:16 2010 +0530 @@ -21,10 +21,16 @@ #include #include +#include class MsgMainWindow; class MsgViewManager; class AfActivityStorage; +class AfActivation; + +// Activity Names +const QString ListViewActivityName("MsgConversationsList"); +const QString EditorActivityName("MsgCreate"); class MsgActivityHandler: public QObject { @@ -47,7 +53,16 @@ * Saves the current running activity. */ void saveActivity(); - + +signals: + + /** + * Reemit activated signal from AfActivation + */ + void activated(Af::ActivationReason reason, + QString name, + QVariantHash parameters); + public: /** * Set the message main window pointer. @@ -73,6 +88,11 @@ */ AfActivityStorage* activitiyStorage(); + /** + * This return the Af activition instance + */ + AfActivation* activation(); + private: /** * main window reference not owned. @@ -84,6 +104,12 @@ * Own. */ AfActivityStorage *mActivityStorage; + + /** + * App Framework activation + * Own. + */ + AfActivation *mActivation; }; #endif /* MSGACTIVITYHANDLER_H_ */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msgapplication.h --- a/messagingapp/msgui/msgapp/inc/msgapplication.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msgapplication.h Tue Oct 19 11:30:16 2010 +0530 @@ -43,11 +43,21 @@ */ void initViewReady(); + /** + * symbianEventFilter + * handles S60 events + */ + bool symbianEventFilter(const QSymbianEvent *event); + private slots: void handleAppReady(); signals: void applicationReady(); + +signals: + // emitted when close event is handled + void closeEvent(); }; #endif // MSGAPPLICATION_H_ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msglistview.h --- a/messagingapp/msgui/msgapp/inc/msglistview.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msglistview.h Tue Oct 19 11:30:16 2010 +0530 @@ -102,11 +102,6 @@ void doDelayedConstruction(); /** - * Handles saving to contacts - */ - void saveToContacts(); - - /** * Opens contact card for resolved contact. */ void contactInfo(); @@ -167,6 +162,9 @@ * Own */ QGraphicsLinearLayout *mMainLayout; + #ifdef MSGUI_MSGAPP_UNIT_TEST + friend class TestMsgListView; + #endif }; #endif // MSG_LIST_VIEW_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msglistviewitem.h --- a/messagingapp/msgui/msgapp/inc/msglistviewitem.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msglistviewitem.h Tue Oct 19 11:30:16 2010 +0530 @@ -145,7 +145,7 @@ /** * Unit Testing */ - #ifdef MSGUI_UNIT_TEST + #ifdef MSGUI_MSGAPP_UNIT_TEST friend class TestMsgListViewItem; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msgmainwindow.h --- a/messagingapp/msgui/msgapp/inc/msgmainwindow.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msgmainwindow.h Tue Oct 19 11:30:16 2010 +0530 @@ -27,6 +27,7 @@ class MsgViewManager; class MsgServiceInterface; class MsgSendServiceInterface; +class MsgActivityHandler; /** * Main window of the messaging application. Activates the @@ -40,7 +41,8 @@ /** * Constructor */ - MsgMainWindow(bool serviceRequest, + MsgMainWindow(bool serviceRequest, + MsgActivityHandler *handler, QWidget *parent = 0); /** @@ -53,6 +55,7 @@ */ MsgViewManager* viewManager(); + protected: /** @@ -60,7 +63,12 @@ * @see QGraphicsItem */ void keyPressEvent(QKeyEvent *event); - + + /** + * Event filter on application + */ + bool eventFilter(QObject *obj, QEvent *event); + private: /** * This initializes the member objects @@ -71,11 +79,15 @@ MsgServiceInterface* mMsgSI; MsgSendServiceInterface* mMsgSendSI; MsgViewManager* mViewManager; + /** + * Not owned + */ + MsgActivityHandler* mActivityHandler; /** * Unit Testing */ - #ifdef MSGUI_UNIT_TEST + #ifdef MSGUI_MSGAPP_UNIT_TEST friend class TestMsgMainWindow; #endif diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/inc/msgviewmanager.h --- a/messagingapp/msgui/msgapp/inc/msgviewmanager.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/inc/msgviewmanager.h Tue Oct 19 11:30:16 2010 +0530 @@ -22,6 +22,7 @@ #include #include #include +#include class HbMainWindow; class MsgUnifiedEditorView; @@ -33,6 +34,8 @@ class MsgSettingsView; class HbAction; class HbView; +class MsgActivityHandler; +class TsTaskSettings; class MsgViewManager: public QObject { @@ -103,6 +106,12 @@ */ bool handleKeyEvent(int key); + /** + * Sets the activity handler + * @param activityHandler + */ + void setActivityHandler(MsgActivityHandler* activityHandler); + private: /** * swiches back to last view after service request is complete. @@ -177,12 +186,6 @@ * Appends the views to be deleted into a QList to be deleted when view is ready */ void appendViewToBeDeleted(HbView* view); - - /** - * Save the editor data to be populated - * @param editorData QVariantList - */ - void populateUniEditorAfterViewReady(const QVariantList& editorData); /** * opens unieditor as activity. @@ -230,9 +233,23 @@ void onDialogSaveTone(HbAction* action); /** - * When this slot is called the saved editor data is set to the editor + * Send the app to background + */ + void handleSendToBackGround(); + +public slots: + + /** + * Set the view for the app */ - void populateUniEditorView(); + void handleApplicationActive(); + + /** + * Handler for activated signal + */ + void handleActivated(Af::ActivationReason reason, + QString name, + QVariantHash parameters); private: /** @@ -251,7 +268,11 @@ MsgSettingsView* mSettingsView; HbAction* mBackAction; - + /** + * Not owned + */ + MsgActivityHandler* mActivityHandler; + TsTaskSettings* mClient; int mPreviousView; int mCurrentView; int mViewAtServiceRequest; @@ -262,8 +283,12 @@ HbView* mDummyview; int mMessageId; - QVariantList mEditorData; QVariantList mViewerData; + /* + * Keeps track of the app background status + * if set then it means app is in background + */ + bool mBringtoForground; }; #endif /* MSGVIEWMANAGER_H_ */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/msgapp.pro --- a/messagingapp/msgui/msgapp/msgapp.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/msgapp.pro Tue Oct 19 11:30:16 2010 +0530 @@ -104,8 +104,13 @@ -lsettingsview \ -lringbc \ -lafservice \ - -lunidatamodelloader - + -lunidatamodelloader \ + -ltstaskmonitorclient \ + -lapgrfx \ + -leikcore \ + -lcone \ + -lQtServiceFramework + symbian:MMP_RULES += SMPSAFE diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/draftslistview.cpp --- a/messagingapp/msgui/msgapp/src/draftslistview.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/draftslistview.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -45,7 +45,7 @@ // LOCAL CONSTANTS const QString POPUP_LIST_FRAME("qtg_fr_popup_list_normal"); const QString NEW_MESSAGE_ICON("qtg_mono_create_message"); -const QString SORT_ICON("qtg_mono_sort"); +const QString SORT_ICON("qtg_mono_show_view"); // LOCALIZATION CONSTANTS diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/main.cpp --- a/messagingapp/msgui/msgapp/src/main.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/main.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -23,8 +23,11 @@ #include #include #include +#include #include "msgmainwindow.h" +#include "msgviewmanager.h" +#include "msgactivityhandler.h" #include "msgapplication.h" //Localised constants @@ -32,7 +35,6 @@ const QString debugFileName("c:/art2_app_log.txt"); const QString activityParam("-activity"); -const int INVALID_MSGID = -1; #ifdef _DEBUG_TRACES_ void debugInit(QtMsgType type, const char *msg) @@ -94,13 +96,16 @@ { HbSplashScreen::setScreenId("clv"); } - + // Application //MsgApplication class dervied from HbApplication is create in order to //emit applicationReady signal for Matti tool - MsgApplication app(argc, argv); + MsgApplication app(argc, argv); - + //TODO pass this flag to viewmanager to prevent saving of activity + //if this is set + //bool preloaded = HbApplication::startedToBackground(); + //TODO: Uncomment the lines when actual translation files are available in sdk and remove loading locally. QString locale = QLocale::system().name(); QString path = "z:/resource/qt/translations/"; @@ -122,11 +127,22 @@ } qInstallMsgHandler(debugInit); #endif - + + MsgActivityHandler* activityHandler = new MsgActivityHandler(&app); // Main window - QPointer mainWindow = - new MsgMainWindow(serviceRequest); - app.initViewReady(); + QPointer mainWindow = new MsgMainWindow(serviceRequest, + activityHandler); + app.initViewReady(); + // Set the main window pointer to activity handler. + activityHandler->setMainWindow(mainWindow); + + //Install event filter on app + app.installEventFilter(mainWindow); + + // connect to aboutToQuit signal to save activity + QObject::connect(&app, SIGNAL(closeEvent()), + mainWindow->viewManager(), SLOT(handleSendToBackGround())); + mainWindow->show(); // Event loop diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msgactivityhandler.cpp --- a/messagingapp/msgui/msgapp/src/msgactivityhandler.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msgactivityhandler.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -18,17 +18,18 @@ #include "msgactivityhandler.h" +#include +#include +#include +#include + #include "msgviewmanager.h" #include "msgbaseview.h" #include "msgmainwindow.h" -#include -#include + +QTM_USE_NAMESPACE const int INVALID_MSGID = -1; -// Activity Names -const QString ListViewActivityName("MsgConversationsList"); -const QString EditorActivityName("MsgCreate"); - //----------------------------------------------------------------------------- // MsgActivityHandler::MsgActivityHandler // Constructor @@ -36,7 +37,15 @@ MsgActivityHandler::MsgActivityHandler(QObject* parent): QObject(parent) { - mActivityStorage = new AfActivityStorage(); + QServiceManager serviceManager; + mActivityStorage = static_cast + (serviceManager.loadInterface("com.nokia.qt.activities.Storage")); + mActivation = static_cast + (serviceManager.loadInterface("com.nokia.qt.activities.Activation")); + + connect(mActivation, + SIGNAL(activated(Af::ActivationReason, QString, QVariantHash)), + this, SIGNAL(activated(Af::ActivationReason, QString, QVariantHash))); } //----------------------------------------------------------------------------- @@ -49,6 +58,10 @@ delete mActivityStorage; mActivityStorage = NULL; } + if(mActivation) { + delete mActivation; + mActivation = NULL; + } } //----------------------------------------------------------------------------- @@ -137,3 +150,13 @@ { return mActivityStorage; } + +//----------------------------------------------------------------------------- +// MsgActivityHandler::activitiyStorage +// @see header +//----------------------------------------------------------------------------- +AfActivation* MsgActivityHandler::activation() +{ + return mActivation; +} + diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msgapplication.cpp --- a/messagingapp/msgui/msgapp/src/msgapplication.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msgapplication.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -18,6 +18,8 @@ //include #include #include +#include +#include //userinclude #include "msgapplication.h" @@ -47,3 +49,21 @@ HbMainWindow *window = hbInstance->allMainWindows().first(); disconnect(window, SIGNAL(viewReady()),this,SLOT(handleAppReady())); } + +/* + * Overloaded method + * handles S60 events + */ +bool MsgApplication::symbianEventFilter(const QSymbianEvent *event) +{ + QSymbianEvent::Type eventType = event->type(); + + // handle close event + if (eventType == QSymbianEvent::CommandEvent && + event->command() == EEikCmdExit) { + emit closeEvent(); + return true; + } + return false; +} + diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msglistview.cpp --- a/messagingapp/msgui/msgapp/src/msglistview.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msglistview.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -31,9 +31,10 @@ #include #include #include -#include -#include +#include +#include #include +#include #include #include @@ -50,7 +51,7 @@ //Icons const QString POPUP_LIST_FRAME("qtg_fr_popup_list_normal"); const QString NEW_MESSAGE_ICON("qtg_mono_create_message"); -const QString SORT_ICON("qtg_mono_sort"); +const QString SORT_ICON("qtg_mono_show_view"); //Localized constants @@ -59,7 +60,6 @@ //itemspecific menu #define LOC_OPEN hbTrId("txt_common_menu_open") -#define LOC_SAVETO_CONTACTS hbTrId("txt_messaging_menu_save_to_contacts") #define LOC_DELETE_CONVERSATION hbTrId("txt_messaging_menu_delete_conversation") #define LOC_OPEN_CONTACT_INFO hbTrId("txt_messaging_menu_contact_info") @@ -129,20 +129,12 @@ //save to contacts for unresolved. int msgType = viewItem->modelIndex().data(MessageType).toInt(); - if(msgType == ConvergedMessage::Sms || - msgType == ConvergedMessage::Mms || - msgType == ConvergedMessage::BioMsg) - { - qint64 contactId = mMsgList->currentIndex().data(ContactId).toLongLong(); - if(contactId < 0) - { - contextMenu->addAction(LOC_SAVETO_CONTACTS,this,SLOT(saveToContacts())); - } - else - { - contextMenu->addAction(LOC_OPEN_CONTACT_INFO,this,SLOT(contactInfo())); - } - } + if (msgType == ConvergedMessage::Sms || + msgType == ConvergedMessage::Mms || + msgType == ConvergedMessage::BioMsg) + { + contextMenu->addAction(LOC_OPEN_CONTACT_INFO, this, SLOT(contactInfo())); + } //delete conversation contextMenu->addAction(LOC_DELETE_CONVERSATION,this,SLOT(deleteItem())); @@ -365,71 +357,39 @@ } //--------------------------------------------------------------- -// MsgListView::saveToContacts -// @see header -//--------------------------------------------------------------- -void MsgListView::saveToContacts() - { - //save to contacts with phone number field prefilled. - QList args; - - QString data = mMsgList->currentIndex().data(DisplayName).toString(); - - QString type = QContactPhoneNumber::DefinitionName; - - args << type; - args << data; - - //service stuff. - QString service("phonebookservices"); - QString interface("com.nokia.symbian.IContactsEdit"); - QString operation("editCreateNew(QString,QString)"); - - XQAiwRequest* request; - XQApplicationManager appManager; - request = appManager.create(service, interface, operation, true); // embedded - if ( request == NULL ) - { - return; - } - - request->setArguments(args); - request->send(); - - delete request; - } - -//--------------------------------------------------------------- // MsgListView::contactInfo // @see header //--------------------------------------------------------------- void MsgListView::contactInfo() - { - //open contact info. - QList args; +{ + QList args; + XQAiwRequest* request = NULL; + XQApplicationManager appManager; int contactId = mMsgList->currentIndex().data(ContactId).toInt(); - args << contactId; - - //service stuff. - QString service("phonebookservices"); - QString interface("com.nokia.symbian.IContactsView"); - QString operation("openContactCard(int)"); + if (contactId < 0) { + // open temp contact card + request = appManager.create(XQI_CONTACTS_VIEW, + XQOP_CONTACTS_VIEW_TEMP_CONTACT_CARD_WITH_DETAIL, true); // Embedded + args << QContactPhoneNumber::DefinitionName; // Type + args << mMsgList->currentIndex().data(DisplayName).toString(); // Actual data + } + else { + // open existing contact card + request = appManager.create(XQI_CONTACTS_VIEW, XQOP_CONTACTS_VIEW_CONTACT_CARD, true); // Embedded + args << contactId; + } - XQAiwRequest* request; - XQApplicationManager appManager; - request = appManager.create(service, interface, operation, true); // embedded - if ( request == NULL ) - { - return; - } + if (request == NULL) { + return; + } request->setArguments(args); request->send(); - + delete request; - } +} //--------------------------------------------------------------- // MsgListView::onDialogDeleteMsg diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msglistviewitem.cpp --- a/messagingapp/msgui/msgapp/src/msglistviewitem.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msglistviewitem.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -244,7 +244,8 @@ switch (sendState) { case ConvergedMessage::Resend: { - previewText = LOC_MSG_RESEND_AT.arg(dateTimeString); + previewText = LOC_MSG_RESEND_AT; + previewText.append(" "+dateTimeString); dateTimeString = QString(); setCommonIndicator(MSG_OUTGOING_ICON); break; diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msgmainwindow.cpp --- a/messagingapp/msgui/msgapp/src/msgmainwindow.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msgmainwindow.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -35,8 +35,10 @@ // MsgMainWindow::MsgMainWindow // Constructor //--------------------------------------------------------------- -MsgMainWindow::MsgMainWindow(bool serviceRequest, QWidget *parent) : -HbMainWindow(parent), mMsgSI(0), mMsgSendSI(0) +MsgMainWindow::MsgMainWindow(bool serviceRequest, + MsgActivityHandler *handler, + QWidget *parent) : +HbMainWindow(parent), mMsgSI(0), mMsgSendSI(0),mActivityHandler(handler) { initialize(serviceRequest); } @@ -49,10 +51,8 @@ { int activityMsgId = INVALID_MSGID; - MsgActivityHandler* activityHandler = - new MsgActivityHandler(this); - AfActivation *activation = new AfActivation( this ); + AfActivation *activation = mActivityHandler->activation(); Af::ActivationReason reason = activation->reason(); @@ -63,12 +63,15 @@ QString actName = activation->name(); - QVariant data = activityHandler->activitiyStorage()->activityData(actName); + QVariant data = mActivityHandler->activitiyStorage()-> + activityData(actName); - activityMsgId = activityHandler->parseActivityData(data); + activityMsgId = mActivityHandler->parseActivityData(data); } mViewManager = new MsgViewManager(serviceRequest,this,this,activityMsgId); + mViewManager->setActivityHandler(mActivityHandler); + mMsgSI = new MsgServiceInterface(NULL,mViewManager); mMsgSendSI = new MsgSendServiceInterface(NULL,mViewManager); @@ -76,14 +79,14 @@ ConversationsEngine::instance(); // clear the old activities - activityHandler->clearActivities(); + mActivityHandler->clearActivities(); // Set the main window pointer to activity handler. - activityHandler->setMainWindow(this); + mActivityHandler->setMainWindow(this); // connect to aboutToQuit signal to save drafts content QObject::connect(qApp, SIGNAL(aboutToQuit()), - activityHandler, SLOT(saveActivity())); + mActivityHandler, SLOT(saveActivity())); } //--------------------------------------------------------------- @@ -135,4 +138,16 @@ } +//--------------------------------------------------------------- +// MsgMainWindow::eventFilter +// @see header +//--------------------------------------------------------------- +bool MsgMainWindow::eventFilter(QObject *obj, QEvent *event) +{ + if (event->type() == QEvent::ApplicationActivate) { + mViewManager->handleApplicationActive(); + } + return QObject::eventFilter(obj, event); +} + // End of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgapp/src/msgviewmanager.cpp --- a/messagingapp/msgui/msgapp/src/msgviewmanager.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgapp/src/msgviewmanager.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -27,6 +27,12 @@ #include #include #include +#include +#include +#include +#include +#include +#include #include "conversationsengine.h" #include "msglistview.h" @@ -40,6 +46,7 @@ #include "unidatamodelloader.h" #include "unidatamodelplugininterface.h" #include "msgcontacthandler.h" +#include "msgactivityhandler.h" #include "debugtraces.h" // LOCALIZATION @@ -47,11 +54,16 @@ #define LOC_DIALOG_SAVE_RINGTONE hbTrId("txt_conversations_dialog_save_ringing_tone") const qint64 NULL_CONVERSATIONID = -1; +const int INVALID_MSGID = -1; -MsgViewManager::MsgViewManager(bool serviceRequest, HbMainWindow* mainWindow, QObject* parent,int activityMsgId) : - QObject(parent), mMainWindow(mainWindow), mUniEditor(0), mListView(0), mConversationView(0), - mUniViewer(0), mDraftsListView(0), mSettingsView(0), mBackAction(0), - mServiceRequest(serviceRequest), mConversationId(-1), mViewServiceRequest(false),mMessageId(-1) +MsgViewManager::MsgViewManager(bool serviceRequest, HbMainWindow* mainWindow, + QObject* parent, int activityMsgId) : + QObject(parent), mMainWindow(mainWindow), mUniEditor(0), mListView(0), + mConversationView(0), mUniViewer(0), mDraftsListView(0), + mSettingsView(0), mBackAction(0), mActivityHandler(0), mClient(0), + mServiceRequest(serviceRequest), mConversationId(-1), + mViewServiceRequest(false), mMessageId(-1), + mBringtoForground(false) { //creating back action. mBackAction = new HbAction(Hb::BackNaviAction, this); @@ -83,8 +95,6 @@ MsgViewManager::~MsgViewManager() { - // TODO Auto-generated destructor stub - mEditorData.clear(); } void MsgViewManager::onBackAction() @@ -99,7 +109,7 @@ } if (!mServiceRequest) { - HbApplication::quit(); + handleSendToBackGround(); } else { completeServiceRequest(); @@ -401,6 +411,10 @@ { QVariantList param; + mClient->setVisibility(true); + mActivityHandler->clearActivities(); + mBringtoForground = false; + if (conversationId < 0) { param << MsgBaseView::CLV; param << MsgBaseView::SERVICE; @@ -708,8 +722,7 @@ } if (MsgBaseView::DLV == mPreviousView) { - //Populate editor after view ready indication - populateUniEditorAfterViewReady(editorData); + mUniEditor->openDraftsMessage(editorData); } else { mUniEditor->populateContent(editorData); @@ -990,37 +1003,6 @@ } // ---------------------------------------------------------------------------- -// MsgViewManager::populateEditorAfterViewReady -// @see header -// ---------------------------------------------------------------------------- -void MsgViewManager::populateUniEditorAfterViewReady(const QVariantList& editorData) - { - QCRITICAL_WRITE("MsgViewManager::populateUniEditorAfterViewReady start."); - //Save the editor data and use it in ViewReady handler - mEditorData = editorData; - connect(mMainWindow, SIGNAL(viewReady()), this, SLOT(populateUniEditorView())); - QCRITICAL_WRITE("MsgViewManager::populateUniEditorAfterViewReady end."); - } - -// ---------------------------------------------------------------------------- -// MsgViewManager::populateUniEditorView -// @see header -// ---------------------------------------------------------------------------- -void MsgViewManager::populateUniEditorView() - { - QCRITICAL_WRITE("MsgViewManager::populateUniEditorView start."); - if (mUniEditor) - { - mUniEditor->openDraftsMessage(mEditorData); - } - mEditorData.clear(); - - disconnect(mMainWindow, SIGNAL(viewReady()), this, - SLOT(populateUniEditorView())); - QCRITICAL_WRITE("MsgViewManager::populateUniEditorView end."); -} - -// ---------------------------------------------------------------------------- // MsgViewManager::onDialogDeleteMsg // @see header // ---------------------------------------------------------------------------- @@ -1166,4 +1148,126 @@ return localId; } +// ---------------------------------------------------------------------------- +// MsgViewManager::handleSendToBackGround +// @see header +// ---------------------------------------------------------------------------- +void MsgViewManager::handleSendToBackGround() + { + if(mBringtoForground == false) + { + if (!mClient) + mClient = new TsTaskSettings; + mClient->setVisibility(false); + + + mServiceRequest = false; + mMainWindow->lower(); + + mActivityHandler->saveActivity(); + + mMainWindow->removeView(mListView); + delete mListView; + mListView = NULL; + + if(mConversationView) + { + mMainWindow->removeView(mConversationView); + delete mConversationView; + mConversationView = NULL; + } + + if(mUniEditor) + { + mMainWindow->removeView(mUniEditor); + delete mUniEditor; + mUniEditor = NULL; + } + + mBringtoForground = true; + + TUid appUid = RProcess().SecureId(); + TApaTaskList taskList(CEikonEnv::Static()->WsSession()); + TApaTask task = taskList.FindApp(appUid); + if(task.Exists()) + { + task.SendToBackground(); + } + } + mPreviousView = MsgBaseView::DEFAULT; + mCurrentView = MsgBaseView::DEFAULT; + } + +// ---------------------------------------------------------------------------- +// MsgViewManager::handleApplicationActive +// @see header +// ---------------------------------------------------------------------------- +void MsgViewManager::handleApplicationActive() + { + if(mBringtoForground) + { + mServiceRequest = false; + mClient->setVisibility(true); + mActivityHandler->clearActivities(); + + mBringtoForground = false; + + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::CLV; + switchView(param); + } + } + +// ---------------------------------------------------------------------------- +// MsgViewManager::setActivityHandler +// @see header +// ---------------------------------------------------------------------------- +void MsgViewManager::setActivityHandler(MsgActivityHandler* activityHandler) + { + mActivityHandler = activityHandler; + connect(mActivityHandler, + SIGNAL(activated(Af::ActivationReason, QString, QVariantHash)), + this, + SLOT(handleActivated(Af::ActivationReason, QString, QVariantHash))); + } + +// ---------------------------------------------------------------------------- +// MsgViewManager::handleActivated +// @see header +// ---------------------------------------------------------------------------- +void MsgViewManager::handleActivated(Af::ActivationReason reason, + QString name, + QVariantHash parameters) + { + Q_UNUSED(parameters) + mClient->setVisibility(true); + mBringtoForground = false; + mServiceRequest = false; + + if( reason == Af::ActivationReasonActivity) + { + QVariant data; + if(name == EditorActivityName) + { + bool ok = QMetaObject::invokeMethod( + mActivityHandler->activitiyStorage(),"activityData", + Q_RETURN_ARG(QVariant,data),Q_ARG(QString,name)); + } + int activityMsgId = mActivityHandler->parseActivityData(data); + if(activityMsgId == INVALID_MSGID) + { + QVariantList param; + param << MsgBaseView::CLV; + param << MsgBaseView::CLV; + switchView(param); + } + else + { + openUniEditorActivity(activityMsgId); + } + } + mActivityHandler->clearActivities(); + } + //EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgaudiofetcher/tsrc/tsrc.pri --- a/messagingapp/msgui/msgaudiofetcher/tsrc/tsrc.pri Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgaudiofetcher/tsrc/tsrc.pri Tue Oct 19 11:30:16 2010 +0530 @@ -13,7 +13,12 @@ # # Description: # -# + +QT += testlib +QT -= gui + +CONFIG += hb +CONFIG += symbian_test TEMPLATE = app TARGET.CAPABILITY = All -TCB @@ -37,22 +42,11 @@ # msgui tsrc INCLUDEPATH += ../../../tsrc/shared -# messaging inc -#INCLUDEPATH += ../../../../../inc -#INCLUDEPATH += ../../../msguiutils/inc -#INCLUDEPATH += ../../../../msgutils/unieditorutils/editorgenutils/inc -#INCLUDEPATH += ../../../appengine/inc -#INCLUDEPATH += ../../../../smartmessaging/ringbc/inc -#INCLUDEPATH += ../../../../msgsettings/settingsview/inc -#INCLUDEPATH += ../../../../msgutils/unidatamodel/univcaldataplugin/inc INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE -QT += testlib -QT -= gui -CONFIG += hb -CONFIG += symbian_test + #HEADERS diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiofetchermodel/unittest_msgaudiofetchermodel.pro --- a/messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiofetchermodel/unittest_msgaudiofetchermodel.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiofetchermodel/unittest_msgaudiofetchermodel.pro Tue Oct 19 11:30:16 2010 +0530 @@ -25,6 +25,32 @@ "./resources/Esp.rng c:/data/testAudioFetcher/Esp.rng" \ "./resources/Desk.rng c:/data/testAudioFetcher/Desk.rng" +symbian: { + + addnondrm.sources = ./resources/nondrm.amr + addnondrm.path = C:/data/testAudioFetcher + DEPLOYMENT += addnondrm + + adddrm.sources = ./resources/drm.amr + adddrm.path = C:/data/testAudioFetcher + DEPLOYMENT += adddrm + + addDRM_DM.sources = ./resources/DRM_DM.dm + addDRM_DM.path = C:/data/testAudioFetcher + DEPLOYMENT += addDRM_DM + + addDRM_ARM.sources = ./resources/DRM_AMR.dcf + addDRM_ARM.path = C:/data/testAudioFetcher + DEPLOYMENT += addDRM_ARM + + addEsp_Rng.sources = ./resources/Esp.rng + addEsp_Rng.path = C:/data/testAudioFetcher + DEPLOYMENT += addEsp_Rng + + addDesk_Rng.sources = ./resources/Desk.rng + addDesk_Rng.path = C:/data/testAudioFetcher + DEPLOYMENT += addDesk_Rng + } include(../tsrc.pri) RESOURCES += unittest_msgaudiofetchermodel.qrc diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiopreview/unittest_msgaudiopreview.pro --- a/messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiopreview/unittest_msgaudiopreview.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msgaudiofetcher/tsrc/unittest_msgaudiopreview/unittest_msgaudiopreview.pro Tue Oct 19 11:30:16 2010 +0530 @@ -22,6 +22,14 @@ #RESOURCES += unittest_msgaudiopreview.qrc +BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include " \ + "./resources/drm.amr c:/data/testAudioFetcher/drm.amr" +symbian: { + adddrm.sources = ./resources/drm.amr + adddrm.path = C:/data/testAudioFetcher + DEPLOYMENT += adddrm + } + # Input HEADERS += unittest_msgaudiopreview.h SOURCES += unittest_msgaudiopreview.cpp \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/msguiutils/src/msgservicelaunchutil.cpp --- a/messagingapp/msgui/msguiutils/src/msgservicelaunchutil.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/msguiutils/src/msgservicelaunchutil.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -21,6 +21,7 @@ #include #include #include +#include #include "msgservicelaunchutil.h" #include "msgcontactsutil.h" @@ -29,6 +30,7 @@ // LOCAL CONSTANTS #define LOC_TITLE hbTrId("txt_messaging_title_messaging") +#define LOC_FILE_NOT_OPEN hbTrId("txt_messages_dialog_file_cannot_be_opened") const QString VCARD_MIMETYPE("text/X-vCard"); //-------------------------------------------------------------- @@ -124,11 +126,13 @@ request = appManager.create(sf, d); if (!request) { + HbDeviceMessageBox::information(LOC_FILE_NOT_OPEN); sf.close(); return; } } else { + HbDeviceMessageBox::information(LOC_FILE_NOT_OPEN); sf.close(); return; } diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditoraddress.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditoraddress.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditoraddress.h Tue Oct 19 11:30:16 2010 +0530 @@ -38,8 +38,7 @@ /** * Constructor */ - MsgUnifiedEditorAddress(const QString& label, - QGraphicsItem *parent = 0); + MsgUnifiedEditorAddress(const QString& label, QGraphicsItem *parent = 0); /** * Destructor @@ -62,7 +61,7 @@ * setter method to set address * @param addrlist, list of addresses to be set in address editor */ - void setAddresses(ConvergedMessageAddressList addrlist,bool aSkipCheck=FALSE); + void setAddresses(ConvergedMessageAddressList addrlist,bool aSkipCheck=false); /** * Get amount of digits to be used in contact matching @@ -85,17 +84,6 @@ */ void setFocus(); -signals: - /** - * Emitted when send button from virtual ITUT is pressed. - */ - void sendMessage(); - - /** - * Emitted when content is added or removed - */ - void contentChanged(); - private slots: /** @@ -158,6 +146,16 @@ * Reset the addresslist to previous list */ void resetToPrevious(); + + /** + * emits contentsChanged signal on address count change. + */ + void emitContentsChanged(); + + /** + * Checks if address field has a valid email id. + */ + bool hasValidEmailAddress(); private: @@ -205,6 +203,14 @@ * limit e.g. multiple selection from contact selection dialog */ int mExceedsMaxMmsRecipientsBy; + + /** + * Number of addresses present. + */ + int mAddressCount; +#ifdef UNIEDITOR_UNIT_TEST + friend class TestMsgUnifiedEditorAddress; +#endif }; #endif //MSG_UNIFIED_EDITOR_ADDRESS_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorattachment.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorattachment.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorattachment.h Tue Oct 19 11:30:16 2010 +0530 @@ -172,7 +172,7 @@ */ MsgUnifiedEditorUtils *mEditorUtils; -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST /** * Unit Testing */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorattachmentcontainer.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorattachmentcontainer.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorattachmentcontainer.h Tue Oct 19 11:30:16 2010 +0530 @@ -17,13 +17,13 @@ #ifndef MSG_UNIFIED_EDITOR_ATTACHMENT_CONTAINER_H #define MSG_UNIFIED_EDITOR_ATTACHMENT_CONTAINER_H -#include +#include #include "msgunieditorattachment.h" class QGraphicsLinearLayout; class MmsConformanceCheck; -class MsgAttachmentContainer : public HbWidget +class MsgAttachmentContainer : public MsgUnifiedEditorBaseWidget { Q_OBJECT @@ -78,12 +78,15 @@ * @return size */ int containerSize(); + + /** + * check if given file name is in use or not. + * @param fileName, file name under queation + * @return true/false if in use/not use. + */ + bool fileNameInUse(const QString& fileName); signals: - /** - * emit when container content changes - */ - void contentChanged(); /** * emit to indicate view that container is now empty @@ -98,12 +101,6 @@ void deleteAttachment(MsgUnifiedEditorAttachment* attachment); private: - /** - * size of the msg - */ - int messageSize(); - -private: /** * container's layout @@ -124,6 +121,10 @@ * flag to tell, if container is holding MM content */ bool mIsMMContent; + +#ifdef UNIEDITOR_UNIT_TEST + friend class TestMsgAttachmentContainer; +#endif }; #endif // MSG_UNIFIED_EDITOR_ATTACHMENT_CONTAINER_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditoraudiowidget.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditoraudiowidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditoraudiowidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -122,7 +122,7 @@ */ bool mValidMediaDuration; -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST /** * Unit Testing */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorbasewidget.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorbasewidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorbasewidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -29,6 +29,9 @@ MsgUnifiedEditorBaseWidget(QGraphicsItem *parent = 0):HbWidget(parent){} virtual void setFocus(){} +signals: + void contentsChanged(const QVariant& data); + }; diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorbody.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorbody.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorbody.h Tue Oct 19 11:30:16 2010 +0530 @@ -22,14 +22,9 @@ #include #include "msgunieditorprocessimageoperation.h" -class HbTextEdit; -class HbTextItem; -class HbFrameItem; class CMsgMediaResolver; class CMsgImageInfo; class MmsConformanceCheck; -class UniEditorPluginInterface; -class UniEditorPluginLoader; class MsgUnifiedEditorPixmapWidget; class MsgUniFiedEditorAudioWidget; @@ -56,11 +51,6 @@ /** * Seeker method to return back data to editor's view */ - QString text(); - - /** - * Seeker method to return back data to editor's view - */ const QStringList mediaContent(); /** @@ -69,27 +59,6 @@ */ int bodySize(); - /* - * Returns value of mUnicode - * @return mUnicode - */ - bool isUnicode(); - - /* - * Disables char counter - */ - void disableCharCounter(); - - /* - * Enables char counter - */ - void enableCharCounter(); - - /** - * To set focus on editable field. - */ - void setFocus(); - /** * Get to find body already contains an image * @return bool @@ -108,13 +77,6 @@ */ void EditorOperationEvent( TUniEditorProcessImageOperationEvent aEvent, TFileName& aFileName ); - /** - * Function which tells whether the image resize process is in progress - */ - bool isImageResizing() - { - return mIsImageResizing; - } /** * remove media content.called when file is not avaialable @@ -128,37 +90,13 @@ * @param medialist list of absolute paths of media. * @param draftMessage specifies draft message */ - void setImage(QString& imagefile, bool draftMessage = false); + void setImage(const QString& imagefile, bool draftMessage = false); /** * Called to insert audio content in editor. * @param medialist list of absolute paths of media. */ - void setAudio(QString& audiofile); - - /** - * Called to insert body text in editor. - * @param text body text. - */ - void setText(QString& text); - -signals: - /** - * Emitted when send button from virtual ITUT is pressed. - */ - void sendMessage(); - - /** - * Emitted when msg-body content changes - */ - void contentChanged(); - - /** - * Emitted when image is being processed. - * @param enable, true to enable/ false to disable. - */ - void enableSendButton(bool enable) const; - + void setAudio(const QString& audiofile); protected: // from HbWidget @@ -169,6 +107,10 @@ */ QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint) const; +signals: + //emitted to enable or disable menu options. + void enableMenuAction(int action, bool enable); + private slots: /** @@ -176,11 +118,6 @@ */ void removeMedia(); - /** - * handle text changes in body field - */ - void onTextChanged(); - private: /** @@ -193,11 +130,6 @@ * Set that body now contains an audio */ void setAudio(bool audio = false); - - /** - * size of the msg - */ - int messageSize(); /** * Handler for set image function @@ -228,11 +160,6 @@ bool mHasAudio; /** - * editor to in put text. - */ - HbTextEdit* mTextEdit; - - /** * icon item to preview images. */ MsgUnifiedEditorPixmapWidget* mPixmapItem; @@ -276,11 +203,6 @@ * Size of audio in body */ int mAudioSize; - - /** - * Size of video in body - */ - int mVideoSize; /** * CUniEditorProcessImageOperation object @@ -298,49 +220,6 @@ CMsgImageInfo *mImageInfo; /** - * Instance of HbTextItem - * Will be deleted automatically by parent. - * Own. - */ - HbTextItem *mCharCounter; - - /** - * Instance of HbFrameItem - * Will be deleted automatically by parent. - * Own. - */ - HbFrameItem* mBackgroundItem; - - /** - * Holds the previous buffer inside msgeditor - */ - QString mPrevBuffer; - - /** - * Holds char type supported - */ - int mCharSupportType; - - /** - * Instance of UniEditorPluginInterface - * Will be deleted automatically by parent. - * Own. - */ - UniEditorPluginInterface* mPluginInterface; - - /** - * Instance of UniEditorPluginLoader - * Will be deleted when UniEditorPluginInterface object is deleted - * Not Own. - */ - UniEditorPluginLoader* mPluginLoader; - - /* - * Maintains information if any unicode character has been entered or not - */ - bool mUnicode; - - /** * Content widget for processing animation. */ HbWidget* mProcessingWidget; @@ -350,11 +229,11 @@ */ bool mDraftMessage ; - /* - * Flag to indicate the state of image resizing process. - * true - resize in progress. false - resize is not underway. - */ - bool mIsImageResizing; +#ifdef UNIEDITOR_UNIT_TEST + friend class TestMsgUnifiedEditorBody; +#endif + + }; #endif //MSG_UNIFIED_EDITOR_BODY_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorbodyeditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorbodyeditor.h Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2009 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: + * + */ + +#ifndef MSG_UNIFIED_EDITOR_BODY_EDITOR_H +#define MSG_UNIFIED_EDITOR_BODY_EDITOR_H + +// SYSTEM INCLUDES +#include +#include + +// FORWARD DECLARATIONS +class HbPushButton; +class HbFrameItem; +class HbTextItem; +class UniEditorPluginLoader; +class UniEditorPluginInterface; +class UniEditorGenUtils; +class ConvergedMessage; + +/** + * Custom editor class + */ +class MsgEditor : public HbTextEdit +{ + Q_OBJECT + +public: + /** + * Constructor + */ + MsgEditor(QGraphicsItem *parent = 0); + +protected: + /** + * reimplemented from base class. + */ + void inputMethodEvent(QInputMethodEvent *event); +}; + +/** + * This class is a custom layout widget for Msg Editor. + */ + +class MsgUnifiedEditorBodyEditor : public MsgUnifiedEditorBaseWidget +{ + Q_OBJECT + +public: + + /** + * Constructor + */ + MsgUnifiedEditorBodyEditor(QGraphicsItem *parent = 0); + + /** + * Destructor + */ + virtual ~MsgUnifiedEditorBodyEditor(); + +public: + /* Setter/Getter methods */ + + /** + * Returns the editor's contents. + * @return Editor contents + */ + QString content() const; + + /** + * Set the editor's content. + * @param contentText content text to set. + */ + void setContent(const QString &contentText); + + /** + * This function does initialisations needed for character counter + */ + void setEncodingSettingsL(); + + /** + * Packs body editor data to ConvergedMessage object. + * @param msg. ConvergedMessage object.(out parameter) + */ + void packMessage(ConvergedMessage &msg); + + /** + * Populate data into body editor from ConvergedMessage. + * @param msg, ConvergedMessage object. + */ + void populateContent(const ConvergedMessage& msg); + +signals: + + /** + * Emitted when send button is pressed. + */ + void sendMessage(); + +public slots: + + /** + * Enables/Disables send button based on message rediness for send. + */ + void enableSendButton(bool enable); + +private slots: + + /** + * Called when editor content is chaged. + */ + void onContentsChanged(); + + /** + * called when send button is pressed/released. + */ + void onPressed(); + void onReleased(); + +private: + + /** + * Initialization function. + */ + void init(); + + /** + * To update back ground. + */ + void updateButtonBackgroundAndColor(const QString& bg,const QString& iconColor); + +private: + + /** + * Instance of message edit. + * Will be deleted automatically by parent. + * Own. + */ + MsgEditor *mMsgEditor; + + /** + * Instance of push button. + * Will be deleted automatically by parent. + * Own. + */ + HbPushButton *mSendButton; + + /** + * Instance of HbTextItem + * Will be deleted automatically by parent. + * Own. + */ + HbTextItem *mCharCounter; + + /** + * Instance of HbFrameItem + * Will be deleted automatically by parent. + * Own. + */ + HbFrameItem* mBackgroundItem; + + /** + * Holds char type supported + */ + int mCharSupportType; + + /** + * Instance of UniEditorPluginInterface + * Will be deleted automatically by parent. + * Own. + */ + UniEditorPluginInterface* mPluginInterface; + + /** + * Instance of UniEditorPluginLoader + * Will be deleted when UniEditorPluginInterface object is deleted + * Not Own. + */ + UniEditorPluginLoader* mPluginLoader; + + /** + * Instance of UniEditorGenUtils + * Own. + */ + UniEditorGenUtils* mEditorUtils; + +#ifdef UNIEDITOR_UNIT_TEST + /** + * Unit Testing + */ + friend class TestMsgUnifiedEditorBodyEditor; +#endif +}; + +#endif // MSG_UNIFIED_EDITOR_BODY_EDITOR_H +// EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorimageprocessor.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorimageprocessor.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorimageprocessor.h Tue Oct 19 11:30:16 2010 +0530 @@ -408,6 +408,12 @@ TInt iQFactorCalculated; TInt iMPixFactor; TInt iOriginalQualityFactor; +#ifdef UNIEDITOR_UNIT_TEST + /** + * Unit Testing + */ + friend class TestCUniImageProcessor; +#endif }; #include diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorlineedit.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorlineedit.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorlineedit.h Tue Oct 19 11:30:16 2010 +0530 @@ -18,11 +18,11 @@ #ifndef MSG_UNIFIED_EDITOR_LINEEDIT_H #define MSG_UNIFIED_EDITOR_LINEEDIT_H -#include +#include #include -class MsgUnifiedEditorLineEdit : public HbLineEdit +class MsgUnifiedEditorLineEdit : public HbTextEdit { Q_OBJECT @@ -89,6 +89,7 @@ void setHighlight(int currentPos); QString text() const; void handleTap(); + void setSelection(int start, int length); private: QRegExp mLabelExpr; @@ -99,7 +100,7 @@ int mSelectionEnd; bool mDefaultBehaviour; -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST friend class TestMsgUnifiedEditorLineEdit; #endif }; diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditormonitor.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditormonitor.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditormonitor.h Tue Oct 19 11:30:16 2010 +0530 @@ -20,6 +20,7 @@ #include #include "convergedmessage.h" + class MsgUnifiedEditorView; class HbWidget; class UniEditorGenUtils; @@ -48,62 +49,100 @@ * Set to skip showing note for first time * @param skip true/false */ - inline void setSkipNote(bool skip = true); + inline void setSkipNote(bool skip = true) + { + mSkipNote = skip; + } /** * Seeker method to access current message type */ - static inline ConvergedMessage::MessageType messageType(); + static inline ConvergedMessage::MessageType messageType() + { + return mMessageType; + } /** * seeker function to get current msg size in bytes */ - static inline int messageSize(); + static inline int messageSize() + { + return mBodyContentSize + mContainerSize + mSubjectSize; + } /** * seeker function to get current msg's body size * in bytes */ - static inline int bodySize(); + static inline int bodySize() + { + return mBodyContentSize; + } /** * seeker function to get current msg's attachment * container size in bytes */ - static inline int containerSize(); + static inline int containerSize() + { + return mContainerSize; + } /** * seeker function to get current msg's subject * size in bytes */ - static inline int subjectSize(); + static inline int subjectSize() + { + return mSubjectSize; + } /** * seeker function to get max possible mms size * in bytes */ - static inline int maxMmsSize(); + static inline int maxMmsSize() + { + return mMaxMmsSize; + } /** * seeker funtion to get max recipient count for sms */ - static inline int maxSmsRecipients(); + static inline int maxSmsRecipients() + { + return mMaxSmsRecipients; + } /** * seeker funtion to get max recipient count for mms */ - static inline int maxMmsRecipients(); + static inline int maxMmsRecipients() + { + return mMaxMmsRecipients; + } /** * get total address count in To, Cc & Bcc fields */ - static inline int msgAddressCount(); + static inline int msgAddressCount() + { + return mToAddressCount + mCcAddressCount + mBccAddressCount; + } + + /** + * tells if message is ready for send. + */ + static inline bool readyForSend() + { + return mReadyForSend; + } public slots: /** * slot to handle content change in any editor component */ - void handleContentChange(); + void handleContentsChanged(const QVariant& data); signals: /** @@ -111,6 +150,11 @@ * @param enable true if send is possible else false. */ void enableSend(bool enable); + + /** + * Emitte when contents are changed, to set drafts flag. + */ + void contentsChanged(); private: /** @@ -124,22 +168,11 @@ ConvergedMessage::MessageType projectedMsgType(); /** - * update various msg info changes during editing - * @param senderWidget, Editor widget which triggered - * content change slot - */ - void updateMsgInfo(HbWidget* senderWidget); - - /** * show type change discreet note */ void showPopup(const QString& text); - /** - * accessor for view - */ - MsgUnifiedEditorView* view(); - + /** * check editor body for MMS content * @return true if MMS content is present @@ -168,6 +201,16 @@ * Checks if composed message can be sent and emits a signal. */ void updateSend(); + + /** + * Updates body content size. + */ + void updateBodyContentSize(); + + /** + * resets value of static member variables. + */ + void reset(); private: @@ -176,6 +219,31 @@ * Note need to be skipped when an mms is opened from draft. */ bool mSkipNote; + + /** + * Flag to keep information, if attachment container has mms content. + */ + bool mContainerHasMmsContent; + + /** + * Priority. + */ + ConvergedMessage::Priority mPriority; + + /** + * Email id is present in to field or not. + */ + bool mEmailPresent; + + /** + * Body text has uni code char(s). + */ + bool mUniCode; + + /** + * Flag to hold state of image resizing + */ + bool mImageResizing; /** * Type of msg under composition in the editor @@ -188,6 +256,16 @@ static int mBodySize; /** + * msg body text size in bytes + */ + static int mBodyTextSize; + + /** + * msg body content (mBodySize + mBodyTextSize + mime headers) size in bytes. + */ + static int mBodyContentSize; + + /** * msg container size in bytes */ static int mContainerSize; @@ -213,17 +291,29 @@ static int mMaxMmsRecipients; /** - * current msg address count (to + cc + bcc) + * Address count in various fields. */ - static int mMsgCurrAddressCount; + static int mToAddressCount; + static int mCcAddressCount; + static int mBccAddressCount; + + /** + * flag to check if message is ready for send. + */ + static bool mReadyForSend; /** * UniEditorGenUtils object * Owned */ UniEditorGenUtils* mUniEditorGenUtils; +#ifdef UNIEDITOR_UNIT_TEST + /** + * Unit Testing + */ + friend class TestMsgUnifiedEditorView; + friend class TestMsgUnifiedEditorMonitor; +#endif }; -#include "msgunieditormonitor.inl" - #endif //MSG_UNIFIED_EDITOR_MONITOR_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditormonitor.inl --- a/messagingapp/msgui/unifiededitor/inc/msgunieditormonitor.inl Tue Oct 05 13:58:47 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,111 +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: msgmonitor.inl -*/ - - - -// ========== INLINE METHODS =============================== - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::setSkipNote -// @see header file -//--------------------------------------------------------------- -inline void MsgUnifiedEditorMonitor::setSkipNote(bool skip) -{ - mSkipNote = skip; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::messageType -// @see header file -//--------------------------------------------------------------- -inline ConvergedMessage::MessageType MsgUnifiedEditorMonitor::messageType() -{ - return mMessageType; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::messageSize -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::messageSize() -{ - return mBodySize + mContainerSize + mSubjectSize; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::bodySize -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::bodySize() -{ - return mBodySize; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::containerSize -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::containerSize() -{ - return mContainerSize; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::subjectSize -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::subjectSize() -{ - return mSubjectSize; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::maxMmsSize -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::maxMmsSize() -{ - return mMaxMmsSize; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::maxSmsRecipients -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::maxSmsRecipients() -{ - return mMaxSmsRecipients; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::maxMmsRecipients -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::maxMmsRecipients() -{ - return mMaxMmsRecipients; -} - -//--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::msgAddressCount -// @see header file -//--------------------------------------------------------------- -inline int MsgUnifiedEditorMonitor::msgAddressCount() -{ - return mMsgCurrAddressCount; -} - -// End of File diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorpixmapwidget.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorpixmapwidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorpixmapwidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -120,7 +120,7 @@ */ QString mPixmapPath; -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST /** * Unit Testing */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorprocessimageoperation.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorprocessimageoperation.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorprocessimageoperation.h Tue Oct 19 11:30:16 2010 +0530 @@ -260,6 +260,9 @@ TInt iMmsCreationMode; RFs iFs; TBool largeImageQuery; +#ifdef UNIEDITOR_UNIT_TEST + friend class TestCUniEditorProcessImageOperation; +#endif }; #endif //MSG_UNIFIED_EDITOR_PROCESS_IMAGEOPERATION_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorscrollarea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorscrollarea.h Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,162 @@ +/* + * Copyright (c) 2009 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: manages scrollable portion of view. + * + */ + +#ifndef MSGUNIEDITORSCROLLAREA_H_ +#define MSGUNIEDITORSCROLLAREA_H_ + +#include +#include "convergedmessageaddress.h" + +class QGraphicsLinearLayout; +class MsgUnifiedEditorAddress; +class MsgUnifiedEditorSubject; +class MsgUnifiedEditorBody; +class MsgUnifiedEditorBaseWidget; +class ConvergedMessage; +class MsgAttachmentContainer; +class MsgUnifiedEditorMonitor; + +class MsgUnifiedEditorScrollArea : public HbScrollArea +{ + Q_OBJECT + +public: + MsgUnifiedEditorScrollArea(MsgUnifiedEditorMonitor* msgMonitor,QGraphicsItem *parent = 0); + ~MsgUnifiedEditorScrollArea(); + + /** + * Tells if contacts in "To" "Cc" , "Bcc" field are valid or not + */ + bool contactsValid(); + + /** + * First address of "To" field. + */ + ConvergedMessageAddress* currentAddress(); + + /** + * Packs the content inside editor into converged message + * @param [OUT]msg, converged message to hold editor data + * @param isSave, flag to indicate that msg needs to be packed + * for saving to draft or not + * @return returns error if something fails + */ + int packMessage(ConvergedMessage &msg, bool isSave); + + /** + * add attachments to the editor + * @param files list of file paths + */ + void addAttachments(const QStringList files); + + /** + * Checks if vcf file name is already in use or not. + */ + bool fileNameInUse(const QString& fileName); + + /** + * Enables/Disables scrolling based on parameter passed. + */ + void enableScrolling(bool enable); + + /** + * Populate data into various fields from ConvergedMessage. + * @param msg, ConvergedMessage object. + * @param draftMessage, true if message is opened from drafts. + */ + void populateContent(const ConvergedMessage& msg, bool draftMessage, bool checkForInline); + +protected: + /** + * Reimplemented from base class. + */ + virtual bool scrollByAmount(const QPointF &delta); + + + +private: + void init(); + void setFocus(MsgUnifiedEditorBaseWidget* item); + void formatAddresses(ConvergedMessageAddressList& addresses); + +signals: + //emitted to enable or disable attach submenu options. + void enableMenuAction(int action, bool enable); + +public slots: + + /** + * Posts event to launch key pad. + */ + void postInputPanelEvent(); + + /** + * slot to add Cc,Bcc field. + */ + void addCcBcc(bool needFocus = false); + + /** + * slot to add subject field. + */ + void addSubject(bool needFocus = false); + + /** + * slot to change priority. + */ + void changePriority(); + + void setImage(const QString& path, bool draftMessage = false); + + void setAudio(const QString& filePath); + +private slots: + + /** + * slot to handle Cc, Bcc group-box's toggle action + */ + void updateOtherRecipientCount(bool state); + + /** + * slot to tell view to remove the attachment's container + */ + void removeAttachmentContainer(); + + /** + * add an attachment to the editor + * @return addition operation status + */ + int addAttachment(const QString& filepath); + + +private: + + MsgUnifiedEditorMonitor* mMsgMonitor; + QGraphicsLinearLayout* mMainLayout; + MsgUnifiedEditorAddress* mToField; + MsgUnifiedEditorAddress* mCcField; + MsgUnifiedEditorAddress* mBccField; + MsgUnifiedEditorSubject* mSubjectField; + MsgUnifiedEditorBody* mBody; + MsgAttachmentContainer* mAttachmentContainer; + + bool mEnableScrolling; +#ifdef UNIEDITOR_UNIT_TEST + friend class TestMsgUnifiedEditorScrollArea; +#endif +}; + +#endif /* MSGUNIEDITORSCROLLAREA_H_ */ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorsubject.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorsubject.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorsubject.h Tue Oct 19 11:30:16 2010 +0530 @@ -73,12 +73,6 @@ */ void setFocus(); -signals: - /** - * Emitted when subject/priority content is added or removed - */ - void contentChanged(); - private slots: /** * called when contentsChanged signal is emitted by the line edit @@ -119,7 +113,7 @@ */ QString mPrevBuffer; -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST friend class TestMsgUnifiesEditorSubject; #endif }; diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorutils.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorutils.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorutils.h Tue Oct 19 11:30:16 2010 +0530 @@ -83,6 +83,9 @@ * @param filePath Absolute path of content. */ void launchViaSharableFile(const QString &filePath); +#ifdef UNIEDITOR_UNIT_TEST + friend class TestMsgUnifiedEditorUtils; +#endif }; diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/inc/msgunieditorview.h --- a/messagingapp/msgui/unifiededitor/inc/msgunieditorview.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/inc/msgunieditorview.h Tue Oct 19 11:30:16 2010 +0530 @@ -18,7 +18,7 @@ #ifndef MSG_UNIFIED_EDITOR_VIEW_H #define MSG_UNIFIED_EDITOR_VIEW_H -#ifdef MSGUI_UNIT_TEST +#ifdef UNIEDITOR_UNIT_TEST #define UNIFIEDEDITOR_EXPORT #else #ifdef UNIFIEDEDITOR_DLL @@ -31,23 +31,59 @@ #include "msgbaseview.h" #include "convergedmessage.h" #include "convergedmessageid.h" +#include -class HbWidget; class HbAction; -class HbGroupBox; class QGraphicsLinearLayout; -class MsgUnifiedEditorSubject; -class MsgUnifiedEditorAddress; -class MsgUnifiedEditorBody; class MsgUnifiedEditorMonitor; -class MsgAttachmentContainer; class UniEditorPluginLoader; -class HbListWidgetItem; -class HbAbstractVkbHost; class MsgUnifiedEditorBaseWidget; -class HbListWidget; class MsgAudioFetcherDialog; +class MsgUnifiedEditorScrollArea; +class MsgUnifiedEditorBodyEditor; +/** + * options in menu. + */ +enum MENU_ACTIONS +{ + PHOTO = 0x00, + SOUND = 0x01, + VCARD = 0x02, + SUBJECT = 0x03, + CCBCC = 0x04 +}; + +/** + * Custom vkb host specific to unifiededitor. + */ +class MsgUniEditorVkbHost: public HbStaticVkbHost +{ + Q_OBJECT + +public: + MsgUniEditorVkbHost(HbWidget *target) : HbStaticVkbHost(target){} + +signals: + /** + * emitted when focus changes. + */ + void focusChanged(); + +protected: + /** + * Reimpleted from base class. + */ + void refresh() + { + emit focusChanged(); + HbStaticVkbHost::refresh(); + } +}; + +/** + * unified editor view class. + */ class UNIFIEDEDITOR_EXPORT MsgUnifiedEditorView : public MsgBaseView { Q_OBJECT @@ -76,7 +112,6 @@ */ void openDraftsMessage(const QVariantList& editorData); - /** * Saves the content inside editor to save */ @@ -89,12 +124,7 @@ * @see MsgBaseView */ bool handleKeyEvent(int key); - -protected: - /** - * reimplemented from base class to provide proper geometry for scrolling. - */ - void resizeEvent( QGraphicsSceneResizeEvent * event ); + private: @@ -104,11 +134,6 @@ void addMenu(); /** - * helper method to add tool bar. - */ - void addToolBar(); - - /** * Packs the content inside editor into converged message * @param [OUT]msg, converged message to hold editor data * @param isSave, flag to indicate that msg needs to be packed @@ -122,8 +147,9 @@ * @param messageDetails message details * @param draftMessage boolean for specifying draft message */ - void populateContentIntoEditor( - const ConvergedMessage& messageDetails, bool draftMessage = false); + void populateContentIntoEditor(const ConvergedMessage& messageDetails, + bool draftMessage, + bool checkForInline); /** * Populate the editor with the message's content @@ -133,8 +159,8 @@ * @param editorOperation, forward or reply or replyAll etc */ void fetchMessageFromStore(ConvergedMessageId& messageId, - ConvergedMessage::MessageType messageType, - int editorOperation); + ConvergedMessage::MessageType messageType, + int editorOperation); /** * Create VCards for all the contacts available in the list @@ -151,20 +177,6 @@ */ QString generateFileName(QString& suggestedName); - /** - * Fetch images - */ - void fetchImages(); - - /** - * Fetch contacts - */ - void fetchContacts(); - - /** - * Fetch audio - */ - void fetchAudio(); /** * To hide/show chrome. @@ -185,52 +197,18 @@ * Removes editors temp folder. */ void removeTempFolder(); - - /** - * Attachment options in TBE - * Row number of the TBE actions - */ - enum TBE_AttachOption - { - TBE_PHOTO = 0x00, TBE_SOUND = 0x01, TBE_VCARD = 0x02 - }; - - /** - * Enable/Disable attachment options for slide-conformance - * @param opt, row number of action in TBE - * @param isEnabled, true/false - */ - void setAttachOptionEnabled(MsgUnifiedEditorView::TBE_AttachOption opt, - bool enable); - - /** - * Addresses are all ok. Now parse not allowed chars away - * before giving it to MTM - * @param addresses, list of ConvergedMessageAddress - */ - void formatAddresses(ConvergedMessageAddressList& addresses); private slots: /** * slot to add subject field. */ - void addSubject(); + void addSubject(bool needFocus = false); /** * slot to add Cc,Bcc field. */ - void addCcBcc(); - - /** - * slot to handle Cc, Bcc group-box's toggle action - */ - void updateOtherRecipientCount(bool state); - - /** - * slot to change priority. - */ - void changePriority(); + void addCcBcc(bool needFocus = false); /** * slot to current delete message. @@ -253,26 +231,10 @@ void send(); /** - * slot to tell view to remove the attachment's container - */ - void removeAttachmentContainer(); - - /** * add attachments to the editor * @param files list of file paths */ void addAttachments(QStringList files); - - /** - * add an attachment to the editor - * @return addition operation status - */ - int addAttachment(const QString& filepath); - - /** - * called when extention item is clicked. - */ - void handleViewExtnActivated(HbListWidgetItem* item); /** * Signal emitted when an error is generated. @@ -314,7 +276,7 @@ void setFocus(MsgUnifiedEditorBaseWidget* item); /** - * Listens to contentChanged signal of various fields. + * Listens to contentChanged signal for various editor fields. */ void onContentChanged(); @@ -335,22 +297,6 @@ * @param action selected action (yes or no). */ void onDialogMmsSettings(HbAction* action); - - /** - * Enable/Disable send tool button. - * @param true/false to enable/disable. - */ - void enableSendButton(bool enable); - - /** - * This slot is triggered when vkb is about to be opened. - */ - void vkbAboutToOpen(); - - /** - * This slot is triggered when vkb is about to be closed. - */ - void vkbAboutToClose(); /** * This slot is called after sound clip is @@ -363,38 +309,73 @@ * @return bool, true if reply-path constraints are broken */ bool isReplyPathBroken(); + + /** + * Fetch images + */ + void fetchImages(); + + /** + * Fetch contacts + */ + void fetchContacts(); + + /** + * Fetch audio + */ + void fetchAudio(); + + /** + * Enable/Disable/removes menu actions. + * @param opt, submenu actions. + * @param isEnabled, true/false + */ + void enableMenuAction(int action, bool enable); + + /** + * Resets layout when vkb is cosed. + */ + void resetLayout(); + + /** + * Perform layouting when vkb is opened. + */ + void doLayout(); + + /** + * Ensures visibility of editor widget in to visible area. + */ + void ensureVisibility(); + + /** + * Updates focus widget when editor gains focus. + */ + void focusChanged(); + private: - HbAction* mSubjectAction; - HbAction* mCcBccAction; - HbAction* mSendAction; + /** + * main layout of view. + */ QGraphicsLinearLayout* mMainLayout; - MsgUnifiedEditorSubject* mSubjectField; - MsgUnifiedEditorAddress* mToField; - MsgUnifiedEditorAddress* mCcField; - MsgUnifiedEditorAddress* mBccField; - MsgUnifiedEditorBody* mBody; - - HbWidget* mContentWidget; - MsgUnifiedEditorMonitor* mMsgMonitor; - MsgAttachmentContainer* mAttachmentContainer; UniEditorPluginLoader* mPluginLoader; + + /** + * Message id of current opened message. + */ ConvergedMessageId mOpenedMessageId; - ConvergedMessage::MessageType mmOpenedMessageType; + + /** + * flag to check if message can be saved to drafts. + */ bool mCanSaveToDrafts; - HbAction *mAttachAction; - - /** - * TBE's content widget - */ - HbListWidget* mTBExtnContentWidget; /** * Instance of VKB host */ - HbAbstractVkbHost* mVkbHost; + MsgUniEditorVkbHost* mVkbHost; /** * Instance of Audio Fetcher Dialog @@ -418,8 +399,47 @@ * Flag to tell if reply-path is available */ bool mReplyPath; - - friend class MsgUnifiedEditorMonitor; + + /** + * Scrollable conatiner. + */ + MsgUnifiedEditorScrollArea* mScrollArea; + + /** + * Body text editor. + */ + MsgUnifiedEditorBodyEditor* mBodyEditor; + + /** + * Various actions. + */ + HbAction* mSubjectAction; + HbAction* mCcBccAction; + HbAction* mPhotoAction; + HbAction* mSoundAction; + + /** + * Widget currently focussed. + */ + QGraphicsWidget* mFocusedWidget; + + /** + * Min height of foucssed widget. + */ + qreal mMinHeight; + + /** + * Max height of focussed widget. + */ + qreal mMaxHeight; + +#ifdef UNIEDITOR_UNIT_TEST + /** + * Unit Testing + */ + friend class TestMsgUnifiedEditorView; +#endif + }; #endif //MSG_UNIFIED_EDITOR_VIEW_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.css --- a/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.css Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.css Tue Oct 19 11:30:16 2010 +0530 @@ -16,48 +16,6 @@ layout: layout-landscape-image; } -/**************************** Text field margin ******************************/ -MsgUnifiedEditorBody::textEdit:portrait { - left: -var(hb-param-margin-gene-left); - right: var(hb-param-margin-gene-right); -} - -MsgUnifiedEditorBody[hasImage="true"][hasAudio="true"]::textEdit:portrait { - top: -var(hb-param-margin-gene-middle-vertical); -} - -MsgUnifiedEditorBody[hasImage="true"][hasAudio="false"]::textEdit:portrait { - top: -var(hb-param-margin-gene-middle-vertical); -} - -MsgUnifiedEditorBody[hasImage="false"][hasAudio="true"]::textEdit:portrait { - top: -var(hb-param-margin-gene-middle-vertical); -} - -MsgUnifiedEditorBody[hasImage="false"][hasAudio="false"]::textEdit:portrait { - top: 0.0un; -} - -MsgUnifiedEditorBody::textEdit:landscape { - right: var(hb-param-margin-gene-right); -} - -MsgUnifiedEditorBody[hasImage="true"]::textEdit:landscape { - left: -1.0un; -} - -MsgUnifiedEditorBody[hasImage="false"]::textEdit:landscape { - left: -var(hb-param-margin-gene-left); -} - -MsgUnifiedEditorBody[hasAudio="true"]::textEdit:landscape { - top: -var(hb-param-margin-gene-middle-vertical); -} - -MsgUnifiedEditorBody[hasAudio="false"]::textEdit:landscape { - top: 0.0un; -} - /*************************** Image field margin ******************************/ MsgUnifiedEditorBody::pixmap { left: -var(hb-param-margin-gene-left); @@ -68,7 +26,7 @@ } MsgUnifiedEditorBody::pixmap:landscape { - right: 1.0un; + right: var(hb-param-margin-gene-right); } MsgUnifiedEditorBody[hasAudio="true"]::pixmap { @@ -86,19 +44,3 @@ right: var(hb-param-margin-gene-right); } -/*************************** Character Counter ******************************/ - -MsgUnifiedEditorBody::charCounter -{ - text-height:var(hb-param-text-height-tiny); - text-align:centre; - text-line-count-min: 1; - text-line-count-max: 1; -} - -MsgUnifiedEditorBody::charCounterFrame -{ - size-policy: fixed, fixed ; - pref-height: expr(var(hb-param-text-height-tiny)+2*var(hb-param-margin-gene-middle-vertical)); - pref-width: expr(var(hb-param-text-height-tiny)*3 + 2*var(hb-param-margin-gene-middle-horizontal)); -} diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.widgetml --- a/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.widgetml Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbody.widgetml Tue Oct 19 11:30:16 2010 +0530 @@ -7,19 +7,8 @@ - - - - - - - - - - - - - + + @@ -28,18 +17,8 @@ - - - - - - - - - - - - + + @@ -47,21 +26,10 @@ - - - - - - - - - - - - - - + + + diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbodyeditor.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbodyeditor.css Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,49 @@ +MsgUnifiedEditorBodyEditor +{ + layout:layout-msg-editor; +} + +MsgUnifiedEditorBodyEditor::msgEditor +{ + left: -var(hb-param-margin-gene-left); + right:var(hb-param-margin-gene-middle-horizontal); + bottom:var(hb-param-margin-gene-middle-vertical); + top:-var(hb-param-margin-gene-middle-vertical); + min-height:7.46un; +} + +MsgUnifiedEditorBodyEditor::msgEditor:portrait +{ + max-height: expr(var(hb-param-screen-long-edge)/4); +} + +MsgUnifiedEditorBodyEditor::msgEditor:landscape +{ + max-height: expr(var(hb-param-screen-short-edge)/3); +} + +MsgUnifiedEditorBodyEditor::sendButton +{ + top:-var(hb-param-margin-gene-middle-vertical); + right: var(hb-param-margin-gene-right); + bottom:var(hb-param-margin-gene-middle-vertical); + fixed-width: 9.34un; + fixed-height: 7.46un; +} + +MsgUnifiedEditorBodyEditor::charCounter +{ + text-height:var(hb-param-text-height-tiny); + text-align:centre; + text-line-count-min: 1; + text-line-count-max: 1; +} + +MsgUnifiedEditorBodyEditor::charCounterFrame +{ + right:var(hb-param-margin-gene-middle-horizontal); + top:-var(hb-param-margin-gene-middle-vertical); + size-policy: fixed, fixed ; + pref-height: expr(var(hb-param-text-height-tiny)+2*var(hb-param-margin-gene-middle-vertical)); + pref-width: expr(var(hb-param-text-height-tiny)*3 + 2*var(hb-param-margin-gene-middle-horizontal)); +} diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbodyeditor.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/resources/layouts/msgunifiededitorbodyeditor.widgetml Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/resources/qtg_anim_loading.axml --- a/messagingapp/msgui/unifiededitor/resources/qtg_anim_loading.axml Tue Oct 05 13:58:47 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - -qtg_anim_loading_1 -qtg_anim_loading_2 -qtg_anim_loading_3 -qtg_anim_loading_4 -qtg_anim_loading_5 -qtg_anim_loading_6 -qtg_anim_loading_7 -qtg_anim_loading_8 -qtg_anim_loading_9 -qtg_anim_loading_10 - - diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditoraddress.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditoraddress.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditoraddress.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -63,7 +63,8 @@ mSkipMaxRecipientQuery(false), mAboutToExceedMaxSmsRecipients(false), mAboutToExceedMaxMmsRecipients(false), -mExceedsMaxMmsRecipientsBy(0) +mExceedsMaxMmsRecipientsBy(0), +mAddressCount(0) { this->setContentsMargins(0,0,0,0); @@ -75,8 +76,6 @@ mAddressEdit = new MsgUnifiedEditorLineEdit(label,this); HbStyle::setItemName(mAddressEdit,"addressField"); - - mAddressEdit->setMaxRows(40); connect(mAddressEdit, SIGNAL(contentsChanged(const QString&)), this, SLOT(onContentsChanged(const QString&))); @@ -89,9 +88,6 @@ MsgUnifiedEditorAddress::~MsgUnifiedEditorAddress() { - //TODO: Should remove this code depending on orbit's reply whether it is needed - //to unregister the same plugin registered on two different widgets twice. - //style()->unregisterPlugin(mPluginPath); } void MsgUnifiedEditorAddress::fetchContacts() @@ -330,6 +326,9 @@ void MsgUnifiedEditorAddress::onContentsChanged(const QString& text) { + + emitContentsChanged(); + // Max MMS recipient count check if( mAboutToExceedMaxMmsRecipients || (MsgUnifiedEditorMonitor::msgAddressCount() >= MsgUnifiedEditorMonitor::maxMmsRecipients()) ) @@ -345,20 +344,18 @@ } else { - // update monitor data - emit contentChanged(); if(MsgUnifiedEditorMonitor::msgAddressCount() > MsgUnifiedEditorMonitor::maxMmsRecipients()) { HbMessageBox::information(LOC_MMS_RECIPIENT_LIMIT_REACHED, 0, 0, HbMessageBox::Ok); resetToPrevious(); - // reset monitor data - emit contentChanged(); } else { mPrevBuffer = text; } } + + emitContentsChanged(); return; } @@ -379,8 +376,8 @@ {// remember addresses before the block insertion started mPrevBuffer = text; } - emit contentChanged(); } + emitContentsChanged(); } void MsgUnifiedEditorAddress::handleRecipientLimitReached() @@ -529,14 +526,15 @@ { HbMessageBox *dlg = qobject_cast (sender()); if (action == dlg->actions().at(0)) { - // accept new content, update prev-buffer - emit contentChanged(); mPrevBuffer = mAddressEdit->content(); } else { // reject the new content, keep the old resetToPrevious(); } + + emitContentsChanged(); + } // ---------------------------------------------------------------------------- @@ -593,6 +591,36 @@ mLaunchBtn->blockSignals(false); } +void MsgUnifiedEditorAddress::emitContentsChanged() +{ + int currentAddressCount = addressCount(); + bool hasEmail = hasValidEmailAddress(); + + if(mAddressCount != currentAddressCount || hasEmail) + { + mAddressCount = currentAddressCount; + QVariantList data; + data << mAddressCount << hasEmail; + emit contentsChanged(data); + } +} + +bool MsgUnifiedEditorAddress::hasValidEmailAddress() +{ + bool result = false; + QStringList addressList = mAddressEdit->addresses(); + QRegExp emailExp("\\S+@\\S+"); + int i = addressList.indexOf(emailExp);//getting item index having @ symbol. + + //check if index is valid. + if(i >= 0 ) + { + result = true; + } + + return result; +} + Q_IMPLEMENT_USER_METATYPE(CntServicesContact) Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList) diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorattachmentcontainer.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditorattachmentcontainer.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorattachmentcontainer.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -35,13 +35,15 @@ // @see header file //--------------------------------------------------------------- MsgAttachmentContainer::MsgAttachmentContainer( QGraphicsItem *parent ) : -HbWidget(parent), +MsgUnifiedEditorBaseWidget(parent), mIsMMContent(false) { + this->setObjectName("attachmentContainer"); + mLayout = new QGraphicsLinearLayout(Qt::Vertical, this); mLayout->setContentsMargins(0,0,0,0); mLayout->setSpacing(0); - mMmsConformanceCheck = new MmsConformanceCheck; + mMmsConformanceCheck = new MmsConformanceCheck; } //--------------------------------------------------------------- @@ -64,7 +66,8 @@ if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(filepath)) return EAddNotSupported; - int msgSize = messageSize(); + int msgSize = MsgUnifiedEditorMonitor::messageSize(); + QFileInfo fileinfo(filepath); int fileSize = fileinfo.size() + KEstimatedMimeHeaderSize; @@ -81,10 +84,12 @@ int index = mLayout->count(); mLayout->insertItem(index,att); connect(att, SIGNAL(deleteMe(MsgUnifiedEditorAttachment*)), - this, SLOT(deleteAttachment(MsgUnifiedEditorAttachment*))); + this, SLOT(deleteAttachment(MsgUnifiedEditorAttachment*))); // emit to signal that container content & size changed - emit contentChanged(); + QVariantList data; + data << containerSize() << mIsMMContent; + emit contentsChanged(data); } else { @@ -111,7 +116,10 @@ } // emit to indicate change in container content & size - emit contentChanged(); + QVariantList data; + data << containerSize() << mIsMMContent; + emit contentsChanged(data); + if(mAttachmentList.count() == 0) { emit emptyAttachmentContainer(); @@ -153,15 +161,6 @@ } //--------------------------------------------------------------- -// MsgAttachmentContainer::messageSize -// @see header file -//--------------------------------------------------------------- -int MsgAttachmentContainer::messageSize() -{ - return containerSize() + MsgUnifiedEditorMonitor::bodySize() + MsgUnifiedEditorMonitor::subjectSize(); -} - -//--------------------------------------------------------------- // MsgAttachmentContainer::hasMMContent // @see header file //--------------------------------------------------------------- @@ -170,5 +169,26 @@ return mIsMMContent; } +//--------------------------------------------------------------- +// MsgAttachmentContainer::fileNameInUse +// @see header file +//--------------------------------------------------------------- +bool MsgAttachmentContainer::fileNameInUse(const QString& fileName) +{ + bool alreadyExists = false; + + for(int i=0; ipath()); + if(fileName == fileinfo.fileName()) + { + alreadyExists = true; + break; + } + } + + return alreadyExists; +} + //EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorbody.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -16,12 +16,8 @@ */ // INCLUDES -#include #include -#include -#include #include -#include #include #include #include @@ -30,51 +26,36 @@ #include #include #include -#include #include #include -#include -#include #include #include #include #include #include #include -#include -#include + // USER INCLUDES #include "msgunieditorbody.h" #include "UniEditorGenUtils.h" -#include "UniSendingSettings.h" #include "msgunieditormonitor.h" #include "mmsconformancecheck.h" -#include "unieditorpluginloader.h" -#include "unieditorplugininterface.h" -#include "convergedmessage.h" -#include "msgmediautil.h" #include "msgunieditorpixmapwidget.h" #include "msgunieditoraudiowidget.h" +#include "msgunieditorview.h" // Constants -const QString BACKGROUND_FRAME("qtg_fr_messaging_char_count"); -const QString CHAR_COUNTER_COLOR("qtc_messaging_char_count"); - -const int KShowCounterLimit = 10; const int BYTES_TO_KBYTES_FACTOR = 1024; //Localized Constants for item specific menu -#define LOC_TITLE hbTrId("txt_messaging_title_messaging") -#define LOC_UNABLE_TO_ADD_CONTENT hbTrId("txt_messaging_dpopinfo_unable_to_add_more_content") #define LOC_UNABLE_TO_ATTACH_ITEM hbTrId("txt_messaging_dpopinfo_unable_to_attach_item_avai") #define LOC_PROCESSING hbTrId("txt_messaging_formlabel_loading") -#define LOC_HINT_TEXT hbTrId("txt_messaging_formlabel_enter_message_here") #define LOC_ATTACHED_PHOTO_SIZE hbTrId("txt_messaging_dpopinfo_attached_photo_size_is_l1") const QString ANIMATION_ICON("qtg_anim_loading"); -const QString ANIMATION_FILE(":/qtg_anim_loading.axml"); +const QString ANIMATION_FILE("qtg_anim_loading.axml"); // LOCAL FUNCTIONS //--------------------------------------------------------------- @@ -84,10 +65,10 @@ void showInsertFailureNote() { int availableSize = - (MsgUnifiedEditorMonitor::maxMmsSize() - MsgUnifiedEditorMonitor::messageSize()) - /BYTES_TO_KBYTES_FACTOR; + (MsgUnifiedEditorMonitor::maxMmsSize() - MsgUnifiedEditorMonitor::messageSize()) + /BYTES_TO_KBYTES_FACTOR; QString displayStr = QString(LOC_UNABLE_TO_ATTACH_ITEM) - .arg(availableSize); + .arg(availableSize); HbMessageBox::information(displayStr, 0, 0, HbMessageBox::Ok); } @@ -97,67 +78,18 @@ MsgUnifiedEditorBaseWidget(parent), mHasImage(false), mHasAudio(false), -mTextEdit(0), mPixmapItem(0), mAudioItem(0), mImageSize(0), mAudioSize(0), -mVideoSize(0), mProcessImageOperation(0), mMediaResolver(0), mImageInfo(0), mProcessingWidget(0), -mDraftMessage(false), -mIsImageResizing(false) +mDraftMessage(false) { - mTextEdit = new HbTextEdit(this); - mTextEdit->setPlaceholderText(LOC_HINT_TEXT); - mTextEdit->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); - HbStyle::setItemName(mTextEdit,"textEdit"); - connect(mTextEdit, SIGNAL(contentsChanged()), this, SLOT(onTextChanged())); - - mMmsConformanceCheck = new MmsConformanceCheck; - - mCharCounter = new HbTextItem(this); - HbStyle::setItemName(mCharCounter, "charCounter"); - mCharCounter->setZValue(1.5); - - QColor color = HbColorScheme::color(CHAR_COUNTER_COLOR); - mCharCounter->setTextColor(color); - - mBackgroundItem = new HbFrameItem(this); - HbStyle::setItemName(mBackgroundItem, "charCounterFrame"); - - mBackgroundItem->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); - mBackgroundItem->frameDrawer().setFillWholeRect(true); - - mBackgroundItem->frameDrawer().setFrameGraphicsName(BACKGROUND_FRAME); - - mPluginLoader = new UniEditorPluginLoader(this); - - mPluginInterface = - mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms); - - TRAP_IGNORE( - CSmsSettings* settings = CSmsSettings::NewLC(); - CSmsAccount* account = CSmsAccount::NewLC(); - account->LoadSettingsL( *settings ); - - if( settings->CharacterSet() == TSmsDataCodingScheme::ESmsAlphabetUCS2) - { - mCharSupportType = TUniSendingSettings::EUniCharSupportFull; - } - else - { - mCharSupportType = TUniSendingSettings::EUniCharSupportReduced; - } - - CleanupStack::PopAndDestroy( account ); - CleanupStack::PopAndDestroy( settings ); - ); - - mCharCounter->setVisible(false); - mBackgroundItem->setVisible(false); + this->setObjectName("body"); + mMmsConformanceCheck = new MmsConformanceCheck; } MsgUnifiedEditorBody::~MsgUnifiedEditorBody() @@ -168,18 +100,17 @@ delete mImageInfo; } -QString MsgUnifiedEditorBody::text() -{ - return mTextEdit->toPlainText(); -} - -void MsgUnifiedEditorBody::setImage(QString& imagefile, bool draftMessage) +void MsgUnifiedEditorBody::setImage(const QString& imagefile, bool draftMessage) { - // do nothing if filepath is empty + + // do nothing if filepath is empty if (imagefile.isEmpty()) { return; } + + //disable image option in menu. + emit enableMenuAction(PHOTO,false); mDraftMessage = draftMessage; if (!mImageInfo) @@ -233,7 +164,10 @@ { mSavedImageFile = imagefile; startResizeAnimation(); - mIsImageResizing = true; + + // image resize is started. set the image resize flag. + emit contentsChanged(true); + mProcessImageOperation->Process(mImageInfo); } else @@ -254,9 +188,13 @@ { //check for insert conformance if(EInsertSuccess != mMmsConformanceCheck->checkModeForInsert(mImageFile)) + { + //enable image option in menu as insertion failed. + emit enableMenuAction(PHOTO,true); return; + } - int msgSize = messageSize(); + int msgSize = MsgUnifiedEditorMonitor::messageSize(); QFileInfo fileinfo(mImageFile); int imageSize = fileinfo.size() + KEstimatedMimeHeaderSize; if ( (imageSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize()) @@ -269,6 +207,10 @@ setImage(false); //Show appropriate note and leave showInsertFailureNote(); + + //enable image option in menu as insertion failed. + emit enableMenuAction(PHOTO,true); + return; } @@ -283,10 +225,10 @@ this->repolish(); // emit signal to indicate addition of image - emit contentChanged(); + emit contentsChanged(bodySize()); } -void MsgUnifiedEditorBody::setAudio(QString& audiofile) +void MsgUnifiedEditorBody::setAudio(const QString& audiofile) { // do nothing if filepath is empty if(audiofile.isEmpty()) @@ -308,7 +250,7 @@ mAudioSize = 0; } - int msgSize = messageSize(); + int msgSize = MsgUnifiedEditorMonitor::messageSize(); QFileInfo fileinfo(mAudioFile); int audioSize = fileinfo.size() + KEstimatedMimeHeaderSize; if((audioSize + msgSize) <= MsgUnifiedEditorMonitor::maxMmsSize() ) @@ -334,15 +276,10 @@ this->repolish(); // emit signal to indicate addition of audio - emit contentChanged(); -} - -void MsgUnifiedEditorBody::setText(QString& text) -{ - if(!text.isEmpty()) - { - mTextEdit->setPlainText(text); - } + emit contentsChanged(bodySize()); + + //disable sound option in menu. + emit enableMenuAction(SOUND,false); } const QStringList MsgUnifiedEditorBody::mediaContent() @@ -383,23 +320,10 @@ HbDeviceProfile prf = HbDeviceProfile::profile(mMainWindow); qreal unt = prf.unitValue(); - // Note: With NGA, the orientation change does not cause HW to switch orientation. - // So, the HW resolution also remains unchanged. We need to swap values of width & - // height to map portrait resolution to landscape resolution. - qreal maxWidth = 0.0, maxHeight = 0.0; - - // Landscape - if(mMainWindow->orientation() == Qt::Horizontal) - { - maxHeight = mMainWindow->width()-chromeHeight-toolbarHeight; - maxWidth = (mMainWindow->height()-leftMargin-rightMargin-(2*unt))/2; - } - else - { - maxWidth = mMainWindow->width()-leftMargin-rightMargin; - maxHeight = mMainWindow->height()-chromeHeight-toolbarHeight; - } - szHint.setHeight(maxHeight); + qreal maxWidth = mMainWindow->width()-leftMargin-rightMargin; + qreal maxHeight = mMainWindow->height()-chromeHeight-toolbarHeight; + + szHint.setHeight(0); // add space for audio if(mAudioItem) @@ -455,12 +379,6 @@ { mPixmapItem->setPreferredSize(imageSize); mPixmapItem->setSize(imageSize); - if(mMainWindow->orientation() == Qt::Horizontal) - { - QPointF currPos = mPixmapItem->pos(); - currPos.setX(leftMargin+((maxWidth-imageSize.width())/2)); - mPixmapItem->setPos(currPos); - } mPixmapItem->show(); } @@ -474,8 +392,6 @@ } } - - mTextEdit->setMinimumHeight(maxHeight); szHint.rheight() += bodyItemSpacing; return szHint; } @@ -501,6 +417,10 @@ } setImage(false); mImageSize = 0; + + //enable photo option in menu. + emit enableMenuAction(PHOTO,true); + } else if(audio)//remove audio item { @@ -513,11 +433,14 @@ } setAudio(false); mAudioSize = 0; + + //enable sound option in menu. + emit enableMenuAction(SOUND,true); } this->repolish(); - emit contentChanged(); + emit contentsChanged(bodySize()); } bool MsgUnifiedEditorBody::hasImage() @@ -542,109 +465,14 @@ int MsgUnifiedEditorBody::bodySize() { - int bodysize = 0; - - if( mImageSize || mTextEdit->toPlainText().size() || - mAudioSize || mVideoSize ) - { - - UniEditorGenUtils* genUtils = q_check_ptr(new UniEditorGenUtils); - - bodysize += mImageSize + mAudioSize + mVideoSize + - genUtils->UTF8Size(mTextEdit->toPlainText()) + - KEstimatedMimeHeaderSize + KEstimatedMmsSmilHeaderSize; - delete genUtils; - } - return bodysize; -} - -int MsgUnifiedEditorBody::messageSize() -{ - int estimatedMediaSize = bodySize(); - if(!estimatedMediaSize) - { - // This is the first media content to be inserted - estimatedMediaSize = KEstimatedMmsSmilHeaderSize; - } - - return estimatedMediaSize + MsgUnifiedEditorMonitor::subjectSize() + MsgUnifiedEditorMonitor::containerSize(); -} - -void MsgUnifiedEditorBody::onTextChanged() -{ - QString string = text(); - - if( string.size() > mPrevBuffer.size() && - MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms ) - { - // reject any text input if mms size limit is reached - int futureSize = bodySize() + - MsgUnifiedEditorMonitor::containerSize() + MsgUnifiedEditorMonitor::subjectSize(); - if(futureSize > MsgUnifiedEditorMonitor::maxMmsSize()) - { - mTextEdit->setPlainText(mPrevBuffer); - HbMessageBox::information(LOC_UNABLE_TO_ADD_CONTENT, 0, 0, HbMessageBox::Ok); - mTextEdit->setCursorPosition(mPrevBuffer.length()); - return; - } - else if(!mPrevBuffer.isEmpty()) - { - //Save the previous buffer - mPrevBuffer = string; - // emit signal to indicate change in content - emit contentChanged(); - return; - } - } - - //Check done for optimization - //Only if content is deleted we need to call encodingsettings again - if (mPrevBuffer.isEmpty() || string.size() <= mPrevBuffer.size()) - { - mPluginInterface->setEncodingSettings(EFalse, ESmsEncodingNone, - mCharSupportType); - } - - TInt numOfRemainingChars; - TInt numOfPDUs; - TBool unicodeMode; - TSmsEncoding alternativeEncodingType; - mPluginInterface->getNumPDUs(string, numOfRemainingChars, numOfPDUs, - unicodeMode, alternativeEncodingType); - - //Save the unicode value returned - mUnicode = unicodeMode; - //Save the old buffer - mPrevBuffer = string; - - // emit signal to indicate change in content - emit contentChanged(); - - if(MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms) - { - //Set char counter value - QString display = QString("%1(%2)").arg(numOfRemainingChars).arg( - numOfPDUs); - mCharCounter->setText(display); - - if (numOfPDUs > 1 || numOfRemainingChars <= KShowCounterLimit) - { - mCharCounter->setVisible(true); - mBackgroundItem->setVisible(true); - } - else - { - mCharCounter->setVisible(false); - mBackgroundItem->setVisible(false); - } - } + return mImageSize + mAudioSize; } void MsgUnifiedEditorBody::EditorOperationEvent( TUniEditorProcessImageOperationEvent aEvent, TFileName& aFileName) { delete mImageInfo; - mImageInfo = NULL; + mImageInfo = NULL; if (aEvent == EUniEditorProcessImageOperationComplete && aFileName.Length() > 0) @@ -662,7 +490,8 @@ mSavedImageFile.clear(); // image resize is complete. reset the image resize flag - mIsImageResizing = false; + emit contentsChanged(false); + //handle the processed image from ProcessImage Operation handleSetImage(); @@ -671,10 +500,6 @@ void MsgUnifiedEditorBody::startResizeAnimation() { - // emit signal to indicate disable the send tool button. - emit enableSendButton(false); - - QGraphicsLinearLayout* processingLayout = new QGraphicsLinearLayout(Qt::Vertical); mProcessingWidget = new HbWidget(this); @@ -710,73 +535,6 @@ } -// --------------------------------------------------------- -// MsgUnifiedEditorBody::isUnicode -// --------------------------------------------------------- -// -bool MsgUnifiedEditorBody::isUnicode() -{ - return mUnicode; -} - -// --------------------------------------------------------- -// MsgUnifiedEditorBody::disableCharCounter -// --------------------------------------------------------- -// -void MsgUnifiedEditorBody::disableCharCounter() -{ - mCharCounter->setVisible(false); - mBackgroundItem->setVisible(false); -} - -// --------------------------------------------------------- -// MsgUnifiedEditorBody::enableCharCounter -// --------------------------------------------------------- -// -void MsgUnifiedEditorBody::enableCharCounter() - { - mPluginInterface->setEncodingSettings(EFalse, ESmsEncodingNone, - mCharSupportType); - - TInt numOfRemainingChars; - TInt numOfPDUs; - TBool unicodeMode; - TSmsEncoding alternativeEncodingType; - QString string = mTextEdit->toPlainText(); - mPluginInterface->getNumPDUs(string, - numOfRemainingChars, numOfPDUs, unicodeMode, - alternativeEncodingType); - - //Save the unicode value returned - mUnicode = unicodeMode; - - //Set char counter value - QString display = QString("%1(%2)").arg(numOfRemainingChars).arg( - numOfPDUs); - mCharCounter->setText(display); - - if (numOfPDUs > 1 || numOfRemainingChars <= KShowCounterLimit) - { - mCharCounter->setVisible(true); - mBackgroundItem->setVisible(true); - } - else - { - mCharCounter->setVisible(false); - mBackgroundItem->setVisible(false); - } - - } - -//--------------------------------------------------------------- -// MsgUnifiedEditorBody :: setFocus -// @see header file -//--------------------------------------------------------------- -void MsgUnifiedEditorBody::setFocus() -{ - mTextEdit->setFocus(Qt::MouseFocusReason); -} - //--------------------------------------------------------------- // MsgUnifiedEditorBody :: removeMediaContent // @see header file @@ -810,6 +568,6 @@ this->repolish(); - emit contentChanged(); + emit contentsChanged(bodySize()); } // EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorbodyeditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorbodyeditor.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2009 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: + * + */ + +#include "msgunieditorbodyeditor.h" + +// SYSTEM INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "unieditorpluginloader.h" +#include "unieditorplugininterface.h" +#include "UniSendingSettings.h" +#include "UniEditorGenUtils.h" +#include "msgunieditormonitor.h" +#include "debugtraces.h" + +// LOCAL CONSTANTS + +const QString SEND_ICON("qtg_mono_send"); +const QString BACKGROUND("qtg_fr_input_v_bg"); +const QString BACKGROUND_FRAME("qtg_fr_messaging_char_count"); +const QString CHAR_COUNTER_COLOR("qtc_messaging_char_count"); + +const QString SEND_BUTTON_NORMAL("qtg_fr_btn_green_normal"); +const QString SEND_BUTTON_PRESSED("qtg_fr_btn_green_pressed"); +const QString SEND_BUTTON_DISABLED("qtg_fr_btn_disabled"); + +const QString SEND_BUTTON_NORMAL_COLOR("qtc_callhandling_answer_normal"); +const QString SEND_BUTTON_PRESSED_COLOR("qtc_callhandling_answer_pressed"); +const QString SEND_BUTTON_DISABLED_COLOR("qtc_button_disabled"); + +#define LOC_SMS_CHAR_LIMIT_REACHED hbTrId("txt_messaging_dialog_sms_character_count_exceeded") +#define LOC_HINT_TEXT hbTrId("txt_messaging_formlabel_enter_message_here") +#define LOC_UNABLE_TO_ADD_CONTENT hbTrId("txt_messaging_dpopinfo_unable_to_add_more_content") + + +const TInt KShowCounterLimit = 10; + + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::MsgUnifiedEditorBodyEditor +// @see header +//--------------------------------------------------------------- +MsgUnifiedEditorBodyEditor::MsgUnifiedEditorBodyEditor(QGraphicsItem *parent) : +MsgUnifiedEditorBaseWidget(parent), +mMsgEditor(NULL), +mSendButton(NULL), +mPluginLoader(NULL) +{ + this->setObjectName("bodyText"); + + setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); + + //setting background. + HbFrameItem* backGround = new HbFrameItem(this); + backGround->frameDrawer().setFrameGraphicsName(BACKGROUND); + backGround->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesVertical); + backGround->frameDrawer().setFillWholeRect(true); + //fixing to 2 pixel to avoid extra line on top of frame. + backGround->frameDrawer().setBorderWidth(2); + this->setBackgroundItem(backGround); + + // Initialize the widget. + init(); + + setEncodingSettingsL(); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::init +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::init() +{ + // Create mandatory element of mesh layout. + mMsgEditor = new MsgEditor(this); + HbStyle::setItemName(mMsgEditor, "msgEditor"); + + mSendButton = new HbPushButton(this); + HbStyle::setItemName(mSendButton, "sendButton"); + mSendButton->setEnabled(false); + + HbFrameItem* backGround = new HbFrameItem(this); + backGround->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); + mSendButton->setBackgroundItem(backGround); + updateButtonBackgroundAndColor(SEND_BUTTON_DISABLED,SEND_BUTTON_DISABLED_COLOR); + mSendButton->setIcon(HbIcon(SEND_ICON)); + + mCharCounter = new HbTextItem(this); + HbStyle::setItemName(mCharCounter, "charCounter"); + mCharCounter->setZValue(1.5); + + QColor color = HbColorScheme::color(CHAR_COUNTER_COLOR); + mCharCounter->setTextColor(color); + + mBackgroundItem = new HbFrameItem(this); + HbStyle::setItemName(mBackgroundItem, "charCounterFrame"); + + mBackgroundItem->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); + mBackgroundItem->frameDrawer().setFillWholeRect(true); + + mBackgroundItem->frameDrawer().setFrameGraphicsName(BACKGROUND_FRAME); + + //Create editor utils object + mEditorUtils = q_check_ptr(new UniEditorGenUtils()); + + connect(mSendButton, SIGNAL(clicked()),this, SIGNAL(sendMessage())); + connect(mSendButton, SIGNAL(pressed()),this, SLOT(onPressed())); + connect(mSendButton, SIGNAL(released()),this, SLOT(onReleased())); + connect(mMsgEditor, SIGNAL(contentsChanged()),this,SLOT(onContentsChanged())); + +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::~MsgUnifiedEditorBodyEditor +// @see header +//--------------------------------------------------------------- +MsgUnifiedEditorBodyEditor::~MsgUnifiedEditorBodyEditor() +{ + delete mEditorUtils; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::content +// @see header +//--------------------------------------------------------------- +QString MsgUnifiedEditorBodyEditor::content() const +{ + return mMsgEditor->toPlainText(); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::setContent +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::setContent(const QString &text) +{ + mMsgEditor->setPlainText(text); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::enableSendButton +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::enableSendButton(bool enable) +{ + if(enable) + { + if(!mSendButton->isEnabled()) + { + mSendButton->setFocusProxy(mMsgEditor); + mSendButton->setEnabled(true); + updateButtonBackgroundAndColor(SEND_BUTTON_NORMAL,SEND_BUTTON_NORMAL_COLOR); + } + } + else + { + if(mSendButton->isEnabled()) + { + mSendButton->setFocusProxy(0); + mSendButton->setEnabled(false); + updateButtonBackgroundAndColor(SEND_BUTTON_DISABLED,SEND_BUTTON_DISABLED_COLOR); + } + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::onContentsChanged +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::onContentsChanged() +{ + QString text = this->content(); + + mPluginInterface->setEncodingSettings(EFalse, ESmsEncodingNone,mCharSupportType); + + TInt numOfRemainingChars; + TInt numOfPDUs; + TBool unicodeMode; + TSmsEncoding alternativeEncodingType; + mPluginInterface->getNumPDUs(text, numOfRemainingChars, numOfPDUs, + unicodeMode, alternativeEncodingType); + + // emit signal to indicate change in content + int contentSize = mEditorUtils->UTF8Size(text); + QVariantList dataList; + dataList << contentSize << unicodeMode; + emit contentsChanged(dataList); + + if(MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Sms) + { + //Set char counter value + QString display = QString("%1(%2)").arg(numOfRemainingChars).arg( + numOfPDUs); + mCharCounter->setText(display); + + if (numOfPDUs > 1 || numOfRemainingChars <= KShowCounterLimit) + { + mCharCounter->setVisible(true); + mBackgroundItem->setVisible(true); + } + else + { + mCharCounter->setVisible(false); + mBackgroundItem->setVisible(false); + } + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::updateButtonBackgroundAndColor +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::updateButtonBackgroundAndColor(const QString& bg,const QString& iconColor) +{ + HbFrameItem* drawer = static_cast(mSendButton->backgroundItem()); + if(drawer) + { + drawer->frameDrawer().setFrameGraphicsName(bg); + } + QColor color = HbColorScheme::color(iconColor); + + if(color.isValid()) + { + mSendButton->icon().setColor(color); + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::onPressed +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::onPressed() +{ + updateButtonBackgroundAndColor(SEND_BUTTON_PRESSED,SEND_BUTTON_PRESSED_COLOR); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::onReleased +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::onReleased() +{ + updateButtonBackgroundAndColor(SEND_BUTTON_NORMAL,SEND_BUTTON_NORMAL_COLOR); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::setEncodingSettingsL +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::setEncodingSettingsL() +{ + mPluginLoader = new UniEditorPluginLoader(this); + + mPluginInterface = + mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms); + + QT_TRAP_THROWING( CSmsSettings* settings = CSmsSettings::NewLC(); + CSmsAccount* account = CSmsAccount::NewLC(); + account->LoadSettingsL( *settings ); + + if( settings->CharacterSet() == TSmsDataCodingScheme::ESmsAlphabetUCS2) + { + mCharSupportType = TUniSendingSettings::EUniCharSupportFull; + } + else + { + mCharSupportType = TUniSendingSettings::EUniCharSupportReduced; + } + + CleanupStack::PopAndDestroy( account ); + CleanupStack::PopAndDestroy( settings )); + + + mCharCounter->setVisible(false); + mBackgroundItem->setVisible(false); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::packMessage +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::packMessage(ConvergedMessage &msg) +{ + msg.setBodyText(mMsgEditor->toPlainText()); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorBodyEditor::populateContent +// @see header +//--------------------------------------------------------------- +void MsgUnifiedEditorBodyEditor::populateContent(const ConvergedMessage& msg) +{ + QString bodyTxt = msg.bodyText(); + mMsgEditor->setPlainText(msg.bodyText()); +} + +//--------------------------------------------------------------- +// MsgEditor::MsgEditor +// @see header +//--------------------------------------------------------------- +MsgEditor::MsgEditor(QGraphicsItem *parent) : +HbTextEdit(parent) +{ + this->setFontSpec(HbFontSpec(HbFontSpec::Secondary)); + this->setPlaceholderText(LOC_HINT_TEXT); + this->setSmileysEnabled(true); +} + +//--------------------------------------------------------------- +// MsgEditor::inputMethodEvent +// @see header +//--------------------------------------------------------------- +void MsgEditor::inputMethodEvent(QInputMethodEvent *event) +{ + bool showNote = false; + + if( MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms && + !event->commitString().isEmpty()) + { + QString str = event->commitString(); + int comitStrSize = str.toUtf8().size(); + + if(MsgUnifiedEditorMonitor::messageSize()+ comitStrSize > MsgUnifiedEditorMonitor::maxMmsSize()) + { + showNote = true; + // reject any text input if mms size limit is reached + event->setCommitString(QString()); + } + } + + HbTextEdit::inputMethodEvent(event); + + if(showNote) + { + HbMessageBox* mb = new HbMessageBox(LOC_UNABLE_TO_ADD_CONTENT,HbMessageBox::MessageTypeInformation); + mb->setStandardButtons(HbMessageBox::Ok); + mb->setAttribute(Qt::WA_DeleteOnClose); + mb->setFocusPolicy(Qt::NoFocus); + mb->show(); + } +} + +// EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorlineedit.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditorlineedit.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorlineedit.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -37,7 +37,7 @@ #define LOC_PASTE hbTrId("txt_common_menu_paste") MsgUnifiedEditorLineEdit::MsgUnifiedEditorLineEdit(const QString& label,QGraphicsItem *parent): -HbLineEdit(parent), +HbTextEdit(parent), mSelectionStart(-1), mSelectionEnd(-1), mDefaultBehaviour(false) @@ -80,7 +80,7 @@ //let it go in default way. if(mDefaultBehaviour) { - HbAbstractEdit::inputMethodEvent(event); + HbTextEdit::inputMethodEvent(event); event->accept(); return; } @@ -102,13 +102,13 @@ event->setCommitString(str, event->replacementStart(), event->replacementLength()); } - else if(this->hasSelectedText()) + else if(this->textCursor().hasSelection()) {// all user inputs get appended at the end this->setCursorPosition(this->text().length()); } } - HbAbstractEdit::inputMethodEvent(event); + HbTextEdit::inputMethodEvent(event); event->accept(); } @@ -120,7 +120,7 @@ { if(mDefaultBehaviour) { - HbAbstractEdit::keyReleaseEvent(event); + HbTextEdit::keyReleaseEvent(event); event->accept(); return; } @@ -132,7 +132,7 @@ this->setCursorPosition(this->text().length()); str = replacementStr; QKeyEvent eve(event->type(), Qt::Key_Any, event->modifiers(), str); - HbAbstractEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); event->accept(); return; } @@ -142,7 +142,7 @@ int pos = this->cursorPosition(); bool pbkContact = true; - if(!this->hasSelectedText()) + if(!this->textCursor().hasSelection()) { this->setCursorPosition(pos-2); pbkContact = this->textCursor().charFormat().fontUnderline(); @@ -161,18 +161,18 @@ if(pbkContact) { //if already selected delete it. - if(this->hasSelectedText()) + if(this->textCursor().hasSelection()) { // deleting phbkContact is an atomic operation // ensure that the signal is emitted only once disconnect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged())); - HbLineEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); event->accept(); //delete seperator (i.e."; "). QKeyEvent eve(event->type(), Qt::Key_Delete, Qt::NoModifier); - HbLineEdit::keyPressEvent(&eve); - HbLineEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); connect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged())); onContentsChanged(); @@ -194,15 +194,15 @@ this, SLOT(onContentsChanged())); //delete seperator (i.e."; "). QKeyEvent eve(event->type(), Qt::Key_Backspace, Qt::NoModifier); - HbLineEdit::keyPressEvent(&eve); - HbLineEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); connect(this, SIGNAL(contentsChanged()), this, SLOT(onContentsChanged())); onContentsChanged(); } else { - HbLineEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); } event->accept(); } @@ -213,7 +213,7 @@ if (event->key() == Qt::Key_Left ) { - bool selectedText = this->hasSelectedText(); + bool selectedText = this->textCursor().hasSelection(); //look ahead left. int pos = this->cursorPosition(); @@ -266,7 +266,7 @@ this->setCursorPosition(newPos+1); } - HbLineEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); } event->accept(); @@ -275,7 +275,7 @@ if (event->key() == Qt::Key_Right) { - bool selectedText = this->hasSelectedText(); + bool selectedText = this->textCursor().hasSelection(); //look ahead. int pos = this->cursorPosition(); @@ -301,7 +301,7 @@ this->setCursorPosition(pos+1); this->deselect(); } - HbAbstractEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); } event->accept(); return; @@ -311,7 +311,7 @@ { if(mDefaultBehaviour) { - HbAbstractEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); event->accept(); return; } @@ -334,11 +334,11 @@ str.replace(expr, replacementStr); QKeyEvent eve(event->type(), event->key(), event->modifiers(), str); - HbAbstractEdit::keyPressEvent(&eve); + HbTextEdit::keyPressEvent(&eve); } else { - HbAbstractEdit::keyPressEvent(event); + HbTextEdit::keyPressEvent(event); event->accept(); return; } @@ -359,15 +359,15 @@ if(labelPos >= 0 )//pressed on label. { - this->setCursorPosition(currentPos + labelPos + 2); + HbTextEdit::setCursorPosition(currentPos + labelPos + 2); } else if(seperatorPos == currentPos-1 || seperatorPos == currentPos)//pressed just on seperator. { - this->setCursorPosition(seperatorPos+2); + HbTextEdit::setCursorPosition(seperatorPos+2); } else { - this->setCursorPosition(currentPos+1); + HbTextEdit::setCursorPosition(currentPos); bool pbkContact = this->textCursor().charFormat().fontUnderline(); if(pbkContact) { @@ -381,7 +381,7 @@ void MsgUnifiedEditorLineEdit::gestureEvent(QGestureEvent* event) { //passing gesture event to base class. - HbLineEdit::gestureEvent(event); + HbTextEdit::gestureEvent(event); if(HbTapGesture *tap = qobject_cast(event->gesture(Qt::TapGesture))) @@ -462,14 +462,14 @@ void MsgUnifiedEditorLineEdit::focusInEvent(QFocusEvent* event) { - HbLineEdit::focusInEvent(event); - this->setCursorVisibility(Hb::TextCursorVisible); + HbTextEdit::focusInEvent(event); +// this->setCursorVisibility(Hb::TextCursorVisible); } void MsgUnifiedEditorLineEdit::focusOutEvent(QFocusEvent* event) { - HbLineEdit::focusOutEvent(event); - this->setCursorVisibility(Hb::TextCursorHidden); + HbTextEdit::focusOutEvent(event); +// this->setCursorVisibility(Hb::TextCursorHidden); } void MsgUnifiedEditorLineEdit::setHighlight(int currentPos) @@ -533,7 +533,7 @@ void MsgUnifiedEditorLineEdit::timerEvent(QTimerEvent *event) { //passing event to base class. - HbLineEdit::timerEvent(event); + HbTextEdit::timerEvent(event); if (event->timerId() == mSelectionSnapTimer.timerId()) { @@ -571,7 +571,7 @@ QString MsgUnifiedEditorLineEdit::text() const { - return HbLineEdit::text(); + return this->toPlainText(); } QString MsgUnifiedEditorLineEdit::content() const @@ -637,4 +637,27 @@ } } + +void MsgUnifiedEditorLineEdit::setSelection(int start, int length) +{ + int textLength = text().count(); + QString test = text(); + Q_UNUSED(test) + if (start < 0 || start > textLength) { + return; + } + + int end(start+length); + if (end > textLength) { + end = textLength; + } else if (end < 0) { + end = 0; + } + + QTextCursor cursor = textCursor(); + cursor.setPosition(start, QTextCursor::MoveAnchor); + cursor.setPosition(end, QTextCursor::KeepAnchor); + setTextCursor(cursor); + +} // eof diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditormonitor.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditormonitor.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditormonitor.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -18,28 +18,27 @@ // INCLUDES #include "debugtraces.h" #include -#include // USER INCLUDES #include "msgunieditormonitor.h" -#include "msgunieditorview.h" -#include "msgunieditoraddress.h" -#include "msgunieditorsubject.h" -#include "msgunieditorbody.h" -#include "msgunieditorattachmentcontainer.h" #include "UniEditorGenUtils.h" // Constants // Define static -ConvergedMessage::MessageType MsgUnifiedEditorMonitor::mMessageType; -int MsgUnifiedEditorMonitor::mBodySize; -int MsgUnifiedEditorMonitor::mContainerSize; -int MsgUnifiedEditorMonitor::mSubjectSize; -int MsgUnifiedEditorMonitor::mMaxMmsSize; -int MsgUnifiedEditorMonitor::mMaxSmsRecipients; -int MsgUnifiedEditorMonitor::mMaxMmsRecipients; -int MsgUnifiedEditorMonitor::mMsgCurrAddressCount; +ConvergedMessage::MessageType MsgUnifiedEditorMonitor::mMessageType = ConvergedMessage::Sms; +int MsgUnifiedEditorMonitor::mBodySize = 0; +int MsgUnifiedEditorMonitor::mBodyTextSize = 0; +int MsgUnifiedEditorMonitor::mContainerSize = 0; +int MsgUnifiedEditorMonitor::mBodyContentSize = 0; +int MsgUnifiedEditorMonitor::mSubjectSize = 0; +int MsgUnifiedEditorMonitor::mMaxMmsSize = 0; +int MsgUnifiedEditorMonitor::mMaxSmsRecipients = 0; +int MsgUnifiedEditorMonitor::mMaxMmsRecipients = 0; +int MsgUnifiedEditorMonitor::mToAddressCount = 0; +int MsgUnifiedEditorMonitor::mCcAddressCount = 0; +int MsgUnifiedEditorMonitor::mBccAddressCount = 0; +bool MsgUnifiedEditorMonitor::mReadyForSend = false; //Localized strings #define LOC_POP_MESSAGE_CHANGE_MUL hbTrId("txt_messaging_dpopinfo_message_type_changed_to_mul") @@ -51,7 +50,12 @@ //--------------------------------------------------------------- MsgUnifiedEditorMonitor::MsgUnifiedEditorMonitor(QObject* parent) : QObject(parent), -mSkipNote(false) +mSkipNote(false), +mContainerHasMmsContent(false), +mPriority(ConvergedMessage::Normal), +mEmailPresent(false), +mUniCode(false), +mImageResizing(false) { mUniEditorGenUtils = q_check_ptr( new UniEditorGenUtils); init(); @@ -63,22 +67,39 @@ //--------------------------------------------------------------- MsgUnifiedEditorMonitor::~MsgUnifiedEditorMonitor() { + reset(); delete mUniEditorGenUtils; } //--------------------------------------------------------------- +// MsgUnifiedEditorMonitor::reset +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorMonitor::reset() +{ + mMessageType = ConvergedMessage::Sms; + mBodySize = 0; + mBodyTextSize = 0; + mContainerSize = 0; + mBodyContentSize = 0; + mSubjectSize = 0; + mMaxMmsSize = 0; + mMaxSmsRecipients = 0; + mMaxMmsRecipients = 0; + mToAddressCount = 0; + mCcAddressCount = 0; + mBccAddressCount = 0; + mReadyForSend = false; +} + +//--------------------------------------------------------------- // MsgUnifiedEditorMonitor::init // @see header file //--------------------------------------------------------------- void MsgUnifiedEditorMonitor::init() { - mMessageType = ConvergedMessage::Sms; - mBodySize = 0; - mContainerSize = 0; - mSubjectSize = 0; - mMsgCurrAddressCount = 0; - mMaxMmsSize = KDefaultMaxSize; + TRAP_IGNORE(mMaxMmsSize = mUniEditorGenUtils->MaxMmsMsgSizeL()); mMaxSmsRecipients = KDefaultSmsRecipients; @@ -89,11 +110,69 @@ } //--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::handleContentChange +// MsgUnifiedEditorMonitor::handleContentsChanged // @see header file //--------------------------------------------------------------- -void MsgUnifiedEditorMonitor::handleContentChange() +void MsgUnifiedEditorMonitor::handleContentsChanged(const QVariant& data) { + QString objectName = sender()->objectName(); + + if(objectName == "attachmentContainer") + { + QVariantList dataList = data.toList(); + mContainerSize = dataList.at(0).toInt(); + mContainerHasMmsContent = dataList.at(1).toBool(); + } + + if(objectName == "body") + { + if(data.type() == QVariant::Bool) + { + mImageResizing = data.toBool(); + } + else + { + mBodySize = data.toInt(); + updateBodyContentSize(); + } + } + + if(objectName == "bodyText") + { + QVariantList dataList = data.toList(); + mBodyTextSize = dataList.at(0).toInt(); + mUniCode = dataList.at(1).toBool(); + updateBodyContentSize(); + + } + + if(objectName == "subject") + { + QVariantList dataList = data.toList(); + mSubjectSize = dataList.at(0).toInt(); + mPriority = ConvergedMessage::Priority(dataList.at(1).toInt()); + + } + + if(objectName == "to") + { + QVariantList dataList = data.toList(); + mToAddressCount = dataList.at(0).toInt(); + mEmailPresent = dataList.at(1).toBool(); + } + + if(objectName == "cc") + { + QVariantList dataList = data.toList(); + mCcAddressCount = dataList.at(0).toInt(); + } + + if(objectName == "bcc") + { + QVariantList dataList = data.toList(); + mBccAddressCount = dataList.at(0).toInt(); + } + // get the projected message type & show the type change note ConvergedMessage::MessageType newMsgType = projectedMsgType(); if(mMessageType != newMsgType) @@ -110,10 +189,14 @@ } showPopup(noteStr); } - - HbWidget* senderWidget = qobject_cast(sender()); - updateMsgInfo(senderWidget); + updateSend(); + + //emit when content is modified after opening a draft message. + if(!mSkipNote) + { + emit contentsChanged(); + } } //--------------------------------------------------------------- @@ -136,66 +219,6 @@ } //--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::updateMsgInfo -// @see header file -//--------------------------------------------------------------- -void MsgUnifiedEditorMonitor::updateMsgInfo(HbWidget* senderWidget) -{ - if(mMessageType == ConvergedMessage::Mms) - { - //Disable char counter & add subject - view()->mBody->disableCharCounter(); - view()->addSubject(); - } - else - { - //Enable char counter - view()->mBody->enableCharCounter(); - } - - // check if sent by body widget - MsgUnifiedEditorBody* body = NULL; - body = qobject_cast(senderWidget); - if(body) - { - mBodySize = view()->mBody->bodySize(); - view()->setAttachOptionEnabled( - MsgUnifiedEditorView::TBE_PHOTO, !view()->mBody->hasImage()); - view()->setAttachOptionEnabled( - MsgUnifiedEditorView::TBE_SOUND, !view()->mBody->hasAudio()); - return; - } - - // check if sent by subject widget - MsgUnifiedEditorSubject* subject = NULL; - subject = qobject_cast(senderWidget); - if(subject) - { - mSubjectSize = view()->mSubjectField->subjectSize(); - return; - } - - // check if sent by attachment container widget - MsgAttachmentContainer* container = NULL; - container = qobject_cast(senderWidget); - if(container) - { - mContainerSize = view()->mAttachmentContainer->containerSize(); - return; - } - - // handle content change from other widgets e.g. To, Cc, Bcc address field - int totalAddressCount = view()->mToField->addressCount(); - if(view()->mCcField && view()->mBccField) - { - totalAddressCount += view()->mCcField->addressCount() + - view()->mBccField->addressCount(); - } - mMsgCurrAddressCount = totalAddressCount; - return; -} - -//--------------------------------------------------------------- // MsgUnifiedEditorMonitor::showPopup // @see header file //--------------------------------------------------------------- @@ -215,37 +238,23 @@ } //--------------------------------------------------------------- -// MsgUnifiedEditorMonitor::view -// @see header file -//--------------------------------------------------------------- -MsgUnifiedEditorView* MsgUnifiedEditorMonitor::view() -{ - return static_cast(this->parent()); -} - -//--------------------------------------------------------------- // MsgUnifiedEditorMonitor::bodyHasMMSContent // @see header file //--------------------------------------------------------------- bool MsgUnifiedEditorMonitor::bodyHasMMSContent() { - MsgUnifiedEditorBody* edBody = view()->mBody; - // If any media-object is present inside body - if(!edBody->mediaContent().isEmpty()) - { - return true; - } - - int bodyTextSize = mUniEditorGenUtils->UTF8Size(edBody->text()); + bool result = false; + int maxSmsSize = 0; - TRAP_IGNORE(maxSmsSize = - mUniEditorGenUtils->MaxSmsMsgSizeL(edBody->isUnicode())); + TRAP_IGNORE(maxSmsSize = mUniEditorGenUtils->MaxSmsMsgSizeL(mUniCode)); + // If body text size exceeds sms text-size limit - if(bodyTextSize > maxSmsSize) + if( mBodyTextSize > maxSmsSize || mBodySize) { - return true; + result = true; } - return false; + + return result; } //--------------------------------------------------------------- @@ -254,22 +263,13 @@ //--------------------------------------------------------------- bool MsgUnifiedEditorMonitor::subjectHasMMSContent() { - MsgUnifiedEditorSubject* edSubject = view()->mSubjectField; - ConvergedMessage::Priority priority = ConvergedMessage::Normal; - QString subjectText; - if(edSubject) + bool result = false; + if(mPriority != ConvergedMessage::Normal || mSubjectSize) { - priority = edSubject->priority(); - subjectText = edSubject->text(); + result = true; } - // If priority is set to other than Normal or - // If subject has some content - if( (priority != ConvergedMessage::Normal) || - !subjectText.isEmpty() ) - { - return true; - } - return false; + + return result; } //--------------------------------------------------------------- @@ -278,23 +278,14 @@ //--------------------------------------------------------------- bool MsgUnifiedEditorMonitor::containerHasMMSContent() { - QString bodyText = view()->mBody->text(); - MsgAttachmentContainer* edContainer = view()->mAttachmentContainer; - bool hasMMAttachmentContent = false; - int attachmentCount = 0; - if(edContainer) + bool result = false; + + if(mContainerHasMmsContent || mContainerSize && mBodyTextSize) { - hasMMAttachmentContent = edContainer->hasMMContent(); - attachmentCount = edContainer->count(); + result = true; } - // If MM attachments are present or - // If only one non-MM attachment is present e.g. vcf along with body text - if( hasMMAttachmentContent || - ((attachmentCount == 1) && !bodyText.isEmpty()) ) - { - return true; - } - return false; + + return result; } //--------------------------------------------------------------- @@ -303,32 +294,14 @@ //--------------------------------------------------------------- bool MsgUnifiedEditorMonitor::otherMMSCriteriaMet() { - MsgUnifiedEditorAddress* edCc = view()->mCcField; - MsgUnifiedEditorAddress* edBcc = view()->mBccField; - int ccCount = 0; - int bccCount = 0; - if(edCc && edBcc) + bool result = false; + + if(mCcAddressCount || mBccAddressCount || mEmailPresent || + mToAddressCount > mMaxSmsRecipients) { - ccCount = edCc->addressCount(); - bccCount = edBcc->addressCount(); + result = true; } - // If CC/BCC has some content or - // If to-recipients count exceeds max sms recipient count - if( ccCount || bccCount || - (view()->mToField->addressCount() > mMaxSmsRecipients) ) - { - return true; - } - - // If to-field contains an email address - bool isEmailPresent = false; - ConvergedMessageAddressList addrList = view()->mToField->addresses(); - TRAP_IGNORE(isEmailPresent = mUniEditorGenUtils->VerifyEmailAddressesL(addrList)); - if(isEmailPresent) - { - return true; - } - return false; + return result; } //--------------------------------------------------------------- @@ -337,15 +310,33 @@ //--------------------------------------------------------------- void MsgUnifiedEditorMonitor::updateSend() { - if (mMsgCurrAddressCount > 0 && (mSubjectSize + mBodySize + mContainerSize) > 0 && !view()->mBody->isImageResizing()) + + if ( (mToAddressCount + mCcAddressCount + mBccAddressCount) > 0 && + (mSubjectSize + mBodyContentSize + mContainerSize) > 0 && + !mImageResizing ) { emit enableSend(true); + mReadyForSend = true; } else { emit enableSend(false); + mReadyForSend = false; + } + +} + +void MsgUnifiedEditorMonitor::updateBodyContentSize() +{ + if(mBodySize || mBodyTextSize) + { + mBodyContentSize = mBodySize + mBodyTextSize + KEstimatedMimeHeaderSize + + KEstimatedMmsSmilHeaderSize; + } + else + { + mBodyContentSize = 0; } } - //EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorscrollarea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorscrollarea.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,741 @@ +/* + * Copyright (c) 2009 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: manages scrollable portion of view. + * + */ + +#include "msgunieditorscrollarea.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "msgunieditoraddress.h" +#include "msgunieditorsubject.h" +#include "msgunieditorbody.h" +#include "msgunieditorsubject.h" +#include "msgunieditorbody.h" +#include "msgunieditormonitor.h" +#include "msgunieditorattachmentcontainer.h" +#include "UniEditorGenUtils.h" +#include "msgunieditorview.h" + +// LOCALIZED CONSTANTS +//To,Cc.Bcc +#define LOC_TO hbTrId("txt_messaging_formlabel_to") +#define LOC_CC hbTrId("txt_messaging_formlabel_cc") +#define LOC_BCC hbTrId("txt_messaging_formlabel_bcc") +//group box +#define LOC_OTHER_RECIPIENTS(n) hbTrId("txt_messaging_title_ln_other_recipients",n) +#define LOC_OTHER_RECIPIENTS_EXPAND hbTrId("txt_messaging_title_other_recipients") + +// attachment addition failure note +#define LOC_UNABLE_TO_ADD_ATTACHMENTS hbTrId("txt_messaging_dpopinfo_unable_to_attach_l1_of_l2") + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::MsgUnifiedEditorScrollArea +// +//--------------------------------------------------------------- +MsgUnifiedEditorScrollArea::MsgUnifiedEditorScrollArea(MsgUnifiedEditorMonitor* msgMonitor,QGraphicsItem *parent) : +HbScrollArea(parent), +mMsgMonitor(msgMonitor), +mMainLayout(0), +mToField(0), +mCcField(0), +mBccField(0), +mSubjectField(0), +mBody(0), +mAttachmentContainer(0), +mEnableScrolling(true) +{ + init(); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::~MsgUnifiedEditorScrollArea +// +//--------------------------------------------------------------- +MsgUnifiedEditorScrollArea::~MsgUnifiedEditorScrollArea() +{ +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::init +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::init() +{ + HbWidget* contentWidget = new HbWidget(this); + this->setContentWidget(contentWidget); + + mMainLayout = new QGraphicsLinearLayout(Qt::Vertical, contentWidget); + qreal vTopSpacing = 0.0; + qreal vItemSpacing = 0.0; + style()->parameter("hb-param-margin-gene-top",vTopSpacing); + style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); + + mMainLayout->setContentsMargins(0,0,0,0); + mMainLayout->setSpacing(vItemSpacing); + + mToField = new MsgUnifiedEditorAddress( LOC_TO, this ); + mToField->setObjectName("to"); + + mBody = new MsgUnifiedEditorBody(this); + + mMainLayout->addItem(mToField); + mMainLayout->addItem(mBody); + mMainLayout->addStretch(2); + + connect(mToField, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + connect(mBody, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + connect(mBody,SIGNAL(enableMenuAction(int,bool)),this,SIGNAL(enableMenuAction(int,bool))); + +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::addCcBcc +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::addCcBcc(bool needFocus) +{ + if(mCcField && mBccField) + { // do nothing if already present + return; + } + + mCcField = new MsgUnifiedEditorAddress( LOC_CC, this ); + mCcField->setObjectName("cc"); + + mBccField = new MsgUnifiedEditorAddress( LOC_BCC, this ); + mBccField->setObjectName("bcc"); + + mCcField->skipMaxRecipientQuery(true); + mBccField->skipMaxRecipientQuery(true); + + connect(mCcField, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + connect(mBccField, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + HbWidget* groupWidget = new HbWidget(this); + groupWidget->setContentsMargins(0,0,0,0); + + QGraphicsLinearLayout* ccBccLayout = new QGraphicsLinearLayout(Qt::Vertical, groupWidget); + ccBccLayout->setContentsMargins(0,0,0,0); + + qreal vItemSpacing = 0.0; + style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); + ccBccLayout->setSpacing(vItemSpacing); + ccBccLayout->addItem(mCcField); + ccBccLayout->addItem(mBccField); + + HbGroupBox* groupBox = new HbGroupBox(0); + groupBox->setObjectName("groupBox"); + + groupBox->setContentWidget(groupWidget); + groupBox->setHeading(LOC_OTHER_RECIPIENTS_EXPAND); + mMainLayout->insertItem(1,groupBox); + connect(groupBox, SIGNAL(toggled(bool)), this, SLOT(updateOtherRecipientCount(bool))); + + //emit signal to remove CcBcc action + emit enableMenuAction(CCBCC, false); + + this->updateGeometry(); + + if(needFocus) + { + setFocus(mCcField); + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::addSubject +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::addSubject(bool needFocus) +{ + // do nothing if already present + if(mSubjectField) + { + return; + } + + mSubjectField = new MsgUnifiedEditorSubject(this); + + int index = 0; + if(mCcField && mBccField) + { + index = 2; + } + else + { + index = 1; + } + + mMainLayout->insertItem(index,mSubjectField); + connect(mSubjectField, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + //emit signal to remove CcBcc action + emit enableMenuAction(SUBJECT, false); + + if(needFocus) + { + setFocus(mSubjectField); + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::setImage +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::setImage(const QString& path, bool draftMessage) +{ + mBody->setImage(path,draftMessage); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::setAudio +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::setAudio(const QString& filePath) +{ + mBody->setAudio(filePath); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::setFocus +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::setFocus(MsgUnifiedEditorBaseWidget* item) +{ + if(item) + { + item->setFocus(); + } + + //open vkb + postInputPanelEvent(); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::changePriority +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::changePriority() +{ + HbAction* action = qobject_cast(sender()); + + ConvergedMessage::Priority priority = ConvergedMessage::Normal; + if(action) + { + int data = action->data().toInt(); + priority = ConvergedMessage::Priority(data); + } + + addSubject(); + mSubjectField->setPriority(priority); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::updateOtherRecipientCount +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::updateOtherRecipientCount(bool state) +{ + HbGroupBox* groupBox = qobject_cast(sender()); + if(groupBox) + { + if(!state) + { + groupBox->setHeading(LOC_OTHER_RECIPIENTS_EXPAND); + } + else + { + int addrCount = mCcField->addressCount(); + addrCount += mBccField->addressCount(); + if(addrCount > 0) + { + groupBox->setHeading(LOC_OTHER_RECIPIENTS(addrCount)); + } + } + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::contactsValid +// +//--------------------------------------------------------------- +bool MsgUnifiedEditorScrollArea::contactsValid() +{ + bool res = ( !mToField->validateContacts() || + (mCcField && !mCcField->validateContacts()) || + (mBccField && !mBccField->validateContacts()) ); + + return !res; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::currentAddress +// +//--------------------------------------------------------------- +ConvergedMessageAddress* MsgUnifiedEditorScrollArea::currentAddress() +{ + ConvergedMessageAddress* currentAdd = NULL; + + ConvergedMessageAddressList addList = mToField->addresses(); + int count = addList.count(); + if(count) + { + currentAdd = addList.takeFirst(); + } + + while(addList.count()) + { + ConvergedMessageAddress* obj = addList.takeFirst(); + delete obj; + } + + return currentAdd; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::packMessage +// +//--------------------------------------------------------------- +int MsgUnifiedEditorScrollArea::packMessage(ConvergedMessage &msg, bool isSave) +{ + // If isSave is true (save to draft usecase), then don't remove duplicates + // If isSave is false (send usecase), then remove duplicates + bool removeDuplicates = !isSave; + ConvergedMessageAddressList addresses = mToField->addresses(removeDuplicates); + + ConvergedMessageAddressList ccAddresses; + ConvergedMessageAddressList bccAddresses; + ConvergedMessageAttachmentList mediaList; + int errorCode = 0; + //Don't format the addresses for save to drfats case + if(!isSave) + { + formatAddresses(addresses); + } + + msg.addToRecipients(addresses); + + if(MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms) + { + if(mCcField) + { + ccAddresses = mCcField->addresses(removeDuplicates); + } + + if(mBccField) + { + bccAddresses = mBccField->addresses(removeDuplicates); + } + + if(removeDuplicates) + { + int matchDigitsCount = MsgUnifiedEditorAddress::contactMatchDigits(); + //comapre cc and to field,remove duplicate from cc + foreach(ConvergedMessageAddress *ccAddress,ccAddresses) + { + foreach(ConvergedMessageAddress *toAddress,addresses) + { + if(0 == ccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount))) + { + ccAddresses.removeOne(ccAddress); + } + } + } + //comapre bcc and cc field,remove duplicate from bcc + foreach(ConvergedMessageAddress *bccAddress,bccAddresses) + { + foreach(ConvergedMessageAddress *ccAddress,ccAddresses) + { + if(0 == bccAddress->address().right(matchDigitsCount).compare(ccAddress->address().right(matchDigitsCount))) + { + bccAddresses.removeOne(bccAddress); + } + } + } + //comapre bcc and to field,remove duplicate from bcc + foreach(ConvergedMessageAddress *bccAddress,bccAddresses) + { + foreach(ConvergedMessageAddress *toAddress,addresses) + { + if(0 == bccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount))) + { + bccAddresses.removeOne(bccAddress); + } + } + } + } + + if(ccAddresses.count()>0) + { + //Don't format the addresses for save to drfats case + if(!isSave) + { + formatAddresses(ccAddresses); + } + msg.addCcRecipients(ccAddresses); + } + if(bccAddresses.count()>0) + { + //Don't format the addresses for save to drfats case + if(!isSave) + { + formatAddresses(bccAddresses); + } + msg.addBccRecipients(bccAddresses); + } + if(mSubjectField) + { + msg.setSubject(mSubjectField->text()); + msg.setPriority(mSubjectField->priority()); + } + + QStringList mediafiles(mBody->mediaContent()); + if (!mediafiles.isEmpty()) + { + for (int i = 0; i < mediafiles.size(); ++i) + { + if(QFile::exists(mediafiles.at(i))) + { + ConvergedMessageAttachment* attachment = + new ConvergedMessageAttachment( + mediafiles.at(i), + ConvergedMessageAttachment::EInline); + mediaList << attachment; + } + else + { mBody->removeMediaContent(mediafiles.at(i)); + errorCode = KErrNotFound; + } + } + + } + if(mediaList.count() > 0) + { + msg.addAttachments(mediaList); + } + } + + // sms/mms attachment list + ConvergedMessageAttachmentList attachmentList; + if(mAttachmentContainer) + { + MsgUnifiedEditorAttachmentList editorAttachmentList = + mAttachmentContainer->attachmentList(); + for (int i = 0; i < editorAttachmentList.count(); ++i) + { + if(QFile::exists(editorAttachmentList.at(i)->path())) + { + ConvergedMessageAttachment* attachment = + new ConvergedMessageAttachment( + editorAttachmentList.at(i)->path(), + ConvergedMessageAttachment::EAttachment); + attachmentList << attachment; + } + else + { + mAttachmentContainer->deleteAttachment(editorAttachmentList.at(i)); + errorCode = KErrNotFound; + } + } + } + if(attachmentList.count() > 0) + { + msg.addAttachments(attachmentList); + } + return errorCode; +} + +// ---------------------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::formatAddresses +// @see header +// ---------------------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::formatAddresses(ConvergedMessageAddressList& addresses) +{ + for(int i=0; i < addresses.count() ;i++ ) + { + QString addr = addresses[i]->address(); + + HBufC *tempAddr = XQConversions::qStringToS60Desc(addr); + + TPtr ptr = tempAddr->Des(); + + // Note: This is just to parse spaces etc away from phonenumbers. + // Ignore EFalse returned for email addresses. + CommonPhoneParser::ParsePhoneNumber(ptr , + CommonPhoneParser::ESMSNumber ); + + addr = XQConversions::s60DescToQString(tempAddr->Des()); + + addresses[i]->setAddress(addr); + + delete tempAddr; + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::addAttachment +// +//--------------------------------------------------------------- +int MsgUnifiedEditorScrollArea::addAttachment(const QString& filepath) +{ + // do nothing if filepath is empty + if(filepath.isEmpty()) + { + return MsgAttachmentContainer::EAddSuccess; + } + + if(!mAttachmentContainer) + { + mAttachmentContainer = new MsgAttachmentContainer(this); + connect(mAttachmentContainer, SIGNAL(emptyAttachmentContainer()), + this, SLOT(removeAttachmentContainer())); + connect(mAttachmentContainer, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor, SLOT(handleContentsChanged(const QVariant&))); + + int index = mMainLayout->count() - 1; + mMainLayout->insertItem(index,mAttachmentContainer); + } + + int ret = mAttachmentContainer->addAttachment(filepath); + if(ret != MsgAttachmentContainer::EAddSuccess) + { + // delete container, if it is empty + if(mAttachmentContainer->count() == 0) + { + removeAttachmentContainer(); + } + } + return ret; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::removeAttachmentContainer +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::removeAttachmentContainer() +{ + if(mAttachmentContainer) + { + mMainLayout->removeItem(mAttachmentContainer); + mAttachmentContainer->setParent(NULL); + delete mAttachmentContainer; + mAttachmentContainer = NULL; + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::addAttachments +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::addAttachments(const QStringList files) +{ + int fcount = files.count(); + int i=0; + for(i=0; ifileNameInUse(fileName); + } + + return inUse; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::scrollByAmount +// +//--------------------------------------------------------------- +bool MsgUnifiedEditorScrollArea::scrollByAmount(const QPointF &delta) +{ + if(mEnableScrolling) + { + return HbScrollArea::scrollByAmount(delta); + } + else + { + return false; + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::enableScrolling +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::enableScrolling(bool enable) +{ + mEnableScrolling = enable; +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::postInputPanelEvent +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::postInputPanelEvent() +{ + // This opens the VKB + QInputContext *ic = qApp->inputContext(); + if (ic) + { + QEvent event(QEvent::RequestSoftwareInputPanel); + ic->filterEvent(&event); + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorScrollArea::populateContent +// +//--------------------------------------------------------------- +void MsgUnifiedEditorScrollArea::populateContent(const ConvergedMessage& msg, bool draftMessage, bool checkForInline) +{ + mToField->skipMaxRecipientQuery(true); + + mToField->setAddresses(msg.toAddressList(),draftMessage); + + if(msg.ccAddressList().count() > 0 ) + { + if(!mCcField) + { + addCcBcc(); + } + mCcField->setAddresses(msg.ccAddressList(),draftMessage); + } + + if(msg.bccAddressList().count() > 0 ) + { + if(!mBccField) + { + addCcBcc(); + } + mBccField->setAddresses(msg.bccAddressList(),draftMessage); + } + + if(msg.subject().size() > 0) + { + if(!mSubjectField) + { + addSubject(); + } + mSubjectField->setText(msg.subject()); + } + + if(msg.priority()==ConvergedMessage::High || + msg.priority() == ConvergedMessage::Low) + { + if(!mSubjectField) + { + addSubject(); + } + mSubjectField->setPriority(msg.priority()); + } + + + ConvergedMessageAttachmentList attachmentList = msg.attachments(); + + UniEditorGenUtils* genUtils = q_check_ptr(new UniEditorGenUtils); + + QStringList pendingAttList; + + int attachmentCount = attachmentList.count(); + + for( int i=0; i < attachmentCount; i++ ) + { + QString filePath = msg.attachments().at(i)->filePath(); + + bool inlineContent = true; + + if(checkForInline) + { + inlineContent = (attachmentList.at(i)->attachmentType() == ConvergedMessageAttachment::EInline); + } + + if (inlineContent) + { + int imageSize=0; + QString mimeType; + TMsgMediaType mediaType = EMsgMediaUnknown; + + TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize, + mimeType,mediaType)); + + switch(mediaType) + { + case EMsgMediaImage: + { + mBody->setImage(filePath,draftMessage); + break; + } + case EMsgMediaAudio: + { + mBody->setAudio(filePath); + break; + } + default: + { + pendingAttList << filePath; + break; + } + } + } + else + { + pendingAttList << filePath; + } + } + // add pending attachments to editor + addAttachments(pendingAttList); + + delete genUtils; + + // ensure that any msg-type change after this are shown + mToField->skipMaxRecipientQuery(false); + +} diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorsubject.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditorsubject.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorsubject.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -45,16 +45,16 @@ mPriority(ConvergedMessage::Normal), mGenUtils(0) { - mSubjectEdit = new MsgUnifiedEditorLineEdit(LOC_SUBJECT,this); - mSubjectEdit->setDefaultBehaviour(true); - HbStyle::setItemName(mSubjectEdit,"subjectEdit"); - mSubjectEdit->setMinRows(1); - mSubjectEdit->setMaxRows(10); - - mGenUtils = q_check_ptr(new UniEditorGenUtils()); - - connect(mSubjectEdit, SIGNAL(contentsChanged(const QString&)), - this, SLOT(onContentsChanged(const QString&))); + this->setObjectName("subject"); + + mSubjectEdit = new MsgUnifiedEditorLineEdit(LOC_SUBJECT,this); + mSubjectEdit->setDefaultBehaviour(true); + HbStyle::setItemName(mSubjectEdit,"subjectEdit"); + + mGenUtils = q_check_ptr(new UniEditorGenUtils()); + + connect(mSubjectEdit, SIGNAL(contentsChanged(const QString&)), + this, SLOT(onContentsChanged(const QString&))); } //--------------------------------------------------------------- @@ -98,7 +98,9 @@ break; } - emit contentChanged(); + QVariantList data; + data << subjectSize() << mPriority; + emit contentsChanged(data); this->repolish(); } @@ -133,7 +135,9 @@ mPrevBuffer = text; if(!subjectOkInSms()) { - emit contentChanged(); + QVariantList data; + data << subjectSize() << mPriority; + emit contentsChanged(data); } } diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp --- a/messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/src/msgunieditorview.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -19,29 +19,25 @@ #include #include #include -#include #include -#include -#include #include #include #include #include #include +#include #include -#include -#include -#include -#include -#include #include #include #include -#include #include #include #include #include +#include +#include +#include + // QT Mobility for fetching business card #include #include @@ -55,11 +51,7 @@ // USER INCLUDES #include "debugtraces.h" #include "msgunieditorview.h" -#include "msgunieditoraddress.h" -#include "msgunieditorsubject.h" -#include "msgunieditorbody.h" #include "msgunieditormonitor.h" -#include "msgunieditorattachmentcontainer.h" #include "msgsendutil.h" #include "convergedmessageaddress.h" #include "UniEditorGenUtils.h" @@ -68,11 +60,12 @@ #include "msgsettingsview.h" #include "msgcontacthandler.h" #include "msgaudiofetcherdialog.h" +#include "msgunieditorscrollarea.h" +#include "msgunieditorbodyeditor.h" QTM_USE_NAMESPACE // Constants -const QString SEND_ICON("qtg_mono_send"); -const QString ATTACH_ICON("qtg_mono_attach"); + // temporary folder for unieditor const QString UNIFIED_EDITOR_TEMP_FOLDER("unifiededitor"); // invalid chars in vcard @@ -89,17 +82,14 @@ // LOCALIZED CONSTANTS #define LOC_TITLE hbTrId("txt_messaging_title_messaging") -//To,Cc.Bcc -#define LOC_TO hbTrId("txt_messaging_formlabel_to") -#define LOC_CC hbTrId("txt_messaging_formlabel_cc") -#define LOC_BCC hbTrId("txt_messaging_formlabel_bcc") //attach options #define LOC_PHOTO hbTrId("txt_messaging_opt_attach_sub_photo") #define LOC_SOUND hbTrId("txt_messaging_opt_attach_sub_sound") #define LOC_BUSINESS_CARD hbTrId("txt_messaging_opt_sub_business_card") -//options menu. +////options menu. +#define LOC_ATTACH hbTrId("txt_messaging_opt_attach") #define LOC_ADD_SUBJECT hbTrId("txt_messaging_opt_add_subject") #define LOC_ADD_CC_BCC hbTrId("txt_messaging_opt_add_cc_bcc") #define LOC_PRIORITY hbTrId("txt_messaging_opt_priority") @@ -110,21 +100,12 @@ #define LOC_NORMAL hbTrId("txt_messaging_opt_attach_sub_normal") #define LOC_LOW hbTrId("txt_messaging_opt_attach_sub_low") -//group box -#define LOC_OTHER_RECIPIENTS(n) hbTrId("txt_messaging_title_ln_other_recipients",n) -#define LOC_OTHER_RECIPIENTS_EXPAND hbTrId("txt_messaging_title_other_recipients") - //saved to draft note #define LOC_SAVED_TO_DRAFTS hbTrId("txt_messaging_dpopinfo_saved_to_drafts") //delete confermation #define LOC_NOTE_DELETE_MESSAGE hbTrId("txt_messaging_dialog_delete_message") -// attachment addition failure note -#define LOC_UNABLE_TO_ADD_ATTACHMENTS hbTrId("txt_messaging_dpopinfo_unable_to_attach_l1_of_l2") - -//extension list item frame. -const QString POPUP_LIST_FRAME("qtg_fr_popup_list_normal"); //settings confirmation #define LOC_DIALOG_SMS_SETTINGS_INCOMPLETE hbTrId("txt_messaging_dialog_sms_message_centre_does_not_e") @@ -153,30 +134,26 @@ //--------------------------------------------------------------- MsgUnifiedEditorView::MsgUnifiedEditorView( QGraphicsItem *parent ) : MsgBaseView(parent), - mSubjectAction(0), - mCcBccAction(0), - mSendAction(0), mMainLayout(0), - mSubjectField(0), - mToField(0), - mCcField(0), - mBccField(0), - mBody(0), - mContentWidget(0), mMsgMonitor(0), - mAttachmentContainer(0), mPluginLoader(0), mCanSaveToDrafts(true), mVkbHost(NULL), mDialog(NULL), mOriginatingSC(0), mOriginatingSME(0), - mReplyPath(false) - { - connect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction())); - - addToolBar(); + mReplyPath(false), + mSubjectAction(0), + mCcBccAction(0), + mPhotoAction(0), + mSoundAction(0), + mFocusedWidget(0), + mMinHeight(0.0), + mMaxHeight(0.0) + { + connect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction())); initView(); + addMenu(); } //--------------------------------------------------------------- @@ -201,64 +178,66 @@ if (!HbStyleLoader::registerFilePath(":/layouts")) { QDEBUG_WRITE("ERROR: MsgUnifiedEditorView -> HbStyleLoader::registerFilePath"); } - HbScrollArea* scrollArea = new HbScrollArea(this); - this->setWidget(scrollArea); - mContentWidget = new HbWidget(this); - scrollArea->setContentWidget(mContentWidget); + //message monitor. + mMsgMonitor = new MsgUnifiedEditorMonitor(this); + + //Set the invalid msg id + mOpenedMessageId.setId(-1); - mMainLayout = new QGraphicsLinearLayout(Qt::Vertical, mContentWidget); + mMainLayout = new QGraphicsLinearLayout(Qt::Vertical, this); qreal vTopSpacing = 0.0; qreal vItemSpacing = 0.0; style()->parameter("hb-param-margin-gene-top",vTopSpacing); - style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); - + style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); mMainLayout->setContentsMargins(0,vTopSpacing,0,0); - mMainLayout->setSpacing(vItemSpacing); - - mMsgMonitor = new MsgUnifiedEditorMonitor(this); - connect(mMsgMonitor, SIGNAL(enableSend(bool)), this, SLOT(enableSendButton(bool))); - - mToField = new MsgUnifiedEditorAddress( LOC_TO, mContentWidget ); + mMainLayout->setSpacing(vItemSpacing); + + mScrollArea = new MsgUnifiedEditorScrollArea(mMsgMonitor,this); + mMainLayout->addItem(mScrollArea); + + mBodyEditor = new MsgUnifiedEditorBodyEditor(this); + + connect(mScrollArea,SIGNAL(enableMenuAction(int,bool)),this,SLOT(enableMenuAction(int,bool))); - mBody = new MsgUnifiedEditorBody( mContentWidget); - - mMainLayout->addItem(mToField); - mMainLayout->addItem(mBody); - - //Set the invalid msg id - mOpenedMessageId.setId(-1); - - connect(mToField, SIGNAL(sendMessage()), this, SLOT(send())); - connect(mToField, SIGNAL(contentChanged()), - mMsgMonitor, SLOT(handleContentChange())); - connect(mToField, SIGNAL(contentChanged()),this,SLOT(onContentChanged())); + connect(mBodyEditor, SIGNAL(contentsChanged(const QVariant&)), + mMsgMonitor,SLOT(handleContentsChanged(const QVariant&))); + + connect(mMsgMonitor,SIGNAL(enableSend(bool)), + mBodyEditor,SLOT(enableSendButton(bool))); - connect(mBody, SIGNAL(sendMessage()), this, SLOT(send())); - connect(mBody, SIGNAL(contentChanged()),this,SLOT(onContentChanged())); - connect(mBody, SIGNAL(contentChanged()), - mMsgMonitor, SLOT(handleContentChange())); - connect(mBody, SIGNAL(enableSendButton(bool)), this, SLOT(enableSendButton(bool))); + connect(mBodyEditor,SIGNAL(sendMessage()),this,SLOT(send())); + + connect(mMsgMonitor,SIGNAL(contentsChanged()),this,SLOT(onContentChanged())); + + mMainLayout->addItem(mBodyEditor); } +//--------------------------------------------------------------- +// MsgUnifiedEditorView::addMenu +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::addMenu() { //Create Menu Options HbMenu* mainMenu = this->menu(); - mainMenu->setFocusPolicy(Qt::NoFocus); - - //if subject field / cc,bcc fields are already present don't add corresponding actions. - if(!mSubjectField) - { - mSubjectAction = mainMenu->addAction(LOC_ADD_SUBJECT); - } + mainMenu->setFocusPolicy(Qt::NoFocus); + + //attach sub menu + HbMenu* attachMenu = mainMenu->addMenu(LOC_ATTACH); + mPhotoAction = attachMenu->addAction(LOC_PHOTO,this,SLOT(fetchImages())); + mSoundAction = attachMenu->addAction(LOC_SOUND,this,SLOT(fetchAudio())); + attachMenu->addAction(LOC_BUSINESS_CARD,this,SLOT(fetchContacts())); - if(!mCcField) - { - mCcBccAction = mainMenu->addAction(LOC_ADD_CC_BCC); - } + //subject action + mSubjectAction = mainMenu->addAction(LOC_ADD_SUBJECT); + //CcBcc action + mCcBccAction = mainMenu->addAction(LOC_ADD_CC_BCC); + connect(mSubjectAction,SIGNAL(triggered()),this, SLOT(addSubject())); + connect(mCcBccAction,SIGNAL(triggered()),this, SLOT(addCcBcc())); + //priority sub menu HbMenu* prioritySubMenu = mainMenu->addMenu(LOC_PRIORITY); HbAction* highPriorityAction = prioritySubMenu->addAction(LOC_HIGH); @@ -268,19 +247,22 @@ normalPriorityAction->setData(ConvergedMessage::Normal); HbAction* lowPriorityAction = prioritySubMenu->addAction(LOC_LOW); - lowPriorityAction->setData(ConvergedMessage::Low); - - HbAction* deleteMsgAction = mainMenu->addAction(LOC_DELETE_MESSAGE); + lowPriorityAction->setData(ConvergedMessage::Low); - connect(mSubjectAction,SIGNAL(triggered()),this, SLOT(addSubject())); - connect(mCcBccAction,SIGNAL(triggered()),this, SLOT(addCcBcc())); - connect(highPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority())); - connect(normalPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority())); - connect(lowPriorityAction, SIGNAL(triggered()), this, SLOT(changePriority())); + connect(highPriorityAction, SIGNAL(triggered()), mScrollArea, SLOT(changePriority())); + connect(normalPriorityAction, SIGNAL(triggered()), mScrollArea, SLOT(changePriority())); + connect(lowPriorityAction, SIGNAL(triggered()), mScrollArea, SLOT(changePriority())); + + + HbAction* deleteMsgAction = mainMenu->addAction(LOC_DELETE_MESSAGE); connect(deleteMsgAction,SIGNAL(triggered()),this, SLOT(deleteMessage())); } +//--------------------------------------------------------------- +// MsgUnifiedEditorView::openDraftsMessage +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::openDraftsMessage(const QVariantList& editorData) { // unpack editor's data @@ -302,11 +284,9 @@ mPluginLoader->getUniEditorPlugin(messageType); mOpenedMessageId.setId(messageId.getId()); - mmOpenedMessageType = messageType; //Fetch the converged message from the msgId - ConvergedMessage* msg; - msg = pluginInterface->convertFrom(messageId.getId()); + ConvergedMessage* msg = pluginInterface->convertFrom(messageId.getId()); if( msg != NULL ) { @@ -317,17 +297,19 @@ mOriginatingSME = msg->toAddressList().at(0)->address(); } //Populate the content inside editor - populateContentIntoEditor(*msg,true); // true as it is draft message + populateContentIntoEditor(*msg,true,true); // true as it is draft message delete msg; } mCanSaveToDrafts = false; } -void MsgUnifiedEditorView::fetchMessageFromStore( - ConvergedMessageId& messageId, - ConvergedMessage::MessageType messageType, - int editorOperation) +//--------------------------------------------------------------- +// MsgUnifiedEditorView::fetchMessageFromStore +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::fetchMessageFromStore(ConvergedMessageId& messageId, + ConvergedMessage::MessageType messageType, int editorOperation) { if(!mPluginLoader) { @@ -336,13 +318,11 @@ UniEditorPluginInterface* pluginInterface = NULL; if( messageType == ConvergedMessage::Mms ) { - pluginInterface = - mPluginLoader->getUniEditorPlugin(ConvergedMessage::Mms); + pluginInterface = mPluginLoader->getUniEditorPlugin(ConvergedMessage::Mms); } else // For sms,vcard,vcal cases { - pluginInterface = - mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms); + pluginInterface = mPluginLoader->getUniEditorPlugin(ConvergedMessage::Sms); } //Fetch the converged message from the msgId @@ -361,11 +341,15 @@ } } //Populate the content inside editor - populateContentIntoEditor(*msg); + populateContentIntoEditor(*msg,false,true); delete msg; } } +//--------------------------------------------------------------- +// MsgUnifiedEditorView::populateContent +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::populateContent(const QVariantList& editorData) { // unpack editor's data @@ -387,8 +371,8 @@ { case MsgBaseView::ADD_SUBJECT: { - addSubject(); - setFocus(mSubjectField); + //setfocus also. + addSubject(true); } break; case MsgBaseView::ADD_VCARD: @@ -401,373 +385,90 @@ fetchMessageFromStore(*messageDetails->id(), messageDetails->messageType(), UniEditorPluginInterface::Forward); + return; } - break; case MsgBaseView::REPLY_MSG: { fetchMessageFromStore(*messageDetails->id(), messageDetails->messageType(), UniEditorPluginInterface::Reply); + return; } - break; case MsgBaseView::REPLY_ALL_MSG: { fetchMessageFromStore(*messageDetails->id(), messageDetails->messageType(), UniEditorPluginInterface::ReplyAll); + return; } - break; default: break; } - // additional common operations for non-forwarded messages - if(editorOp != MsgBaseView::FORWARD_MSG) - { - if(editorOp == MsgBaseView::ADD_RECIPIENTS) - { - // CV sends contact card address as the first address - ConvergedMessageAddressList toAddresses = - messageDetails->toAddressList(); - int addrCount = toAddresses.count(); - if(addrCount > 0) - { - // add contact card address first - ConvergedMessageAddress *firstAddress = - new ConvergedMessageAddress(); - firstAddress->setAlias(toAddresses.at(0)->alias()); - firstAddress->setAddress(toAddresses.at(0)->address()); - ConvergedMessageAddressList firstList; - firstList << firstAddress; - mToField->setAddresses(firstList); - - // add remaining contacts now - ConvergedMessageAddressList otherList; - for(int i=1; isetAddresses(otherList); - } - } - else - { - mToField->setAddresses(messageDetails->toAddressList()); - } - QString bodyTxt = messageDetails->bodyText(); - mBody->setText(bodyTxt); + populateContentIntoEditor(*messageDetails,false,false); - int attachmentCount = messageDetails->attachments().count(); - QStringList pendingAttList; - for(int i=0; iattachments().at(i)->filePath(); - - - UniEditorGenUtils* genUtils = q_check_ptr(new UniEditorGenUtils); - - TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize, - mimeType,mediaType)); - delete genUtils; - switch(mediaType) - { - case EMsgMediaImage: - { - mBody->setImage(filePath); - } - break; - case EMsgMediaAudio: - { - mBody->setAudio(filePath); - } - break; - default: - { - pendingAttList << filePath; - } - break; - } - } - // add pending attachments in bulk - addAttachments(pendingAttList); - } delete messageDetails; } -void MsgUnifiedEditorView::populateContentIntoEditor( - const ConvergedMessage& messageDetails,bool draftMessage) +//--------------------------------------------------------------- +// MsgUnifiedEditorView::populateContentIntoEditor +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::populateContentIntoEditor(const ConvergedMessage& messageDetails, + bool draftMessage, + bool checkForInline) { // skip first-time MMS type switch note for draft - mMsgMonitor->setSkipNote(true); - mToField->skipMaxRecipientQuery(true); - - mToField->setAddresses(messageDetails.toAddressList(),draftMessage); - if(messageDetails.ccAddressList().count() > 0 ) - { - if(!mCcField) - { - addCcBcc(); - } - mCcField->setAddresses(messageDetails.ccAddressList(),draftMessage); - } - if(messageDetails.bccAddressList().count() > 0 ) + if(draftMessage) { - if(!mBccField) - { - addCcBcc(); - } - mBccField->setAddresses(messageDetails.bccAddressList(),draftMessage); - } - if(messageDetails.subject().size() > 0) - { - if(!mSubjectField) - { - addSubject(); - } - mSubjectField->setText(messageDetails.subject()); - } - - if(messageDetails.priority()==ConvergedMessage::High || - messageDetails.priority() == ConvergedMessage::Low) - { - if(!mSubjectField) - { - addSubject(); - } - mSubjectField->setPriority(messageDetails.priority()); + mMsgMonitor->setSkipNote(true); } - QString bodyTxt = messageDetails.bodyText(); - mBody->setText(bodyTxt); - - ConvergedMessageAttachmentList attachmentList = - messageDetails.attachments(); - int attachmentCount = attachmentList.count(); - - UniEditorGenUtils* genUtils = q_check_ptr(new UniEditorGenUtils); - - QStringList pendingAttList; - for( int i=0; i < attachmentCount; i++ ) - { - QString filePath = messageDetails.attachments().at(i)->filePath(); - - if(attachmentList.at(i)->attachmentType() == - ConvergedMessageAttachment::EInline) - { - int imageSize=0; - QString mimeType; - TMsgMediaType mediaType = EMsgMediaUnknown; - TRAP_IGNORE(genUtils->getFileInfoL(filePath,imageSize, - mimeType,mediaType)); + //scrollarea populate contents + mScrollArea->populateContent(messageDetails,draftMessage,checkForInline); - switch(mediaType) - { - case EMsgMediaImage: - { - mBody->setImage(filePath,draftMessage); - break; - } - case EMsgMediaAudio: - { - mBody->setAudio(filePath); - break; - } - default: - { - pendingAttList << filePath; - break; - } - } - } - else - { - pendingAttList << filePath; - } - } - // add pending attachments to editor - addAttachments(pendingAttList); + //body editor populate contents + mBodyEditor->populateContent(messageDetails); - delete genUtils; - // ensure that any msg-type change after this are shown - mToField->skipMaxRecipientQuery(false); mMsgMonitor->setSkipNote(false); } -void MsgUnifiedEditorView::addToolBar() +//--------------------------------------------------------------- +// MsgUnifiedEditorView::addSubject +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::addSubject(bool needFocus) { - //Create Tool Bar - HbToolBar *toolBar = new HbToolBar(); - toolBar->setOrientation(Qt::Horizontal); - - //tool bar extension for attach action. - HbToolBarExtension* attachExtension = new HbToolBarExtension(); - mAttachAction = toolBar->addExtension(attachExtension); - mAttachAction->setIcon(HbIcon(ATTACH_ICON)); - - mTBExtnContentWidget = new HbListWidget(); - mTBExtnContentWidget->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Fixed); - mTBExtnContentWidget->addItem(LOC_PHOTO); - mTBExtnContentWidget->addItem(LOC_SOUND); - mTBExtnContentWidget->addItem(LOC_BUSINESS_CARD); - - HbListViewItem *prototype = mTBExtnContentWidget->listItemPrototype(); - HbFrameBackground frame(POPUP_LIST_FRAME, HbFrameDrawer::NinePieces); - prototype->setDefaultFrame(frame); - - connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), - this, SLOT(handleViewExtnActivated(HbListWidgetItem*))); - connect(mTBExtnContentWidget, SIGNAL(activated(HbListWidgetItem*)), - attachExtension, SLOT(close())); - - attachExtension->setContentWidget(mTBExtnContentWidget); - - //Add Action to the toolbar and show toolbar - mSendAction = toolBar->addAction(HbIcon(SEND_ICON),QString(),this,SLOT(send())); - mSendAction->setDisabled(true); - - setToolBar(toolBar); -} - -void MsgUnifiedEditorView::addSubject() -{ - if(mSubjectField) - { // do nothing if already present - return; - } - - int index =0; - int offset = 1; - if(mAttachmentContainer) - { - ++offset; - } - index = mMainLayout->count() - offset; - - mSubjectField = new MsgUnifiedEditorSubject( mContentWidget); - - mMainLayout->insertItem(index,mSubjectField); - connect(mSubjectField, SIGNAL(contentChanged()), - mMsgMonitor, SLOT(handleContentChange())); - connect(mSubjectField, SIGNAL(contentChanged()),this,SLOT(onContentChanged())); - - //set focus to subject field. + //triggered from menu so need a focus. HbAction* subjectAction = qobject_cast(this->sender()); if(subjectAction) { - setFocus(mSubjectField); + needFocus = true; } - - // remove mainmenu's "Add Subject" action - if(mSubjectAction) - { - HbMenu* mainMenu = this->menu(); - mainMenu->removeAction(mSubjectAction); - mSubjectAction->setParent(NULL); - delete mSubjectAction; - } + mScrollArea->addSubject(needFocus); } -void MsgUnifiedEditorView::addCcBcc() +//--------------------------------------------------------------- +// MsgUnifiedEditorView::addCcBcc +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::addCcBcc(bool needFocus) { - if(mCcField && mBccField) - { // do nothing if already present - return; + //set focus to Cc field. + HbAction* ccBccAction = qobject_cast(this->sender()); + if(ccBccAction) + { + needFocus = true; } - mCcField = new MsgUnifiedEditorAddress( LOC_CC, mContentWidget ); - mBccField = new MsgUnifiedEditorAddress( LOC_BCC, mContentWidget ); - mCcField->skipMaxRecipientQuery(true); - mBccField->skipMaxRecipientQuery(true); - - connect(mCcField, SIGNAL(sendMessage()), this, SLOT(send())); - connect(mCcField, SIGNAL(contentChanged()), mMsgMonitor, SLOT(handleContentChange())); - connect(mCcField, SIGNAL(contentChanged()),this,SLOT(onContentChanged())); - - connect(mBccField, SIGNAL(sendMessage()), this, SLOT(send())); - connect(mBccField, SIGNAL(contentChanged()), mMsgMonitor, SLOT(handleContentChange())); - connect(mBccField, SIGNAL(contentChanged()),this,SLOT(onContentChanged())); - - HbWidget* groupWidget = new HbWidget(mContentWidget); - groupWidget->setContentsMargins(0,0,0,0); - - QGraphicsLinearLayout* ccBccLayout = new QGraphicsLinearLayout(Qt::Vertical, groupWidget); - ccBccLayout->setContentsMargins(0,0,0,0); - - qreal vItemSpacing = 0.0; - style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); - ccBccLayout->setSpacing(vItemSpacing); - ccBccLayout->addItem(mCcField); - ccBccLayout->addItem(mBccField); - - HbGroupBox* groupBox = new HbGroupBox(0); - groupBox->setObjectName("groupBox"); - - groupBox->setContentWidget(groupWidget); - groupBox->setHeading(LOC_OTHER_RECIPIENTS_EXPAND); - mMainLayout->insertItem(1,groupBox); - connect(groupBox, SIGNAL(toggled(bool)), this, SLOT(updateOtherRecipientCount(bool))); - - // add subject field too + mScrollArea->addCcBcc(needFocus); addSubject(); - - //set focus to Cc field. - HbAction* ccBccAction = qobject_cast(this->sender()); - if(mCcBccAction) - { - setFocus(mCcField); - } - - // remove mainmenu's "Add Cc/Bcc" & "Add Subject" actions - if(mCcBccAction) - { - HbMenu* mainmenu = this->menu(); - mainmenu->removeAction(mCcBccAction); - mCcBccAction->setParent(NULL); - delete mCcBccAction; - } - - this->updateGeometry(); } -void MsgUnifiedEditorView::updateOtherRecipientCount(bool state) -{ - HbGroupBox* groupBox = qobject_cast(sender()); - if(groupBox) - { - if(!state) - { - groupBox->setHeading(LOC_OTHER_RECIPIENTS_EXPAND); - } - else - { - int addrCount = mCcField->addressCount(); - addrCount += mBccField->addressCount(); - if(addrCount > 0) - { - groupBox->setHeading(LOC_OTHER_RECIPIENTS(addrCount)); - } - } - } -} - -void MsgUnifiedEditorView::changePriority() -{ - HbAction* action = qobject_cast(sender()); - - ConvergedMessage::Priority priority = ConvergedMessage::Normal; - if(action) - { - int data = action->data().toInt(); - priority = ConvergedMessage::Priority(data); - } - - addSubject(); - mSubjectField->setPriority(priority); -} - +//--------------------------------------------------------------- +// MsgUnifiedEditorView::deleteMessage +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::deleteMessage() { HbMessageBox::question(LOC_NOTE_DELETE_MESSAGE,this, @@ -775,76 +476,26 @@ HbMessageBox::Delete | HbMessageBox::Cancel); } -void MsgUnifiedEditorView::removeAttachmentContainer() -{ - if(mAttachmentContainer) - { - mMainLayout->removeItem(mAttachmentContainer); - mAttachmentContainer->setParent(NULL); - delete mAttachmentContainer; - mAttachmentContainer = NULL; - } -} - +//--------------------------------------------------------------- +// MsgUnifiedEditorView::addAttachments +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::addAttachments(QStringList files) { - int fcount = files.count(); - int i=0; - for(i=0; iaddAttachments(files); } -int MsgUnifiedEditorView::addAttachment(const QString& filepath) -{ - // do nothing if filepath is empty - if(filepath.isEmpty()) - { - return MsgAttachmentContainer::EAddSuccess; - } - - if(!mAttachmentContainer) - { - mAttachmentContainer = new MsgAttachmentContainer( mContentWidget); - connect(mAttachmentContainer, SIGNAL(emptyAttachmentContainer()), - this, SLOT(removeAttachmentContainer())); - connect(mAttachmentContainer, SIGNAL(contentChanged()), - mMsgMonitor, SLOT(handleContentChange())); - connect(mAttachmentContainer, SIGNAL(contentChanged()), - this,SLOT(onContentChanged())); - - int index = mMainLayout->count() - 1; - mMainLayout->insertItem(index,mAttachmentContainer); - } - - int ret = mAttachmentContainer->addAttachment(filepath); - if(ret != MsgAttachmentContainer::EAddSuccess) - { - // delete container, if it is empty - if(mAttachmentContainer->count() == 0) - { - removeAttachmentContainer(); - } - } - return ret; -} - +//--------------------------------------------------------------- +// MsgUnifiedEditorView::send +// @see header file +//--------------------------------------------------------------- void MsgUnifiedEditorView::send() { activateInputBlocker(); - + // first run the address validation tests - if( !mToField->validateContacts() || - (mCcField && !mCcField->validateContacts()) || - (mBccField && !mBccField->validateContacts()) ) + if(!mScrollArea->contactsValid() || + !MsgUnifiedEditorMonitor::readyForSend()) { deactivateInputBlocker(); return; @@ -855,38 +506,7 @@ ConvergedMessage::MessageType messageType = MsgUnifiedEditorMonitor::messageType(); msg.setMessageType(messageType); - // we need to remove duplicate addresses - bool removeDuplicates = true; - ConvergedMessageAddressList addresses = - mToField->addresses(removeDuplicates); - if(messageType == ConvergedMessage::Sms && - addresses.isEmpty()) - { - // no recipient specified for sms, do not send msg - deactivateInputBlocker(); - return; - } - ConvergedMessageAddressList ccAddresses; - ConvergedMessageAddressList bccAddresses; - if(mCcField) - { - ccAddresses = mCcField->addresses(removeDuplicates); - } - if(mBccField) - { - bccAddresses = mBccField->addresses(removeDuplicates); - } - if( messageType == ConvergedMessage::Mms && - addresses.isEmpty() && - ccAddresses.isEmpty() && - bccAddresses.isEmpty()) - { - // no recipient specified for mms, do not send msg - deactivateInputBlocker(); - return; - } - //close vkb before switching view. mVkbHost->closeKeypad(true); @@ -901,7 +521,7 @@ MsgSendUtil *sendUtil = new MsgSendUtil(this); int sendResult = sendUtil->send(msg); delete sendUtil; - + // all checks and validations happen before send if( sendResult == KErrNone) { @@ -917,54 +537,34 @@ UniEditorPluginInterface* pluginInterface = mPluginLoader->getUniEditorPlugin(messageType); - //TODO delete the entry + //delete the entry pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId()); } - ConvergedMessageAddressList addrList = addresses; - QString receipient; - + ConvergedMessageAddressList addrList = msg.toAddressList() + + msg.ccAddressList() + + msg.bccAddressList(); + int recepientCount = addrList.count(); - if(recepientCount) - { - receipient = addrList.at(0)->address(); - } - if( mCcField && mBccField) - { - addrList = ccAddresses; - int ccCount = addrList.count(); - recepientCount += ccCount; - if(ccCount) - { - receipient = addrList.at(0)->address(); - } + QVariantList params; - addrList = bccAddresses; - int bccCount = addrList.count(); - recepientCount += bccCount; - if(bccCount) - { - receipient = addrList.at(0)->address(); - } + if(recepientCount == 1 ) + { + params << MsgBaseView::CV; // target view + params << MsgBaseView::UNIEDITOR; // source view + QString receipient = addrList.at(0)->address(); + params << receipient; } - - QVariantList params; - - if(recepientCount == 1 ) + else { - params << MsgBaseView::CV; // target view - params << MsgBaseView::UNIEDITOR; // source view - - params << receipient; - } - else - { - params << MsgBaseView::CLV;// target view - params << MsgBaseView::UNIEDITOR; // source view + params << MsgBaseView::CLV;// target view + params << MsgBaseView::UNIEDITOR; // source view } deactivateInputBlocker(); emit switchView(params); + + mCanSaveToDrafts = false; } else { @@ -974,19 +574,23 @@ if (messageType == ConvergedMessage::Sms) { HbMessageBox::question(LOC_DIALOG_SMS_SETTINGS_INCOMPLETE, - this,SLOT(onDialogSmsSettings(HbAction*)), - HbMessageBox::Ok | HbMessageBox::Cancel); + this,SLOT(onDialogSmsSettings(HbAction*)), + HbMessageBox::Ok | HbMessageBox::Cancel); } else { HbMessageBox::question(LOC_DIALOG_MMS_SETTINGS_INCOMPLETE, - this,SLOT(onDialogMmsSettings(HbAction*)), - HbMessageBox::Ok | HbMessageBox::Cancel); + this,SLOT(onDialogMmsSettings(HbAction*)), + HbMessageBox::Ok | HbMessageBox::Cancel); } } } } +//--------------------------------------------------------------- +// MsgUnifiedEditorView::packMessage +// @see header file +//--------------------------------------------------------------- int MsgUnifiedEditorView::packMessage(ConvergedMessage &msg, bool isSave) { // reset reply-path if originating SME constraint is broken @@ -1003,157 +607,24 @@ ConvergedMessage::MessageType messageType = MsgUnifiedEditorMonitor::messageType(); msg.setMessageType(messageType); - // If isSave is true (save to draft usecase), then don't remove duplicates - // If isSave is false (send usecase), then remove duplicates - bool removeDuplicates = !isSave; - ConvergedMessageAddressList addresses = - mToField->addresses(removeDuplicates); - ConvergedMessageAddressList ccAddresses; - ConvergedMessageAddressList bccAddresses; - ConvergedMessageAttachmentList mediaList; - int errorCode = 0; - //Don't format the addresses for save to drfats case - if(!isSave) - { - formatAddresses(addresses); - } - - msg.addToRecipients(addresses); - msg.setBodyText(mBody->text()); msg.setDirection(ConvergedMessage::Outgoing); QDateTime time = QDateTime::currentDateTime(); msg.setTimeStamp(time.toTime_t()); - - if(messageType == ConvergedMessage::Mms) - { - if(mCcField) - { - ccAddresses = mCcField->addresses(removeDuplicates); - } - - if(mBccField) - { - bccAddresses = mBccField->addresses(removeDuplicates); - } - - if(removeDuplicates) - { - int matchDigitsCount = MsgUnifiedEditorAddress::contactMatchDigits(); - //comapre cc and to field,remove duplicate from cc - foreach(ConvergedMessageAddress *ccAddress,ccAddresses) - { - foreach(ConvergedMessageAddress *toAddress,addresses) - { - if(0 == ccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount))) - { - ccAddresses.removeOne(ccAddress); - } - } - } - //comapre bcc and cc field,remove duplicate from bcc - foreach(ConvergedMessageAddress *bccAddress,bccAddresses) - { - foreach(ConvergedMessageAddress *ccAddress,ccAddresses) - { - if(0 == bccAddress->address().right(matchDigitsCount).compare(ccAddress->address().right(matchDigitsCount))) - { - bccAddresses.removeOne(bccAddress); - } - } - } - //comapre bcc and to field,remove duplicate from bcc - foreach(ConvergedMessageAddress *bccAddress,bccAddresses) - { - foreach(ConvergedMessageAddress *toAddress,addresses) - { - if(0 == bccAddress->address().right(matchDigitsCount).compare(toAddress->address().right(matchDigitsCount))) - { - bccAddresses.removeOne(bccAddress); - } - } - } - } - - if(ccAddresses.count()>0) - { - //Don't format the addresses for save to drfats case - if(!isSave) - { - formatAddresses(ccAddresses); - } - msg.addCcRecipients(ccAddresses); - } - if(bccAddresses.count()>0) - { - //Don't format the addresses for save to drfats case - if(!isSave) - { - formatAddresses(bccAddresses); - } - msg.addBccRecipients(bccAddresses); - } - if(mSubjectField) - { - msg.setSubject(mSubjectField->text()); - msg.setPriority(mSubjectField->priority()); - } - - QStringList mediafiles(mBody->mediaContent()); - if (!mediafiles.isEmpty()) - { - for (int i = 0; i < mediafiles.size(); ++i) - { - if(QFile::exists(mediafiles.at(i))) - { - ConvergedMessageAttachment* attachment = - new ConvergedMessageAttachment( - mediafiles.at(i), - ConvergedMessageAttachment::EInline); - mediaList << attachment; - } - else - { mBody->removeMediaContent(mediafiles.at(i)); - errorCode = KErrNotFound; - } - } - - } - if(mediaList.count() > 0) - { - msg.addAttachments(mediaList); - } - } - - // sms/mms attachment list - ConvergedMessageAttachmentList attachmentList; - if(mAttachmentContainer) - { - MsgUnifiedEditorAttachmentList editorAttachmentList = - mAttachmentContainer->attachmentList(); - for (int i = 0; i < editorAttachmentList.count(); ++i) - { - if(QFile::exists(editorAttachmentList.at(i)->path())) - { - ConvergedMessageAttachment* attachment = - new ConvergedMessageAttachment( - editorAttachmentList.at(i)->path(), - ConvergedMessageAttachment::EAttachment); - attachmentList << attachment; - } - else - { - mAttachmentContainer->deleteAttachment(editorAttachmentList.at(i)); - errorCode = KErrNotFound; - } - } - } - if(attachmentList.count() > 0) - { - msg.addAttachments(attachmentList); - } - return errorCode; + + + //pack message data from mscrollarea. + int errorCode = mScrollArea->packMessage(msg,isSave); + + //pack message data from body editor. + mBodyEditor->packMessage(msg); + + return errorCode; } +//--------------------------------------------------------------- +// MsgUnifiedEditorView::saveContentToDrafts +// @see header file +//--------------------------------------------------------------- int MsgUnifiedEditorView::saveContentToDrafts() { if(!mCanSaveToDrafts) @@ -1164,8 +635,6 @@ activateInputBlocker(); ConvergedMessage::MessageType messageType = MsgUnifiedEditorMonitor::messageType(); - ConvergedMessageAddressList addresses = mToField->addresses(); - UniEditorPluginInterface* pluginInterface = NULL; if( mOpenedMessageId.getId() != -1) @@ -1175,77 +644,29 @@ mPluginLoader = new UniEditorPluginLoader(this); } - pluginInterface = - mPluginLoader->getUniEditorPlugin(messageType); - } - - if(messageType == ConvergedMessage::Sms && - addresses.isEmpty() && - MsgUnifiedEditorMonitor::bodySize() <= 0 && - MsgUnifiedEditorMonitor::containerSize() <= 0) - { - if(mOpenedMessageId.getId() != -1) - { - pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId()); - } - - // if empty msg, do not save - deactivateInputBlocker(); - return INVALID_MSGID; + pluginInterface = mPluginLoader->getUniEditorPlugin(messageType); } - ConvergedMessageAddressList ccAddresses; - ConvergedMessageAddressList bccAddresses; - if(mCcField) - { - ccAddresses = mCcField->addresses(); - } - if(mBccField) - { - bccAddresses = mBccField->addresses(); - } - int subectSize =0; - if(mSubjectField) - { - subectSize = mSubjectField->text().size(); - } - - if( messageType == ConvergedMessage::Mms && - addresses.isEmpty() && - ccAddresses.isEmpty() && - bccAddresses.isEmpty() && - subectSize <= 0 && - MsgUnifiedEditorMonitor::bodySize() <= 0 && - MsgUnifiedEditorMonitor::containerSize() <= 0) + // if empty msg, do not save + if( MsgUnifiedEditorMonitor::messageSize() <= 0 && + MsgUnifiedEditorMonitor::msgAddressCount() <= 0 ) { if(mOpenedMessageId.getId() != -1) { pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId()); } - // if empty msg, do not send + deactivateInputBlocker(); return INVALID_MSGID; } + ConvergedMessage msg; int result = packMessage(msg, true); if(result == KErrNotFound) { HbNotificationDialog::launchDialog(LOC_NOTE_FILES_MISSED_DRAFTS); - if(messageType == ConvergedMessage::Sms && - addresses.isEmpty() && - MsgUnifiedEditorMonitor::bodySize() <= 0 && - MsgUnifiedEditorMonitor::containerSize() <= 0) - { - if(mOpenedMessageId.getId() != -1) - { - pluginInterface->deleteDraftsEntry(mOpenedMessageId.getId()); - } - - // if empty msg, do not save - deactivateInputBlocker(); - return INVALID_MSGID; - } } + // save to drafts MsgSendUtil *sendUtil = new MsgSendUtil(this); int msgId = sendUtil->saveToDrafts(msg); @@ -1267,13 +688,21 @@ { HbDeviceNotificationDialog::notification("", LOC_SAVED_TO_DRAFTS); } + + mCanSaveToDrafts = false; + return msgId; } + +//--------------------------------------------------------------- +// MsgUnifiedEditorView::handleKeyEvent +// @see header file +//--------------------------------------------------------------- bool MsgUnifiedEditorView::handleKeyEvent(int key) { bool eventHandled = false; - if (Qt::Key_Yes == key && mSendAction->isEnabled()) { + if (Qt::Key_Yes == key) { eventHandled = true; send(); } @@ -1281,16 +710,6 @@ return eventHandled; } -void MsgUnifiedEditorView::resizeEvent( QGraphicsSceneResizeEvent * event ) -{ - Q_UNUSED(event) - #ifdef _DEBUG_TRACES_ - qDebug()<<"resize event"; -#endif - - mContentWidget->resize(this->rect().width(),this->rect().height()+1); -} - //--------------------------------------------------------------- // MsgUnifiedEditorView::createVCards // @see header file @@ -1415,24 +834,7 @@ searchFileName.append(FILE_EXTN); // check if filename is already used by an attachment in container - bool alreadyExists = false; - if(mAttachmentContainer) - { - MsgUnifiedEditorAttachmentList attList = - mAttachmentContainer->attachmentList(); - int attCount = attList.count(); - for(int j=0; jpath()); - if(searchFileName == fileinfo.fileName()) - { - alreadyExists = true; - break; - } - } - } - - if(!alreadyExists) + if(!mScrollArea->fileNameInUse(searchFileName)) { if(i>0) { @@ -1447,27 +849,6 @@ return filepath; } -void MsgUnifiedEditorView::handleViewExtnActivated(HbListWidgetItem* item) - { - QString itemText = item->text(); - - if(itemText == LOC_PHOTO) - { - //launch photo picker. - fetchImages(); - } - else if(itemText == LOC_SOUND) - { - //launch audio picker - fetchAudio(); - } - else if(itemText == LOC_BUSINESS_CARD) - { - //launch contact card picker. - fetchContacts(); - } - -} //--------------------------------------------------------------- // MsgUnifiedEditorView::fetchContacts @@ -1488,7 +869,7 @@ return; } - request->setSynchronous(false); // synchronous + request->setSynchronous(false); // asynchronous // Result handlers connect (request, SIGNAL(requestOk(const QVariant&)), @@ -1524,7 +905,7 @@ QCRITICAL_WRITE("AIW-ERROR: NULL request"); return; } - request->setSynchronous(false); // synchronous + request->setSynchronous(false); // asynchronous connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(imagesFetched(const QVariant&))); @@ -1596,7 +977,7 @@ if ( fileList.size()>0 ) { QString filepath(QDir::toNativeSeparators(fileList.at(0))); - mBody->setImage(filepath); + mScrollArea->setImage(filepath); } } } @@ -1637,14 +1018,57 @@ } //--------------------------------------------------------------- -// MsgUnifiedEditorView::setAttachOptionEnabled +// MsgUnifiedEditorView::enableMenuAction // @see header file //-------------------------------------------------------------- -void MsgUnifiedEditorView::setAttachOptionEnabled( - MsgUnifiedEditorView::TBE_AttachOption opt, bool enable) +void MsgUnifiedEditorView::enableMenuAction(int action, bool enable) { - HbListWidgetItem* wgtItem = mTBExtnContentWidget->item(opt); - wgtItem->setEnabled(enable); + switch(action) + { + case SOUND: + { + if(mSoundAction) + { + mSoundAction->setEnabled(enable); + } + break; + } + case PHOTO: + { + if(mPhotoAction) + { + mPhotoAction->setEnabled(enable); + } + break; + } + case SUBJECT: //subject action has to be removed + { + // remove mainmenu's "Add Subject" action + if(mSubjectAction) + { + this->menu()->removeAction(mSubjectAction); + mSubjectAction->setParent(NULL); + delete mSubjectAction; + mSubjectAction = NULL; + } + break; + } + case CCBCC: //CcBcc action has to be removed + { + // remove mainmenu's "Add Cc/Bcc" & "Add Subject" actions + if(mCcBccAction) + { + this->menu()->removeAction(mCcBccAction); + mCcBccAction->setParent(NULL); + delete mCcBccAction; + mCcBccAction = NULL; + } + break; + } + + default: + break; + } } //--------------------------------------------------------------- @@ -1655,55 +1079,220 @@ { hideChrome(true); + //get focussed object. + HbInputMethod* im = HbInputMethod::activeInputMethod(); + HbInputFocusObject* focusObj = im->focusObject(); + if(focusObj) + { + QObject* obj = focusObj->object(); + mFocusedWidget = qobject_cast(obj); + HbAbstractEdit* editor = qobject_cast(obj); + if(editor) + { + connect(editor,SIGNAL(contentsChanged()),this,SLOT(ensureVisibility())); + } + } + + QRectF appRect = mVkbHost->applicationArea(); + + if(this->mainWindow()->orientation() == Qt::Vertical) + { + this->setMaximumHeight(appRect.height()); + mScrollArea->resize(-1,-1); + } + else + { + if(mFocusedWidget) + { + qreal vItemSpacing = 0.0; + style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); + + mMinHeight = mFocusedWidget->minimumHeight(); + mMaxHeight = mFocusedWidget->maximumHeight(); + qreal newHeight = appRect.height()-vItemSpacing-1; + mFocusedWidget->setMinimumHeight(newHeight); + mFocusedWidget->setMaximumHeight(newHeight); + mFocusedWidget->resize(mFocusedWidget->rect().width(),newHeight); + + } + } + + //do layouting after some delay. + QTimer::singleShot(50,this,SLOT(doLayout())); + disconnect(mVkbHost,SIGNAL(keypadOpened()),this,SLOT(vkbOpened())); + connect(this->mainWindow(),SIGNAL(aboutToChangeOrientation()),this,SLOT(resetLayout())); } - + //--------------------------------------------------------------- // MsgUnifiedEditorView::vkbClosed // @see header file //--------------------------------------------------------------- void MsgUnifiedEditorView::vkbClosed() { - hideChrome(false); + hideChrome(false); + + resetLayout(); + + connect(mVkbHost,SIGNAL(keypadOpened()),this,SLOT(vkbOpened())); - connect(mVkbHost,SIGNAL(keypadOpened()),this,SLOT(vkbOpened())); + disconnect(this->mainWindow(),SIGNAL(aboutToChangeOrientation()),this,SLOT(resetLayout())); +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorView::doLayout +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::doLayout() +{ + if(mFocusedWidget && mVkbHost->keypadStatus() == HbVkbHost::HbVkbStatusOpened) + { + if(this->mainWindow()->orientation() == Qt::Vertical) + { + ensureVisibility(); + } + else + { + qreal vItemSpacing = 0.0; + style()->parameter("hb-param-margin-gene-middle-vertical",vItemSpacing); + + if(mScrollArea->isAncestorOf(mFocusedWidget)) + { + QPointF p = mScrollArea->mapFromScene(mFocusedWidget->scenePos()); + mScrollArea->scrollContentsTo(p,0); + mScrollArea->enableScrolling(false); + mScrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); + } + + QPointF pp = mapFromScene(mFocusedWidget->scenePos()); + qreal delta = pp.y() - vItemSpacing; + this->setTransform(QTransform::fromTranslate(0, -delta), true); + } + } } //--------------------------------------------------------------- -// MsgUnifiedEditorView::vkbAboutToOpen +// MsgUnifiedEditorView::resetLayout +// @see header file +//--------------------------------------------------------------- +void MsgUnifiedEditorView::resetLayout() +{ + //disconnect signal from previously focused object. + if(mFocusedWidget) + { + HbAbstractEdit* editor = qobject_cast(mFocusedWidget); + disconnect(editor,SIGNAL(contentsChanged()),this,SLOT(ensureVisibility())); + } + + if(this->mainWindow()->orientation() == Qt::Vertical) + { + this->setMaximumHeight(-1); + mScrollArea->scrollContentsTo(QPointF(0,0),0); + mScrollArea->resize(-1,-1); + } + else + { + this->resetTransform(); + + if(mFocusedWidget) + { + if(mMinHeight >0) + { + mFocusedWidget->setMinimumHeight(mMinHeight); + mMinHeight = 0.0; + } + if(mMaxHeight >0) + { + mFocusedWidget->setMaximumHeight(mMaxHeight); + mMaxHeight = 0.0; + } + + if(mScrollArea->isAncestorOf(mFocusedWidget)) + { + mScrollArea->enableScrolling(true); + mScrollArea->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAutoHide); + mScrollArea->scrollContentsTo(QPointF(0,0),0); + } + + mFocusedWidget = NULL; + } + + } +} + +//--------------------------------------------------------------- +// MsgUnifiedEditorView::ensureVisibility // @see header file //--------------------------------------------------------------- -void MsgUnifiedEditorView::vkbAboutToOpen() -{ - //This is done to avoid user action on attachment - //toolbar button when vkb is opening - mAttachAction->setDisabled(true); - disconnect(mVkbHost,SIGNAL(aboutToOpen()), - this,SLOT(vkbAboutToOpen())); +void MsgUnifiedEditorView::ensureVisibility() +{ + if(mFocusedWidget && mVkbHost->keypadStatus() == HbVkbHost::HbVkbStatusOpened) + { + if(this->mainWindow()->orientation() == Qt::Vertical) + { + if ( mScrollArea->isAncestorOf(mFocusedWidget)) + { + QRectF scrollRect = mScrollArea->sceneBoundingRect(); + QRectF editorRect = mFocusedWidget->sceneBoundingRect(); + + if (!scrollRect.contains(editorRect) || + scrollRect.intersects(editorRect)) + { + + if (editorRect.height() < scrollRect.height()) { + // Whole editor rect fits into scroll area. Move it there. + if (editorRect.bottom() > scrollRect.bottom()) { + // Scroll upwards. + mScrollArea->ensureVisible(mScrollArea->contentWidget()->mapFromScene(editorRect.bottomLeft())); + } else { + // Scroll downwards. + mScrollArea->ensureVisible(mScrollArea->contentWidget()->mapFromScene(editorRect.topLeft())); + } + } + } + } + } + } } - + //--------------------------------------------------------------- -// MsgUnifiedEditorView::vkbAboutToClose +// MsgUnifiedEditorView::focusChanged // @see header file //--------------------------------------------------------------- -void MsgUnifiedEditorView::vkbAboutToClose() -{ - mAttachAction->setDisabled(false); - connect(mVkbHost,SIGNAL(aboutToOpen()), - this,SLOT(vkbAboutToOpen())); +void MsgUnifiedEditorView::focusChanged() +{ + //disconnect signal from previously focused object. + if(mFocusedWidget) + { + HbAbstractEdit* editor = qobject_cast(mFocusedWidget); + disconnect(editor,SIGNAL(contentsChanged()),this,SLOT(ensureVisibility())); + } + + //connect signal for newly focused object. + HbInputMethod* im = HbInputMethod::activeInputMethod(); + HbInputFocusObject* focusObj = im->focusObject(); + if(focusObj) + { + QObject* obj = focusObj->object(); + mFocusedWidget = qobject_cast(obj); + HbAbstractEdit* editor = qobject_cast(obj); + if(editor) + { + connect(editor,SIGNAL(contentsChanged()),this,SLOT(ensureVisibility())); + } + } } //--------------------------------------------------------------- // MsgUnifiedEditorView::onAudioSelected // @see header file //--------------------------------------------------------------- -void -MsgUnifiedEditorView::onAudioSelected(QString& filePath) +void MsgUnifiedEditorView::onAudioSelected(QString& filePath) { if (!filePath.isEmpty()) - { - mBody->setAudio(filePath); - } + { + mScrollArea->setAudio(filePath); + } } //--------------------------------------------------------------- @@ -1730,18 +1319,16 @@ //--------------------------------------------------------------- void MsgUnifiedEditorView::doDelayedConstruction() { - addMenu(); createTempFolder(); //Create VKB instance and listen to VKB open and close signals. - mVkbHost = new HbAbstractVkbHost(this); + mVkbHost = new MsgUniEditorVkbHost(this); + + connect(mVkbHost, SIGNAL(focusChanged()), this, SLOT(focusChanged())); connect(mVkbHost, SIGNAL(keypadOpened()), this, SLOT(vkbOpened())); connect(mVkbHost, SIGNAL(keypadClosed()), this, SLOT(vkbClosed())); - connect(mVkbHost,SIGNAL(aboutToOpen()),this,SLOT(vkbAboutToOpen())); - connect(mVkbHost,SIGNAL(aboutToClose()),this,SLOT(vkbAboutToClose())); disconnect(this->mainWindow(),SIGNAL(viewReady()),this,SLOT(doDelayedConstruction())); - } //--------------------------------------------------------------- @@ -1826,7 +1413,6 @@ if (backAction) { backAction->trigger(); } - } } @@ -1836,14 +1422,13 @@ void MsgUnifiedEditorView::onDialogSmsSettings(HbAction* action) { HbMessageBox *dlg = qobject_cast (sender()); - if (action == dlg->actions().at(0)) { - + if (action == dlg->actions().at(0)) + { QVariantList params; params << MsgBaseView::MSGSETTINGS;// target view params << MsgBaseView::UNIEDITOR; // source view params << MsgSettingsView::SMSView; emit switchView(params); - } } @@ -1863,50 +1448,6 @@ } } -//--------------------------------------------------------------- -// MsgUnifiedEditorView::enableSendButton -// @see header file -//-------------------------------------------------------------- -void MsgUnifiedEditorView::enableSendButton(bool enable) - { - if(mSendAction) - { - // enable/disable based on only if its disabled/enabled. - // this check is to avoid unnecessary calls to mSendAction->setEnabled(enable); - if(mSendAction->isEnabled() != enable ) - mSendAction->setEnabled(enable); - } - } - -// ---------------------------------------------------------------------------- -// MsgUnifiedEditorView::formatAddresses -// @see header -// ---------------------------------------------------------------------------- -void MsgUnifiedEditorView::formatAddresses( - ConvergedMessageAddressList& addresses) -{ - - for(int i=0; i < addresses.count() ;i++ ) - { - QString addr = addresses[i]->address(); - - HBufC *tempAddr = XQConversions::qStringToS60Desc(addr); - - TPtr ptr = tempAddr->Des(); - - // Note: This is just to parse spaces etc away from phonenumbers. - // Ignore EFalse returned for email addresses. - CommonPhoneParser::ParsePhoneNumber(ptr , - CommonPhoneParser::ESMSNumber ); - - addr = XQConversions::s60DescToQString(tempAddr->Des()); - - addresses[i]->setAddress(addr); - - delete tempAddr; - } -} - // ---------------------------------------------------------------------------- // MsgUnifiedEditorView::isReplyPathBroken // @see header @@ -1916,7 +1457,7 @@ // 1. Never set for MMS // 2. if additional recipients exits if( (MsgUnifiedEditorMonitor::messageType() == ConvergedMessage::Mms) || - (mToField->addressCount() != 1) ) + (MsgUnifiedEditorMonitor::msgAddressCount() != 1) ) { // broken return true; @@ -1926,9 +1467,16 @@ QString dispName; int phCount; int origCntLocalId = MsgContactHandler::resolveContactDisplayName( - mOriginatingSME, dispName, phCount); + mOriginatingSME, dispName, phCount); int currCntLocalId = -1; - QString currAddress(mToField->addresses().at(0)->address()); + QString currAddress; + ConvergedMessageAddress* currentAdd = mScrollArea->currentAddress(); + if(currentAdd) + { + currAddress = currentAdd->address(); + delete currentAdd; + } + if(origCntLocalId != -1) { currCntLocalId = MsgContactHandler::resolveContactDisplayName( @@ -1944,11 +1492,11 @@ } else { // atleast one contact is not present in contacts db - // direct compare + // direct compare UniEditorGenUtils* genUtils = q_check_ptr(new UniEditorGenUtils); bool compareResult = false; TRAP_IGNORE( - compareResult = genUtils->MatchPhoneNumberL( + compareResult = genUtils->MatchPhoneNumberL( *XQConversions::qStringToS60Desc(mOriginatingSME), *XQConversions::qStringToS60Desc(currAddress)) ); diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/CatsFallingInLove1280x1024.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/CatsFallingInLove1280x1024.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEGProgressive_8Mpix.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEGProgressive_8Mpix.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEGProgressive_QCIF.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEGProgressive_QCIF.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEG_CIF.JPG Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEG_CIF.JPG has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEG_QCIF.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/JPEG_QCIF.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/WMF_Qcif.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/WMF_Qcif.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/animated_gif_800X600.gif Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/animated_gif_800X600.gif has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/gif87_bomb.gif Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/gif87_bomb.gif has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/jpg_sun.jpg Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorprocessimageoperation/data/jpg_sun.jpg has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/data/JPEG_CIF.JPG Binary file messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/data/JPEG_CIF.JPG has changed diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/src/unittest_msgunieditorutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/src/unittest_msgunieditorutils.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,76 @@ +/* +* Copyright (c) 2009 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: Test class for MsgUnifiedEditorPixmapWidget +* +*/ + +#include "unittest_msgunieditorutils.h" +#include +#include +#include "msguitest.h" +const QString IMAGE_JPEG_CIF_PATH = "c:\\data\\testUniEditor\\JPEG_CIF.JPG"; +const QString IMAGE_MIMETYPE("image"); +TestMsgUnifiedEditorUtils::TestMsgUnifiedEditorUtils() + { + + } +TestMsgUnifiedEditorUtils::~TestMsgUnifiedEditorUtils() + { + + } +void TestMsgUnifiedEditorUtils::initTestCase() + { + mMsgUnifiedEditorUtils = new MsgUnifiedEditorUtils(); + QVERIFY(mMsgUnifiedEditorUtils != NULL); + } + +void TestMsgUnifiedEditorUtils::test_Constructor() + { + /*nothing to check*/ + } + + +void TestMsgUnifiedEditorUtils::test_handleOk() + { + QSignalSpy signaleHandlerOK(mMsgUnifiedEditorUtils, SIGNAL(requestOk(const QVariant&))); + QVariant lVariant; + lVariant.setValue(QString("OK")); + + QCOMPARE( signaleHandlerOK.count(), 0 ); + mMsgUnifiedEditorUtils->handleOk(lVariant); + QCOMPARE( signaleHandlerOK.count(), 1 ); + } + +void TestMsgUnifiedEditorUtils::test_handleError() + { + QSignalSpy signaleHandlerError(mMsgUnifiedEditorUtils, SIGNAL(requestError(int, const QString&))); + QString lString = "Not found"; + int errorcode = KErrNotFound; + QCOMPARE( signaleHandlerError.count(), 0 ); + mMsgUnifiedEditorUtils->handleError(errorcode, lString); + QCOMPARE( signaleHandlerError.count(), 1 ); + } + +void TestMsgUnifiedEditorUtils::test_launchContentViewer() + { + mMsgUnifiedEditorUtils->launchContentViewer(IMAGE_MIMETYPE,IMAGE_JPEG_CIF_PATH); + } + +void TestMsgUnifiedEditorUtils::cleanupTestCase() + { + delete mMsgUnifiedEditorUtils; + } + +//entry point. +MSGUI_TEST_MAIN(TestMsgUnifiedEditorUtils) diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/unittest_msgunieditorutils.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingapp/msgui/unifiededitor/tsrc/unittest_msgunieditorutils/unittest_msgunieditorutils.pro Tue Oct 19 11:30:16 2010 +0530 @@ -0,0 +1,34 @@ +# +# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# +# + +TARGET = unittest_msgunieditorutils +TARGET.UID3 = 0x20024340 + +include(../tsrc.pri) + +BLD_INF_RULES.prj_testexports += "$${LITERAL_HASH}include " \ + "./data/JPEG_CIF.JPG c:/data/testUniEditor/JPEG_CIF.JPG" \ + +symbian: { + addJPEGCIF.sources = ./data/JPEG_CIF.JPG + addJPEGCIF.path = c:/data/testUniEditor + DEPLOYMENT += addJPEGCIF + +} +# Input +HEADERS += unittest_msgunieditorutils.h +SOURCES += unittest_msgunieditorutils.cpp \ No newline at end of file diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/unifiededitor.pro --- a/messagingapp/msgui/unifiededitor/unifiededitor.pro Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/unifiededitor.pro Tue Oct 19 11:30:16 2010 +0530 @@ -54,7 +54,9 @@ MMP_RULES += defBlock # Input -HEADERS += msgunieditormonitor.h \ +HEADERS += msgunieditorbodyeditor.h \ + msgunieditorscrollarea.h \ + msgunieditormonitor.h \ msgunieditoraddress.h \ msgunieditorattachment.h \ msgunieditorbody.h \ @@ -69,8 +71,9 @@ msgunieditorpixmapwidget.h \ msgunieditorutils.h \ msgunieditoraudiowidget.h - -SOURCES += msgunieditormonitor.inl \ + +SOURCES += msgunieditorbodyeditor.cpp \ + msgunieditorscrollarea.cpp \ msgunieditormonitor.cpp \ msgunieditoraddress.cpp \ msgunieditorattachment.cpp \ diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiededitor/unifiededitor.qrc --- a/messagingapp/msgui/unifiededitor/unifiededitor.qrc Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiededitor/unifiededitor.qrc Tue Oct 19 11:30:16 2010 +0530 @@ -1,7 +1,4 @@ - - resources/qtg_anim_loading.axml - resources/layouts/msgunifiededitoraddress.css resources/layouts/msgunifiededitoraddress.widgetml @@ -13,5 +10,7 @@ resources/layouts/msgunifiededitorsubject.widgetml resources/layouts/msgunifiededitorattachment_color.css resources/layouts/msgunifiededitorview.css + resources/layouts/msgunifiededitorbodyeditor.css + resources/layouts/msgunifiededitorbodyeditor.widgetml diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiedviewer/inc/univieweraddresswidget.h --- a/messagingapp/msgui/unifiedviewer/inc/univieweraddresswidget.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiedviewer/inc/univieweraddresswidget.h Tue Oct 19 11:30:16 2010 +0530 @@ -108,12 +108,12 @@ void menuClosed(); /** - * handlers for phone number specific menu items. + * handlers for context sensitive menu items. */ void openContactInfo(); void call(); - void saveToContacts(); void sendMessage(); + void createEmail(); void copyToClipboard(); /** @@ -150,6 +150,13 @@ QTextCharFormat mFormatHighlight; QTextCharFormat mFormatNormal; +#ifdef MSGUI_UNIT_TEST + /** + * Unit Testing + */ + friend class TestUniViewerAddressWidget; +#endif + }; #endif // UNI_VIEWER_ADDRESS_WIDGET_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiedviewer/inc/univiewertextitem.h --- a/messagingapp/msgui/unifiedviewer/inc/univiewertextitem.h Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiedviewer/inc/univiewertextitem.h Tue Oct 19 11:30:16 2010 +0530 @@ -99,7 +99,6 @@ * common handlers. */ void openContactInfo(); - void saveToContacts(); void copyToClipboard(); /** @@ -141,6 +140,13 @@ //Current cursor position. int mCursorPos; + +#ifdef MSGUI_UNIT_TEST + /** + * Unit Testing + */ + friend class TestUniViewerTextItem; +#endif }; #endif // UNIVIEWERTEXTITEM_H diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp --- a/messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiedviewer/src/univieweraddresswidget.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -30,10 +30,10 @@ #include #include +#include +#include #include #include -#include -#include #include "msgcontacthandler.h" // LOCAL CONSTANTS @@ -41,13 +41,14 @@ const QString ADDRESS_OPEN(" ("); const QString ADDRESS_CLOSE(")"); const QString SPACE(" "); +const QChar AT_SIGN('@'); //localization #define LOC_CONTACT_INFO hbTrId("txt_messaging_menu_contact_info") #define LOC_CALL hbTrId("txt_common_menu_call_verb") #define LOC_SEND_MESSAGE hbTrId("txt_common_menu_send_message") -#define LOC_SAVE_TO_CONTACTS hbTrId("txt_common_menu_save_to_contacts") #define LOC_COPY hbTrId("txt_common_menu_copy") +#define LOC_CREATE_EMAIL hbTrId("txt_messaging_menu_create_mail") const QString BG_FRAME_GRAPHICS("qtg_fr_lineedit_normal"); @@ -349,6 +350,7 @@ if(!anchor.isEmpty() && !this->textCursor().hasSelection()) { + // Secondary Actions populateMenu(contextMenu,anchor); } } @@ -357,63 +359,48 @@ { HbAction* action = NULL; - int contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); - - if(contactId > 0) - { + // Finding if the data is an Email Address + QBool isEmail = data.contains(AT_SIGN, Qt::CaseInsensitive); + + if (isEmail) { + action = contextMenu->addAction(LOC_CREATE_EMAIL, this, SLOT(createEmail())); + action->setData(data); + action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); action->setData(data); } - else - { - action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts())); - action->setData(data); - } + else { + action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); + action->setData(data); - action = contextMenu->addAction(LOC_CALL, this, SLOT(call())); - action->setData(data); + action = contextMenu->addAction(LOC_CALL, this, SLOT(call())); + action->setData(data); - action = contextMenu->addAction(LOC_SEND_MESSAGE, this, SLOT(sendMessage())); - action->setData(data); + action = contextMenu->addAction(LOC_SEND_MESSAGE, this, SLOT(sendMessage())); + action->setData(data); + } action = contextMenu->addAction(LOC_COPY, this, SLOT(copyToClipboard())); action->setData(data); - - connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed())); + + connect(contextMenu, SIGNAL(aboutToClose()), this, SLOT(menuClosed())); } void UniViewerAddressWidget::shortTapAction(QString anchor,const QPointF& pos) { + Q_UNUSED(pos) + + // Primary Actions + HbAction action; action.setData(anchor); - - int contactId = MsgContactHandler::resolveContactDisplayName( - anchor, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); - - if(contactId > 0 ) - { - //if resolved conatct open contact card - connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo())); + if (anchor.contains(AT_SIGN, Qt::CaseInsensitive)) { + // Email address + connect(&action, SIGNAL(triggered()), this, SLOT(createEmail())); } - else - { - //unresolved contact show popup. - highlightText(true); - - HbMenu* contextMenu = new HbMenu(); - contextMenu->setDismissPolicy(HbPopup::TapAnywhere); - contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); - contextMenu->setPreferredPos(pos); - - populateMenu(contextMenu,anchor); - - contextMenu->show(); + else { + connect(&action, SIGNAL(triggered()), this, SLOT(openContactInfo())); } action.trigger(); @@ -452,7 +439,10 @@ connect(serviceRequest, SIGNAL(requestError(int)), this, SLOT(onServiceRequestCompleted())); - *serviceRequest << phoneNumber; + QList args; + args << phoneNumber; + + serviceRequest->setArguments(args); serviceRequest->send(); } } @@ -471,63 +461,52 @@ void UniViewerAddressWidget::openContactInfo() { - HbAction* action = qobject_cast(sender()); - - if(action) - { - QString data = action->data().toString(); - - int contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); + HbAction* action = qobject_cast (sender()); + + if (action) { + QString data = action->data().toString(); + int contactId = -1; + QVariant contactType; - // if contact is unresolved on phone number field - // then, try resolving it on email address field - if(contactId <= 0) - { - contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactEmailAddress::DefinitionName, - QContactEmailAddress::FieldEmailAddress); + if (data.contains(AT_SIGN, Qt::CaseInsensitive)) { + // Email address + contactId = MsgContactHandler::resolveContactDisplayName(data, + QContactEmailAddress::DefinitionName, QContactEmailAddress::FieldEmailAddress); + contactType = QContactEmailAddress::DefinitionName; + } + else { + contactId = MsgContactHandler::resolveContactDisplayName(data, + QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); + contactType = QContactPhoneNumber::DefinitionName; } //service stuff. - QString service("phonebookservices"); - QString interface; - QString operation; QList args; + XQAiwRequest* request = NULL; + XQApplicationManager appManager; - if(contactId > 0) - { - //open contact card - interface = QString("com.nokia.symbian.IContactsView"); - operation = QString("openContactCard(int)"); + if (contactId > 0) { + // open existing contact card + request = appManager.create(XQI_CONTACTS_VIEW, XQOP_CONTACTS_VIEW_CONTACT_CARD, true); // Embedded args << contactId; } - else - { - //save to contacts with phone number field prefilled. - interface = QString("com.nokia.symbian.IContactsEdit"); - operation = QString("editCreateNew(QString,QString)"); - QString type = QContactPhoneNumber::DefinitionName; - args << type; - args << data; + else { + // open temp contact card + request = appManager.create(XQI_CONTACTS_VIEW, + XQOP_CONTACTS_VIEW_TEMP_CONTACT_CARD_WITH_DETAIL, true); // Embedded + args << contactType; // Type + args << data; // Actual data } - XQAiwRequest* request; - XQApplicationManager appManager; - request = appManager.create(service, interface, operation, true); // embedded - if ( request == NULL ) - { - return; - } + + if (request == NULL) { + return; + } // Result handlers - connect (request, SIGNAL(requestOk(const QVariant&)), - this, SLOT(handleOk(const QVariant&))); - connect (request, SIGNAL(requestError(const QVariant&)), - this, SLOT(handleError(const QVariant&))); - + connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(request, SIGNAL(requestError(const QVariant&)), this, + SLOT(handleError(const QVariant&))); + request->setArguments(args); request->send(); delete request; @@ -535,19 +514,14 @@ } void UniViewerAddressWidget::handleOk(const QVariant& result) - { +{ Q_UNUSED(result) - } +} void UniViewerAddressWidget::handleError(int errorCode, const QString& errorMessage) - { +{ Q_UNUSED(errorMessage) Q_UNUSED(errorCode) - } - -void UniViewerAddressWidget::saveToContacts() -{ - openContactInfo(); } void UniViewerAddressWidget::sendMessage() @@ -585,4 +559,45 @@ } } +//--------------------------------------------------------------- +// UniViewerAddressWidget::createEmail +// @see header file +//--------------------------------------------------------------- +void UniViewerAddressWidget::createEmail() +{ + HbAction* action = qobject_cast (sender()); + + if (action) { + QString emailId = action->data().toString(); + + // Launch email editor + QString interfaceName("com.nokia.symbian.IEmailMessageSend"); + QString operation("send(QVariant)"); + XQApplicationManager appManager; + XQAiwRequest* request = appManager.create(interfaceName, operation, true); + if (request == NULL) { + return; + } + + // Fill args + QStringList recipients; + recipients.append(emailId); + + QMap map; + map.insert(QString("to"), recipients); + + QList args; + args.append(map); + + // Result handlers + connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(request, SIGNAL(requestError(const QVariant&)), this, + SLOT(handleError(const QVariant&))); + + request->setArguments(args); + request->send(); + delete request; + } +} + // EOF diff -r ecf6a73a9186 -r 60a8a215b0ec messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp --- a/messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp Tue Oct 05 13:58:47 2010 +0530 +++ b/messagingapp/msgui/unifiedviewer/src/univiewertextitem.cpp Tue Oct 19 11:30:16 2010 +0530 @@ -32,6 +32,7 @@ #include #include #include +#include #include @@ -54,7 +55,6 @@ #define LOC_CONTACT_INFO hbTrId("txt_messaging_menu_contact_info") #define LOC_CALL hbTrId("txt_common_menu_call_verb") #define LOC_SEND_MESSAGE hbTrId("txt_common_menu_send_message") -#define LOC_SAVE_TO_CONTACTS hbTrId("txt_common_menu_save_to_contacts") #define LOC_COPY hbTrId("txt_common_menu_copy") #define LOC_CREATE_EMAIL hbTrId("txt_messaging_menu_create_mail") #define LOC_OPEN_LINK hbTrId("txt_messaging_menu_open_link") @@ -72,6 +72,7 @@ this->setFlag(QGraphicsItem::ItemIsFocusable,false); this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); this->setBackgroundItem(0); + this->setSmileysEnabled(true); //inserting rules and patterns to map. mRules.insert(NUMBER_RULE,NUMBER_PATTERN); @@ -163,6 +164,7 @@ // Check if there is an anchor at this pos QString anchor = this->anchorAt(pos); + // Secondary Actions if(!anchor.isEmpty() && !this->textCursor().hasSelection()) { //remove default actions. @@ -251,24 +253,9 @@ { HbAction* action = NULL; - QString number = data; - number.remove(NUMBER_RULE); - int contactId = MsgContactHandler::resolveContactDisplayName( - number, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); + action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); + action->setData(data); - if(contactId > 0) - { - action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); - action->setData(data); - } - else - { - action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts())); - action->setData(data); - } - action = contextMenu->addAction(LOC_CALL, this, SLOT(call())); action->setData(data); @@ -289,9 +276,6 @@ action = contextMenu->addAction(LOC_CONTACT_INFO, this, SLOT(openContactInfo())); action->setData(data); - action = contextMenu->addAction(LOC_SAVE_TO_CONTACTS, this, SLOT(saveToContacts())); - action->setData(data); - action = contextMenu->addAction(LOC_COPY, this, SLOT(copyToClipboard())); action->setData(data); } @@ -312,38 +296,16 @@ void UniViewerTextItem::handleShortTap(QString anchor,const QPointF& pos) { + Q_UNUSED(pos) + + // Primary Actions + HbAction action; action.setData(anchor); if(anchor.contains(NUMBER_RULE)) { - QString data = anchor; - data.remove(NUMBER_RULE); - int contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); - - if(contactId > 0 ) - { - //if resolved conatct open contact card - connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo())); - } - else - { - //unresolved contact show popup. - highlightText(true); - - HbMenu* contextMenu = new HbMenu(); - contextMenu->setDismissPolicy(HbPopup::TapAnywhere); - contextMenu->setAttribute(Qt::WA_DeleteOnClose, true); - contextMenu->setPreferredPos(pos); - connect(contextMenu,SIGNAL(aboutToClose()),this,SLOT(menuClosed())); - - addNumberMenu(contextMenu,anchor); - - contextMenu->show(); - } + connect(&action,SIGNAL(triggered()),this,SLOT(openContactInfo())); } else if(anchor.contains(EMAIL_RULE)) { @@ -489,96 +451,63 @@ void UniViewerTextItem::openContactInfo() { - HbAction* action = qobject_cast(sender()); - - if(action) - { - //service stuff. - QString service("phonebookservices"); - QString interface; - QString operation; - QList args; - + HbAction* action = qobject_cast (sender()); + + if (action) { + int contactId = -1; QString data = action->data().toString(); - - if(data.contains(QRegExp("^"+NUMBER_RULE))) - { + QVariant contactType; + + if (data.contains(QRegExp("^" + NUMBER_RULE))) { data.remove(NUMBER_RULE); - - int contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactPhoneNumber::DefinitionName, - QContactPhoneNumber::FieldNumber); - - if(contactId > 0) - { - //open contact card - interface = QString("com.nokia.symbian.IContactsView"); - operation = QString("openContactCard(int)"); - args << contactId; - } - else - { - //save to contacts with phone number field prefilled. - interface = QString("com.nokia.symbian.IContactsEdit"); - operation = QString("editCreateNew(QString,QString)"); - QString type = QContactPhoneNumber::DefinitionName; - args << type; - args << data; - } + + contactId = MsgContactHandler::resolveContactDisplayName(data, + QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldNumber); + + contactType = QContactPhoneNumber::DefinitionName; } - else if(data.contains(QRegExp("^"+EMAIL_RULE))) - { + else if (data.contains(QRegExp("^" + EMAIL_RULE))) { data.remove(EMAIL_RULE); - - int contactId = MsgContactHandler::resolveContactDisplayName( - data, - QContactEmailAddress::DefinitionName, - QContactEmailAddress::FieldEmailAddress); - - if(contactId > 0) - { - //open contact card - interface = QString("com.nokia.symbian.IContactsView"); - operation = QString("openContactCard(int)"); - args << contactId; - } - else - { - //save to contacts with e-mail field prefilled. - interface = QString("com.nokia.symbian.IContactsEdit"); - operation = QString("editCreateNew(QString,QString)"); - QString type = QContactEmailAddress::DefinitionName; - args << type; - args << data; - } - } - XQAiwRequest* request; + + contactId = MsgContactHandler::resolveContactDisplayName(data, + QContactEmailAddress::DefinitionName, QContactEmailAddress::FieldEmailAddress); + + contactType = QContactEmailAddress::DefinitionName; + } + + //service stuff. + QList args; + XQAiwRequest* request = NULL; XQApplicationManager appManager; - request = appManager.create(service, interface, operation, true); // embedded - if ( request == NULL ) - { - return; - } + + if (contactId > 0) { + // open existing contact card + request = appManager.create(XQI_CONTACTS_VIEW, XQOP_CONTACTS_VIEW_CONTACT_CARD, true); // Embedded + args << contactId; + } + else { + // open temp contact card + request = appManager.create(XQI_CONTACTS_VIEW, + XQOP_CONTACTS_VIEW_TEMP_CONTACT_CARD_WITH_DETAIL, true); // Embedded + args << contactType; // Type + args << data; // Actual data + } + + if (request == NULL) { + return; + } // Result handlers - connect (request, SIGNAL(requestOk(const QVariant&)), - this, SLOT(handleOk(const QVariant&))); - connect (request, SIGNAL(requestError(const QVariant&)), - this, SLOT(handleError(const QVariant&))); - + connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&))); + connect(request, SIGNAL(requestError(const QVariant&)), this, + SLOT(handleError(const QVariant&))); + request->setArguments(args); request->send(); delete request; } } - -void UniViewerTextItem::saveToContacts() -{ - openContactInfo(); -} - void UniViewerTextItem::onServiceRequestCompleted() { //service request is now complete. delete it. diff -r ecf6a73a9186 -r 60a8a215b0ec mobilemessaging/smsmtm/clientmtm/group/bld.inf --- a/mobilemessaging/smsmtm/clientmtm/group/bld.inf Tue Oct 05 13:58:47 2010 +0530 +++ b/mobilemessaging/smsmtm/clientmtm/group/bld.inf Tue Oct 19 11:30:16 2010 +0530 @@ -17,11 +17,11 @@ PRJ_EXPORTS ../inc/SMCMMAIN.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smcmmain.h) ../inc/SMSCLNT.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smsclnt.h) -../inc/SMSCLNT.INL SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(smsclnt.inl) +../inc/SMSCLNT.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smsclnt.inl) ../inc/SMUTHDR.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smuthdr.h) -../inc/SMUTHDR.INL SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(smuthdr.inl) +../inc/SMUTHDR.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smuthdr.inl) ../inc/SMUTSET.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smutset.h) -../inc/SMUTSET.INL SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(smutset.inl) +../inc/SMUTSET.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smutset.inl) ../inc/smutsimparam.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smutsimparam.h) ../inc/smscmds.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smscmds.h) ../inc/smut.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(smut.h) diff -r ecf6a73a9186 -r 60a8a215b0ec msg_plat/conversation_services_utilities_api/inc/ccsdefs.h --- a/msg_plat/conversation_services_utilities_api/inc/ccsdefs.h Tue Oct 05 13:58:47 2010 +0530 +++ b/msg_plat/conversation_services_utilities_api/inc/ccsdefs.h Tue Oct 19 11:30:16 2010 +0530 @@ -199,9 +199,9 @@ ECsBioMsg_VCard, ECsBioMsg_VCal, ECsBioMgs_NokiaService, -ECsUnknown, ECsBlueTooth_VCard, -ECsBlueTooth_VCal +ECsBlueTooth_VCal, +ECsUnknown }; /** diff -r ecf6a73a9186 -r 60a8a215b0ec msg_plat/messaging_history_api/inc/msgitem.h --- a/msg_plat/messaging_history_api/inc/msgitem.h Tue Oct 05 13:58:47 2010 +0530 +++ b/msg_plat/messaging_history_api/inc/msgitem.h Tue Oct 19 11:30:16 2010 +0530 @@ -50,9 +50,14 @@ MsgTypeBioMsg, MsgTypeBlueTooth, MsgTypeRingingTone, - MsgTypeProvisioning, - MsgTypeUnknown - }; + MsgTypeProvisioning, + MsgTypeBioMsg_VCard, + MsgTypeBioMsg_VCal, + MsgTypeBioMgs_NokiaService, + MsgTypeBlueTooth_VCard, + MsgTypeBlueTooth_VCal, + MsgTypeUnknown + }; /** * Message state