diff -r 000000000000 -r 8466d47a6819 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrdescriptionfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrdescriptionfield.cpp Thu Dec 17 08:39:21 2009 +0200 @@ -0,0 +1,466 @@ +/* +* 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: ESMR Description (summary) field implementation + * +*/ + + +#include "emailtrace.h" +#include +#include +#include +#include +#include +#include +// +#include "cesmrurlparserplugin.h" +// + +#include "cesmrdescriptionfield.h" +#include "mesmrlistobserver.h" +#include "cesmreditor.h" +#include "cesmrrichtextlink.h" +#include "cesmrlayoutmgr.h" +#include "esmrfieldbuilderdef.h" +#include "cesmrfeaturesettings.h" +#include "cesmrglobalnote.h" + +namespace{ // codescanner::namespace +const TInt KFieldInnerShrink(3); +}//namespace + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::NewL +// --------------------------------------------------------------------------- +// +CESMRDescriptionField* CESMRDescriptionField::NewL( ) + { + FUNC_LOG; + CESMRDescriptionField* self = new (ELeave) CESMRDescriptionField; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::~CESMRDescriptionField +// --------------------------------------------------------------------------- +// +CESMRDescriptionField::~CESMRDescriptionField( ) + { + FUNC_LOG; + delete iFrameBgContext; + + delete iLocationLink; + + delete iFeatures; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::InitializeL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::InitializeL() + { + FUNC_LOG; + iDescription->SetFontL( iLayout->Font (iCoeEnv, iFieldId ), iLayout ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::InternalizeL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::InternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + CCalEntry& entry = aEntry.Entry ( ); + HBufC* summary = entry.DescriptionL().AllocLC ( ); + + // externalize is done only when there is text and its NOT the default one. + if ( summary->Length ( )> 0 && iDescription->DefaultText().Compare (*summary )!= 0 ) + { + iDescription->ClearSelectionAndSetTextL ( *summary ); + if ( FeaturesL().FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + StoreLinkL( aEntry ); + } + } + + CleanupStack::PopAndDestroy ( summary ); + + // this is needed to be re-called here, otherwise the CEikEdwin + // does not get correctly instantiated with default text + iDescription->FocusChanged(EDrawNow); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ExternalizeL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::ExternalizeL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + HBufC* buf = iDescription->GetTextInHBufL(); + + if( buf ) + { + CleanupStack::PushL( buf ); + + if( iDescription->DefaultText().Compare( *buf ) != 0 ) + { + CCalEntry& entry = aEntry.Entry(); + + HBufC* newBuf = AddLinkToTextL( *buf ); + if( newBuf ) + { + CleanupStack::PopAndDestroy( buf ); + buf = newBuf; + CleanupStack::PushL( buf ); + } + entry.SetDescriptionL( *buf ); + } + CleanupStack::PopAndDestroy( buf ); + } + else if( iLocationLink ) + { + CCalEntry& entry = aEntry.Entry(); + entry.SetDescriptionL( iLocationLink->Value() ); + } + else + { + CCalEntry& entry = aEntry.Entry(); + entry.SetDescriptionL( KNullDesC ); + } + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::SetOutlineFocusL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::SetOutlineFocusL( TBool aFocus ) + { + FUNC_LOG; + CESMRField::SetOutlineFocusL ( aFocus ); + if ( aFocus ) + { + ChangeMiddleSoftKeyL(EESMRCmdSaveMR,R_QTN_MSK_SAVE); + } + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ExpandedHeight +// --------------------------------------------------------------------------- +// +TInt CESMRDescriptionField::ExpandedHeight( ) const + { + FUNC_LOG; + return iSize.iHeight; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CESMRDescriptionField::OfferKeyEventL(const TKeyEvent& aEvent, + TEventCode aType ) + { + FUNC_LOG; + return iDescription->OfferKeyEventL( aEvent, aType ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::HandleEdwinSizeEventL +// --------------------------------------------------------------------------- +// +TBool CESMRDescriptionField::HandleEdwinSizeEventL(CEikEdwin* /*aEdwin*/, + TEdwinSizeEvent /*aType*/, TSize aSize ) + { + FUNC_LOG; + iSize = aSize; + iSize.iHeight -= KEditorDifference; + + if (iLayout->CurrentFontZoom() == EAknUiZoomSmall || + iLayout->CurrentFontZoom() == EAknUiZoomVerySmall) + { + iSize.iHeight -= KEditorDifference; + } + + if ( iObserver ) + { + iObserver->ControlSizeChanged ( this ); + } + + if( iFrameBgContext ) + { + TRect visibleRect = CalculateVisibleRect( iDescription->Rect() ); + iFrameBgContext->SetFrameRects( visibleRect, visibleRect ); + } + + return ETrue; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::HandleEdwinEventL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::HandleEdwinEventL(CEikEdwin* aEdwin,TEdwinEvent aEventType) + { + FUNC_LOG; + if ( aEdwin == iDescription + && aEventType == EEventTextUpdate ) + { + HBufC* text = iDescription->GetTextInHBufL(); + if ( text ) + { + CleanupStack::PushL( text ); + TInt textLength( text->Length() ); + if ( iDescription->GetLimitLength() <= textLength ) + { + NotifyEventAsyncL( EESMRCmdSizeExceeded ); + } + CleanupStack::PopAndDestroy( text ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::CESMRDescriptionField +// --------------------------------------------------------------------------- +// +CESMRDescriptionField::CESMRDescriptionField() : + iSize( TSize( 0, 0 )) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ActivateL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::ActivateL() + { + FUNC_LOG; + CCoeControl::ActivateL(); + TRect rect(TPoint(iDescription->Position()), iDescription->Size()); + TRect inner(rect); + inner.Shrink( KFieldInnerShrink, KFieldInnerShrink ); + TRect outer(rect); + + delete iFrameBgContext; + iFrameBgContext = NULL; + iFrameBgContext = CAknsFrameBackgroundControlContext::NewL( KAknsIIDQsnFrInput, + outer, + inner, + EFalse ); + + iFrameBgContext->SetParentContext( iBackground ); + iDescription->SetSkinBackgroundControlContextL( iFrameBgContext ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::PositionChanged() +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::PositionChanged() + { + FUNC_LOG; + CCoeControl::PositionChanged(); + if( iFrameBgContext ) + { + TRect visibleRect = CalculateVisibleRect( iDescription->Rect() ); + iFrameBgContext->SetFrameRects( visibleRect, visibleRect ); + } + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ConstructL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::ConstructL() + { + FUNC_LOG; + SetFieldId( EESMRFieldDescription ); + SetExpandable( ); + iDescription = CESMREditor::NewL( this, 1, KTextLimit, + CEikEdwin::EResizable | + CEikEdwin::EAvkonEditor ); + iDescription->SetEdwinSizeObserver( this ); + iDescription->SetEdwinObserver( this ); + + HBufC* buf = StringLoader::LoadLC( R_QTN_MEET_REQ_DETAILS_FIELD ); + iDescription->SetDefaultTextL( buf ); // ownership transferred + CleanupStack::Pop( buf ); + + iBackground = AknsDrawUtils::ControlContext( this ); + + CESMRField::ConstructL( iDescription ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::GetMinimumVisibleVerticalArea +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::GetMinimumVisibleVerticalArea(TInt& aUpper, TInt& aLower) + { + FUNC_LOG; + aLower = iDescription->CurrentLineNumber() * iDescription->RowHeight(); + aUpper = aLower - iDescription->RowHeight(); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ListObserverSet +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::ListObserverSet() + { + FUNC_LOG; + iDescription->SetListObserver( iObserver ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::StoreLinkL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::StoreLinkL( MESMRCalEntry& aEntry ) + { + FUNC_LOG; + TInt command( EESMRCmdDisableWaypointIcon ); + CESMRUrlParserPlugin* urlParser = CESMRUrlParserPlugin::NewL(); + CleanupStack::PushL( urlParser ); + TPtrC urlPointer; + TInt position; + position = urlParser->FindLocationUrl( aEntry.Entry().DescriptionL(), + urlPointer ); + CleanupStack::PopAndDestroy( urlParser ); + if ( position >= KErrNone ) + { + command = EESMRCmdEnableWaypointIcon; + HBufC* description = + HBufC::NewL( aEntry.Entry().DescriptionL().Length() ); + CleanupStack::PushL( description ); + TPtr descriptionPointer( description->Des() ); + descriptionPointer.Append( aEntry.Entry().DescriptionL() ); + descriptionPointer.Delete( position, urlPointer.Length() ); + descriptionPointer.TrimLeft(); + if ( description->Length() != 0 ) + { + iDescription->ClearSelectionAndSetTextL( *description ); + } + else + { + iDescription->ClearSelectionAndSetTextL( iDescription->DefaultText() ); + } + CleanupStack::PopAndDestroy( description ); + + if ( iLocationLink ) + { + delete iLocationLink; + iLocationLink = NULL; + } + HBufC* showOnMapBuf = + StringLoader::LoadLC( R_MEET_REQ_LINK_SHOW_ON_MAP ); + iLocationLink = CESMRRichTextLink::NewL( position, + showOnMapBuf->Length(), + urlPointer, + CESMRRichTextLink::ETypeLocationUrl, + CESMRRichTextLink::ETriggerKeyOk ); + CleanupStack::PopAndDestroy( showOnMapBuf ); + } + + NotifyEventL( command ); + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::AddLinkToTextL +// --------------------------------------------------------------------------- +// +HBufC* CESMRDescriptionField::AddLinkToTextL( const TDesC& aBuf ) + { + FUNC_LOG; + if( iLocationLink ) + { + TInt newTextLen = aBuf.Length() + iLocationLink->Value().Length() + 1; + HBufC* retBuf = HBufC::NewL( newTextLen ); + + retBuf->Des().Append( iLocationLink->Value() ); + _LIT( KParagraphSeparator, "\x2029" ); // unicode paragraph separator + // add the separator after url + retBuf->Des().Append( KParagraphSeparator ); + retBuf->Des().Append( aBuf ); + + return retBuf; + } + else + { + return NULL; + } + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::FeaturesL +// --------------------------------------------------------------------------- +// +CESMRFeatureSettings& CESMRDescriptionField::FeaturesL() + { + FUNC_LOG; + if ( !iFeatures ) + { + iFeatures = CESMRFeatureSettings::NewL(); + } + + return *iFeatures; + } + +// --------------------------------------------------------------------------- +// CESMRDescriptionField::ExecuteGenericCommandL +// --------------------------------------------------------------------------- +// +void CESMRDescriptionField::ExecuteGenericCommandL( + TInt aCommand ) + { + FUNC_LOG; + if ( EESMRCmdSizeExceeded == aCommand ) + { + CESMRGlobalNote::ExecuteL ( + CESMRGlobalNote::EESMRCannotDisplayMuchMore ); + + HBufC* text = iDescription->GetTextInHBufL(); + CleanupDeletePushL( text ); + if ( text ) + { + TInt curPos = iDescription->CursorPos(); + if( curPos > iDescription->GetLimitLength() - 1 ) + curPos = iDescription->GetLimitLength() - 1; + HBufC* newText = + text->Des().Mid( 0, iDescription->GetLimitLength() - 1 ).AllocLC(); + + iDescription->SetTextL ( newText ); + CleanupStack::PopAndDestroy( newText ); + newText = NULL; + + iDescription->SetCursorPosL (curPos, EFalse ); + iDescription->HandleTextChangedL(); + iDescription->UpdateScrollBarsL(); + SetFocus(ETrue); + } + CleanupStack::PopAndDestroy( text ); + } + } + + +// EOF