--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/exampleapps/alfexcalendar/src/alfexcalendardeckcontrol.cpp Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,515 @@
+/*
+* Copyright (c) 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: ?Description
+*
+*/
+
+
+
+#include <alf/alftextvisual.h>
+#include <alf/alfgridlayout.h>
+#include <alf/alfdecklayout.h>
+#include <alf/alfflowlayout.h>
+#include <alf/alfcurvepathlayout.h>
+#include <alf/alfcurvepath.h>
+#include <alf/alfevent.h>
+#include <alf/alfenv.h>
+#include <alf/alfdisplay.h>
+#include <alf/alflinevisual.h>
+#include <alf/alfimagevisual.h>
+#include <alf/alftransformation.h>
+#include <alf/alfcommand.h>
+
+#include "alfexcalendardeckcontrol.h"
+#include "alfexcalendarmonth.h"
+#include "alfexcalendarengine.h"
+
+_LIT( KImagePath, "c:\\data\\Images\\Pictures\\" );
+_LIT( KCalendar, "calendar.jpg" );
+
+const TInt KMonthViewTransitTime = 1500;
+const TInt KMonthViewRotationTime = 1500;
+const TInt KMonthViewScalingTime = 2500;
+const TInt KMonthViewOpacityTime = 2500;
+
+const TReal KUnitSize = 1.0f;
+const TReal KMonthXSf = 0.2f;
+const TReal KMonthYSf = 0.2f;
+
+// Custome events
+enum TCustomEvent
+{
+ EMoveMonthToBack = 1,
+ EMonthMovedToFront,
+
+ ECustomEventInvalid
+};
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::NewLC
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarDeckControl* CAlfExCalendarDeckControl::NewLC(
+ CAlfEnv& aEnv,
+ CAlfExCalendarEngine& aCalendarEngine )
+ {
+ CAlfExCalendarDeckControl* self =
+ new (ELeave) CAlfExCalendarDeckControl( aCalendarEngine, aEnv );
+ CleanupStack::PushL( self );
+ self->ConstructL( aEnv );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::CAlfExCalendarDeckControl
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarDeckControl::CAlfExCalendarDeckControl(
+ CAlfExCalendarEngine& aCalendarEngine,
+ CAlfEnv& aEnv )
+ : iFocusedMonth( (KMonthsVisible-1) ), iMonthView( EFalse ),
+ iCalendarEngine( aCalendarEngine ), iEnv( aEnv ),
+ iMonthAnimationStyle( EAnimationStyle1 ),
+ iMonthTransitionState( ETransitionStateStopped )
+ {
+ }
+
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::ConstructL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::ConstructL( CAlfEnv& aEnv )
+ {
+ CAlfControl::ConstructL( aEnv );
+
+ /* // not using currently
+ // Background image.
+ iBackground = CAlfImageVisual::AddNewL(*this);
+ Env().TextureManager().SetImagePathL( KImagePath );
+ SetImageTexture( iBackground, KCalendar );
+ */
+
+ // Get display rectangle
+ iDisplayRect = aEnv.PrimaryDisplay().VisibleArea();
+
+ // create Deck Layout and add to CAlfExCalendarDeckControl
+ // CAlfExCalendarDeckControl takes ownership of created layout
+ iDeck = CAlfDeckLayout::AddNewL( *this );
+
+
+ // Calendar logic here
+ // we create only KMonthsVisible number (atleast 2 :))of CAlfExCalendarMonth instances
+ // and only use those many, to show un-limited calendar months.
+ // take the responsibility of updating CAlfExCalendarMonth instances
+ // when moving between the months.
+ iSelectedTime.HomeTime();
+ iCurrentMonthControlIndex = (KMonthsVisible - 1);
+
+ TTime tmpTime = iSelectedTime - (TTimeIntervalMonths)( KMonthsVisible - 1 );
+ for( TInt i = 0; i < KMonthsVisible; i++ )
+ {
+ iMonthControls[i] = CAlfExCalendarMonth::NewLC( iDeck, tmpTime.DateTime(), aEnv, *this );
+ tmpTime += (TTimeIntervalMonths)1;
+ CleanupStack::Pop();
+ };
+
+ // move Focus to current month
+ iMonthControls[iCurrentMonthControlIndex]->MonthFocusedL();
+ iMonthView = ETrue;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::~CAlfExCalendarDeckControl
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarDeckControl::~CAlfExCalendarDeckControl()
+ {
+ // delete all iMonthControls
+ for (TInt i = 0; i < KMonthsVisible ; i++ )
+ {
+ delete iMonthControls[i];
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::SetImageTexture
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::SetImageTexture(
+ CAlfImageVisual* aImageVisual,
+ const TDesC& aImageFileName )
+ {
+
+ TRAP_IGNORE(
+ // creates texture from given aImageFileName
+ CAlfTexture& texture =
+ Env().TextureManager().LoadTextureL(
+ aImageFileName,
+ EAlfTextureFlagDefault,
+ KAlfAutoGeneratedTextureId );
+
+ aImageVisual->SetScaleMode( CAlfImageVisual::EScaleCover );
+
+ // sets created texture to given aImageVisual
+ aImageVisual->SetImage( TAlfImage( texture ) );
+ );
+
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::SetMonthView
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::SetMonthView( TBool aVal )
+ {
+ iMonthView = aVal;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::CalendarEngine
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarEngine& CAlfExCalendarDeckControl::CalendarEngine() const
+ {
+ return iCalendarEngine;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::OfferEventL
+// --------------------------------------------------------------------------
+//
+TBool CAlfExCalendarDeckControl::OfferEventL(const TAlfEvent& aEvent )
+ {
+ // DO NOT change the order of below aEvent checking
+
+ // Pointer events are irrelevant for 3.2,
+ // but caught here for 5.0 compatibility.
+ if( aEvent.IsPointerEvent() )
+ {
+ return ETrue;
+ }
+
+ if( aEvent.IsCustomEvent() /* && iMonthTransitionState != ETransitionStateStopped */ )
+ {
+ switch( aEvent.CustomParameter() )
+ {
+ // month transition (animation)is completed. Handle custome events
+ case EMoveMonthToBack:
+ iDeck->MoveVisualToBack( iDeck->Visual( iFocusedMonth ) );
+ iMonthTransitionState = ETransitionStateStopped;
+ iMonthControls[iCurrentMonthControlIndex]->MonthFocusedL();
+ iMonthView = ETrue;
+ return ETrue;
+
+ case EMonthMovedToFront:
+ iMonthTransitionState = ETransitionStateStopped;
+ iMonthControls[iCurrentMonthControlIndex]->MonthFocusedL();
+ iMonthView = ETrue;
+ return ETrue;
+
+ default:
+ break;
+ }
+ }
+
+ // Don't handle events while month transition
+ if( iMonthTransitionState != ETransitionStateStopped )
+ {
+ return ETrue;
+ }
+
+ // If month view
+ if( iMonthView )
+ {
+ TBool ret = iMonthControls[iCurrentMonthControlIndex]->OfferEventL( aEvent );
+
+ // iMonthControls can change the iMonthView value.
+ // month might have been closed
+ if( iMonthView )
+ {
+ return ret;
+ }
+ else
+ {
+ // dont return, continue event processing here
+ }
+ }
+
+ if ( aEvent.Code() == EEventKey )
+ {
+ iMonthAnimationStyle = EAnimationStyle1;
+ TInt code = aEvent.KeyEvent().iCode;
+ switch( code )
+ {
+ case EKeyUpArrow:
+ iMonthAnimationStyle = EAnimationStyle2;
+ MoveToPrevMonthL();
+ return ETrue;
+
+ case EKeyDownArrow:
+ iMonthAnimationStyle = EAnimationStyle2;
+ MoveToNextMonthL();
+ return ETrue;
+
+ case EKeyLeftArrow:
+ MoveToPrevMonthL();
+ return ETrue;
+
+ case EKeyRightArrow:
+ MoveToNextMonthL();
+ return ETrue;
+
+ default:
+ break;
+ }
+ }
+ return EFalse;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToNextMonthL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToNextMonthL()
+ {
+ // calls appropriate function according to animation style
+ switch( iMonthAnimationStyle )
+ {
+ case EAnimationStyle1:
+ MoveToNextMonthAnimation1L();
+ break;
+ case EAnimationStyle2:
+ MoveToNextMonthAnimation2L();
+ break;
+ default:
+ break;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToPrevMonthL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToPrevMonthL()
+ {
+ // calls appropriate function according to animation style
+ switch( iMonthAnimationStyle )
+ {
+ case EAnimationStyle1:
+ MoveToPrevMonthAnimation1L();
+ break;
+ case EAnimationStyle2:
+ MoveToPrevMonthAnimation2L();
+ break;
+ default:
+ break;
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::UpdateNextMonthL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::UpdateNextMonthL()
+ {
+ // change time to next month
+ iSelectedTime += (TTimeIntervalMonths)1;
+
+ // set iCurrentMonthControlIndex value properly.
+ // some logic here based on how many no of month layout we have
+ iCurrentMonthControlIndex++;
+ if( iCurrentMonthControlIndex == KMonthsVisible )
+ {
+ iCurrentMonthControlIndex = 0;
+ }
+
+ // now update the month layout according to iSelectedTime
+ iMonthControls[iCurrentMonthControlIndex]->UpdateMonthL( iSelectedTime.DateTime() );
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::UpdatePrevMonthL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::UpdatePrevMonthL()
+ {
+ // change time to previous month
+ iSelectedTime -= (TTimeIntervalMonths)1;
+
+ // set iCurrentMonthControlIndex value properly.
+ iCurrentMonthControlIndex--;
+ if( iCurrentMonthControlIndex == -1 )
+ {
+ iCurrentMonthControlIndex = (KMonthsVisible-1);
+ }
+
+ // update the month layout according to iSelectedTime
+ iMonthControls[iCurrentMonthControlIndex]->UpdateMonthL( iSelectedTime.DateTime() );
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToNextMonthAnimation1L
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToNextMonthAnimation1L()
+ {
+ // updates the month layout which is at bottom of deck layout
+ UpdateNextMonthL();
+
+ // get the bottom most month to front of DECK layout
+ iDeck->MoveVisualToFront( iDeck->Visual( 0 ) );
+
+ // move this month to extreme right of display
+ iDeck->Visual( iFocusedMonth ).SetPos( TPoint( iDisplayRect.Width(), 0 ), 0 );
+
+ // now move this month to 0,0 position in KMonthViewTransitTime time
+ iDeck->Visual( iFocusedMonth ).SetPos( TPoint( 0, 0 ), KMonthViewTransitTime );
+
+ // with rotation transformation
+ RotateVisualL( iDeck->Visual( iFocusedMonth ), 360, 0, KMonthViewRotationTime );
+
+ // send custome event, handle EMonthMovedToFront in OfferEventL() after KMonthViewTransitTime
+ Env().Send( TAlfCustomEventCommand( EMonthMovedToFront, this ), KMonthViewTransitTime );
+
+ // change iMonthTransitionState state
+ iMonthTransitionState = ETransitionStateMovingToNext;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToPrevMonthAnimation1L
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToPrevMonthAnimation1L()
+ {
+ // updates the month layout which is just below the top of deck layout
+ UpdatePrevMonthL();
+
+ // move currently focused month to out of screen horizontally
+ iDeck->Visual( iFocusedMonth ).SetPos( TPoint( iDisplayRect.Width(), 0 ), KMonthViewTransitTime );
+
+ // with rotation transformation
+ RotateVisualL( iDeck->Visual( iFocusedMonth ), 0, 360, KMonthViewRotationTime );
+
+ // move month to back of DECK after KMonthViewTransitTime duration by sending custom event
+ // custom event EMoveMonthToBack should be handled in OfferEventL()
+ Env().Send( TAlfCustomEventCommand( EMoveMonthToBack, this ), KMonthViewTransitTime );
+
+ // change iMonthTransitionState state
+ iMonthTransitionState = ETransitionStateMovingToPrev;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToNextMonthAnimation2L
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToNextMonthAnimation2L()
+ {
+ // updates the month layout which is at bottom of deck layout
+ UpdateNextMonthL();
+
+ // get the bottom most month to front of DECK
+ iDeck->MoveVisualToFront( iDeck->Visual( 0 ) );
+
+ // position it at bottom of display
+ iDeck->Visual( iFocusedMonth ).SetPos( TPoint( 0, iDisplayRect.Height() ), 0 );
+
+ // ans move it to 0,0 position (top left of display)
+ iDeck->Visual( iFocusedMonth ).SetPos( TPoint( 0, 0 ), KMonthViewTransitTime );
+
+ // send custom event and handle it in OfferEventL()
+ Env().Send( TAlfCustomEventCommand( EMonthMovedToFront, this ), KMonthViewTransitTime );
+
+ // change iMonthTransitionState state
+ iMonthTransitionState = ETransitionStateMovingToNext;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::MoveToPrevMonthAnimation2L
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::MoveToPrevMonthAnimation2L()
+ {
+ // updates the month layout which is just below (2nd one)
+ // from the top of deck layout
+ UpdatePrevMonthL();
+
+ // move currently visible month (which is on top of layout)
+ // to bottom of didplay
+ iDeck->Visual( iFocusedMonth ).SetPos(
+ TPoint( 0, iDisplayRect.Height() ), KMonthViewTransitTime );
+
+ // then move month to back of DECK after KMonthViewTransitTime duration
+ Env().Send(
+ TAlfCustomEventCommand( EMoveMonthToBack, this ),
+ KMonthViewTransitTime );
+
+ // change iMonthTransitionState state
+ iMonthTransitionState = ETransitionStateMovingToPrev;
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::ScaleVisualL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::ScaleVisualL(
+ CAlfVisual& aVisual,
+ TReal aXSf,
+ TReal aYSf,
+ TInt aTime )
+ {
+ aVisual.EnableTransformationL();
+ TAlfTimedValue xSc( KUnitSize );
+ xSc.SetTarget( aXSf, aTime );
+ TAlfTimedValue ySc( KUnitSize );
+ ySc.SetTarget( aYSf, aTime );
+ aVisual.Transformation().Scale( xSc, ySc );
+ }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::RotateVisualL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::RotateVisualL(
+ CAlfVisual& aVisual,
+ TReal aInitAngle,
+ TReal aTargetAngle,
+ TInt aTime )
+ {
+ aVisual.EnableTransformationL();
+ TAlfTimedValue angle( aInitAngle );
+ angle.SetTarget( aTargetAngle, aTime );
+ aVisual.Transformation().Rotate( angle , 0.0, 0.0, 1.0 );
+ }
+
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarDeckControl::SetOpacity
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarDeckControl::SetOpacity(
+ CAlfVisual& aVisual,
+ TReal aInitValue,
+ TReal aTargetValue,
+ TInt aTime )
+ {
+ TAlfTimedValue opacity;
+ opacity.SetValueNow( aInitValue );
+ opacity.SetTarget( aTargetValue, aTime ); // in milliseconds
+ aVisual.SetOpacity( opacity );
+ }
+
+
+// end of file
+