diff -r 0396474f30f5 -r 4ce476e64c59 meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp --- a/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.cpp Mon Mar 15 12:39:10 2010 +0200 +++ b/meetingrequest/mrgui/mrfieldbuilderplugin/src/cesmrviewerlocationfield.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" @@ -15,18 +15,24 @@ * */ +#include "cesmrviewerlocationfield.h" +#include "cesmrrichtextviewer.h" +#include "mesmrlistobserver.h" +#include "nmrlayoutmanager.h" +#include "cmrimage.h" +#include "cesmrfeaturesettings.h" +#include "emailtrace.h" +#include "cesmrglobalnote.h" +#include "cmrbutton.h" + #include #include #include -#include +#include +#include +#include -#include "cesmrviewerlocationfield.h" -#include "cesmrrichtextviewer.h" -#include "mesmrlistobserver.h" -#include "cesmrfeaturesettings.h" -#include "nmrlayoutmanager.h" -#include "cmrimage.h" - +// LOCAL DEFINITIONS // ======== MEMBER FUNCTIONS ======== @@ -49,9 +55,8 @@ // CESMRViewerLocationField::~CESMRViewerLocationField() { - iObserver = NULL; - delete iFieldIcon; - delete iRichTextViewer; + delete iFieldButton; + delete iWaypointIcon; delete iFeatures; } @@ -61,14 +66,19 @@ // TSize CESMRViewerLocationField::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(); + TRect parentRect( Parent()->Rect() ); + + TRect fieldRect = + NMRLayoutManager::GetFieldLayoutRect( parentRect, 1 ).Rect(); - // We will use as minimum size the parents width - // but the calculated iRichTextViewers height - return TSize( Parent()->Size().iWidth, richTextViewerRect.Height() ); + TRect viewerRect( NMRLayoutManager::GetLayoutText( + fieldRect, + NMRLayoutManager::EMRTextLayoutTextEditor ).TextRect() ); + + // Adjust field size so that there's room for expandable editor. + fieldRect.Resize( 0, iSize.iHeight - viewerRect.Height() ); + + return fieldRect.Size(); } @@ -79,17 +89,19 @@ void CESMRViewerLocationField::InitializeL() { // Setting Font for the rich text viewer - TAknLayoutText text = NMRLayoutManager::GetLayoutText( - Rect(), + TAknLayoutText text = NMRLayoutManager::GetLayoutText( + Rect(), NMRLayoutManager::EMRTextLayoutTextEditor ); - - iRichTextViewer->SetFontL( text.Font(), iLayout ); + + iRichTextViewer->SetFontL( text.Font() ); + iRichTextViewer->ApplyLayoutChangesL(); // This is called so that theme changes will apply when changing theme "on the fly" if ( IsFocused() ) { iRichTextViewer->FocusChanged( EDrawNow ); } + iRichTextViewer->SetEventQueue( iEventQueue ); } // --------------------------------------------------------------------------- @@ -99,19 +111,30 @@ void CESMRViewerLocationField::InternalizeL( MESMRCalEntry& aEntry ) { TPtrC text = aEntry.Entry().LocationL( ); - + // Hide this field if location is not set if( text.Length() == 0 ) { - iObserver->RemoveControl( FieldId() ); + iObserver->HideControl( FieldId() ); } else { iRichTextViewer->SetTextL( &text, ETrue ); - // After setting the text, the viewer line count is known - iLineCount = iRichTextViewer->LineCount(); } - iDisableRedraw = ETrue; + + // If the geo value has set, the waypoint icon has to be shown on right + // side of the location field + CCalGeoValue* geoValue = aEntry.Entry().GeoValueL(); + TReal dummy; + if( !iLocked ) + { + if( geoValue && geoValue->GetLatLong( dummy, dummy ) ) + { + iWaypointIcon = + CMRImage::NewL( NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); + iWaypointIcon->SetParent( this ); + } + } } // --------------------------------------------------------------------------- @@ -133,7 +156,7 @@ TEdwinSizeEvent /*aType*/, TSize aSize ) { TBool reDraw( EFalse ); - + // Let's save the required size for the iRichTextViewer iSize = aSize; @@ -153,6 +176,7 @@ CESMRViewerLocationField::CESMRViewerLocationField() { SetFieldId( EESMRFieldLocation ); + SetFocusType( EESMRHighlightFocus ); } // --------------------------------------------------------------------------- @@ -161,14 +185,16 @@ // void CESMRViewerLocationField::ConstructL( ) { - SetFocusType( EESMRHighlightFocus ); - - iFieldIcon = CMRImage::NewL( KAknsIIDQgnMeetReqIndiLocation ); - iFieldIcon->SetParent( this ); - + iFieldButton = CMRButton::NewL( NMRBitmapManager::EMRBitmapLocation ); + iFieldButton->SetParent( this ); + iFieldButton->SetObserver(this); + iRichTextViewer = CESMRRichTextViewer::NewL( this ); + CESMRField::ConstructL( iRichTextViewer ); // ownership transfered iRichTextViewer->SetEdwinSizeObserver( this ); iRichTextViewer->SetParent( this ); + + iFeatures = CESMRFeatureSettings::NewL(); } // --------------------------------------------------------------------------- @@ -184,24 +210,42 @@ // CESMRViewerLocationField::ExecuteGenericCommandL() // --------------------------------------------------------------------------- // -void CESMRViewerLocationField::ExecuteGenericCommandL( TInt aCommand ) +TBool CESMRViewerLocationField::ExecuteGenericCommandL( TInt aCommand ) { + TBool isUsed( EFalse ); switch ( aCommand ) { case EESMRCmdClipboardCopy: - { - iRichTextViewer->CopyCurrentLinkToClipBoardL(); - break; + { + iRichTextViewer->CopyCurrentLinkToClipBoardL(); + isUsed = ETrue; + break; } case EESMRCmdDisableWaypointIcon: case EESMRCmdEnableWaypointIcon: { SetWaypointIconL( aCommand == EESMRCmdEnableWaypointIcon ); + isUsed = ETrue; break; } case EAknSoftkeySelect: { iRichTextViewer->LinkSelectedL(); + isUsed = ETrue; + + break; + } + case EAknCmdOpen: + { + // Open command is handled only when field is locked + if ( IsLocked() ) + { + HandleTactileFeedbackL(); + + CESMRGlobalNote::ExecuteL( + CESMRGlobalNote::EESMRUnableToEdit ); + isUsed = ETrue; + } break; } default: @@ -209,6 +253,7 @@ break; } } + return isUsed; } // --------------------------------------------------------------------------- @@ -218,84 +263,35 @@ void CESMRViewerLocationField::SetOutlineFocusL( TBool aFocus ) { CESMRField::SetOutlineFocusL( aFocus ); - - iRichTextViewer->SetFocus( aFocus ); - if ( FeaturesL().FeatureSupported( - CESMRFeatureSettings::EESMRUILocationFeatures ) ) - { - - if ( aFocus ) - { - //Store MSK function before changing it - CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current(); - if ( cba->PositionById( EESMRCmdEdit ) == - CEikButtonGroupContainer::EMiddleSoftkeyPosition ) - { - iMskCommandId = EESMRCmdEdit; - - } - else if ( cba->PositionById( EESMRCmdEditLocal ) == - CEikButtonGroupContainer::EMiddleSoftkeyPosition ) - { - iMskCommandId = EESMRCmdEditLocal; - } - else if ( cba->PositionById( EESMRCmdCalEntryUIEdit ) == - CEikButtonGroupContainer::EMiddleSoftkeyPosition ) - { - iMskCommandId = EESMRCmdCalEntryUIEdit; - } - - ChangeMiddleSoftKeyL( EAknSoftkeyContextOptions, R_QTN_MSK_OPEN ); - } - else - { - switch ( iMskCommandId ) - { - case EESMRCmdEdit: - case EESMRCmdEditLocal: - case EESMRCmdCalEntryUIEdit: - { - ChangeMiddleSoftKeyL( iMskCommandId, R_QTN_MSK_EDIT ); - break; - } - default: - { - CEikButtonGroupContainer* cba = - CEikButtonGroupContainer::Current(); - cba->SetCommandL( - CEikButtonGroupContainer::EMiddleSoftkeyPosition, - R_MR_SELECT_SOFTKEY ); - cba->DrawNow(); - break; - } - } - - //need to tell action menu that focus has changed - iRichTextViewer->ResetActionMenuL(); - } - } + if ( aFocus ) + { + ChangeMiddleSoftKeyL( EAknSoftkeyContextOptions, R_QTN_MSK_OPEN ); + } + else + { + //need to tell action menu that focus has changed + iRichTextViewer->ResetActionMenuL(); + } } // --------------------------------------------------------------------------- -// CESMRViewerLocationField::FeaturesL() +// CESMRViewerLocationField::SetWaypointIconL // --------------------------------------------------------------------------- // -CESMRFeatureSettings& CESMRViewerLocationField::FeaturesL() +void CESMRViewerLocationField::SetWaypointIconL( TBool aEnabled ) { - if ( !iFeatures ) + delete iWaypointIcon; + iWaypointIcon = NULL; + + if ( aEnabled ) { - iFeatures = CESMRFeatureSettings::NewL(); + iWaypointIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLocationWaypoint, ETrue ); + iWaypointIcon->SetParent( this ); } - return *iFeatures; - } -// --------------------------------------------------------------------------- -// CESMRCheckbox::SetWaypointIconL -// --------------------------------------------------------------------------- -// -void CESMRViewerLocationField::SetWaypointIconL( TBool /*aEnabled*/ ) - { + // Relayout + SizeChanged(); } // --------------------------------------------------------------------------- @@ -305,7 +301,7 @@ TInt CESMRViewerLocationField::CountComponentControls() const { TInt count( 0 ); - if ( iFieldIcon ) + if ( iFieldButton ) { ++count; } @@ -314,6 +310,11 @@ { ++count; } + + if( iWaypointIcon ) + { + ++count; + } return count; } @@ -326,9 +327,11 @@ switch ( aIndex ) { case 0: - return iFieldIcon; + return iFieldButton; case 1: return iRichTextViewer; + case 2: + return iWaypointIcon; default: return NULL; } @@ -340,75 +343,242 @@ // void CESMRViewerLocationField::SizeChanged( ) { - TRect rect = Rect(); + TRect rect( Rect() ); + + TAknLayoutRect rowLayoutRect( + NMRLayoutManager::GetFieldRowLayoutRect( rect, 1 ) ); + TRect rowRect( rowLayoutRect.Rect() ); - // LAYOUTING FIELD ICON - if( iFieldIcon ) + // Layouting field icon + if( iFieldButton ) { - TAknWindowComponentLayout iconLayout = - NMRLayoutManager::GetWindowComponentLayout( NMRLayoutManager::EMRLayoutTextEditorIcon ); - AknLayoutUtils::LayoutImage( iFieldIcon, rect, iconLayout ); + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutSingleRowAColumnGraphic ) ); + AknLayoutUtils::LayoutControl( iFieldButton, rowRect, iconLayout ); + } + + // Layouting waypoint icon + if( iWaypointIcon ) + { + TAknWindowComponentLayout iconLayout( + NMRLayoutManager::GetWindowComponentLayout( + NMRLayoutManager::EMRLayoutSingleRowDColumnGraphic ) ); + AknLayoutUtils::LayoutImage( iWaypointIcon, rowRect, 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 + TAknLayoutText viewerLayoutText; + + if( iWaypointIcon ) + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutSingleRowEditorText ); + } + else + { + viewerLayoutText = NMRLayoutManager::GetLayoutText( rowRect, + NMRLayoutManager::EMRTextLayoutTextEditor ); + } + + // Layouting viewer field + 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( viewerRect ); + + // 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() ); - } + // Failures are ignored. + TRAP_IGNORE( + // Try setting font + iRichTextViewer->SetFontL( viewerLayoutText.Font() ); + // Try applying changes + iRichTextViewer->ApplyLayoutChangesL(); + ); } // --------------------------------------------------------------------------- // CESMRViewerLocationField::SetContainerWindowL // --------------------------------------------------------------------------- // -void CESMRViewerLocationField::SetContainerWindowL( const CCoeControl& aContainer ) +void CESMRViewerLocationField::SetContainerWindowL( + const CCoeControl& aContainer ) { CCoeControl::SetContainerWindowL( aContainer ); iRichTextViewer->SetContainerWindowL( aContainer ); + iRichTextViewer->SetParent( this ); + iFieldButton->SetContainerWindowL( aContainer ); + iFieldButton->SetParent( this ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::HandleLongtapEventL +// --------------------------------------------------------------------------- +// +void CESMRViewerLocationField::HandleLongtapEventL( + const TPoint& aPosition ) + { + if ( !iRichTextViewer->LinkSelectedL() ) + { + HandleTapEventL( aPosition ); + } + else + { + // Reset action menu after link selection + iRichTextViewer->ResetActionMenuL(); + } + } + +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CESMRViewerLocationField::DynInitMenuPaneL( + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + if ( aResourceId == R_MR_VIEWER_MENU || + aResourceId == R_MR_VIEWER_LOCATION_MENU ) + { + TBool showOnMap( EFalse ); + + if ( iWaypointIcon ) + { + showOnMap = ETrue; + } + + TBool searchFromMap = !showOnMap; + + if ( !iFeatures->FeatureSupported( + CESMRFeatureSettings::EESMRUIMnFwIntegration ) ) + { + // Maps disabled + showOnMap = EFalse; + searchFromMap = EFalse; + } + + aMenuPane->SetItemDimmed( EESMRCmdShowOnMap, !showOnMap ); + aMenuPane->SetItemDimmed( EESMRCmdSearchFromMap, !searchFromMap ); + } } // --------------------------------------------------------------------------- -// CESMRViewerLocationField::RichTextViewerRect +// CESMRViewerLocationField::LockL +// --------------------------------------------------------------------------- +// +void CESMRViewerLocationField::LockL() + { + FUNC_LOG; + if( IsLocked() ) + { + return; + } + + CESMRField::LockL(); + + delete iWaypointIcon; + iWaypointIcon = NULL; + iWaypointIcon = CMRImage::NewL( NMRBitmapManager::EMRBitmapLockField, ETrue ); + + iWaypointIcon->SetParent( this ); + iWaypointIcon->SetObserver( this ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::GetCursorLineVerticalPos +// --------------------------------------------------------------------------- +// +void CESMRViewerLocationField::GetCursorLineVerticalPos( + TInt& aUpper, TInt& aLower) + { + aLower = iRichTextViewer->CurrentLineNumber() * iRichTextViewer->RowHeight(); + aUpper = aLower - iRichTextViewer->RowHeight(); + } + +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::HandleControlEventL // --------------------------------------------------------------------------- // -TRect CESMRViewerLocationField::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 ) +void CESMRViewerLocationField::HandleControlEventL( + CCoeControl* aControl,TCoeEvent aEventType ) + { + if ( aControl == iFieldButton ) { - viewerRect.SetHeight( iSize.iHeight ); + if( iLocked ) + { + //if field is locked, iFieldButton can't be used. + return; + } + switch ( aEventType ) + { + // Button state changed (button was pressed) + case EEventRequestFocus: + { + // Clear viewer selection + iRichTextViewer->ClearSelectionL(); + iRichTextViewer->DrawDeferred(); + + // Show context menu + HandleTactileFeedbackL(); + NotifyEventL( EAknSoftkeyContextOptions ); + } + + default: + break; + } } - // 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; } +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::HandleSingletapEventL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerLocationField::HandleSingletapEventL( const TPoint& aPosition ) + { + return HandleTapEventL( aPosition ); + } + +// --------------------------------------------------------------------------- +// CESMRViewerLocationField::HandletapEventL +// --------------------------------------------------------------------------- +// +TBool CESMRViewerLocationField::HandleTapEventL( const TPoint& aPosition ) + { + TBool ret( EFalse ); + + if( iLocked ) + { + HandleTactileFeedbackL(); + + CESMRGlobalNote::ExecuteL( + CESMRGlobalNote::EESMRUnableToEdit ); + + // Field locked, let's consume the event + ret = ETrue; + } + else + { + // Button events are handled by HandleControlEvent. + // Tap on link is handled by rich text viewer. + if ( !iFieldButton->Rect().Contains( aPosition ) + && !iRichTextViewer->GetSelectedLink() ) + { + NotifyEventL( EAknSoftkeyContextOptions ); + + ret = ETrue; + + HandleTactileFeedbackL(); + } + } + + return ret; + } + //EOF