diff -r 0396474f30f5 -r 4ce476e64c59 meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrviewerattachmentfield.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,1123 @@ +/* +* 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: MR viewer attahcment field implementation + * + */ +#include "cmrviewerattachmentfield.h" + +#include "mesmrlistobserver.h" +#include "mesmrmeetingrequestentry.h" +#include "nmrlayoutmanager.h" +#include "nmrbitmapmanager.h" +#include "cmrimage.h" +#include "cesmrrichtextviewer.h" +#include "cesmreditor.h" +#include "cesmrrichtextlink.h" +#include "cmrattachmentcommandhandler.h" +#include "ccalremoteattachmentapi.h" +#include "ccalremoteattachmentinfo.h" +#include "mcalremoteattachmentoperation.h" +#include "cesmrglobalnote.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// DEBUG +#include "emailtrace.h" + + +// unnamed namespace for local definitions +namespace { // codescanner::namespace +//CONSTANTS + +_LIT( KNewLine, "\f" ); + +const TInt KOneKiloByte( 1024 ); +const TInt KOneMegaByte( 1048576 ); // (1024^2 or 2^20): +const TInt KMargin = 5; + +/** + * Checks that command is valid attachment viewer command. + * @param aCommmand Command ID + */ +TBool IsValidAttachmentViewerCommand( TInt aCommand ) + { + TBool ret( EFalse ); + + switch( aCommand ) + { + case EESMRViewerOpenAttachment: + case EESMRViewerSaveAttachment: + case EESMRViewerSaveAllAttachments: + case EESMRViewerCancelAttachmentDownload: + ret = ETrue; + break; + + default: + ret = EFalse; + break; + } + + return ret; + } + +}//namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::CMRViewerAttachmentsField +// --------------------------------------------------------------------------- +// +CMRViewerAttachmentsField::CMRViewerAttachmentsField() + { + FUNC_LOG; + SetFocusType( EESMRHighlightFocus ); + SetFieldId( EESMRFieldViewerAttachments ); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::~CMRViewerAttachmentsField +// --------------------------------------------------------------------------- +// +CMRViewerAttachmentsField::~CMRViewerAttachmentsField( ) + { + FUNC_LOG; + delete iBgCtrlContext; + delete iFieldIcon; + delete iLockIcon; + delete iAttachmentCommandHandler; + delete iRemoteAttUris; + delete iAttachmentInfo; + delete iRemoteAttApi; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::NewL +// --------------------------------------------------------------------------- +// +CMRViewerAttachmentsField* CMRViewerAttachmentsField::NewL() + { + FUNC_LOG; + CMRViewerAttachmentsField* self = new( ELeave )CMRViewerAttachmentsField(); + CleanupStack::PushL ( self ); + self->ConstructL ( ); + CleanupStack::Pop ( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ConstructL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::ConstructL( ) + { + FUNC_LOG; + SetComponentsToInheritVisibility( ETrue ); + + iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAttachment ); + iFieldIcon->SetParent( this ); + + iRichTextViewer = CESMRRichTextViewer::NewL( this ); + CESMRField::ConstructL( iRichTextViewer ); // ownership transferred + iRichTextViewer->SetEdwinSizeObserver ( this ); + iRichTextViewer->SetLinkObserver (this ); + iRichTextViewer->SetParent( this ); + + // Draw bg instead of using skin bg + TRect tempRect( 0, 0, 0, 0 ); + NMRBitmapManager::TMRBitmapStruct bitmapStruct; + bitmapStruct = NMRBitmapManager::GetBitmapStruct( + NMRBitmapManager::EMRBitmapInputCenter ); + + iBgCtrlContext = CAknsBasicBackgroundControlContext::NewL( + bitmapStruct.iItemId, + tempRect, + EFalse ); + + iRichTextViewer->SetSkinBackgroundControlContextL( iBgCtrlContext ); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::MinimumSize +// --------------------------------------------------------------------------- +// +TSize CMRViewerAttachmentsField::MinimumSize() + { + TRect parentRect( Parent()->Rect() ); + + TRect fieldRect = + NMRLayoutManager::GetFieldLayoutRect( parentRect, 1 ).Rect(); + + TRect viewerRect( NMRLayoutManager::GetLayoutText( + fieldRect, + NMRLayoutManager::EMRTextLayoutTextEditor ).TextRect() ); + + // Adjust field size so that there's room for expandable editor. + fieldRect.Resize( 0, iRichTextSize.iHeight - viewerRect.Height() ); + + return fieldRect.Size(); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::InitializeL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::InitializeL() + { + FUNC_LOG; + TAknLayoutText layoutText = + NMRLayoutManager::GetLayoutText( Rect(), + NMRLayoutManager::EMRTextLayoutTextEditor ); + iRichTextViewer->SetFontL( layoutText.Font() ); + if( iAttachmentCount > 1 ) + { + iRichTextViewer->SetLineSpacingL( LineSpacing() ); + } + + iRichTextViewer->ApplyLayoutChangesL(); + + //wake up current contact menu selection by calling this + iRichTextViewer->FocusChanged( ENoDrawNow ); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::InternalizeL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::InternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + + delete iAttachmentCommandHandler; + iAttachmentCommandHandler = NULL; + + iEntry = &aEntry; + + CreateRemoteAttApiL(); + UpdateAttachmentsListL(); + + if ( iAttachmentCount ) + { + //wake up current contact menu selection by calling this + iRichTextViewer->FocusChanged( ENoDrawNow ); + iDisableRedraw = ETrue; + iAttachmentCommandHandler = + CMRAttachmentCommandHandler::NewL( iEntry->Entry(), *iEventQueue ); + + if ( iRemoteAttApi ) + { + iAttachmentCommandHandler->SetRemoteAttachmentInformationL( + *iRemoteAttApi, + *iAttachmentInfo ); + } + } + else + { + iObserver->HideControl( EESMRFieldViewerAttachments ); + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ExternalizeL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::ExternalizeL( MESMRCalEntry& /*aEntry*/ ) + { + FUNC_LOG; + // No implementation + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CMRViewerAttachmentsField::CountComponentControls( ) const + { + FUNC_LOG; + TInt count( 0 ); + if ( iFieldIcon ) + { + ++count; + } + + if ( iRichTextViewer ) + { + ++count; + } + + if ( iLockIcon ) + { + ++count; + } + + return count; + + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ComponentControl +// --------------------------------------------------------------------------- +// +CCoeControl* CMRViewerAttachmentsField::ComponentControl( TInt aInd ) const + { + FUNC_LOG; + switch ( aInd ) + { + case 0: + return iRichTextViewer; + case 1: + return iFieldIcon; + case 2: + return iLockIcon; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::SizeChanged +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::SizeChanged( ) + { + FUNC_LOG; + TRect rect( Rect() ); + + TAknLayoutRect rowLayoutRect( + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) ); + TRect rowRect( rowLayoutRect.Rect() ); + + // Layouting field icon + if( iFieldIcon ) + { + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutSingleRowAColumnGraphic ) ); + AknLayoutUtils::LayoutControl( iFieldIcon, rowRect, iconLayout ); + } + + // Layouting lock icon + if( iLockIcon ) + { + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutSingleRowDColumnGraphic ) ); + AknLayoutUtils::LayoutImage( iLockIcon, rowRect, iconLayout ); + } + + // Layouting viewer rect + TAknLayoutText viewerLayoutText; + if( iLockIcon ) + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutSingleRowEditorText ); + } + else + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutTextEditor ); + } + + TRect viewerRect( viewerLayoutText.TextRect() ); + + // Resize height according to actual height required by edwin. + viewerRect.Resize( 0, iSize.iHeight - viewerRect.Height() ); + iRichTextViewer->SetRect( viewerRect ); + + // Layouting focus + TRect bgRect( 0, 0, 0, 0 ); + if( iAttachmentCount > 1 ) + { + bgRect.SetRect( + TPoint( viewerRect.iTl.iX, + viewerRect.iTl.iY - FocusMargin() ), + TPoint( viewerRect.iBr.iX, + viewerRect.iBr.iY + FocusMargin() ) ); + } + else + { + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + rowRect, NMRLayoutManager::EMRLayoutTextEditorBg ); + bgRect = bgLayoutRect.Rect(); + } + + // Move focus rect so that it's relative to field's position. + bgRect.Move( -Position() ); + SetFocusRect( bgRect ); + + // Failures are ignored. + TRAP_IGNORE( + // Set font + iRichTextViewer->SetFontL( viewerLayoutText.Font() ); + if( iAttachmentCount > 1 ) + { + // Set line spacing + iRichTextViewer->SetLineSpacingL( LineSpacing() ); + } + + // Apply changes. + iRichTextViewer->ApplyLayoutChangesL(); + ) + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CMRViewerAttachmentsField::OfferKeyEventL( + const TKeyEvent& aEvent, + TEventCode aType ) + { + FUNC_LOG; + TKeyResponse response( EKeyWasNotConsumed ); + + if( iAttachmentCount > 0 ) + { + response = iRichTextViewer->OfferKeyEventL( aEvent, aType ); + } + + return response; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::SetContainerWindowL() +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::SetContainerWindowL( const CCoeControl& aControl ) + { + FUNC_LOG; + CESMRField::SetContainerWindowL( aControl ); + iRichTextViewer->SetContainerWindowL( aControl ); + iRichTextViewer->SetParent( this ); + + iFieldIcon->SetContainerWindowL( aControl ); + iFieldIcon->SetParent( this ); + + iButtonGroupContainer = CEikButtonGroupContainer::Current(); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::HandleEdwinSizeEventL +// --------------------------------------------------------------------------- +// +TBool CMRViewerAttachmentsField::HandleEdwinSizeEventL( CEikEdwin* aEdwin, + TEdwinSizeEvent /*aType*/, TSize aSize ) + { + FUNC_LOG; + TBool reDraw( EFalse ); + + if( iRichTextSize.iHeight != aSize.iHeight && iAttachmentCount > 0 ) + { + // Let's save the required size of the rich text viewer + iRichTextSize = aSize; + + if ( iObserver && aEdwin == iRichTextViewer ) + { + iObserver->ControlSizeChanged( this ); + reDraw = ETrue; + } + } + + return reDraw; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ListObserverSet +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::ListObserverSet() + { + FUNC_LOG; + iRichTextViewer->SetListObserver( iObserver ); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ExecuteGenericCommandL +// --------------------------------------------------------------------------- +// +TBool CMRViewerAttachmentsField::ExecuteGenericCommandL( TInt aCommand ) + { + FUNC_LOG; + // TODO: Changes from other fields have to be implemented here + TBool handled( EFalse ); + + //handle locked field first + if( IsLocked() ) + { + if( aCommand == EESMRViewerOpenAttachment || + aCommand == EAknCmdOpen ) + { + HandleTactileFeedbackL(); + + CESMRGlobalNote::ExecuteL( + CESMRGlobalNote::EESMRUnableToEdit ); + return ETrue; + } + } + + if ( IsValidAttachmentViewerCommand(aCommand) && iAttachmentCommandHandler ) + { + const CESMRRichTextLink* currentLink = iRichTextViewer->GetSelectedLink(); + + ASSERT( currentLink ); + + TBool remoteCommand( + iAttachmentCommandHandler->IsRemoteAttachmentL( *currentLink) ); + + if ( !remoteCommand ) + { + iAttachmentCommandHandler->HandleAttachmentCommandL( + aCommand, + *currentLink ); + + HandleTactileFeedbackL(); + } + else + { + iAttachmentCommandHandler->HandleRemoteAttachmentCommandL( + aCommand, + *currentLink ); + + HandleTactileFeedbackL(); + } + + handled = ETrue; + } + return handled; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::SetOutlineFocusL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::SetOutlineFocusL( TBool aFocus ) + { + FUNC_LOG; + CESMRField::SetOutlineFocusL( aFocus ); + + if ( aFocus && iAttachmentCount) + { + ChangeMiddleSoftKeyL( + EAknSoftkeyContextOptions, + R_QTN_MSK_OPEN ); + } + } + +// ----------------------------------------------------------------------------- +// CMRViewerAttachmentsField::HandleRichTextLinkSelection +// ----------------------------------------------------------------------------- +// +TBool CMRViewerAttachmentsField::HandleRichTextLinkSelection( + const CESMRRichTextLink* aLink ) + { + FUNC_LOG; + TBool ret( EFalse ); + + // Open context menu in editor and viewer modes with link selection + if ( aLink->Type() == CESMRRichTextLink::ETypeAttachment ) + { + TRAP_IGNORE( NotifyEventL( EMRLaunchAttachmentContextMenu )); + ret = ETrue; + + TRAP_IGNORE( HandleTactileFeedbackL() ); + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CMRViewerAttachmentsField::UpdateAttachmentsListL +// ----------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::UpdateAttachmentsListL() + { + FUNC_LOG; + + + if ( iRemoteAttApi ) + { + // Let's fetch remote attachment information + iRemoteAttApi->AttachmentInfo( + *iAttachmentInfo, + *iRemoteAttUris ); + } + + RBuf buffer; // codescanner::resourcenotoncleanupstack + buffer.CleanupClosePushL(); + + RCPointerArray attachmentLinks; + CleanupClosePushL( attachmentLinks ); + + TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText( + Rect(), + NMRLayoutManager::EMRTextLayoutTextEditor ); + + iAttachmentCount = iEntry->Entry().AttachmentCountL(); + attachmentLinks.ReserveL( iAttachmentCount ); + for ( TInt i = 0; i < iAttachmentCount; ++i ) + { + CCalAttachment* att = iEntry->Entry().AttachmentL( i ); // Ownership not gained + + // Reducing space required by file size information from + // max line width, so that file name can be trimmed to correct + // length + TInt maxLineWidth = layoutText.TextRect().Width(); + const CFont* font = layoutText.Font(); + + HBufC* attachmentSize = AttachmentNameAndSizeL( KNullDesC(), *att ); + TInt attachmentSizeLength = attachmentSize->Length(); + maxLineWidth -= font->TextWidthInPixels( *attachmentSize ); + delete attachmentSize; + attachmentSize = NULL; + + // TODO: correct icon zise to correct one. Ask from UI specifier. + TSize iconSize( 20, 20); + maxLineWidth -= iconSize.iWidth; + + // Trimming file name to fit to one line + TPtrC text = att->Label(); + HBufC* clippedTextHBufC = ClipTextLC( text, *font, maxLineWidth ); + TPtr clippedText = clippedTextHBufC->Des(); + clippedText.Trim(); + + if ( clippedText.Length() > 0 ) + { + // Creating rich text link + CESMRRichTextLink* link = CESMRRichTextLink::NewL( + buffer.Length(), + clippedText.Length() + attachmentSizeLength, + text, + CESMRRichTextLink::ETypeAttachment, + CESMRRichTextLink::ETriggerKeyRight ); + CleanupStack::PushL( link ); + attachmentLinks.AppendL( link ); + CleanupStack::Pop( link ); + + HBufC* buf = AttachmentNameAndSizeL( clippedText, *att ); + CleanupStack::PushL( buf ); + + // Append attachment name and size with line feed to buffer + buffer.ReAllocL( buffer.Length() + + clippedText.Length() + + buf->Length() + + KNewLine().Length() ); + + buffer.Append( buf->Des() ); + buffer.Append( KNewLine ); + + CleanupStack::PopAndDestroy( buf ); + } + + CleanupStack::PopAndDestroy( clippedTextHBufC ); + } + + // Remove unnecessary new line from the end of buffer. + if ( buffer.Length() >= KNewLine().Length() ) + { + buffer.SetLength( buffer.Length() - KNewLine().Length() ); + } + + // Adding all rich text links to the rich text viewer + if ( buffer.Length() > 0 ) + { + iRichTextViewer->SetTextL( &buffer ); + iRichTextViewer->SetFontL( layoutText.Font() ); + if( iAttachmentCount > 1 ) + { + iRichTextViewer->SetLineSpacingL( LineSpacing() ); + } + + iRichTextViewer->ApplyLayoutChangesL(); + + iRichTextViewer->SetMargins( KMargin ); // What's this? + iRichTextViewer->HandleTextChangedL(); + + while ( attachmentLinks.Count() > 0 ) + { + CESMRRichTextLink* link = attachmentLinks[0]; + CleanupStack::PushL( link ); + attachmentLinks.Remove( 0 ); + iRichTextViewer->AddLinkL( link ); + CleanupStack::Pop( link ); + } + } + + CleanupStack::PopAndDestroy( &attachmentLinks ); + CleanupStack::PopAndDestroy( &buffer ); + + if ( iAttachmentCount ) + { + ChangeMiddleSoftKeyL( + EAknSoftkeyContextOptions, + R_QTN_MSK_OPEN ); + } + } + +// ----------------------------------------------------------------------------- +// CMRViewerAttachmentsField::ClipTextLC +// ----------------------------------------------------------------------------- +// +HBufC* CMRViewerAttachmentsField::ClipTextLC( + const TDesC& aText, const CFont& aFont, TInt aWidth ) + { + FUNC_LOG; + HBufC* text = HBufC::NewLC( aText.Length() + KAknBidiExtraSpacePerLine ); + TPtr textPtr = text->Des(); + AknBidiTextUtils::ConvertToVisualAndClip( + aText, textPtr, aFont, aWidth, aWidth ); + return text; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::AttachmentNameAndSizeL +// --------------------------------------------------------------------------- +// +HBufC* CMRViewerAttachmentsField::AttachmentNameAndSizeL( + const TDesC& aDes, + const CCalAttachment& aAttachment ) + { + HBufC* stringholder = NULL; + + CDesCArrayFlat* attachmentStrings = + new(ELeave)CDesCArrayFlat( 1 ); + CleanupStack::PushL( attachmentStrings ); + + CArrayFixFlat* integers = + new (ELeave) CArrayFixFlat(1); + CleanupStack::PushL( integers ); + + CCalAttachment::TType attType( aAttachment.Type() ); + + TInt attachmentSize(0); + if ( CCalAttachment::EFile == attType ) + { + attachmentSize = aAttachment.FileAttachment()->Size(); + } + else if ( iAttachmentInfo && iAttachmentInfo->AttachmentCount() ) + { + TInt remoteAttCount( iAttachmentInfo->AttachmentCount() ); + for ( TInt i(0); i < remoteAttCount; ++i ) + { + TPtrC label( aAttachment.Label() ); + TPtrC remoteLabel( + iAttachmentInfo->AttachmentL(i).AttachmentLabel() ); + if ( !label.Compare( remoteLabel ) ) + { + attachmentSize = iAttachmentInfo->AttachmentL(i).AttachmentSizeInBytes(); + } + } + } + + if ( attachmentSize >= KOneMegaByte ) + { + attachmentStrings->AppendL( aDes ); + + integers->AppendL( attachmentSize / KOneMegaByte ); + + stringholder = StringLoader::LoadLC( + R_MEET_REQ_ATTACHMENT_FILE_MEGABYTE, + *attachmentStrings, + *integers ); + } + else if (( attachmentSize < KOneKiloByte ) && (attachmentSize != 0)) + { + attachmentStrings->AppendL( aDes ); + + stringholder = StringLoader::LoadLC( + R_MEET_REQ_ATTACHMENT_FILE_LESS_THAN_KILOBYTE , + *attachmentStrings ); + } + else + { + attachmentStrings->AppendL( aDes ); + + integers->AppendL( attachmentSize / KOneKiloByte ); + + stringholder = StringLoader::LoadLC( + R_MEET_REQ_ATTACHMENT_FILE_KILOBYTE, + *attachmentStrings, + *integers ); + } + + CleanupStack::Pop( stringholder ); + CleanupStack::PopAndDestroy( integers ); + CleanupStack::PopAndDestroy( attachmentStrings ); + + return stringholder; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::HandleLongtapEventL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::HandleLongtapEventL( const TPoint& aPosition ) + { + FUNC_LOG; + + if ( iRichTextViewer->Rect().Contains( aPosition ) ) + { + if( iRichTextViewer->LinkSelectedL() ) + { + HandleTactileFeedbackL(); + } + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::HandleRawPointerEventL +// --------------------------------------------------------------------------- +// +TBool CMRViewerAttachmentsField::HandleRawPointerEventL( + const TPointerEvent& aPointerEvent ) + { + FUNC_LOG; + // Handles short on attachment fields actual attachments + TBool ret( EFalse ); + + if( iAttachmentCount > 0 && + aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + if( iRichTextViewer->Rect().Contains( aPointerEvent.iPosition ) ) + { + iRichTextViewer->HandlePointerEventL( aPointerEvent ); + ret = ETrue; + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + + if ( R_MR_VIEWER_ATTACHMENT_MENU == aResourceId ) + { + DynInitMenuPaneForCurrentAttachmentL( aMenuPane ); + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::LockL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::LockL() + { + FUNC_LOG; + if( IsLocked() ) + { + return; + } + + CESMRField::LockL(); + + delete iLockIcon; + iLockIcon = NULL; + iLockIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); + iLockIcon->SetParent( this ); + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::LineSpacing +// --------------------------------------------------------------------------- +// +TInt CMRViewerAttachmentsField::LineSpacing() + { + FUNC_LOG; + // Calculates the line spacing based on default one line layout data + TInt lineSpacing( 0 ); + + TRect rect( Rect() ); + + TAknLayoutRect rowLayoutRect = + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ); + TRect rowRect = rowLayoutRect.Rect(); + + TAknLayoutText labelLayout = + NMRLayoutManager::GetLayoutText( + rect, NMRLayoutManager::EMRTextLayoutTextEditor ); + + TRect defaultTextRect = labelLayout.TextRect(); + + TInt difference = rowRect.Height() - defaultTextRect.Height(); + + lineSpacing = difference * 2; + + return lineSpacing; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::FocusMargin +// --------------------------------------------------------------------------- +// +TInt CMRViewerAttachmentsField::FocusMargin() + { + FUNC_LOG; + // Calculates focus margin based on default one line layout data + TInt focusMagin( 0 ); + + TRect rect( Rect() ); + + TAknLayoutRect rowLayoutRect = + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ); + TRect rowRect = rowLayoutRect.Rect(); + + TAknLayoutText labelLayout = + NMRLayoutManager::GetLayoutText( + rect, NMRLayoutManager::EMRTextLayoutTextEditor ); + + TRect defaultTextRect = labelLayout.TextRect(); + + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + rect, NMRLayoutManager::EMRLayoutTextEditorBg ); + TRect defaultBgRect( bgLayoutRect.Rect() ); + + TInt difference = defaultBgRect.Height() - defaultTextRect.Height(); + + focusMagin = TReal( difference / 2 ); + + return focusMagin; + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::CreateRemoteAttApiL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::CreateRemoteAttApiL() + { + FUNC_LOG; + + delete iAttachmentCommandHandler; + iAttachmentCommandHandler = NULL; + + delete iRemoteAttUris; + iRemoteAttUris = NULL; + + delete iAttachmentInfo; + iAttachmentInfo = NULL; + + TInt attachmentCount( iEntry->Entry().AttachmentCountL() ); + if ( attachmentCount ) + { + iRemoteAttUris = new (ELeave) CDesCArrayFlat( 4 ); + iAttachmentInfo = CCalRemoteAttachmentInfo::NewL(); + } + + for (TInt i(0); i < attachmentCount; ++i ) + { + // Ownership not gained + CCalAttachment* att = iEntry->Entry().AttachmentL( i ); + CCalAttachment::TType attachhmentType( att->Type() ); + + if ( CCalAttachment::EUri == attachhmentType ) + { + if ( !iRemoteAttApi ) + { + TPtrC8 uri( att->Value() ); + iRemoteAttApi = CCalRemoteAttachmentApi::NewL( uri ); + } + + HBufC* uri16 = HBufC16::NewLC(att->Value().Length() ); + uri16->Des().Copy( att->Value() ); + iRemoteAttUris->AppendL( *uri16 ); + CleanupStack::PopAndDestroy( uri16 ); + } + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::DynInitMenuPaneForCurrentAttachmentL +// --------------------------------------------------------------------------- +// +void CMRViewerAttachmentsField::DynInitMenuPaneForCurrentAttachmentL( + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + TInt commandInProgress( + iAttachmentCommandHandler->CurrentCommandInProgress() ); + + // Get selected attachment + CCalAttachment* selectedAttachment = NULL; + + const CESMRRichTextLink* currentLink = iRichTextViewer->GetSelectedLink(); + ASSERT( currentLink ); + + TPtrC currentAttachmentName( currentLink->Value() ); + for ( TInt i(0); i < iAttachmentCount && !selectedAttachment; ++i ) + { + CCalAttachment* attachment = iEntry->Entry().AttachmentL( i ); + TPtrC attachmentLabel ( attachment->Label() ); + + if ( !attachmentLabel.Compare( currentAttachmentName ) ) + { + selectedAttachment = attachment; + } + } + + ASSERT( selectedAttachment ); + + + /* + * Case 1: Download in progress + */ + if( commandInProgress ) + { + // A) If selected attachment is remote attachment and download is in progress + // or attachment is queued for downloading + if( selectedAttachment->Type() == CCalAttachment::EUri && + EESMRViewerSaveAllAttachments == commandInProgress ) + { + aMenuPane->SetItemDimmed( + EESMRViewerOpenAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMRViewerSaveAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMRViewerSaveAllAttachments, + ETrue ); + } + + // B) If selected attachment is local attachment + else if( selectedAttachment->Type() == CCalAttachment::EFile ) + { + // Always hide cancel attachment download item + aMenuPane->SetItemDimmed( + EESMRViewerCancelAttachmentDownload, + ETrue ); + + // If attachment count is one, hide 'Save All' also + if ( iAttachmentCount == 1 ) + { + aMenuPane->SetItemDimmed( + EESMRViewerSaveAllAttachments, + ETrue ); + } + } + + // C) If selected attachment is Uri, and some other command is in progress + // than save all + else if( selectedAttachment->Type() == CCalAttachment::EUri && + commandInProgress != EESMRViewerSaveAllAttachments ) + { + // If this attachment is the one being downloaded + if( IsAttachmentDownloadInProgress( *selectedAttachment ) ) + { + aMenuPane->SetItemDimmed( + EESMRViewerOpenAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMRViewerSaveAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMRViewerSaveAllAttachments, + ETrue ); + } + + + // if this attacment is not the one being downloaded + else + { + // Always hide cancel attachment download item + aMenuPane->SetItemDimmed( + EESMRViewerCancelAttachmentDownload, + ETrue ); + + // If attachment count is one, hide 'Save All' also + if ( iAttachmentCount == 1 ) + { + aMenuPane->SetItemDimmed( + EESMRViewerSaveAllAttachments, + ETrue ); + } + } + } + } + + /* + * Case 2: No download in progress + */ + else + { + // Always hide cancel attachment download item + aMenuPane->SetItemDimmed( + EESMRViewerCancelAttachmentDownload, + ETrue ); + + // If attachment count is one, hide 'Save All' also + if ( iAttachmentCount == 1 ) + { + aMenuPane->SetItemDimmed( + EESMRViewerSaveAllAttachments, + ETrue ); + } + } + } + +// --------------------------------------------------------------------------- +// CMRViewerAttachmentsField::IsAttachmentDownloadInProgress +// --------------------------------------------------------------------------- +// +TBool CMRViewerAttachmentsField::IsAttachmentDownloadInProgress( + const CCalAttachment& aAttachment ) + { + TBool ret( EFalse ); + + RPointerArray& remoteOperations( + iAttachmentCommandHandler->RemoteOperations() ); + + TPtrC currentAttachmentName( aAttachment.Label() ); + + TInt downloadOperationCount( remoteOperations.Count() ); + if ( downloadOperationCount ) + { + for ( TInt i(0); i < downloadOperationCount; ++i ) + { + // There are download operations in progress + const MCalRemoteAttachment& attachInfo = + remoteOperations[i]->AttachmentInformation(); + + TPtrC label( attachInfo.AttachmentLabel() ); + + if ( label.Compare( currentAttachmentName ) == 0 ) + { + ret = ETrue; + } + } + } + + return ret; + } + +//EOF