diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Mon Mar 15 12:39:10 2010 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerdescriptionfield.cpp Wed Mar 31 21:08:33 2010 +0300 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* 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" @@ -31,8 +31,8 @@ #include "cesmrurlparserplugin.h" // #include -#include -#include +#include +#include #include #include #include @@ -71,7 +71,7 @@ FUNC_LOG; delete iLocationPlugin; delete iFeatures; - delete iLocation; + delete iUrlParser; } // --------------------------------------------------------------------------- @@ -83,13 +83,16 @@ FUNC_LOG; TAknLayoutText layoutText = NMRLayoutManager::GetLayoutText( Rect(), NMRLayoutManager::EMRTextLayoutMultiRowTextEditor ); - iRichTextViewer->SetFontL ( layoutText.Font(), iLayout ); + iRichTextViewer->SetFontL( layoutText.Font() ); + iRichTextViewer->ApplyLayoutChangesL(); + if ( IsFocused() ) { iRichTextViewer->FocusChanged( EDrawNow ); } iRichTextViewer->HandleTextChangedL(); + iRichTextViewer->SetEventQueue( iEventQueue ); } // --------------------------------------------------------------------------- @@ -102,7 +105,7 @@ TPtrC text = aEntry.Entry().DescriptionL ( ); if( text.Length() == 0 ) { - iObserver->RemoveControl( FieldId() ); + iObserver->HideControl( FieldId() ); } else if ( FeaturesL().FeatureSupported( CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) @@ -111,6 +114,7 @@ } else { + TPtrC text = aEntry.Entry().DescriptionL(); iRichTextViewer->SetTextL( &text, ETrue ); iRichTextViewer->SetMargins( KMargin ); } @@ -127,30 +131,19 @@ FUNC_LOG; TKeyResponse response = EKeyWasNotConsumed; response = iRichTextViewer->OfferKeyEventL ( aEvent, aType ); - + //track up and down events to change MSK if ( aType == EEventKey ) { if ( aEvent.iCode == EKeyUpArrow || aEvent.iCode == EKeyDownArrow ) { - if ( FeaturesL().FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - SetShowOnMapLinkMiddleSoftKeyL(); - } - else + if ( !iRichTextViewer->GetSelectedLink() ) { - if ( iRichTextViewer->GetSelectedLink() ) - { - SetMiddleSoftKeyVisible( ETrue ); - } - else - { - RestoreMiddleSoftKeyL(); - } + // Restore default middle softkey if field does not contain link + RestoreMiddleSoftKeyL(); } } - } + } return response; } @@ -162,6 +155,7 @@ { CESMRField::SetContainerWindowL( aContainer ); iRichTextViewer->SetContainerWindowL( aContainer ); + iRichTextViewer->SetParent( this ); } // --------------------------------------------------------------------------- @@ -179,7 +173,7 @@ NMRLayoutManager::GetFieldRowLayoutRect( fieldRect, 1 ).Rect(); TRect viewerRect = NMRLayoutManager::GetLayoutText( rowRect, NMRLayoutManager::EMRTextLayoutMultiRowTextEditor ).TextRect(); - + fieldRect.Resize( 0, iSize.iHeight - viewerRect.Height() ); fieldRect.SetWidth( Parent()->Rect().Width() ); return fieldRect.Size(); @@ -193,15 +187,36 @@ { TRect rect( Rect() ); rect = NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ).Rect(); - + TRect viewerRect = - NMRLayoutManager::GetLayoutText( - rect, + NMRLayoutManager::GetLayoutText( + rect, NMRLayoutManager::EMRTextLayoutMultiRowTextEditor ).TextRect(); - - iRichTextViewer->SetRect( - TRect( viewerRect.iTl, + + TRect bgRect( viewerRect.iTl, + TSize( viewerRect.Width(), iSize.iHeight ) ); + // Move focus rect so that it's relative to field's position. + bgRect.Move( -Position() ); + + // Setting Font for the rich text viewer + TAknLayoutText text = NMRLayoutManager::GetLayoutText( + Rect(), + NMRLayoutManager::EMRTextLayoutTextEditor ); + + // Failures are ignored. + TRAP_IGNORE( + // Try setting font + iRichTextViewer->SetFontL( text.Font() ); + // Try applying changes + iRichTextViewer->ApplyLayoutChangesL(); + ); + + iRichTextViewer->SetRect( + TRect( viewerRect.iTl, TSize( viewerRect.Width(), iSize.iHeight ) ) ); + + bgRect.SetHeight( iRichTextViewer->Rect().Height() ); + SetFocusRect( bgRect ); } // --------------------------------------------------------------------------- @@ -237,7 +252,7 @@ { FUNC_LOG; iSize = aSize; - + if ( iObserver && iDisableRedraw ) { iObserver->ControlSizeChanged ( this ); @@ -247,13 +262,35 @@ } // --------------------------------------------------------------------------- +// CESMRViewerDescriptionField::HandleRichTextLinkSelection +// --------------------------------------------------------------------------- +// +TBool CESMRViewerDescriptionField::HandleRichTextLinkSelection( + const CESMRRichTextLink* aLink ) + { + TBool result = EFalse; + if ( aLink && + aLink->Type() == CESMRRichTextLink::ETypeLocationUrl ) + { + TRAPD( error, ShowLocationOnMapL( *aLink ) ) + if ( error ) + { + iCoeEnv->HandleError( error ); + } + result = ETrue; + } + return result; + } + +// --------------------------------------------------------------------------- // CESMRViewerDescriptionField::CESMRViewerDescriptionField() // --------------------------------------------------------------------------- // CESMRViewerDescriptionField::CESMRViewerDescriptionField( ) { FUNC_LOG; - //do nothing + SetFieldId( EESMRFieldDescription ); + SetFocusType( EESMRHighlightFocus ); } // --------------------------------------------------------------------------- @@ -265,16 +302,16 @@ FUNC_LOG; iRichTextViewer = CESMRRichTextViewer::NewL( this ); iRichTextViewer->SetEdwinSizeObserver( this ); + CESMRField::ConstructL( iRichTextViewer ); // ownership transferred iRichTextViewer->SetParent( this ); - - SetFieldId( EESMRFieldDescription ); + iRichTextViewer->SetLinkObserver( this ); } // --------------------------------------------------------------------------- -// CESMRViewerDescriptionField::GetMinimumVisibleVerticalArea() +// CESMRViewerDescriptionField::GetCursorLineVerticalPos() // --------------------------------------------------------------------------- // -void CESMRViewerDescriptionField::GetMinimumVisibleVerticalArea(TInt& aUpper, TInt& aLower) +void CESMRViewerDescriptionField::GetCursorLineVerticalPos( TInt& aUpper, TInt& aLower ) { FUNC_LOG; aLower = iRichTextViewer->CurrentLineNumber() * iRichTextViewer->RowHeight(); @@ -295,33 +332,22 @@ // CESMRViewerDescriptionField::ExecuteGenericCommandL() // --------------------------------------------------------------------------- // -void CESMRViewerDescriptionField::ExecuteGenericCommandL( TInt aCommand ) +TBool CESMRViewerDescriptionField::ExecuteGenericCommandL( TInt aCommand ) { FUNC_LOG; + TBool isUsed( EFalse ); switch ( aCommand ) { case EESMRCmdClipboardCopy: { iRichTextViewer->CopyCurrentLinkToClipBoardL(); - break; - } - case EESMRCmdShowOnMap: - { - if ( FeaturesL().FeatureSupported( - CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) - { - const CESMRRichTextLink* link = - iRichTextViewer->GetSelectedLink(); - if ( link ) - { - LocationPluginL().ShowOnMapL( *iLocation, link->Value() ); - } - } + isUsed = ETrue; break; } case EAknSoftkeySelect: { iRichTextViewer->LinkSelectedL(); + isUsed = ETrue; break; } default: @@ -329,6 +355,7 @@ break; } } + return isUsed; } // --------------------------------------------------------------------------- @@ -339,9 +366,9 @@ { FUNC_LOG; CESMRField::SetOutlineFocusL ( aFocus ); - + iRichTextViewer->SetFocus( aFocus ); - + if ( FeaturesL().FeatureSupported( CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) { @@ -350,7 +377,7 @@ SetShowOnMapLinkMiddleSoftKeyL(); } } - + if ( !aFocus ) { //need to tell action menu that focus has changed @@ -359,20 +386,37 @@ } // --------------------------------------------------------------------------- +// CESMRDescriptionField::HandleLongtapEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerDescriptionField::HandleLongtapEventL( + const TPoint& aPosition ) + { + FUNC_LOG; + + if ( iRichTextViewer->Rect().Contains( aPosition ) ) + { + if( iRichTextViewer->LinkSelectedL() ) + { + HandleTactileFeedbackL(); + } + + } + } + +// --------------------------------------------------------------------------- // CESMRViewerDescriptionField::AddShowOnMapLinkL // --------------------------------------------------------------------------- // void CESMRViewerDescriptionField::AddShowOnMapLinkL( MESMRCalEntry& aEntry ) { FUNC_LOG; - TInt command( EESMRCmdDisableWaypointIcon ); - CESMRUrlParserPlugin* urlParser = CESMRUrlParserPlugin::NewL(); - CleanupStack::PushL( urlParser ); + TPtrC urlPointer; TInt position; - position = urlParser->FindLocationUrl( aEntry.Entry().DescriptionL(), + position = UrlParserL().FindLocationUrl( aEntry.Entry().DescriptionL(), urlPointer ); - CleanupStack::PopAndDestroy( urlParser ); + // Location url is found and need to be replaced with show on map link if ( position >= KErrNone ) { @@ -387,24 +431,22 @@ descriptionPointer.Replace( position, urlPointer.Length(), *showOnMapBuf ); - CESMRRichTextLink* showOnMapLink = CESMRRichTextLink::NewL( position, - showOnMapBuf->Length(), + CESMRRichTextLink* showOnMapLink = CESMRRichTextLink::NewL( position, + showOnMapBuf->Length(), urlPointer, CESMRRichTextLink::ETypeLocationUrl, CESMRRichTextLink::ETriggerKeyOk ); CleanupStack::PushL( showOnMapLink ); iRichTextViewer->SetTextL( description, ETrue ); - iRichTextViewer->InsertLinkL( showOnMapLink, 0 ); - CleanupStack::Pop( showOnMapLink ); + iRichTextViewer->InsertLinkL( showOnMapLink, 0 ); + CleanupStack::Pop( showOnMapLink ); iRichTextViewer->HandleTextChangedL(); CleanupStack::PopAndDestroy( description ); CleanupStack::PopAndDestroy( showOnMapBuf ); - command = EESMRCmdEnableWaypointIcon; - - const TDesC& location = aEntry.Entry().LocationL(); - delete iLocation; - iLocation = NULL; - iLocation = location.AllocL(); + + StoreGeoValueL( + aEntry.Entry(), + urlPointer ); } // No location url found. Other description text is added to field. else @@ -412,9 +454,8 @@ TPtrC text = aEntry.Entry().DescriptionL(); iRichTextViewer->SetTextL( &text, ETrue ); } - + iRichTextViewer->SetMargins( KMargin ); - NotifyEventL( command ); } // --------------------------------------------------------------------------- @@ -435,7 +476,7 @@ { RestoreMiddleSoftKeyL(); } - + SetMiddleSoftKeyVisible( ETrue ); } else @@ -455,7 +496,7 @@ { iFeatures = CESMRFeatureSettings::NewL(); } - + return *iFeatures; } @@ -470,9 +511,65 @@ { iLocationPlugin = CESMRLocationPlugin::NewL(); } - + return *iLocationPlugin; } +// --------------------------------------------------------------------------- +// CESMRViewerDescriptionField::ShowLocationOnMapL +// --------------------------------------------------------------------------- +// +void CESMRViewerDescriptionField::ShowLocationOnMapL( + const CESMRRichTextLink& aLink ) + { + FUNC_LOG; + + if ( FeaturesL().FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + LocationPluginL().ShowOnMapL( aLink.Value() ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDescriptionField::StoreGeoValueL +// --------------------------------------------------------------------------- +// +void CESMRViewerDescriptionField::StoreGeoValueL( + CCalEntry& aCalEntry, + const TDesC& aLocationUrl ) + { + FUNC_LOG; + + TReal lat, lon; + CCalGeoValue* geoVal = aCalEntry.GeoValueL(); + + if ( !geoVal || ! geoVal->GetLatLong( lat, lon ) ) + { + // GEO value not set. Convert URL + geoVal = UrlParserL().CreateGeoValueLC( aLocationUrl ); + aCalEntry.SetGeoValueL( *geoVal ); + CleanupStack::Pop( geoVal ); + + NotifyEventL( EESMRCmdEnableWaypointIcon ); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerDescriptionField::UrlParserL +// --------------------------------------------------------------------------- +// +CESMRUrlParserPlugin& CESMRViewerDescriptionField::UrlParserL() + { + FUNC_LOG; + + if ( !iUrlParser ) + { + iUrlParser = CESMRUrlParserPlugin::NewL(); + } + + return *iUrlParser; + } + //EOF