diff -r d189ee25cf9d -r 3533d4323edc meetingrequest/mrgui/src/cesmrview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/meetingrequest/mrgui/src/cesmrview.cpp Wed Sep 01 12:28:57 2010 +0100 @@ -0,0 +1,1250 @@ +/* +* 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: ESMR UI Container class +* +*/ + +#include "cesmrview.h" +#include "mesmrmeetingrequestentry.h" +#include "esmrinternaluid.h" +#include "cesmrtitlepane.h" +#include "cesmrfield.h" +#include "mesmrcalentry.h" +#include "nmrlayoutmanager.h" +#include "mesmrfieldstorage.h" +#include "FreestyleEmailUiConstants.h" +#include "cesmrcaldbmgr.h" +#include "mmrfocusstrategy.h" +#include "cmrnaviarrow.h" +#include "mesmrlistobserver.h" +#include "cmrtoolbar.h" +#include "cmrattachmentindicator.h" +#include "esmrdef.h" +#include "mesmrfieldevent.h" +#include "cesmrgenericfieldevent.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "emailtrace.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CESMRView::CESMRView() +// --------------------------------------------------------------------------- +// +CESMRView::CESMRView( MESMRFieldStorage* aStorage, + MESMRCalEntry& aEntry, + MMRFocusStrategy& aFocusStrategy, + MESMRNaviArrowEventObserver* aObserver, + CMRToolbar& aToolbar ) + : iStorage( aStorage ), + iEntry( &aEntry ), + iFocusStrategy( aFocusStrategy ), + iObserver( aObserver ), + iToolbar( aToolbar ) + { + FUNC_LOG; + // Do nothing + } + +// --------------------------------------------------------------------------- +// CESMRView::NewL() +// --------------------------------------------------------------------------- +// +CESMRView* CESMRView::NewL( + MESMRFieldStorage* aStorage, + MESMRCalEntry& aEntry, + const TRect& aRect, + MMRFocusStrategy& aFocusStrategy, + CMRToolbar& aToolbar, + MESMRNaviArrowEventObserver* aObserver ) + { + FUNC_LOG; + CESMRView* self = new (ELeave) CESMRView( + aStorage, aEntry, aFocusStrategy, aObserver, aToolbar ); + CleanupStack::PushL( self ); + self->ConstructL( aRect ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CESMRView::ConstructL() +// --------------------------------------------------------------------------- +// +void CESMRView::ConstructL( const TRect& aRect ) + { + FUNC_LOG; + CreateWindowL(); + SetRect( aRect ); + } + +// --------------------------------------------------------------------------- +// CESMRView::~CESMRView() +// --------------------------------------------------------------------------- +// +CESMRView::~CESMRView() + { + FUNC_LOG; + delete iListPane; + delete iBgContext; + delete iNaviArrowLeft; + delete iNaviArrowRight; + delete iScrollBar; + delete iStorage; + } + +// --------------------------------------------------------------------------- +// CESMRView::ExternalizeL() +// --------------------------------------------------------------------------- +// +void CESMRView::ExternalizeL( TBool aForceValidation ) + { + FUNC_LOG; + // externalize all fields: + iListPane->ExternalizeL( *iEntry, aForceValidation ); + } + +// --------------------------------------------------------------------------- +// CESMRView::InternalizeL() +// --------------------------------------------------------------------------- +// +void CESMRView::InternalizeL() + { + FUNC_LOG; + iListPane->DisableSizeChange( ETrue ); + // internalize all fields: + iListPane->InternalizeL( *iEntry ); + iListPane->DisableSizeChange( EFalse ); + iListPane->SizeChanged(); + } + +// --------------------------------------------------------------------------- +// CESMRView::IsControlVisible() +// --------------------------------------------------------------------------- +// +TBool CESMRView::IsControlVisible( TESMREntryFieldId aFieldId ) const + { + FUNC_LOG; + return iListPane->IsControlVisible( aFieldId ); + } + +// --------------------------------------------------------------------------- +// CESMRView::ProcessCommandL +// --------------------------------------------------------------------------- +// +void CESMRView::ProcessEditorCommandL( TInt aCommand ) + { + FUNC_LOG; + switch ( aCommand ) + { + case EESMRCmdPriorityHigh: // Fall through + case EESMRCmdPriorityNormal: // Fall through + case EESMRCmdPriorityLow: + { + CESMRField* field = iStorage->FieldById( EESMRFieldSubject ); + if ( field ) + { + field->ExecuteGenericCommandL( + aCommand ); + iListPane->SizeChanged(); + } + break; + } + case EESMRCmdAddOptAttendee: + { + iListPane->ShowControl( EESMRFieldOptAttendee ); + SetControlFocusedL( EESMRFieldOptAttendee ); + break; + } + case EAknCmdHelp: + { + break; + } + case EMRCmdHideAttachmentIndicator: + { + if ( iAttachmentIndicator ) + { + TInt pos = iControls.Find( iAttachmentIndicator ); + if (KErrNotFound != pos ) + { + iControls.Remove( pos ); + } + + delete iAttachmentIndicator; + iAttachmentIndicator = NULL; + + SizeChanged(); + } + } + break; + default://forward to fields + { + iListPane->FocusedField()->ExecuteGenericCommandL( aCommand ); + break; + } + } + } + +// --------------------------------------------------------------------------- +// CESMRView::LaunchEditorHelpL +// --------------------------------------------------------------------------- +// +void CESMRView::LaunchEditorHelpL() + { + FUNC_LOG; + + switch ( iEntry->Type() ) + { + case MESMRCalEntry::EESMRCalEntryTodo: + { + LaunchHelpL( KFSCA_HLP_TODO_EDITOR ); + break; + } + case MESMRCalEntry::EESMRCalEntryMemo: + { + LaunchHelpL( KFSCA_HLP_MEMO_EDITOR ); + break; + } + case MESMRCalEntry::EESMRCalEntryAnniversary: + { + LaunchHelpL( KFSCA_HLP_ANNIVERSARY_EDITOR ); + break; + } + case MESMRCalEntry::EESMRCalEntryMeeting: + { + LaunchHelpL( KFSCA_HLP_CALE_MEETING_EDITOR ); + break; + } + case MESMRCalEntry::EESMRCalEntryMeetingRequest: + { + LaunchHelpL( KMEET_REQ_HLP_EDITOR ); + break; + } + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through + default: + { + break; + } + } + + } + +// --------------------------------------------------------------------------- +// CESMRView::LaunchViewerHelpL +// --------------------------------------------------------------------------- +// +void CESMRView::LaunchViewerHelpL() + { + FUNC_LOG; + + + switch ( iEntry->Type() ) + { + case MESMRCalEntry::EESMRCalEntryTodo: + { + LaunchHelpL( KFSCA_HLP_TODO_VIEWER ); + break; + } + case MESMRCalEntry::EESMRCalEntryMemo: + { + LaunchHelpL( KFSCA_HLP_MEMO_VIEWER ); + break; + } + case MESMRCalEntry::EESMRCalEntryAnniversary: + { + LaunchHelpL( KFSCA_HLP_ANNI_VIEWER ); + break; + } + case MESMRCalEntry::EESMRCalEntryMeeting: + { + LaunchHelpL( KFSCA_HLP_CALE_MEETING_VIEWER ); + break; + } + case MESMRCalEntry::EESMRCalEntryMeetingRequest: + { + MESMRMeetingRequestEntry* mrEntry = + static_cast( iEntry ); + + if ( mrEntry->IsOpenedFromMail() ) + { + if ( CFeatureDiscovery::IsFeatureSupportedL( + TUid::Uid( KFeatureIdFfCalMeetingRequestUi ) ) ) + { + // Full functionality + LaunchHelpL( KFS_VIEWER_HLP_MEETING_REQ_VIEW ); + } + else + { + // Only viewer from Mail supported + LaunchHelpL( KFS_VIEWER_HLP_MR_RECEIVED ); + } + } + else if ( mrEntry->RoleL() == EESMRRoleOrganizer ) + { + LaunchHelpL( KFSCA_HLP_VIEWER_ORGANIZER ); + } + else + { + LaunchHelpL( KFSCA_HLP_VIEWER ); + } + break; + } + case MESMRCalEntry::EESMRCalEntryReminder: // Fall through + default: + { + break; + } + } + + } + +// --------------------------------------------------------------------------- +// CESMRView::IsComponentfocused +// --------------------------------------------------------------------------- +// +TBool CESMRView::IsComponentFocused( TESMREntryFieldId aField ) const + { + FUNC_LOG; + return FocusedField() == aField; + } + +// --------------------------------------------------------------------------- +// CESMRView::FocusedField +// --------------------------------------------------------------------------- +// +TESMREntryFieldId CESMRView::FocusedField() const + { + FUNC_LOG; + TESMREntryFieldId fieldId( ( TESMREntryFieldId ) 0 ); + + CESMRField* field = iListPane->FocusedField(); + + if ( field ) + { + fieldId = field->FieldId(); + } + + return fieldId; + } + +// --------------------------------------------------------------------------- +// CESMRView::ClickedOrFocusedField +// --------------------------------------------------------------------------- +// +TESMREntryFieldId CESMRView::ClickedOrFocusedField() const + { + FUNC_LOG; + TESMREntryFieldId fieldId( ( TESMREntryFieldId ) 0 ); + + // Get clicked item if exists + CESMRField* field = iListPane->ClickedField(); + + if ( field ) + { + fieldId = field->FieldId(); + } + // If doesn't, try getting focused item + else + { + field = iListPane->FocusedField(); + if( field ) + { + fieldId = FocusedField(); + } + } + + return fieldId; + } + +// --------------------------------------------------------------------------- +// CESMRView::AdjustViewL +// --------------------------------------------------------------------------- +// +void CESMRView::AdjustViewL( + MESMRCalEntry* aNewEntry, + const CESMRPolicy& aNewPolicy ) + { + iStorage->ChangePolicyL( aNewPolicy,*aNewEntry ); + iEntry = aNewEntry; + iListPane->InitializeL(); + iListPane->ReActivateL(); + InternalizeL(); + SetControlFocusedL( EESMRFieldUnifiedEditor ); + SetTitlePaneObserver(); + DrawDeferred(); + } + +// --------------------------------------------------------------------------- +// CESMRView::LaunchHelpL +// --------------------------------------------------------------------------- +// +void CESMRView::LaunchHelpL( const TDesC& aContext ) + { + FUNC_LOG; + + CArrayFix* cntx = + new (ELeave) CArrayFixFlat(1); + CleanupStack::PushL(cntx); + cntx->AppendL( TCoeHelpContext( KFSEmailUiUid, aContext ) ); + CleanupStack::Pop(cntx); + HlpLauncher::LaunchHelpApplicationL( iCoeEnv->WsSession(), cntx ); + } + + +// --------------------------------------------------------------------------- +// CESMRView::SetTitlePaneObserver +// --------------------------------------------------------------------------- +// +void CESMRView::SetTitlePaneObserver() + { + CESMRField* field = NULL; + TInt fieldCount( iStorage->Count() ); + for ( TInt i(0); i < fieldCount; ++i ) + { + field = iStorage->Field( i ); + TESMREntryFieldId fieldId( field->FieldId() ); + + switch( fieldId ) + { + case EESMRFieldSubject: //Fall through + case EESMRFieldOccasion://Fall through + case EESMRFieldPriority://Fall through + case EESMRFieldDetailedSubject: + { + field->SetTitlePaneObserver( this ); + break; + } + default: + break; + } + } + } + +// --------------------------------------------------------------------------- +// CESMRView::UpdateTitlePaneTextL +// --------------------------------------------------------------------------- +// +void CESMRView::UpdateTitlePaneTextL( const TDesC& aText ) + { + FUNC_LOG; + SetTitleL( aText ); + } + +// --------------------------------------------------------------------------- +// CESMRView::HandleScrollEventL +// --------------------------------------------------------------------------- +// +void CESMRView::HandleScrollEventL( + CEikScrollBar* aScrollBar, + TEikScrollEvent aEventType ) + { + FUNC_LOG; + + if ( !aScrollBar ) + { + return; + } + + TInt newPosition = aScrollBar->ThumbPosition(); + + switch( aEventType ) + { + case EEikScrollThumbDragVert: // Drag started + case EEikScrollThumbReleaseVert: // Drag released + { + if( newPosition < iScrollBarThumbPosition ) + { + iListPane->ScrollFieldsDown( + iScrollBarThumbPosition - newPosition ); + + iScrollBarThumbPosition = newPosition; + } + + else if( newPosition > iScrollBarThumbPosition ) + { + iListPane->ScrollFieldsUp( + newPosition - iScrollBarThumbPosition ); + + iScrollBarThumbPosition = newPosition; + } + break; + } + case EEikScrollPageUp: + { + if( newPosition < iScrollBarThumbPosition ) + { + iListPane->ScrollFieldsDown( + iScrollBarThumbPosition - newPosition ); + + iScrollBarThumbPosition = newPosition; + } + break; + } + case EEikScrollPageDown: + { + if( newPosition > iScrollBarThumbPosition ) + { + iListPane->ScrollFieldsUp( + newPosition - iScrollBarThumbPosition ); + + iScrollBarThumbPosition = newPosition; + } + break; + } + default: + { + break; + } + } + + DrawNow(); + } + +// --------------------------------------------------------------------------- +// CESMRView::ScrollBarPositionChanged() +// --------------------------------------------------------------------------- +// +void CESMRView::ScrollBarPositionChanged( TInt aThumbPosition ) + { + FUNC_LOG; + iScrollBarThumbPosition = aThumbPosition; + } + +// --------------------------------------------------------------------------- +// CESMRView::SetContainerWindowL +// --------------------------------------------------------------------------- +// +void CESMRView::SetContainerWindowL( const CCoeControl& aContainer ) + { + FUNC_LOG; + CCoeControl::SetContainerWindowL( aContainer ); + + /** + * Somehow if list is constructed before this SetContainerWindowL is called, + * all redraws throws KERN-EXEC 3 (the CCoeControl's iWin variable is NULL) + */ + + iScrollBar = new (ELeave) CAknDoubleSpanScrollBar( this ); + iScrollBar->ConstructL( EFalse, this, this, CEikScrollBar::EVertical, 0 ); + iScrollBar->SetModel( &iScrollBarModel ); + iScrollBar->MakeVisible( ETrue ); + + iControls.AppendL( iScrollBar ); + + iListPane = CMRListPane::NewL( + *this, + *iStorage, + iScrollBarModel, + *iScrollBar, + *this ); + + iControls.AppendL( iListPane ); + + iListPane->SetBackground( this ); + + iBgContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMain, Rect(), ETrue ); + + if( iEntry ) + { + MESMRCalDbMgr& dbMgr = iEntry->GetDBMgr(); + dbMgr.SetCurCalendarByEntryL( *iEntry ); + } + + // Physics: enable needed pointer events + EnableDragEvents(); + ClaimPointerGrab(); + + // Initialize the focus + iFocusStrategy.InitializeFocus(); + + if( iEntry->Type() == MESMRCalEntry::EESMRCalEntryMeetingRequest ) + { + // Static cast is safe here. We know for sure that entry is MR + MESMRMeetingRequestEntry* mrEntry = + static_cast( iEntry ); + if ( mrEntry->IsOpenedFromMail() ) + { + TAknLayoutRect naviArrowRightLayoutRect = + NMRLayoutManager::GetLayoutRect( Rect(), + NMRLayoutManager::EMRLayoutMRNaviArrowRight ); + TRect naviArrowRect( naviArrowRightLayoutRect.Rect() ); + + iNaviArrowLeft = CMRNaviArrow::NewL( + this, + CMRNaviArrow::EMRArrowLeft, + iObserver, + naviArrowRect.Size() ); + + iNaviArrowRight = CMRNaviArrow::NewL( + this, + CMRNaviArrow::EMRArrowRight, + iObserver, + naviArrowRect.Size() ); + + iControls.AppendL( iNaviArrowLeft ); + iControls.AppendL( iNaviArrowRight ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRView::CountComponentControls +// --------------------------------------------------------------------------- +// +TInt CESMRView::CountComponentControls() const + { + FUNC_LOG; + return iControls.Count(); + } + +// --------------------------------------------------------------------------- +// CESMRView::ComponentControl() +// --------------------------------------------------------------------------- +// +CCoeControl* CESMRView::ComponentControl( TInt aInd ) const + { + FUNC_LOG; + return iControls[aInd]; + } + +// --------------------------------------------------------------------------- +// CESMRView::SizeChanged() +// --------------------------------------------------------------------------- +// +void CESMRView::SizeChanged() + { + FUNC_LOG; + + // If list pane is not yet constructed, no point in layouting anything + if( !iListPane ) + { + return; + } + + // Remove possible intersection with toolbar from container rect + TRect containerRect( ContainerRect() ); + + // Now toolbar does not intersect with view, so it must not be taken + // into account when calculating other component layouts. + containerRect.SetRect( TPoint( 0, 0 ), containerRect.Size() ); + + // Get the rect of stripe. + TAknLayoutRect stripeLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutStripe ); + iStripeRect = stripeLayoutRect.Rect(); + + // Layouting listpane, scroll bar and navi arrows in landscape mode + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + TAknLayoutRect listareaLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutListArea ); + TRect listareaRect( listareaLayoutRect.Rect() ); + + // List panes default rect needs to be modified due to + // scrollbar and calendar indication stripe + + if ( AknLayoutUtils::LayoutMirrored() ) + { + // Remove stripe width from list pane width when align is R to L + listareaRect.iBr.iX -= iStripeRect.Width(); + } + else + { + // Remove stripe width from list pane width when align is L to R + listareaRect.iTl.iX += iStripeRect.Width(); + } + + if( iScrollBar ) + { + TAknLayoutRect scrollareaLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutScrollBar ); + TRect scrollareaRect( scrollareaLayoutRect.Rect() ); + // Scroll bar's height is always the same as listpane's height + scrollareaRect.SetHeight( listareaRect.Height() ); + + iScrollBar->SetRect( scrollareaRect ); + } + + iListPane->SetRect( listareaRect ); + + // Make sure, that stripe height is the list pane height + iStripeRect.SetHeight( iListPane->Rect().Height() ); + + if(iViewMode == EESMRViewMR) + { + if( iNaviArrowLeft ) + { + TAknLayoutRect naviArrowLeftLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowLeft ); + TRect naviArrowLeftRect( naviArrowLeftLayoutRect.Rect() ); + + // Left arrow needs to be moved right the amount of + // stripe width in landscape + naviArrowLeftRect.Move( iStripeRect.Width(), 0 ); + + iNaviArrowLeft->SetRect( naviArrowLeftRect ); + } + + if( iNaviArrowRight ) + { + TAknLayoutRect naviArrowRightLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowRight ); + TRect naviArrowRightRect( naviArrowRightLayoutRect.Rect() ); + + // Right arrow needs to be moved left the amount of + // possible toolbar width in landscape + TInt scrollWidth( 0 ); + if( iScrollBar ) + { + scrollWidth = iScrollBar->Rect().Width(); + } + + naviArrowRightRect.Move( scrollWidth, 0 ); + + iNaviArrowRight->SetRect( naviArrowRightRect ); + } + } + else + { + SetNaviArrowStatus( EFalse, EFalse ); + } + } + + // Layouting listpane, scroll bar and navi arrows in portrait mode + else + { + TAknLayoutRect listareaLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutListArea ); + TRect listareaRect( listareaLayoutRect.Rect() ); + + if ( AknLayoutUtils::LayoutMirrored() ) + { + // Remove stripe width from list pane width when align is R to L + listareaRect.iBr.iX -= iStripeRect.Width(); + } + else + { + // Remove stripe width from list pane width when align is L to R + listareaRect.iTl.iX += iStripeRect.Width(); + } + + iListPane->SetRect( listareaRect ); + + if( iScrollBar ) + { + TAknLayoutRect scrollareaLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutScrollBar ); + TRect scrollareaRect( scrollareaLayoutRect.Rect() ); + // Scroll bar's height is always the same as listpane's height + scrollareaRect.SetHeight( iListPane->Rect().Height() ); + iScrollBar->SetRect( scrollareaRect ); + } + + // Make sure, that stripe height is the list pane height + iStripeRect.SetHeight( iListPane->Rect().Height() ); + + if(iViewMode == EESMRViewMR) + { + if( iNaviArrowLeft ) + { + TAknLayoutRect naviArrowLeftLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowLeft ); + TRect naviArrowLeftRect( naviArrowLeftLayoutRect.Rect() ); + + // Left arrow needs to be moved right the amount of + // stripe width in portrait + naviArrowLeftRect.Move( iStripeRect.Width(), 0 ); + + iNaviArrowLeft->SetRect( naviArrowLeftRect ); + } + + if( iNaviArrowRight ) + { + TAknLayoutRect naviArrowRightLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowRight ); + TRect naviArrowRightRect( naviArrowRightLayoutRect.Rect() ); + + // Right arrow needs to be moved right the amount of + // stripe width in portrait + naviArrowRightRect.Move( iStripeRect.Width(), 0 ); + + iNaviArrowRight->SetRect( naviArrowRightRect ); + } + } + else + { + SetNaviArrowStatus( EFalse, EFalse ); + } + } + + if ( iAttachmentIndicator ) + { + iAttachmentIndicator->SetRect( + CalculateAttachmentIndicatorLayout() ); + } + + if( iBgContext ) + { + iBgContext->SetRect( containerRect ); + if ( &Window() ) + { + iBgContext->SetParentPos( PositionRelativeToScreen() ); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRView::MinimumSize() +// Gets the main pane size needed by CEikDialog to layout itself correctly +// --------------------------------------------------------------------------- +// +TSize CESMRView::MinimumSize() + { + FUNC_LOG; + TRect rect; + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, rect ); + return rect.Size(); + } + +// --------------------------------------------------------------------------- +// CESMRView::OfferKeyEventL +// --------------------------------------------------------------------------- +// +TKeyResponse CESMRView::OfferKeyEventL( + const TKeyEvent &aKeyEvent, + TEventCode aType) + { + FUNC_LOG; + TKeyResponse response( EKeyWasNotConsumed ); + if ( iListPane ) + { + // Use focus strategy + iFocusStrategy.EventOccured( MMRFocusStrategy::EFocusKeyEvent ); + + TBool forwardEvent( ETrue ); + // Remove Delete hw key command if the focus is not visible + if ( !iFocusStrategy.IsFocusVisible() ) + { + if ( aType == EEventKey && aKeyEvent.iCode == EKeyBackspace ) + { + forwardEvent = EFalse; + } + } + + if ( forwardEvent ) + { + response = iListPane->OfferKeyEventL( aKeyEvent, aType ); + iListPane->DrawDeferred(); + } + } + return response; + } + + +// --------------------------------------------------------------------------- +// CESMRView::Draw +// This Draw is called when background for title pane (iTitle) is drawn +// --------------------------------------------------------------------------- +// +void CESMRView::Draw( const TRect& aRect ) const + { + FUNC_LOG; + CWindowGc& gc = SystemGc(); + + // Draw the background for iTitle using the current skin + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc, this, gc, aRect ); + + // Draw color stripe + MESMRCalDbMgr& DbMgr = iEntry->GetDBMgr(); + + TRgb stripeColor = DbMgr.GetCurCalendarColor(); + gc.SetBrushStyle( CGraphicsContext::ESolidBrush ); + gc.SetBrushColor( stripeColor ); + gc.DrawRect( iStripeRect ); + + gc.Reset(); + } + +// --------------------------------------------------------------------------- +// CESMRView::Draw +// This draw method draws the dialog area +// --------------------------------------------------------------------------- +// +void CESMRView::Draw( + CWindowGc& /* aGc */, + const CCoeControl& aControl, + const TRect& /*aRect*/) const + { + FUNC_LOG; + CWindowGc& gc = SystemGc(); + + // Draw the background for aControl using the current skin + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + MAknsControlContext* cc = AknsDrawUtils::ControlContext( this ); + AknsDrawUtils::Background( skin, cc, &aControl, gc, aControl.Rect() ); + } + +// --------------------------------------------------------------------------- +// CESMRView::GetTextDrawer +// --------------------------------------------------------------------------- +// +void CESMRView::GetTextDrawer( + CCoeTextDrawerBase*& /*aText*/, + const CCoeControl* /*aControl*/) const + { + // Do nothing + } + +// --------------------------------------------------------------------------- +// CESMRView::SetTitleL() +// --------------------------------------------------------------------------- +// +void CESMRView::SetTitleL( const TDesC& /*aTitle*/, TBool /*aDefault*/) + { + FUNC_LOG; + } + +// --------------------------------------------------------------------------- +// CESMRView::SetControlFocusedL() +// --------------------------------------------------------------------------- +// +void CESMRView::SetControlFocusedL( TESMREntryFieldId aField ) + { + FUNC_LOG; + iListPane->SetControlFocusedL( aField ); + } + +// --------------------------------------------------------------------------- +// CESMRView::HandleResourceChange() +// --------------------------------------------------------------------------- +// +void CESMRView::HandleResourceChange( TInt aType ) + { + FUNC_LOG; + CCoeControl::HandleResourceChange( aType ); + TInt error = KErrNone; + TBool record = ETrue; + + switch ( aType ) + { + case KAknsMessageSkinChange: + { + TRAP( error, iListPane->InitializeL() ); + break; + } + case KEikMessageColorSchemeChange: + { + TRAP( error, iListPane->InitializeL() ); + break; + } + case KEikDynamicLayoutVariantSwitch: + case KAknLocalZoomLayoutSwitch: + { + SizeChanged(); + break; + } + default: + { + record = EFalse; + break; + } + } + + if ( error != KErrNone ) + { + record = EFalse; + iCoeEnv->HandleError( error ); + } + + if ( record ) + { + iListPane->RecordFields(); + } + } + +// --------------------------------------------------------------------------- +// CESMRView::MopSupplyObject() +// --------------------------------------------------------------------------- +// +TTypeUid::Ptr CESMRView::MopSupplyObject( TTypeUid aId ) + { + FUNC_LOG; + if ( iBgContext ) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + return CCoeControl::MopSupplyObject( aId ); + } + +// ----------------------------------------------------------------------------- + // CESMRView::HandlePointerEventL() + // ----------------------------------------------------------------------------- + // + void CESMRView::HandlePointerEventL( + const TPointerEvent &aPointerEvent ) + { + FUNC_LOG; + // Call focus strategy + iFocusStrategy.EventOccured( MMRFocusStrategy::EFocusPointerEvent ); + + CCoeControl::HandlePointerEventL( aPointerEvent ); + } + +// --------------------------------------------------------------------------- +// CESMRView::InitialScroll() +// --------------------------------------------------------------------------- +// +void CESMRView::InitialScrollL() + { + FUNC_LOG; + iListPane->InitialScrollL(); + } + +// --------------------------------------------------------------------------- +// CESMRView::DynInitMenuPaneL +// --------------------------------------------------------------------------- +// +void CESMRView::DynInitMenuPaneL( + TMRMenuStyle aMenuStyle, + TInt aResourceId, + CEikMenuPane* aMenuPane ) + { + FUNC_LOG; + // Initialize field specific options in context menu and options menu. + // Options menu has field specific options only when focus is visible. + if ( aMenuStyle != EMROptionsMenu + || ( aMenuStyle == EMROptionsMenu + && iFocusStrategy.IsFocusVisible() ) ) + { + CESMRField* field = iStorage->FieldById( ClickedOrFocusedField() ); + field->DynInitMenuPaneL( aResourceId, aMenuPane ); + } + } + +// --------------------------------------------------------------------------- +// CESMRView::SetNaviArrowStatus +// --------------------------------------------------------------------------- +// +void CESMRView::SetNaviArrowStatus( + TBool aLeftArrowVisible, + TBool aRightArrowVisible ) + { + FUNC_LOG; + if ( iNaviArrowLeft ) + { + iNaviArrowLeft->SetNaviArrowStatus( aLeftArrowVisible ); + } + if ( iNaviArrowRight ) + { + iNaviArrowRight->SetNaviArrowStatus( aRightArrowVisible ); + } + } +// --------------------------------------------------------------------------- +// CESMRView::SetViewMode +// --------------------------------------------------------------------------- +// +void CESMRView::SetViewMode(TESMRViewMode aMode) + { + FUNC_LOG; + iViewMode = aMode; + } +// --------------------------------------------------------------------------- +// CESMRView::GetViewMode +// --------------------------------------------------------------------------- +// +TESMRViewMode CESMRView::GetViewMode() + { + FUNC_LOG; + return iViewMode; + } + +// --------------------------------------------------------------------------- +// CESMRView::ProcessEventL +// --------------------------------------------------------------------------- +// +void CESMRView::ProcessEventL( const MESMRFieldEvent& aEvent ) + { + FUNC_LOG; + + if ( MESMRFieldEvent::EESMRFieldChangeEvent == aEvent.Type() ) + { + TInt* fieldId = static_cast< TInt* >( aEvent.Param( 0 ) ); + + if ( EESMRFieldViewerAttachments == *fieldId ) + { + if ( !iAttachmentIndicator ) + { + TRect attachmentDownloadIndicatorRect( + CalculateAttachmentIndicatorLayout() ); + + iAttachmentIndicator = CMRAttachmentIndicator::NewL( + attachmentDownloadIndicatorRect, + this ); + + CFbsBitmap* bitMap( NULL ); + CFbsBitmap* bitMapMask( NULL ); + TSize size( 0,0 ); + NMRBitmapManager::GetSkinBasedBitmapLC( + NMRBitmapManager::EMRBitmapDownloadAttachment, + bitMap, bitMapMask, size ); + + CleanupStack::Pop( 2 ); // bitMap, bitMapMask + + + + iAttachmentIndicator->SetImage( bitMap, bitMapMask ); + iControls.AppendL( iAttachmentIndicator ); + } + + MESMRFieldEventValue* value = + static_cast< MESMRFieldEventValue* >( aEvent.Param( 1 ) ); + + iAttachmentIndicator->SetTextL( value->StringValue() ); + iAttachmentIndicator->MakeVisible( ETrue ); + + SizeChanged(); + } + } + } + +// --------------------------------------------------------------------------- +// CESMRView::CalculateAttachmentIndicatorLayout +// --------------------------------------------------------------------------- +// +TRect CESMRView::CalculateAttachmentIndicatorLayout() + { + TRect containerRect( ContainerRect() ); + + + TAknLayoutRect naviArrowLeftLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowLeft ); + TRect naviArrowLeftRect = naviArrowLeftLayoutRect.Rect(); + + TAknLayoutRect naviArrowRightLayoutRect = + NMRLayoutManager::GetLayoutRect( containerRect, + NMRLayoutManager::EMRLayoutMRNaviArrowRight ); + TRect naviArrowRightRect = naviArrowRightLayoutRect.Rect(); + //Exchange the narrows' rect when LayoutMirrored + if ( AknLayoutUtils::LayoutMirrored() ) + { + naviArrowLeftRect = naviArrowRightLayoutRect.Rect(); + naviArrowRightRect= naviArrowLeftLayoutRect.Rect(); + } + + if( Layout_Meta_Data::IsLandscapeOrientation() ) + { + naviArrowLeftRect.Move( iStripeRect.Width(), 0 ); + + TInt scrollWidth( 0 ); + if( iScrollBar ) + { + scrollWidth = iScrollBar->Rect().Width(); + } + + naviArrowRightRect.Move( scrollWidth, 0 ); + } + else + { + // Left arrow needs to be moved right the amount of + // stripe width in portrait + naviArrowLeftRect.Move( iStripeRect.Width(), 0 ); + + TRect naviArrowRightRect = naviArrowRightLayoutRect.Rect(); + + naviArrowRightRect.Move( iStripeRect.Width(), 0 ); + } + + // Get height for one row + TAknLayoutRect rowLayout = + NMRLayoutManager::GetLayoutRect( + containerRect, NMRLayoutManager::EMRLayoutTextEditorIcon ); + TRect rowRect( rowLayout.Rect() ); + + TRect attachmentIndicatorRect; + + attachmentIndicatorRect.iTl = + TPoint( naviArrowLeftRect.iBr.iX, + naviArrowLeftRect.iBr.iY - naviArrowLeftRect.Height() ); + + attachmentIndicatorRect.iBr = + TPoint( naviArrowRightRect.iTl.iX, + naviArrowLeftRect.iBr.iY ); + + return attachmentIndicatorRect; + } + +// --------------------------------------------------------------------------- +// CESMRView::ContainerRect +// --------------------------------------------------------------------------- +// +TRect CESMRView::ContainerRect() const + { + // Remove possible intersection with toolbar from container rect + TRect containerRect( PositionRelativeToScreen(), Rect().Size() ); + TRect toolbar( iToolbar.Rect() ); + if ( containerRect.Intersects( toolbar ) ) + { + toolbar.Intersection( containerRect ); + if ( Layout_Meta_Data::IsLandscapeOrientation() ) + { + containerRect.SetWidth( containerRect.Width() - toolbar.Width() ); + } + else + { + containerRect.SetHeight( containerRect.Height() - toolbar.Height() ); + } + } + // Now toolbar does not intersect with view, so it must not be taken + // into account when calculating other component layouts. + containerRect.SetRect( TPoint( 0, 0 ), containerRect.Size() ); + + return containerRect; + } + +// EOF