diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cmrattachmentsfield.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -0,0 +1,1040 @@ +/* +* 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 attahcment field implementation + * + */ +#include "cmrattachmentsfield.h" + +#include "mesmrlistobserver.h" +#include "mesmrmeetingrequestentry.h" +#include "cmrlabel.h" +#include "nmrlayoutmanager.h" +#include "nmrbitmapmanager.h" +#include "cmrimage.h" +#include "cesmrrichtextviewer.h" +#include "cesmreditor.h" +#include "cesmrrichtextlink.h" +#include "cmrattachmentcommandhandler.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +// DEBUG +#include "emailtrace.h" + + +// unnamed namespace for local definitions +namespace { // codescanner::namespace +//CONSTANTS + +// TODO: Read default text from resource +_LIT( KAddAttachment, "Add attachment" ); +_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 IsValidAttachmentEditorCommand( TInt aCommand ) + { + TBool ret( EFalse ); + + switch( aCommand ) + { + case EESMREditorOpenAttachment: + case EESMREditorRemoveAttachment: + case EESMREditorRemoveAllAttachments: + case EESMREditorAddAttachment: + ret = ETrue; + break; + + default: + ret = EFalse; + break; + } + + return ret; + } + +}//namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::CMRAttachmentsField +// --------------------------------------------------------------------------- +// +CMRAttachmentsField::CMRAttachmentsField() + { + FUNC_LOG; + SetFocusType( EESMRHighlightFocus ); + SetFieldId( EESMRFieldAttachments ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::~CMRAttachmentsField +// --------------------------------------------------------------------------- +// +CMRAttachmentsField::~CMRAttachmentsField( ) + { + FUNC_LOG; + delete iBgCtrlContext; + delete iFieldIcon; + delete iTitle; + delete iAttCommandHandler; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::NewL +// --------------------------------------------------------------------------- +// +CMRAttachmentsField* CMRAttachmentsField::NewL() + { + FUNC_LOG; + CMRAttachmentsField* self = new( ELeave )CMRAttachmentsField(); + CleanupStack::PushL ( self ); + self->ConstructL(); + CleanupStack::Pop ( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::ConstructL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::ConstructL() + { + FUNC_LOG; + + SetComponentsToInheritVisibility( ETrue ); + + iFieldIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapAttachment ); + iFieldIcon->SetParent( this ); + + iTitle = CMRLabel::NewL(); + iTitle->SetParent( this ); + + iRichTextViewer = CESMRRichTextViewer::NewL( this ); + CESMRField::ConstructL( iRichTextViewer ); // ownership transferred + iRichTextViewer->SetEdwinSizeObserver ( this ); + iRichTextViewer->SetLinkObserver (this ); + iRichTextViewer->SetParent( this ); + + // TODO: read from resource + iTitle->SetTextL( KAddAttachment ); + + // 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 ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::MinimumSize +// --------------------------------------------------------------------------- +// +TSize CMRAttachmentsField::MinimumSize() + { + TRect parentRect( Parent()->Rect() ); + + TRect richTextRect = + NMRLayoutManager::GetFieldLayoutRect( parentRect, 1 ).Rect(); + + TRect textRect( NMRLayoutManager::GetLayoutText( + richTextRect, + NMRLayoutManager::EMRTextLayoutTextEditor ).TextRect() ); + + // Adjust field size so that there's room for expandable editor. + richTextRect.Resize( 0, iRichTextSize.iHeight - textRect.Height() ); + + // Add title area to the required size + TSize titleSize( CESMRField::MinimumSize() ); + + TSize completeFieldSize( titleSize ); + if( iAttachmentCount ) + { + completeFieldSize.iHeight += richTextRect.Height(); + } + + return completeFieldSize; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::InitializeL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::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 ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::InternalizeL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::InternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + iEntry = &aEntry; + + if ( aEntry.SupportsCapabilityL( MESMRCalEntry::EMRCapabilityAttachments ) ) + { + UpdateAttachmentsListL(); + + //wake up current contact menu selection by calling this + iRichTextViewer->FocusChanged( ENoDrawNow ); + + iDisableRedraw = ETrue; + } + else + { + // Field does not support attachments --> Remove field from UI. + iObserver->HideControl( EESMRFieldAttachments ); + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::ExternalizeL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::ExternalizeL( MESMRCalEntry& /*aEntry*/ ) + { + FUNC_LOG; + // No implementation + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentsField::CountComponentControls( ) const + { + FUNC_LOG; + TInt count( 0 ); + if ( iFieldIcon ) + { + ++count; + } + + if ( iRichTextViewer ) + { + ++count; + } + if ( iTitle ) + { + ++count; + } + + return count; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::ComponentControl +// --------------------------------------------------------------------------- +// +CCoeControl* CMRAttachmentsField::ComponentControl( TInt aInd ) const + { + FUNC_LOG; + switch ( aInd ) + { + case 0: + return iRichTextViewer; + case 1: + return iFieldIcon; + case 2: + return iTitle; + default: + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::SizeChanged +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::SizeChanged( ) + { + FUNC_LOG; + TRect rect( Rect() ); + + TAknLayoutRect firstRowLayoutRect( + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) ); + TRect firstRowRect( firstRowLayoutRect.Rect() ); + + TRect secondRowRect( firstRowRect ); + secondRowRect.Move( 0, firstRowRect.Height() ); + + // Layout field button + if( iFieldIcon ) + { + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutTextEditorIcon ) ); + AknLayoutUtils::LayoutControl( + iFieldIcon, firstRowRect, iconLayout ); + } + + // Layout field title + if( iTitle ) + { + TAknLayoutText labelLayout( + NMRLayoutManager::GetLayoutText( + firstRowRect, + NMRLayoutManager::EMRTextLayoutTextEditor ) ); + + iTitle->SetRect( labelLayout.TextRect() ); + + // Setting font also for the label. Failures are ignored. + TRAP_IGNORE( iTitle->SetFont( labelLayout.Font() ) ); + } + + TRect edwinRect( 0, 0, 0, 0 ); + + // Layout field editor + if( iRichTextViewer ) + { + TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText( + secondRowRect, + NMRLayoutManager::EMRTextLayoutTextEditor ); + + edwinRect = layoutText.TextRect(); + + // Resize height according to actual height required by edwin. + edwinRect.Resize( 0, iRichTextSize.iHeight - edwinRect.Height() ); + + iRichTextViewer->SetRect( edwinRect ); + + // Try setting font. Failures are ignored. + TRAP_IGNORE( + iRichTextViewer->SetFontL( layoutText.Font() ); + if( iAttachmentCount > 1 ) + { + iRichTextViewer->SetLineSpacingL( LineSpacing() ); + } + iRichTextViewer->ApplyLayoutChangesL(); + ); + } + + // Layouting focus + TRect bgRect( 0, 0, 0, 0 ); + // No attachments -> Focus to the title + if( iAttachmentCount == 0 ) + { + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + firstRowRect, NMRLayoutManager::EMRLayoutTextEditorBg ); + bgRect = bgLayoutRect.Rect(); + } + // One attachment -> Focus to the attachment according to layout data + if( iAttachmentCount == 1 ) + { + TAknLayoutRect bgLayoutRect = + NMRLayoutManager::GetLayoutRect( + secondRowRect, NMRLayoutManager::EMRLayoutTextEditorBg ); + bgRect = bgLayoutRect.Rect(); + } + // More than one attachements -> Focus calculated manually + if( iAttachmentCount > 1 ) + { + bgRect.SetRect( + TPoint( edwinRect.iTl.iX, + edwinRect.iTl.iY - FocusMargin() ), + TPoint( edwinRect.iBr.iX, + edwinRect.iBr.iY + FocusMargin() ) ); + } + + // Move focus rect so that it's relative to field's position. + bgRect.Move( -Position() ); + SetFocusRect( bgRect ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CMRAttachmentsField::OfferKeyEventL( + const TKeyEvent& aEvent, + TEventCode aType ) + { + FUNC_LOG; + TKeyResponse response( EKeyWasNotConsumed ); + + if( iAttachmentCount == 0 ) + { + response = iTitle->OfferKeyEventL( aEvent, aType ); + } + + if( iAttachmentCount > 0 ) + { + response = iRichTextViewer->OfferKeyEventL( aEvent, aType ); + } + + if ( aType == EEventKey && + ( aEvent.iScanCode != EStdKeyUpArrow && + aEvent.iScanCode != EStdKeyDownArrow )) + { + iTitle->DrawDeferred(); // ?? + } + return response; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::SetContainerWindowL() +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::SetContainerWindowL( const CCoeControl& aControl ) + { + FUNC_LOG; + CESMRField::SetContainerWindowL( aControl ); + iRichTextViewer->SetContainerWindowL( aControl ); + iRichTextViewer->SetParent( this ); + iTitle->SetContainerWindowL( aControl ); + iTitle->SetParent( this ); + iFieldIcon->SetContainerWindowL( aControl ); + iFieldIcon->SetParent( this ); + + iButtonGroupContainer = CEikButtonGroupContainer::Current(); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::HandleEdwinSizeEventL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::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; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::ListObserverSet +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::ListObserverSet() + { + FUNC_LOG; + iRichTextViewer->SetListObserver( iObserver ); + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::ExecuteGenericCommandL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::ExecuteGenericCommandL( TInt aCommand ) + { + FUNC_LOG; + // TODO: Changes from other fields have to be implemented here + TBool handled( EFalse ); + + // From cesmrattachmentfield + if( aCommand == EAknCmdOpen ) + { + handled = ETrue; + HandleTactileFeedbackL(); + } + else if ( aCommand == EESMREditorAddAttachment ) + { + handled = AddAttachmentL(); + if( handled ) + { + HandleTactileFeedbackL(); + } + } + + else if ( IsValidAttachmentEditorCommand(aCommand) && + iAttCommandHandler ) + { + const CESMRRichTextLink* currentLink = iRichTextViewer->GetSelectedLink(); + + ASSERT( currentLink ); + + iAttCommandHandler->HandleAttachmentCommandL( + aCommand, + *currentLink ); + + HandleTactileFeedbackL(); + + handled = ETrue; + + if( aCommand == EESMREditorRemoveAttachment || + aCommand == EESMREditorRemoveAllAttachments ) + { + // Attachment list needs to be updated after removing + // attachment(s) + UpdateAttachmentsListL(); + + //wake up current contact menu selection by calling this + iRichTextViewer->FocusChanged( ENoDrawNow ); + + if( iAttachmentCount == 0 ) + { + // If no attachments are present anymore, let's hide the + // whole rich text viewer. + iRichTextViewer->MakeVisible( EFalse ); + + // Because rich text part is removed from the UI, + // we need to inform the parent, to re-size the + // field container and re-initialize the physics + // world size + iObserver->ControlSizeChanged( this ); + } + } + } + + return handled; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::SetOutlineFocusL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::SetOutlineFocusL( TBool aFocus ) + { + FUNC_LOG; + CESMRField::SetOutlineFocusL( aFocus ); + + if ( aFocus ) + { + if ( iAttachmentCount ) + { + ChangeMiddleSoftKeyL( + EAknSoftkeyContextOptions, + R_QTN_MSK_OPEN ); + } + else + { + ChangeMiddleSoftKeyL( + EESMREditorAddAttachment, + R_QTN_MSK_ADD ); + + } + } + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentsField::HandleRichTextLinkSelection +// ----------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::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; + } + + return ret; + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentsField::UpdateAttachmentsListL +// ----------------------------------------------------------------------------- +// +void CMRAttachmentsField::UpdateAttachmentsListL() + { + FUNC_LOG; + + RBuf buffer; // codescanner::resourcenotoncleanupstack + buffer.CleanupClosePushL(); + + RCPointerArray attachmentLinks; + CleanupClosePushL( attachmentLinks ); + + iAttachmentCount = iEntry->Entry().AttachmentCountL(); + + TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText( + Rect(), + NMRLayoutManager::EMRTextLayoutTextEditor ); + + 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 = MinimumSize().iWidth; + 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 ) + { + iRichTextViewer->MakeVisible( ETrue ); + + iObserver->ControlSizeChanged( this ); + + ChangeMiddleSoftKeyL( + EAknSoftkeyContextOptions, + R_QTN_MSK_OPEN ); + + delete iAttCommandHandler; + iAttCommandHandler = NULL; + + iAttCommandHandler = + CMRAttachmentCommandHandler::NewL( + iEntry->Entry(), + *iEventQueue ); + } + } + +// ----------------------------------------------------------------------------- +// CMRAttachmentsField::ClipTextLC +// ----------------------------------------------------------------------------- +// +HBufC* CMRAttachmentsField::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; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::AttachmentOperationCompleted +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::AttachmentOperationCompleted( + MDesC16Array& /*aArray*/ ) + { + TRAPD( error, UpdateAttachmentsListL() ); + if( error != KErrNone ) + { + // Error occured, could not update the field + iCoeEnv->HandleError( error ); + } + + delete iAttachmentUi; + iAttachmentUi = NULL; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::AttachmentNameAndSizeL +// --------------------------------------------------------------------------- +// +HBufC* CMRAttachmentsField::AttachmentNameAndSizeL( + const TDesC& aDes, + const CCalAttachment& aAttachment ) + { + HBufC* stringholder; + + CDesCArrayFlat* attachmentStrings = + new(ELeave)CDesCArrayFlat( 1 ); + CleanupStack::PushL( attachmentStrings ); + + CArrayFixFlat* integers = + new (ELeave) CArrayFixFlat(1); + CleanupStack::PushL( integers ); + + TInt attachmentSize = aAttachment.FileAttachment()->Size(); + + 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; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::AddAttachmentL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::AddAttachmentL() + { + TBool ret( EFalse ); + + if( iEntry ) + { + if ( !iAttachmentUi ) + { + iAttachmentUi = CMRAttachmentUi::NewL(); + } + + iAttachmentUi->SetObserver( *this ); + TInt error( iAttachmentUi->LaunchFetchUi( *iEntry ) ); + ret = ETrue; + if( error != KErrNone ) + { + iCoeEnv->HandleError( error ); + ret = EFalse; + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::HandleSingletapEventL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::HandleSingletapEventL( const TPoint& aPosition ) + { + FUNC_LOG; + TBool ret( EFalse ); + + // When there are no attachments, the whole field area + // will execute single tap the action + if( iAttachmentCount == 0 ) + { + if( Rect().Contains( aPosition ) ) + { + ret = AddAttachmentL(); + if( ret ) + { + HandleTactileFeedbackL(); + } + } + } + // Otherwise only the title and the fieldIcon will + // execute the single tap action + else + { + if( iTitle->Rect().Contains( aPosition ) || + iFieldIcon->Rect().Contains( aPosition ) ) + { + ret = AddAttachmentL(); + if( ret ) + { + HandleTactileFeedbackL(); + } + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::HandleLongtapEventL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::HandleLongtapEventL( const TPoint& aPosition ) + { + // When there are no attachments, the whole field area + // will execute long tap the action + if( iAttachmentCount == 0 ) + { + if( Rect().Contains( aPosition ) ) + { + if( AddAttachmentL() ) + { + HandleTactileFeedbackL(); + } + } + } + else + { + if ( iRichTextViewer->Rect().Contains( aPosition ) ) + { + if( iRichTextViewer->LinkSelectedL() ) + { + HandleTactileFeedbackL(); + } + } + + if( iTitle->Rect().Contains( aPosition ) || + iFieldIcon->Rect().Contains( aPosition ) ) + { + if( AddAttachmentL() ) + { + HandleTactileFeedbackL(); + } + } + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::HandleRawPointerEventL +// --------------------------------------------------------------------------- +// +TBool CMRAttachmentsField::HandleRawPointerEventL( + const TPointerEvent& aPointerEvent ) + { + FUNC_LOG; + TBool ret( EFalse ); + + if( iAttachmentCount > 0 && + aPointerEvent.iType == TPointerEvent::EButton1Up ) + { + if( iRichTextViewer->Rect().Contains( aPointerEvent.iPosition ) ) + { + iRichTextViewer->HandlePointerEventL( aPointerEvent ); + ret = ETrue; + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CMRAttachmentsField::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + + if ( R_MR_EDITOR_ATTACHMENT_MENU == aResourceId ) + { + if ( !iAttachmentCount ) + { + aMenuPane->SetItemDimmed( + EESMREditorOpenAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMREditorRemoveAttachment, + ETrue ); + + aMenuPane->SetItemDimmed( + EESMREditorRemoveAllAttachments, + ETrue ); + } + else if ( iAttachmentCount == 1 ) + { + aMenuPane->SetItemDimmed( + EESMREditorRemoveAllAttachments, + ETrue ); + + } + } + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::LineSpacing +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentsField::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; + } + +// --------------------------------------------------------------------------- +// CMRAttachmentsField::FocusMargin +// --------------------------------------------------------------------------- +// +TInt CMRAttachmentsField::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; + } + +//EOF