--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrgui/src/cesmrlistcomponent.cpp Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,610 @@
+/*
+* 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 policy implementation
+*
+*/
+
+#include "emailtrace.h"
+#include <caltime.h>
+#include <calentry.h>
+#include <layoutmetadata.cdl.h>
+#include <e32math.h>
+#include <aknphysics.h>
+
+#include "cesmrlistcomponent.h"
+#include "cesmrlayoutmgr.h"
+#include "nmrlayoutmanager.h"
+#include "mesmrfieldstorage.h"
+#include "mesmrcalentry.h"
+#include "cesmrfield.h"
+#include "cmrlistpane.h"
+// <cmail> Removed profiling. </cmail>
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::NewL()
+// ---------------------------------------------------------------------------
+//
+CESMRListComponent* CESMRListComponent::NewL( const CCoeControl* aParent,
+ MESMRFieldStorage* aStorage,
+ CESMRLayoutManager* aLayout )
+ {
+ FUNC_LOG;
+ CESMRListComponent* self = new (ELeave) CESMRListComponent( aStorage,
+ aLayout );
+ CleanupStack::PushL( self );
+ self->ConstructL( aParent );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::CESMRListComponent()
+// ---------------------------------------------------------------------------
+//
+CESMRListComponent::CESMRListComponent( MESMRFieldStorage* aFactory,
+ CESMRLayoutManager* aLayout ) :
+ iFactory( aFactory ),
+ iLayout( aLayout )
+ {
+ FUNC_LOG;
+ // Do nothing
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::~CESMRListComponent
+// ---------------------------------------------------------------------------
+//
+CESMRListComponent::~CESMRListComponent()
+ {
+ FUNC_LOG;
+ delete iFactory;
+ delete iScroll;
+ delete iContainer;
+
+ delete iPhysics;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ConstructL()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::ConstructL( const CCoeControl* aParent )
+ {
+ FUNC_LOG;
+ CreateWindowL( aParent );
+
+ iScroll = new (ELeave) CAknDoubleSpanScrollBar( this );
+ iScroll->ConstructL( EFalse, this, this, CEikScrollBar::EVertical, 0 );
+ iScroll->SetModel( &iScrollModel );
+ iScroll->MakeVisible( ETrue );
+
+ const TInt count(iFactory->Count());
+ for ( TInt i = 0; i < count; i++ )
+ {
+ CESMRField* field = iFactory->Field(i);
+
+ field->SetListObserver( this );
+ field->SetLayoutManager( iLayout );
+ }
+
+ iContainer = CMRListPane::NewL( *this, *iFactory, iScrollModel );
+ iPrevThumbPos = iScroll->ThumbPosition();
+
+ if ( CAknPhysics::FeatureEnabled() )
+ {
+ iPhysics = CAknPhysics::NewL( *this, iContainer );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::InternalizeL()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::InitializeL()
+ {
+ FUNC_LOG;
+ const TInt count(iFactory->Count());
+ for ( TInt i = 0; i < count; i++ )
+ {
+ iFactory->Field(i)->InitializeL();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::InternalizeL()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::InternalizeL( MESMRCalEntry& aEntry )
+ {
+ FUNC_LOG;
+ iFactory->InternalizeL( aEntry );
+ // This is called to make sure everything is drawn correctly
+ DrawDeferred();
+ }
+
+void CESMRListComponent::DisableSizeChange(TBool aDisable )
+ {
+ FUNC_LOG;
+ iDisableSizeChanged = aDisable;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ExternalizeL()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::ExternalizeL(
+ MESMRCalEntry& aEntry,
+ TBool aForceValidation )
+ {
+ FUNC_LOG;
+ CESMRField* currentFocus = FocusedItem();
+ ASSERT( currentFocus );
+ TESMREntryFieldId id = currentFocus->FieldId();
+
+ if ( aForceValidation )
+ {
+ // force validate the values:
+ TInt err = iFactory->Validate( id, aForceValidation );
+ // fill the calendar entry with data in fields.
+ iFactory->ExternalizeL( aEntry );
+ }
+ else
+ {
+ TInt err = iFactory->Validate( id );
+ if ( err )
+ {
+ SetControlFocusedL( id );
+ User::Leave( err );
+ }
+ else
+ {
+ // fill the calendar entry with data in fields.
+ iFactory->ExternalizeL( aEntry );
+ }
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::CountComponentControls()
+// ---------------------------------------------------------------------------
+//
+TInt CESMRListComponent::CountComponentControls() const
+ {
+ FUNC_LOG;
+ return 2;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::HandleFontChange()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::HandleFontChange()
+ {
+ FUNC_LOG;
+ // Disable SizeChanged handling until all fonts are updated
+ iDisableSizeChanged = ETrue;
+ const TInt count(iFactory->Count());
+ for ( TInt i = 0; i < count; i++ )
+ {
+ // Updates Font depending on the type of a field
+ TRAP_IGNORE( iFactory->Field(i)->FontChangedL() );
+ }
+ // Enable and call SizeChanged
+ iDisableSizeChanged = EFalse;
+ SizeChanged();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ComponentControl()
+// ---------------------------------------------------------------------------
+//
+CCoeControl* CESMRListComponent::ComponentControl( TInt aInd ) const
+ {
+ FUNC_LOG;
+ CCoeControl* control = NULL;
+ switch ( aInd )
+ {
+ case 0:
+ control = iContainer;
+ break;
+ case 1:
+ control = iScroll;
+ break;
+ default:
+ break;
+ }
+ return control;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::SizeChanged
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::SizeChanged()
+ {
+ FUNC_LOG;
+ if ( iDisableSizeChanged || Rect() == TRect( 0, 0, 0, 0 ) )
+ {
+ return;
+ }
+
+ TRect containerRect( Rect() );
+
+ TAknLayoutRect listareaLayoutRect =
+ NMRLayoutManager::GetLayoutRect( containerRect, NMRLayoutManager::EMRLayoutListArea );
+ TRect listareaRect( listareaLayoutRect.Rect() );
+ iContainer->SetRect( listareaRect );
+
+ TAknWindowComponentLayout scrollLayout =
+ NMRLayoutManager::GetWindowComponentLayout( NMRLayoutManager::EMRLayoutScrollBar );
+ AknLayoutUtils::LayoutControl( iScroll, containerRect, scrollLayout );
+
+ ScrollItemVisible( KErrNotFound ); // Update scroll position
+
+ // physics needs to be initialized before screensaver gets activated
+ TRAP_IGNORE( UpdatePhysicsL() );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::OfferKeyEventL
+// ---------------------------------------------------------------------------
+//
+TKeyResponse CESMRListComponent::OfferKeyEventL(
+ const TKeyEvent &aEvent,
+ TEventCode aType )
+ {
+ FUNC_LOG;
+ TKeyResponse response = iContainer->OfferKeyEventL( aEvent, aType );
+
+ if ( EKeyWasConsumed == response )
+ {
+ iScroll->SetModel( &iScrollModel );
+ }
+
+ TInt thumbPos = iScroll->ThumbPosition();
+ iPrevThumbPos = thumbPos;
+
+ if( iPhysics )
+ {
+ iPhysics->StopPhysics();
+ iPhysics->ResetFriction();
+ }
+
+ return response;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::HandleScrollEventL
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::HandleScrollEventL(
+ CEikScrollBar* aScrollBar,
+ TEikScrollEvent /*aEventType*/ )
+ {
+ FUNC_LOG;
+ if ( aScrollBar == iScroll )
+ {
+ TInt thumbPos = aScrollBar->ThumbPosition();
+ TInt delta = thumbPos - iPrevThumbPos;
+ if ( delta != 0 )
+ {
+ iPrevThumbPos = thumbPos;
+ iContainer->ScrollView( delta );
+ }
+ }
+ if( iPhysics )
+ {
+ iPhysics->StopPhysics();
+ iPhysics->ResetFriction();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::UpdatePhysicsL
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::UpdatePhysicsL()
+ {
+ FUNC_LOG;
+ if ( iPhysics )
+ {
+ const TSize viewSize( Size() );
+ TInt wSize = iScrollModel.ScrollSpan();
+ const TSize worldSize( viewSize.iWidth, wSize );
+
+
+ iPhysics->StopPhysics();
+ iPhysics->ResetFriction();
+ iPhysics->InitPhysicsL( worldSize, viewSize, EFalse );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ViewPositionChanged
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::ViewPositionChanged(
+ const TPoint& aNewPosition,
+ TBool /*aDrawNow*/,
+ TUint /*aFlags*/ )
+ {
+ // Sometimes ViewPositionChanged events come after view is already changed,
+ // so adding a safety check here
+ if( IsVisible() )
+ {
+ TPoint centerPos = iContainer->GetViewCenterPosition();
+ TInt scrollOffset = aNewPosition.iY - centerPos.iY;
+
+ iContainer->ScrollView( scrollOffset );
+ iPrevThumbPos = iScroll->ThumbPosition();
+ // updates scrollbar thumb position and does redrawing
+ iScroll->SetModel( &iScrollModel );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::PhysicEmulationEnded
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::PhysicEmulationEnded()
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ViewPosition
+// ---------------------------------------------------------------------------
+//
+TPoint CESMRListComponent::ViewPosition() const
+ {
+ TPoint viewPos = iContainer->GetViewCenterPosition();
+ return viewPos;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ScrollItemVisible()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::ScrollItemVisible( TInt aInd/*, TBool*/ /*aSizeChanged*/ )
+ {
+ FUNC_LOG;
+ iContainer->ScrollItemVisible( aInd );
+ UpdateScrollBar();
+ DrawDeferred();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::UpdateScrollBar()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::UpdateScrollBar()
+ {
+ FUNC_LOG;
+ iContainer->UpdateFocusPosition();
+ iScroll->SetModel( &iScrollModel );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ListObserver
+// ---------------------------------------------------------------------------
+//
+MESMRListObserver& CESMRListComponent::ListObserver()
+ {
+ FUNC_LOG;
+ return *this;
+ }
+
+CESMRField* CESMRListComponent::FocusedItem() const
+ {
+ FUNC_LOG;
+ return iContainer->FocusedItem();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::IsControlVisible()
+// ---------------------------------------------------------------------------
+//
+TBool CESMRListComponent::IsControlVisible( TESMREntryFieldId aField )
+ {
+ FUNC_LOG;
+ TBool ret( EFalse );
+
+ CESMRField* field = iFactory->FieldById( aField );
+ if ( field && field->IsVisible() )
+ {
+ ret = ETrue;
+ }
+
+ return ret;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ControlSizeChanged()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::ControlSizeChanged( CESMRField* aField )
+ {
+ FUNC_LOG;
+ /* Called whenever one of the controls size changed
+ * E.G. when a eik edwin expands */
+ iContainer->ControlSizeChanged( aField );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::InsertControl()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::InsertControl( TESMREntryFieldId aField )
+ {
+ FUNC_LOG;
+ iContainer->InsertControl( aField );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::RemoveControl()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::RemoveControl( TESMREntryFieldId aField )
+ {
+ FUNC_LOG;
+ iContainer->RemoveControl( aField );
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::SetControlFocused()
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::SetControlFocusedL( TESMREntryFieldId aField )
+ {
+ FUNC_LOG;
+ iContainer->SetControlFocusedL( aField );
+ UpdateScrollBar();
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::MoveListAreaDownL
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::MoveListAreaDownL( TInt aAmount )
+ {
+ FUNC_LOG;
+ iContainer->MoveListAreaDownL( aAmount );
+
+ // Do the view scrolling if needed:
+ if ( aAmount )
+ {
+ UpdateScrollBar();
+ DrawDeferred();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::MoveListAreaUpL
+// ---------------------------------------------------------------------------
+//
+void CESMRListComponent::MoveListAreaUpL( TInt aAmount )
+ {
+ FUNC_LOG;
+ iContainer->MoveListAreaUpL( aAmount );
+
+ // do the scrolling if needed:
+ if ( aAmount > 0 )
+ {
+ UpdateScrollBar();
+ DrawDeferred();
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::ListHeight()
+// ---------------------------------------------------------------------------
+//
+TInt CESMRListComponent::ListHeight()
+ {
+ FUNC_LOG;
+ return iContainer->Size().iHeight;
+ }
+
+// ---------------------------------------------------------------------------
+// CESMRListComponent::IsFieldBottomVisible()
+// ---------------------------------------------------------------------------
+//
+ TBool CESMRListComponent::IsFieldBottomVisible()
+ {
+ FUNC_LOG;
+ return iContainer->IsFieldBottomVisible();
+ }
+
+ // -----------------------------------------------------------------------------
+ // CESMRListComponent::HandlePointerEventL
+ // -----------------------------------------------------------------------------
+ //
+ void CESMRListComponent::HandlePointerEventL( const TPointerEvent& aPointerEvent )
+ {
+ FUNC_LOG;
+
+
+ CCoeControl::HandlePointerEventL(aPointerEvent);
+ TPoint position = aPointerEvent.iPosition;
+
+ switch ( aPointerEvent.iType )
+ {
+ case TPointerEvent::EButton1Down:
+ iPreviousPosition = iOriginalPosition = aPointerEvent.iPosition;
+
+ iIsScrolling = iScroll->Rect().Contains(aPointerEvent.iPosition );
+ iCurrentScrollSpan = iScrollModel.ScrollSpan();
+
+
+ iIsDragging = EFalse;
+ if( iPhysics )
+ {
+ iStartTime.HomeTime();
+ UpdatePhysicsL();
+ }
+ break;
+
+ case TPointerEvent::EDrag:
+ if (!iIsScrolling)
+ {
+ // if when dragging scrollbar pointer touches container rectangle,
+ // do not activate physics!
+ iIsDragging = ETrue;
+
+ if( iPhysics )
+ {
+ TPoint delta( 0, iPreviousPosition.iY - position.iY );
+ iPhysics->RegisterPanningPosition( delta );
+ }
+ }
+ // Save current position as previous pos for future calculations
+ iPreviousPosition = position;
+ break;
+
+ case TPointerEvent::EButton1Up:
+ if( iIsDragging && iPhysics )
+ {
+ TPoint drag(iOriginalPosition - aPointerEvent.iPosition);
+ iPhysics->StartPhysics(drag, iStartTime);
+ }
+
+ // some fields may change their size due to as result of click, update model if needed
+ if (iCurrentScrollSpan != iScrollModel.ScrollSpan())
+ {
+ iScroll->SetModel( &iScrollModel );
+ }
+ break;
+ }
+ }
+
+
+ // -----------------------------------------------------------------------------
+ // CESMRListComponent::MakeVisible
+ // -----------------------------------------------------------------------------
+ //
+void CESMRListComponent::MakeVisible( TBool aIsVisible )
+ {
+ if(!aIsVisible && IsVisible() )
+ {
+ // hiding the control, stop physics for performance gain
+ if( iPhysics )
+ {
+ iPhysics->StopPhysics();
+ iPhysics->ResetFriction();
+ }
+ }
+ }
+// End of file
+