diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattachmentsfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderpluginextension/src/cesmrviewerattachmentsfield.cpp Mon Mar 15 12:39:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,686 +0,0 @@ -/* -* Copyright (c) 2007-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: Meeting request attachments field - * -*/ -#include "emailtrace.h" -#include "cesmrviewerattachmentsfield.h" - -// -#include "mesmrcalentry.h" -#include "cesmrcontactmenuattachmenthandler.h" -// -#include -#include -// -#include "esmricalvieweropcodes.hrh" -#include "cfsmailmessage.h" -// - -#include "cesmrrichtextviewer.h" -#include "cesmrrichtextlink.h" -#include "mesmrlistobserver.h" -#include "mesmrmeetingrequestentry.h" -#include "tesmrinputparams.h" -#include "cesmrattachment.h" -#include "cesmrattachmentinfo.h" -#include "cesmrcontactmenuhandler.h" -#include "cmrimage.h" -#include "nmrlayoutmanager.h" - - -// Unnamed namespace for local definitions -namespace { // codescanner::namespace - -// -// MR does not contain attachments -const TInt KNoAttachments( 0 ); -// MR contains one attachment -const TInt KOneAttachment( 1 ); -// - -const TInt KOneKiloByte( 1024 ); - -}//namespace - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::CESMRViewerAttachmentsField -// --------------------------------------------------------------------------- -// -CESMRViewerAttachmentsField::CESMRViewerAttachmentsField() -: iFocused(EFalse) - { - FUNC_LOG; - SetFieldId( EESMRFieldAttachments ); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::~CESMRViewerAttachmentsField -// --------------------------------------------------------------------------- -// -CESMRViewerAttachmentsField::~CESMRViewerAttachmentsField() - { - FUNC_LOG; - delete iFieldIcon; - delete iRichTextViewer; - delete iAttachmentText; - - iESMRStatic.Close(); - - delete iAttachmentInfo; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::NewL -// --------------------------------------------------------------------------- -// -CESMRViewerAttachmentsField* CESMRViewerAttachmentsField::NewL() - { - FUNC_LOG; - CESMRViewerAttachmentsField* self = new( ELeave )CESMRViewerAttachmentsField; - CleanupStack::PushL( self ); - self->ConstructL(); - CleanupStack::Pop( self ); - return self; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::ConstructL() -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::ConstructL() - { - FUNC_LOG; - SetFocusType( EESMRNoFocus ); - - iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapMailAttachment ); - iFieldIcon->SetParent( this ); - - iRichTextViewer = CESMRRichTextViewer::NewL( this ); - iRichTextViewer->SetEdwinSizeObserver( this ); - iRichTextViewer->SetLinkObserver( this ); - iRichTextViewer->SetParent( this ); - - iRichTextViewer->SetActionMenuStatus( ETrue ); - iESMRStatic.ConnectL(); - iCntMenuHdlr = &iESMRStatic.ContactMenuHandlerL(); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::MinimumSize -// --------------------------------------------------------------------------- -// -TSize CESMRViewerAttachmentsField::MinimumSize() - { - // Let's calculate the required rect of the iRichTextViewer. - // We will not use directly the iRichTextViewer height, because it might - // not exist, or the height of the viewer might still be incorrect - TRect richTextViewerRect = RichTextViewerRect(); - - // We will use as minimum size the parents width - // but the calculated iRichTextViewers height - return TSize( Parent()->Size().iWidth, richTextViewerRect.Height() ); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::InitializeL -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::InitializeL() - { - FUNC_LOG; - // Setting Font for the rich text viewer - TAknLayoutText text = NMRLayoutManager::GetLayoutText( - Rect(), - NMRLayoutManager::EMRTextLayoutTextEditor ); - - iRichTextViewer->SetFontL( text.Font(), iLayout ); - - // This is called so theme changes will apply when changing theme "on the fly" - if ( IsFocused() ) - { - iRichTextViewer->FocusChanged( EDrawNow ); - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::InternalizeL() -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::InternalizeL( MESMRCalEntry& aEntry ) - { - FUNC_LOG; - MESMRMeetingRequestEntry* mrEntry = NULL; - if ( aEntry.Type() != MESMRCalEntry::EESMRCalEntryMeetingRequest ) - { - // This is not meeting request entry so attachment field should be removed from ui - iObserver->RemoveControl( FieldId() ); - return; - } - else - { - mrEntry = static_cast( &aEntry ); - - TESMRInputParams startupParams; - if ( mrEntry && mrEntry->StartupParameters(startupParams) ) - { - // Startup parameters exist --> Let's check if there are attachments - - if ( startupParams.iAttachmentInfo ) - { - iMailMessage = startupParams.iMailMessage; - - UpdateAttachmentInfoL(); - - iCntMenuHdlr->SetCommandObserver( this ); - - iAttachmentCount = 0; - - if ( iAttachmentInfo ) - { - iAttachmentCount = iAttachmentInfo->AttachmentCount(); - } - - if ( iAttachmentCount > KOneAttachment ) - { - // There are more than one attachments - TInt attachmentsSizeSum(0); - for (TInt i(0); i < iAttachmentCount; ++i ) - { - const CESMRAttachment& attachment( - iAttachmentInfo->AttachmentL( i ) ); - - TInt attachmentSize( attachment.AttachmentSizeInBytes() ); - attachmentsSizeSum += attachmentSize; - } - if ( attachmentsSizeSum >= KOneKiloByte ) - { - CArrayFixFlat* ints = - new ( ELeave ) CArrayFixFlat( 1 ); - - CleanupStack::PushL(ints); - ints->AppendL( iAttachmentCount ); - ints->AppendL( attachmentsSizeSum / KOneKiloByte ); - - iAttachmentText = StringLoader::LoadL( - R_QTN_FSE_VIEWER_HEADER_ATTACHMENTS_TOTAL, - *ints ); - - CleanupStack::PopAndDestroy(ints); - } - else - { - iAttachmentText = StringLoader::LoadL( - R_QTN_FSE_VIEWER_HEADER_ATTACHMENTS_LESS_THAN_KB, - iAttachmentCount); - } - } - else if ( iAttachmentCount > 0 ) - { - // There is one attachment - const CESMRAttachment& attachment( - iAttachmentInfo->AttachmentL( 0 ) ); - TPtrC attachmentName( attachment.AttachmentName() ); - - TInt attachmentSize( attachment.AttachmentSizeInBytes() ); - - if ( attachmentSize >= KOneKiloByte ) - { - // "%0U %1N kB" - - CDesCArrayFlat* attachmentStrings = - new(ELeave)CDesCArrayFlat( 1 ); - CleanupStack::PushL( attachmentStrings ); - //First string - attachmentStrings->AppendL( attachmentName ); - - CArrayFixFlat* integers = - new (ELeave) CArrayFixFlat(1); - CleanupStack::PushL( integers ); - integers->AppendL( attachmentSize / KOneKiloByte ); - - iAttachmentText = StringLoader::LoadL( - R_QTN_FSE_VIEWER_HEADER_ATTACHMENT, - *attachmentStrings, - *integers ); - - // Pop and delete strings array - CleanupStack::PopAndDestroy( integers ); - CleanupStack::PopAndDestroy( attachmentStrings ); - } - else - { - iAttachmentText = StringLoader::LoadL( - R_QTN_FSE_VIEWER_HEADER_ATTACHMENT_LESS_THAN_KB, - attachmentName); - } - } - - if ( iAttachmentText ) - { - iRichTextViewer->SetTextL( iAttachmentText, EFalse ); - // After setting the text, the viewer line count is known - iLineCount = iRichTextViewer->LineCount(); - - CESMRRichTextLink* link = CESMRRichTextLink::NewL ( - 0, iAttachmentText->Length ( ), - iAttachmentText->Des(), - CESMRRichTextLink::ETypeAttachment, - CESMRRichTextLink::ETriggerKeyRight ); - - CleanupStack::PushL( link ); - iRichTextViewer->AddLinkL( link ); - CleanupStack::Pop( link ); - } - } - } - } - - if ( KNoAttachments == iAttachmentCount ) - { - iObserver->RemoveControl( FieldId() ); - } - - iDisableRedraw = ETrue; - } - -// ----------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::HandleRichTextLinkSelection -// ----------------------------------------------------------------------------- -// -TBool CESMRViewerAttachmentsField::HandleRichTextLinkSelection( - const CESMRRichTextLink* /*aLink*/ ) - { - FUNC_LOG; - - // - TRAP_IGNORE( iCntMenuHdlr->ShowActionMenuL() ); - // - - return ETrue; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::OfferKeyEventL() -// --------------------------------------------------------------------------- -// -TKeyResponse CESMRViewerAttachmentsField::OfferKeyEventL( - const TKeyEvent& aEvent, - TEventCode aType ) - { - FUNC_LOG; - TKeyResponse response( EKeyWasNotConsumed ); - - if ( ( aType == EEventKey || aType == EEventKeyUp ) && - aEvent.iScanCode == EStdKeyDevice3 ) - { - // Selection key was pressed --> Trigger open attachment view command - NotifyEventL( EESMRCmdMskOpenEmailAttachment ); - - response = EKeyWasConsumed; - } - else - { - response = iRichTextViewer->OfferKeyEventL ( aEvent, aType ); - } - - return response; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::HandleEdwinSizeEventL() -// --------------------------------------------------------------------------- -// -TBool CESMRViewerAttachmentsField::HandleEdwinSizeEventL( - CEikEdwin* aEdwin, - TEdwinSizeEvent /*aType*/, - TSize aSize ) - { - FUNC_LOG; - TBool reDraw( EFalse ); - - // Let's save the required size for the iRichTextViewer - iSize = aSize; - - if ( iObserver && aEdwin == iRichTextViewer ) - { - iObserver->ControlSizeChanged( this ); - reDraw = ETrue; - } - return reDraw; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::ListObserverSet -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::ListObserverSet() - { - FUNC_LOG; - iRichTextViewer->SetListObserver( iObserver ); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::SetOutlineFocusL -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::SetOutlineFocusL( TBool aFocus ) - { - FUNC_LOG; - CESMRField::SetOutlineFocusL( aFocus ); - - if ( iRichTextViewer ) - { - iRichTextViewer->SetFocus( aFocus ); - } - - if ( aFocus && aFocus != iFocused ) - { - // - UpdateAttachmentInfoL(); - - if( iAttachmentInfo->AttachmentCount() > KOneAttachment ) - { - ChangeMiddleSoftKeyL( EESMRCmdOpenAttachmentView, - R_QTN_MSK_VIEWLIST ); - } - else - { - // There is one attachment - const CESMRAttachment& attachment( - iAttachmentInfo->AttachmentL( 0 ) ); - - if( attachment.AttachmenState() == CESMRAttachment::EAttachmentStateDownloaded ) - { - ChangeMiddleSoftKeyL( EESMRCmdOpenAttachment, - R_QTN_MSK_OPEN ); - } - else - { - ChangeMiddleSoftKeyL( EESMRCmdDownloadAttachment, - R_QTN_MSK_DOWNLOAD ); - } - } - // - } - iFocused = aFocus; - } - -// -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::MessagePartPointerArrayCleanup -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::MessagePartPointerArrayCleanup( TAny* aArray ) - { - FUNC_LOG; - RPointerArray* messagePartArray = - static_cast*>( aArray ); - - messagePartArray->ResetAndDestroy(); - messagePartArray->Close(); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::UpdateAttachmentInfoL -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::UpdateAttachmentInfoL() - { - if ( iMailMessage->IsFlagSet( EFSMsgFlag_Attachments ) ) - { - RPointerArray attachmentParts; - CleanupStack::PushL( - TCleanupItem( - MessagePartPointerArrayCleanup, - &attachmentParts) ); - - iMailMessage->AttachmentListL( attachmentParts ); - - // find calendar part from the list - CFSMailMessagePart* calendarPart = - iMailMessage->FindBodyPartL( KFSMailContentTypeTextCalendar ); - CleanupStack::PushL( calendarPart ); - - if ( calendarPart ) - { - // remove calendar body part from attachment list - for ( TInt ii = attachmentParts.Count() - 1; ii >= 0; --ii ) - { - if ( attachmentParts[ii]->GetPartId() == calendarPart->GetPartId() ) - { - delete attachmentParts[ii]; - attachmentParts.Remove(ii); - break; - } - } - } - CleanupStack::PopAndDestroy( calendarPart ); - - iAttachmentCount = attachmentParts.Count(); - if ( iAttachmentCount > 0 ) - { - delete iAttachmentInfo; - iAttachmentInfo = NULL; - - CESMRAttachmentInfo* attachmentInfo = CESMRAttachmentInfo::NewL(); - CleanupStack::PushL( attachmentInfo ); - - for( TInt i(0); i < iAttachmentCount; ++i ) - { - CESMRAttachment::TESMRAttachmentState state( - CESMRAttachment::EAttachmentStateDownloaded ); - - if ( EFSFull != attachmentParts[i]->FetchLoadState() ) - { - state = CESMRAttachment::EAttachmentStateNotDownloaded; - } - - TInt contentSize( attachmentParts[i]->ContentSize() ); - TPtrC attachmentName( attachmentParts[i]->AttachmentNameL() ); - if ( contentSize > 0 && attachmentName.Length() ) - { - attachmentInfo->AddAttachmentInfoL( - attachmentName, - contentSize, - state ); - } - } - - if ( attachmentInfo->AttachmentCount() ) - { - iAttachmentInfo = attachmentInfo; - CleanupStack::Pop( attachmentInfo ); - } - else - { - CleanupStack::PopAndDestroy( attachmentInfo ); - } - - attachmentInfo = NULL; - } - CleanupStack::PopAndDestroy(); // attachmentparts - - // relay attachment info to contact menu so we can display - // options based on attachment state - if ( iAttachmentInfo ) - { - iCntMenuHdlr->SetAttachmentInfoL( iAttachmentInfo ); - } - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::ExecuteGenericCommandL -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::ExecuteGenericCommandL( TInt aCommand ) - { - FUNC_LOG; - - switch ( aCommand ) - { - case EESMRCmdOpenAttachment:// Fall through - case EESMRCmdOpenAttachmentView:// Fall through - case EESMRCmdDownloadAttachment: // Fall through - { - NotifyEventL( aCommand ); - - break; - } - case EESMRCmdClipboardCopy: - { - iRichTextViewer->CopyCurrentLinkValueToClipBoardL(); - break; - } - default: - { - break; - } - } - } - -// ----------------------------------------------------------------------------- -// CESMRRichTextViewer::ProcessCommandL -// ----------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::ProcessCommandL( TInt aCommandId ) - { - FUNC_LOG; - - NotifyEventL( aCommandId ); - } - - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::CountComponentControls -// --------------------------------------------------------------------------- -// -TInt CESMRViewerAttachmentsField::CountComponentControls() const - { - TInt count( 0 ); - if ( iFieldIcon ) - { - ++count; - } - - if ( iRichTextViewer ) - { - ++count; - } - return count; - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::ComponentControl -// --------------------------------------------------------------------------- -// -CCoeControl* CESMRViewerAttachmentsField::ComponentControl( - TInt aIndex ) const - { - switch ( aIndex ) - { - case 0: - return iFieldIcon; - case 1: - return iRichTextViewer; - default: - return NULL; - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::SizeChanged -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::SizeChanged( ) - { - TRect rect = Rect(); - - // LAYOUTING FIELD ICON - if( iFieldIcon ) - { - TAknWindowComponentLayout iconLayout = - NMRLayoutManager::GetWindowComponentLayout( - NMRLayoutManager::EMRLayoutTextEditorIcon ); - AknLayoutUtils::LayoutImage( iFieldIcon, rect, iconLayout ); - } - - // LAYOUTING FIELD BACKGROUND - TAknLayoutRect bgLayoutRect = - NMRLayoutManager::GetLayoutRect( - rect, NMRLayoutManager::EMRLayoutTextEditorBg ); - TRect bgRect( bgLayoutRect.Rect() ); - // Move focus rect so that it's relative to field's position - bgRect.Move( -Position() ); - SetFocusRect( bgRect ); - - - // LAYOUTING FIELD TEXT VIEWER - if( iRichTextViewer ) - { - iRichTextViewer->SetRect( RichTextViewerRect() ); - } - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::SetContainerWindowL -// --------------------------------------------------------------------------- -// -void CESMRViewerAttachmentsField::SetContainerWindowL( - const CCoeControl& aContainer ) - { - CCoeControl::SetContainerWindowL( aContainer ); - iRichTextViewer->SetContainerWindowL( aContainer ); - } - -// --------------------------------------------------------------------------- -// CESMRViewerAttachmentsField::RichTextViewerRect -// --------------------------------------------------------------------------- -// -TRect CESMRViewerAttachmentsField::RichTextViewerRect() - { - TRect rect = Rect(); - - TAknTextComponentLayout edwinLayout = NMRLayoutManager::GetTextComponentLayout( - NMRLayoutManager::EMRTextLayoutTextEditor ); - - // Text layout rect for one line viewer - TAknLayoutText textLayout; - textLayout.LayoutText( rect, edwinLayout ); - TRect textLayoutRect = textLayout.TextRect(); - - TRect viewerRect = textLayoutRect; - - // If iRichTextViewer has lines and iSize has been set, - // we will use iSize.iHeight as the viewers height - if( iLineCount > 0 && iSize.iHeight > 0 ) - { - viewerRect.SetHeight( iSize.iHeight ); - } - // Otherwise we will use one row height as the height of the - // iRichTextViewer - else - { - TAknLayoutRect rowLayoutRect = - NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ); - viewerRect.SetHeight( rowLayoutRect.Rect().Height() ); - } - - return viewerRect; - } - -//EOF