--- /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
+