exampleapps/alfexcalendar/src/alfexcalendarmonth.cpp
changeset 0 15bf7259bb7c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/exampleapps/alfexcalendar/src/alfexcalendarmonth.cpp	Tue Feb 02 07:56:43 2010 +0200
@@ -0,0 +1,1068 @@
+/*
+* 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 <avkon.hrh>
+
+#include <alf/alftextvisual.h>
+#include <alf/alfimagevisual.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/alfborderbrush.h>
+#include <alf/alfimagebrush.h>
+#include <alf/alfbrusharray.h>
+#include <alf/alfgradientbrush.h>
+#include <alf/alfshadowborderBrush.h>
+#include <alf/alftransformation.h>
+#include <alf/alftextstylemanager.h>
+#include <alf/alftextstyle.h>
+#include <alf/alfimageloaderutil.h>
+
+#include "alfexcalendarmonth.h"
+#include "alfexcalendardeckcontrol.h"
+#include "alfexcalendarengine.h"
+
+_LIT( KWkNo, "Wk" );
+_LIT( KMonday, "Mo" );
+_LIT( KTuesday, "Tu" );
+_LIT( KWednesday, "We" );
+_LIT( KThursday, "Th" );
+_LIT( KFriday, "Fr" );
+_LIT( KSaturday, "Sa" );
+_LIT( KSunday, "Su" );
+
+_LIT( KMonth1, "January" );
+_LIT( KMonth2, "February" );
+_LIT( KMonth3, "March" );
+_LIT( KMonth4, "April" );
+_LIT( KMonth5, "May" );
+_LIT( KMonth6, "June" );
+_LIT( KMonth7, "July" );
+_LIT( KMonth8, "August" );
+_LIT( KMonth9, "September" );
+_LIT( KMonth10, "October" );
+_LIT( KMonth11, "November" );
+_LIT( KMonth12, "December" );
+
+// svg files need full path in 3.2
+_LIT( KMonthSVGBg, "c:\\data\\Images\\background.svg" );
+_LIT( KNormalDayBg, "c:\\data\\Images\\normaldaybutton.svg" );
+_LIT( KEventsDayBg, "c:\\data\\Images\\eventsdaybutton.svg" );
+_LIT( KTitleBg, "c:\\data\\Images\\title.svg" );
+_LIT( KSelectedDayBg, "c:\\data\\Images\\selectedday.svg" );
+
+_LIT( KImagePath, "c:\\data\\Images\\" );
+
+// Custom events
+enum
+{
+    EShowCaledarEvents = 1,
+    
+};
+
+// Constant declarations
+// Month names
+const TDesC* KMonths[12] = { &KMonth1, &KMonth2, &KMonth3, &KMonth4,
+                             &KMonth5, &KMonth6, &KMonth7, &KMonth8,
+                             &KMonth9, &KMonth10, &KMonth11, &KMonth12 };
+
+const TInt KXPaddingLen = 3; // padding between visuals in layout
+const TInt KYPaddingLen = 3;
+const TInt KNoOfRows = 7;
+const TInt KNoOfCols = 8; // including week numbers
+
+const TReal KDayViewSizeXChange = 60.0;
+const TReal KDayViewSizeYChange = 60.0;
+const TInt KDayViewTransitionTime = 800;
+const TInt KDayFocusTime = 1000;
+
+const TReal KUnitSize = 1.0f;
+const TReal KXSf = 1.32f;
+const TReal KYSf = 1.50f;
+const TReal KDayViewXSf = 15.0f;
+const TReal KDayViewYSf = 15.0f;
+
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::CAlfExCalendarMonth
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarMonth::CAlfExCalendarMonth(
+    CAlfExCalendarDeckControl& aCalendarControl,
+    CAlfEnv& aEnv,
+    TDateTime aDateTime )
+    :iMonthNumber(0), iDayNoInWeek(0), iFocusedDay(0), iDayView( EFalse ),
+    iCalendarControl( aCalendarControl ), iEnv( aEnv ),
+    iIsDayFocused( EFalse ), iDateTime( aDateTime )
+    {
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::~CAlfExCalendarMonth
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarMonth::~CAlfExCalendarMonth()
+    {
+    delete iEventTimer;
+    delete iFocusedDayBrush;
+    delete iNormalDayBrush;
+    delete iEventsDayBrush;
+    delete iImageLoaderUtil;
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::NewLC
+// --------------------------------------------------------------------------
+//
+CAlfExCalendarMonth* CAlfExCalendarMonth::NewLC( CAlfLayout* aParentLayout, 
+		TDateTime aDateTime,
+		CAlfEnv& aEnv,
+        CAlfExCalendarDeckControl& aCalendarControl )
+    {
+    CAlfExCalendarMonth* self =
+        new (ELeave) CAlfExCalendarMonth( aCalendarControl, aEnv, aDateTime );
+    CleanupStack::PushL( self );
+    
+    self->ConstructL( aParentLayout );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::ConstructL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::ConstructL( CAlfLayout* aParentLayout )
+	{
+    CAlfControl::ConstructL( iEnv );
+
+    iMonthNumber = iDateTime.Month();
+    iDateTime.SetDay(0);
+    iTime = TTime( iDateTime );
+    iDayNoInWeek = iTime.DayNoInWeek();
+    iDaysInMonth = iTime.DaysInMonth();
+    
+    iBottomGrid = CAlfGridLayout::AddNewL( *this, 1, 2, aParentLayout );
+    iBottomGrid->SetOpacity( TAlfTimedValue(1.0f) );
+    
+	RArray<TInt> weights;
+    weights.Append( 3 );
+    weights.Append( 12 );
+    iBottomGrid->SetRowsL( weights );
+    weights.Reset();
+    
+    Env().TextureManager().SetImagePathL( KImagePath );
+    
+    TRect displayRect = iEnv.PrimaryDisplay().VisibleArea();
+    
+    iImageLoaderUtil = new(ELeave)CAlfImageLoaderUtil();
+    //iImageLoaderUtil->SetSize( TSize( displayRect.Width(), displayRect.Height() ) );
+    iImageLoaderUtil->SetSize( TSize(240, 320) ); // This is very important
+    
+    // set background to month view
+    SetMonthBackgroundL( iBottomGrid );
+    
+    // Add text visual for "month name and year"
+	iMonthText = CAlfTextVisual::AddNewL( *this, iBottomGrid );
+
+    // sets title text for month ("Date Month name Year")
+    SetMonthTitleTextL();
+    
+    iMonthText->SetColor( KRgbYellow );
+    iMonthText->SetAlign( EAlfAlignHCenter, EAlfAlignVCenter );
+    
+    // create font style and set to iMonthText
+    TInt fontStyleId = KErrNotFound;
+    fontStyleId = iEnv.TextStyleManager().CreatePlatformTextStyleL(
+            EAknLogicalFontPrimarySmallFont,
+            EAlfTextStyleSmall );
+    CAlfTextStyle* style = iEnv.TextStyleManager().TextStyle( fontStyleId );
+    style->SetTextSizeInPixels( 25, ETrue );
+    iMonthText->SetTextStyle( style->Id() );
+
+    // set svg graphics as Image brush to iMonthText visual
+    SetSVGImageTextureL( iMonthText, KTitleBg );
+    
+    // create dates grid and add dates
+    iDatesGrid = CAlfGridLayout::AddNewL(
+            *this,
+            KNoOfCols,
+            KNoOfRows,
+            iBottomGrid );
+    AddDateVisualsL( iDatesGrid );
+
+    // set week names in iDatesGrid
+    SetWeekDayNameL( KWkNo(), iDatesGrid, 0, KWeekNumberColor );
+    SetWeekDayNameL( KMonday(), iDatesGrid, 1 );
+    SetWeekDayNameL( KTuesday(), iDatesGrid, 2 );
+    SetWeekDayNameL( KWednesday(), iDatesGrid, 3 );
+    SetWeekDayNameL( KThursday(), iDatesGrid, 4 );
+    SetWeekDayNameL( KFriday(), iDatesGrid, 5 );
+    SetWeekDayNameL( KSaturday(), iDatesGrid, 6, KWeekendDayColor );
+    SetWeekDayNameL( KSunday(), iDatesGrid, 7, KWeekendDayColor );
+
+    // create CalendarEngine EventTimer
+    iEventTimer = CAlfExCalendarEngineEventTimer::NewL( *this );
+	
+    // Create all brushes here
+    MAlfBitmapProvider* provider = iImageLoaderUtil->CreateSVGImageLoaderL( KNormalDayBg );
+    CAlfTexture& texture1 = Env().TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId, 
+            provider,
+            EAlfTextureFlagRetainResolution );
+    iNormalDayBrush = CAlfImageBrush::NewL( Env(), TAlfImage( texture1 ) );
+    iNormalDayBrush->SetLayer( EAlfBrushLayerBackground );
+
+    provider = iImageLoaderUtil->CreateSVGImageLoaderL( KEventsDayBg );
+    CAlfTexture& texture2 = Env().TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId, 
+            provider,
+            EAlfTextureFlagRetainResolution );
+    iEventsDayBrush = CAlfImageBrush::NewL( Env(), TAlfImage( texture2 ) );
+    iEventsDayBrush->SetLayer( EAlfBrushLayerBackground );
+
+    provider = iImageLoaderUtil->CreateSVGImageLoaderL( KSelectedDayBg );
+    CAlfTexture& texture3 = Env().TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId, 
+            provider,
+            EAlfTextureFlagRetainResolution );
+    iFocusedDayBrush = CAlfImageBrush::NewL( Env(), TAlfImage( texture3 ) );
+    iFocusedDayBrush->SetLayer( EAlfBrushLayerForeground );
+    
+    // end of brushes creation
+    
+    // set the dates in iDatesGrid according to the iTime
+    SetDatesL( iDatesGrid, iTime ); // TODO - refactor - API can be changed
+
+    iDatesGrid->SetInnerPadding( TPoint( KXPaddingLen, KYPaddingLen ) );
+	}
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetMonthTitleTextL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetMonthTitleTextL()
+    {
+    // this fuction sets month title as "date month year"
+    TBuf<4> yearBuf;
+    yearBuf.Num( iDateTime.Year() );
+    TBuf<2> dayBuf;
+    dayBuf.Num( iFocusedDay+1 ); // iFocusedDay starts from 0
+
+    TBuf<16> buf;
+    buf.Append( dayBuf );
+    buf.Append( _L(" "));    
+    buf.Append( *(KMonths[iDateTime.Month()]) );
+    buf.Append( _L(" "));
+    buf.Append( yearBuf );
+    iMonthText->SetTextL( buf );
+    }
+
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetMonthBackgroundL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetMonthBackgroundL( CAlfVisual* aVisual, TRgb /* aColor */ )
+    {
+    // IMPORTANT: first enable the brushes for the visual
+    aVisual->EnableBrushesL();
+    
+    // now set brush
+    SetSVGImageTextureL( aVisual, KMonthSVGBg );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetBgImgL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetBgImgL( CAlfVisual* /* aVisual */ )
+    {
+    // This method is not used currently
+    /*
+    // Set background image
+    TRAP_IGNORE(
+    CAlfTexture& texture =
+        Env().TextureManager().LoadTextureL(
+                *(KMonthBackgrounds[iMonthNumber]),
+                EAlfTextureFlagDefault, //EAlfTextureFlagDoNotRetainResolution,
+                KAlfAutoGeneratedTextureId );
+
+    CAlfImageBrush* imgBrush = CAlfImageBrush::NewLC( Env(), TAlfImage( texture ) );
+    imgBrush->SetLayer( EAlfBrushLayerBackground );
+    aVisual->Brushes()->AppendL( imgBrush, EAlfHasOwnership );
+    CleanupStack::Pop( imgBrush );
+    );
+    */
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetSVGImageTextureL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetSVGImageTextureL(
+    CAlfVisual* aVisual,
+    const TDesC& aSvgFileName )
+    {
+    // IMPORTANT: first enable the brushes for the visual
+    aVisual->EnableBrushesL(); // incase, it has not been enabled
+    
+    // SVG graphics loading
+    MAlfBitmapProvider* provider = iImageLoaderUtil->CreateSVGImageLoaderL( aSvgFileName );
+    CAlfTexture& texture = Env().TextureManager().CreateTextureL(
+            KAlfAutoGeneratedTextureId, 
+            provider,
+            EAlfTextureFlagRetainResolution );
+
+    // create Image brush
+    CAlfImageBrush* imgBrush = CAlfImageBrush::NewLC( Env(), TAlfImage( texture ) );
+    imgBrush->SetLayer( EAlfBrushLayerBackground );
+    aVisual->Brushes()->AppendL( imgBrush, EAlfHasOwnership );
+    CleanupStack::Pop( imgBrush );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetWeekDayNameL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetWeekDayNameL(
+    const TDesC& aDayName,
+    CAlfGridLayout* aGrid,
+    TInt aDayIndex,
+    TRgb aColor )
+	{
+    CAlfVisual& cell = aGrid->Visual( aDayIndex );
+    CAlfTextVisual& textVisual = static_cast<CAlfTextVisual&>( cell );
+    
+    textVisual.SetTextL( aDayName );
+    textVisual.SetColor( aColor );
+
+    TInt fontStyleId = KErrNotFound;
+    fontStyleId = iEnv.TextStyleManager().CreatePlatformTextStyleL(
+            EAknLogicalFontPrimarySmallFont,
+            EAlfTextStyleSmall );
+    
+    CAlfTextStyle* style = iEnv.TextStyleManager().TextStyle( fontStyleId );
+    style->SetTextSizeInPixels( 20, ETrue );
+    style->SetBold( ETrue );
+    textVisual.SetTextStyle( style->Id() );
+	}
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::AddDateVisualsL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::AddDateVisualsL( CAlfGridLayout* aGrid )
+	{
+    // adds text visuals i Grid
+	for (TInt i = 0 ; i < KNoOfRows * KNoOfCols ; i ++ )
+		{
+		CAlfTextVisual* text = CAlfTextVisual::AddNewL( *this, aGrid );
+        text->EnableBrushesL( ETrue );
+		}
+	}
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetDatesL
+// --------------------------------------------------------------------------
+//
+TInt CAlfExCalendarMonth::SetDatesL(
+    CAlfGridLayout* aGrid,
+    TTime aTime )
+    {
+    // logic to arrange dates and week numbers in correct positions
+    // TODO - there is problem of showing weeke numbers in some months. 
+    // look into TTime API/implementation and fix.
+    
+    iDaysInMonth = aTime.DaysInMonth();
+    TInt emptyDays = aTime.DayNoInWeek();
+    TInt dateTextStyle = DateTextStyleL();
+    TInt weekTextStyle = dateTextStyle;
+    
+    // 1st row of dates
+    // set week number at 1st column
+    TInt dayIdx = 1;
+    TInt visualIdx = 8;
+    SetWeekNumberL( aGrid, visualIdx, dayIdx, weekTextStyle );
+
+    // move to 1st day in month
+    visualIdx++;
+    // clear text visuals in the grid for first empty days
+    for( TInt idx = 1; idx <= emptyDays; idx++, visualIdx++ )
+        {
+        ClearDayVisualL( aGrid, visualIdx );
+        }
+    
+    // set date numbers from correct week (after the empty days)
+    for( TInt colIdx = emptyDays+1; colIdx < KNoOfCols; colIdx++, visualIdx++, dayIdx++ )
+        {
+        if( colIdx > KNoOfCols-3 ) // weekend days
+            {
+            SetDateNumberL( aGrid, visualIdx, dayIdx, dateTextStyle, KWeekendDayColor );
+            }
+        else
+            {
+            SetDateNumberL( aGrid, visualIdx, dayIdx, dateTextStyle );            
+            }
+        }
+    
+    // fill week and date numbers from 2nd row
+    for( TInt rowIdx = 2; rowIdx < KNoOfRows && dayIdx <= iDaysInMonth; rowIdx++ )
+        {
+        // set week number at 1st column
+        SetWeekNumberL( aGrid, visualIdx, dayIdx, weekTextStyle );
+        visualIdx++;
+
+        // set dates in next columns
+        for( TInt colIdx = 1;
+             colIdx < KNoOfCols && dayIdx <= iDaysInMonth; /* only week days */
+             colIdx++, visualIdx++, dayIdx++ )
+            {
+            if( colIdx > KNoOfCols-3 ) // weekend days
+                {
+                SetDateNumberL( aGrid, visualIdx, dayIdx, dateTextStyle, KWeekendDayColor );
+                }
+            else // week days
+                {
+                SetDateNumberL( aGrid, visualIdx, dayIdx, dateTextStyle );            
+                }            
+           }
+        }
+
+    // clear remaining text visuals in the grid
+    for( ; visualIdx < KNoOfRows * KNoOfCols; visualIdx++ )
+        {
+        ClearDayVisualL( aGrid, visualIdx );
+        }
+    
+    return 1;
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetDateNumberL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetDateNumberL(
+        CAlfGridLayout* aGrid,
+        TInt aVisualIndex,
+        TInt aDayNumber,
+        TInt aDateTextStyle,
+        TRgb aColor )
+    {
+    // get text visual from grid
+    CAlfVisual& cell = aGrid->Visual( aVisualIndex );
+    CAlfTextVisual& textVisual = static_cast<CAlfTextVisual&>( cell );
+    textVisual.SetTextStyle( aDateTextStyle );
+    textVisual.SetColor( aColor );
+    textVisual.SetAlign( EAlfAlignHCenter, EAlfAlignVCenter );
+
+    // set the text
+    TBuf<3> buf;
+    buf.Num( aDayNumber );
+    textVisual.SetTextL( buf );
+
+    // append brush
+    textVisual.Brushes()->AppendL( iNormalDayBrush, EAlfDoesNotHaveOwnership );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetWeekNumberL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetWeekNumberL(
+        CAlfGridLayout* aGrid,
+        TInt aVisualIndex,
+        TInt aDayNumber,
+        TInt aWeekTextStyle )
+    {
+    // get text visual from grid
+    CAlfVisual& cell = aGrid->Visual( aVisualIndex );
+    CAlfTextVisual& textVisual = static_cast<CAlfTextVisual&>( cell );
+    textVisual.SetColor( KWeekNumberColor );
+    textVisual.SetAlign( EAlfAlignHCenter, EAlfAlignVCenter );
+    textVisual.SetTextStyle( aWeekTextStyle );
+
+    // use aDayNumber to get the correct week number
+    TDateTime tempDateTime = iDateTime;
+    tempDateTime.SetDay( aDayNumber );
+    TTime tempTime = TTime( tempDateTime );
+
+    TBuf<3> buf;
+    buf.Num( tempTime.WeekNoInYear() );
+    textVisual.SetTextL( buf ); 
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::ClearDayVisualL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::ClearDayVisualL(
+        CAlfGridLayout* aGrid,
+        TInt aVisualIndex )
+    {
+    CAlfVisual& cell = aGrid->Visual( aVisualIndex );
+    CAlfTextVisual& textVisual = static_cast<CAlfTextVisual&>( cell );
+    
+    TBuf<3> buf;
+    textVisual.SetTextL( buf ); // set empty string
+    
+    // remove all brushes
+    if( textVisual.Brushes() )
+        {
+        TInt count = textVisual.Brushes()->Count();
+        for( TInt i = 0;  i < count; ++i )
+            {
+            textVisual.Brushes()->Remove( 0 );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::DateTextStyleL
+// --------------------------------------------------------------------------
+//
+TInt CAlfExCalendarMonth::DateTextStyleL()
+    {
+    // creates font style id and returns
+    TInt fontStyleId = KErrNotFound;
+    fontStyleId = iEnv.TextStyleManager().CreatePlatformTextStyleL(
+            EAknLogicalFontPrimarySmallFont,
+            EAlfTextStyleSmall );
+    CAlfTextStyle* style = iEnv.TextStyleManager().TextStyle( fontStyleId );
+    style->SetTextSizeInPixels( 20, ETrue );
+    return style->Id();
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::UpdateMonthL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::UpdateMonthL( TDateTime aDateTime )
+	{
+    // updates month acording to received aDateTime
+    
+    iDateTime = aDateTime;
+    iDateTime.SetDay(0);
+    
+	iTime = TTime( iDateTime );
+    iDaysInMonth = iTime.DaysInMonth();
+	iDayNoInWeek = iTime.DayNoInWeek();
+	iMonthNumber = iDateTime.Month();
+    
+	SetDatesL( iDatesGrid, iTime );
+
+    TBuf<4> yearBuf;
+    yearBuf.Num( iDateTime.Year() );
+    TBuf<16> buf;
+    buf.Append( *(KMonths[iMonthNumber]) );
+    buf.Append( _L(" "));
+    buf.Append( yearBuf );
+
+    iMonthText->SetTextL( buf );
+	}
+	
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::MonthFocusedL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::MonthFocusedL()
+    {
+    // update(some kind of selection) all the days which have calendar events
+    UpdateDaysWithCalEventsL();
+    
+    // focus the 1st day
+    iFocusedDay = 0;
+    iDayVisualIndex = (9 + iDayNoInWeek + iFocusedDay);
+    CAlfVisual& startDay = iDatesGrid->Visual( iDayVisualIndex );
+    FocusDayL( static_cast<CAlfTextVisual&>( startDay ) );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::UpdateDaysWithCalEventsL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::UpdateDaysWithCalEventsL()
+    {
+    iDaysInMonth = iTime.DaysInMonth();
+    iDayNoInWeek = iTime.DayNoInWeek();
+    
+    CAlfExCalendarEngine& calendarEngine = iCalendarControl.CalendarEngine();
+    calendarEngine.LoadCalendarEventsL( iTime );
+
+    TInt dayVisualIndex = (9 + iDayNoInWeek); // 1st day visual in the month
+    for( TInt i = 0; i < iDaysInMonth; i++, dayVisualIndex++ )
+        {
+        if( dayVisualIndex%8 == 0 ) // Visual index is at week number column (i.e., at column 0)
+            {
+            dayVisualIndex++;
+            }
+        if( calendarEngine.EventsAvailable( iTime + (TTimeIntervalDays)i ) )
+            {
+            CAlfVisual& cell = iDatesGrid->Visual( dayVisualIndex );
+
+            // add shadow border brush to the day visual
+            cell.Brushes()->AppendL( iEventsDayBrush, EAlfDoesNotHaveOwnership );
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::RemoveAllDayBrushesL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::RemoveAllDayBrushesL()
+    {
+    // remove all brushes of day visuals in grid
+    for( TInt i = 0 ; i < KNoOfRows * KNoOfCols ; i++ )
+        {
+        CAlfVisual& day = iDatesGrid->Visual( i );
+        
+        if( day.Brushes() )
+            {
+            TInt count = day.Brushes()->Count();
+            for( TInt i = 0;  i < count; ++i )
+                {
+                day.Brushes()->Remove( 0 );
+                }
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::MoveDayFocusL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::MoveDayFocusL( TInt aChange )
+	{
+	CAlfVisual& day1 = iDatesGrid->Visual( iDayVisualIndex );
+    UnFocusDayL( static_cast<CAlfTextVisual&>( day1 ) );
+    
+    iFocusedDay += aChange;
+	if ( iFocusedDay < 0 )
+		{
+        RemoveAllDayBrushesL();
+        iCalendarControl.SetMonthView( EFalse );
+        return;
+		}
+	if (iFocusedDay > iDaysInMonth -1 )
+		{
+        RemoveAllDayBrushesL();
+        iCalendarControl.SetMonthView( EFalse );
+        return;
+		}
+
+    if( aChange == 7 )
+        {
+        iDayVisualIndex += 8;
+        }
+    else if( aChange == -7 )
+        {
+        iDayVisualIndex -= 8;
+        }
+    else
+        {
+        iDayVisualIndex += aChange;
+        if( iDayVisualIndex%8 == 0 ) // Visual index is at week number column (column 0)
+            {
+            if( aChange > 0 )  // change is +1. move to next visual position
+                {
+                iDayVisualIndex++;
+                }
+            else // change is -1. Move to previous visual position
+                {
+                iDayVisualIndex--;
+                }
+            }
+        }
+    
+	CAlfVisual& day2 = iDatesGrid->Visual( iDayVisualIndex );
+    FocusDayL( static_cast<CAlfTextVisual&>( day2 ) );
+	}
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::UnFocusDayL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::UnFocusDayL( CAlfTextVisual& aTextVisual )
+    {
+    if( !iIsDayFocused ) // if day is not focued, dont do unfocus
+        {
+        return;
+        }
+    iIsDayFocused = EFalse;
+    
+    iEventTimer->Cancel();
+    
+    // IMPORTANT: Remove brushes applied ONLY in FocusDayL()
+    if( aTextVisual.Brushes() )
+        {
+        aTextVisual.Brushes()->Remove( aTextVisual.Brushes()->Count()-1 ); // 1st Brush
+        }
+    
+    // must scale back to original size
+    ScaleVisualL( aTextVisual, (KUnitSize/KXSf), (KUnitSize/KYSf), KDayFocusTime );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::FocusDayL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::FocusDayL( CAlfTextVisual& aTextVisual )
+    {
+    if( iIsDayFocused ) // if day is already focused
+        {
+        return;
+        }
+    SetMonthTitleTextL();
+
+    iIsDayFocused = ETrue;
+    
+    // Append brush 1
+    aTextVisual.Brushes()->AppendL( iFocusedDayBrush, EAlfDoesNotHaveOwnership );
+
+    ScaleVisualL( aTextVisual, KXSf, KYSf, KDayFocusTime );
+    
+    TTimeIntervalMicroSeconds32 dayOpenTime( 6000000 ); // EVENT TIMER
+    iEventTimer->StartTimer( dayOpenTime );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::OpenDayViewL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::OpenDayViewL()
+    {
+    // check if calendar events available for the day
+    CAlfExCalendarEngine& calendarEngine = iCalendarControl.CalendarEngine();
+    if( !calendarEngine.EventsAvailable( iTime + (TTimeIntervalDays)iFocusedDay ) )
+        {
+        return; // return if no calendar events for the day
+        }
+    // get calendar events
+    calendarEngine.GetEventInformation( 
+                iTime + (TTimeIntervalDays)iFocusedDay, 
+                0, 
+                iCalendarEventTextBuffer );
+
+    TAlfTimedValue opacity;
+    opacity.SetValueNow( 1 );
+    opacity.SetTarget( 0, KDayViewTransitionTime ); // in milliseconds
+    // Set opacity of all visuals to 0
+    for (TInt i = 0 ; i < KNoOfRows * KNoOfCols ; i ++ )
+        {
+        CAlfTextVisual& day = static_cast<CAlfTextVisual&>( iDatesGrid->Visual( i ) );
+        day.SetOpacity( opacity );
+        }
+
+    // store the original day visual position to be used in UnFocusL()
+    // to move it back to original position
+    iOriginalDayPos = iDatesGrid->Visual(iDayVisualIndex).Pos();
+
+    // now move the day visual to center on display
+    TRect displayRect = iEnv.PrimaryDisplay().VisibleArea();
+    TAlfRealPoint pos = TAlfRealPoint(displayRect.Width()/2, displayRect.Height()/3 );
+
+    CAlfTextVisual& day = static_cast<CAlfTextVisual&>( iDatesGrid->Visual( iDayVisualIndex ) );
+    day.SetPos( pos, KDayViewTransitionTime );
+
+    // Scale the day to fit entire display 
+    ScaleVisualL( day, KDayViewXSf, KDayViewYSf, KDayViewTransitionTime );
+
+    // send custom event to show calendar events after KDayViewTransitionTime
+    iEnv.Send( TAlfCustomEventCommand( EShowCaledarEvents, this ), KDayViewTransitionTime );
+    
+    iDayView = ETrue;
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::CloseDayViewL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::CloseDayViewL()
+    {
+    // cancel event timer
+    iEventTimer->Cancel();
+    
+    CAlfTextVisual& dayEventsVisual =
+        static_cast<CAlfTextVisual&>( iDatesGrid->Visual( (KNoOfRows*KNoOfCols)-1 ) );
+    // no need to put dayEventsVisual visual back to original size/position.
+    // this can be used dedicatedly to show calendar events
+
+    // just empty the text and hide it using opacity setting
+    TBuf<1> empty;
+    dayEventsVisual.SetTextL( empty );
+    dayEventsVisual.SetOpacity(0);
+    
+    // scale the opened day in OpenDayViewL() back to oroginal size
+    CAlfTextVisual& day = static_cast<CAlfTextVisual&>( iDatesGrid->Visual( iDayVisualIndex ) );
+    ScaleVisualL( day, (KUnitSize/KDayViewXSf), (KUnitSize/KDayViewYSf), KDayViewTransitionTime );
+    
+    // set position of opened day in OpenDayViewL() back to oroginal position
+    day.SetPos( iOriginalDayPos.ValueNow(), KDayViewTransitionTime );
+
+    //set all visuals opacity to 1
+    TAlfTimedValue opacity;
+    opacity.SetValueNow( 0.0 );
+    opacity.SetTarget( 1.0, KDayViewTransitionTime ); // in milliseconds
+    for (TInt i = 0 ; i < KNoOfRows * KNoOfCols ; i ++ )
+        {
+        CAlfTextVisual& day = static_cast<CAlfTextVisual&>( iDatesGrid->Visual( i ) );
+        day.SetOpacity( opacity );
+        }
+    dayEventsVisual.SetOpacity(0); // hide the dedicated dayEventsVisual
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::ScaleVisualL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::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 );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::RotateVisualL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::RotateVisualL(
+        CAlfVisual& aVisual,
+        TReal aInitAngle,
+        TReal aTargetAngle,
+        TInt aTime )
+    {
+    aVisual.EnableTransformationL();
+    
+    TAlfTimedValue angle( aInitAngle );
+    angle.SetTarget( aTargetAngle, aTime );
+    aVisual.Transformation().Rotate( angle , 1.0, 0.0, 0.0 );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetTextStylesL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetTextStylesL(
+        CAlfTextVisual& aTextVisual,
+        const TDesC &aText,
+        TRgb aColor,
+        CAlfTextVisual::TLineWrap aLineWrap,
+        TAlfAlignHorizontal /*aAlignH*/,
+        TAlfAlignVertical /*aAlignV*/,
+        TPoint /*aPoint*/ )
+    {
+    aTextVisual.SetTextL( aText );
+    aTextVisual.SetColor( aColor );
+    aTextVisual.SetWrapping( aLineWrap );
+    aTextVisual.SetAlign( EAlfAlignHLeft, EAlfAlignVTop );
+    aTextVisual.SetPadding( TPoint(5,5) );
+
+    // S60 Font IDs:
+    // EAknLogicalFontPrimaryFont, EAknLogicalFontSecondaryFont, EAknLogicalFontTitleFont, 
+    // EAknLogicalFontDigitalFont, EAknHighestLogicalFont, EAknLogicalFontPrimarySmallFont
+    TInt fontStyleId = KErrNotFound;
+    fontStyleId = iEnv.TextStyleManager().CreatePlatformTextStyleL(
+            EAknLogicalFontPrimarySmallFont,
+            EAlfTextStyleSmall );
+    
+    CAlfTextStyle* style = iEnv.TextStyleManager().TextStyle( fontStyleId );
+    TInt sizeInPixels = style->TextSizeInPixels();
+    style->SetTextSizeInPixels( 20, ETrue );
+    style->SetBold( EFalse );
+    style->SetItalic( EFalse );
+    style->SetUnderline( ETrue );
+    style->SetStrikeThrough( EFalse );
+    aTextVisual.SetTextStyle( style->Id() );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::ShowCalendarEventsL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::ShowCalendarEventsL()
+    {
+    // use last text visual in the grid to show the calendar events
+    CAlfTextVisual& dayEventsVisual =
+        static_cast<CAlfTextVisual&>( iDatesGrid->Visual( (KNoOfRows*KNoOfCols)-1 ) );
+
+    // set dayEventsVisual position at 1st text visual of grid.
+    // to align the day events from below the month name
+    dayEventsVisual.SetPos( iDatesGrid->Visual(0).Pos() );
+    
+    // set the size to fit to bottom right corner of display.
+    TAlfRealRect visualArea = dayEventsVisual.DisplayRectTarget();
+    TAlfRealPoint sizeChange( 200, 200 ); // width, height
+    TAlfRealPoint newSize = TAlfRealPoint( visualArea.Size().iWidth, visualArea.Size().iHeight)  + sizeChange;
+    dayEventsVisual.SetSize( newSize, 0 );
+    
+    // now set the calendar events text
+    SetTextStylesL( dayEventsVisual, iCalendarEventTextBuffer );
+
+    // set opacity to 1 to make it visible
+    TAlfTimedValue opacity;
+    opacity.SetValueNow( 0 );
+    opacity.SetTarget( 1, 500 ); // in milliseconds
+    dayEventsVisual.SetOpacity( opacity );    
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::OfferEventL
+// --------------------------------------------------------------------------
+//
+TBool CAlfExCalendarMonth::OfferEventL(const TAlfEvent& aEvent )
+	{
+    // handle custome vents if any
+    if( aEvent.IsCustomEvent() )
+        {
+        if( iDayView )
+            {
+                switch( aEvent.CustomParameter() )
+                {
+                case EShowCaledarEvents:
+                    ShowCalendarEventsL();
+                    return ETrue;
+    
+                default:
+                    break;
+                }
+            }
+        else
+            return ETrue;
+        }
+    
+    // handle key events
+	if ( aEvent.Code() == EEventKey )
+		{
+		TInt code = aEvent.KeyEvent().iCode;
+		switch( code )
+			{
+            case EKeyBackspace: // TODO - use "Back" softkey
+                if( iDayView )
+                    {
+                    // close day view and return to month view
+                    iDayView = EFalse;
+                    CloseDayViewL();
+                    }
+                return ETrue;
+
+			case 63557: // TODO - replace with key code
+                if( !iDayView )
+                    {
+                    OpenDayViewL();
+                    }
+                return ETrue;
+                
+			case EKeyLeftArrow:
+                if( iDayView )
+                    {
+                    iDayView = EFalse;
+                    CloseDayViewL();
+                    }
+				MoveDayFocusL( -1 );
+				return ETrue;
+				
+			case EKeyRightArrow:
+                if( iDayView )
+                    {
+                    iDayView = EFalse;
+                    CloseDayViewL();
+                    }
+				MoveDayFocusL( 1 );
+				return ETrue;
+
+			case EKeyUpArrow:
+                if( iDayView )
+                    {
+                    iDayView = EFalse;
+                    CloseDayViewL();
+                    }
+				MoveDayFocusL( -7 );
+				return ETrue;
+				
+			case EKeyDownArrow:
+                if( iDayView )
+                    {
+                    iDayView = EFalse;
+                    CloseDayViewL();
+                    }
+                MoveDayFocusL( +7 );
+                return ETrue;
+
+			default:;break;
+			}		
+	
+		}
+	return EFalse;
+	}
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::SetDateGridWeightsL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::SetDateGridWeightsL(
+    CAlfGridLayout* aDatesGrid,
+    TInt aRowIndex, 
+    TInt aWeight )
+    {
+    RArray<TInt> weights;
+    CleanupClosePushL( weights );
+
+    for( TInt i = 1; i <= KNoOfRows; ++i )
+        {
+        User::LeaveIfError( weights.Append( 1 ) );
+        }
+    if( aRowIndex != -1 )
+        {
+        weights.Insert( aRowIndex, aWeight );
+        }
+    
+    aDatesGrid->SetRowsL( weights );
+    CleanupStack::PopAndDestroy( &weights );
+    }
+
+// --------------------------------------------------------------------------
+// CAlfExCalendarMonth::HandleTimerEventL
+// --------------------------------------------------------------------------
+//
+void CAlfExCalendarMonth::HandleTimerEventL()
+    {
+    CAlfExCalendarEngine& calendarEngine = iCalendarControl.CalendarEngine();
+    if( calendarEngine.EventsAvailable( iTime + (TTimeIntervalDays)iFocusedDay ) &&
+            !iDayView ) // AND if day has not been opend already
+        {
+        OpenDayViewL();
+        }
+    }
+
+// end of file
+