/*
* Copyright (c) 2002 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: Container control for Week View .
*
*/
#include <calcommon.h>
#include <caltime.h>
#include <calinstance.h>
#include <calentry.h>
#include <calinstanceview.h>
#include <calcalendarinfo.h>
#include <AknIconArray.h>
#include <AknsDrawUtils.h>
#include <AknsFrameBackgroundControlContext.h>
#include <AknUtils.h>
#include <AknIconUtils.h>
#include <eikenv.h>
#include <eikfrlbd.h>
#include <eiklabel.h>
#include <gulicon.h>
#include <StringLoader.h>
#include <calencontext.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <caleninstanceid.h> // TCalenInstanceId
#include <layoutmetadata.cdl.h>
#include <centralrepository.h>
#include <calenviewutils.h>
#include <calenservices.h>
#include <calenagendautils.h>
#include <calendateutils.h>
#include <mcalenpreview.h>
#include <Calendar.rsg>
#include <csxhelp/cale.hlp.hrh>
#include <gesturehelper.h> //CGestureHelper
#include "calendarui_debug.h"
#include "calenweekcontainer.h"
#include "calencontainerlayoutmanager.h"
#include "calencontroller.h"
#include "calendrawutils.h"
#include "calenicons.h"
#include "calenpreview.h"
#include "CalenUid.h"
#include "CalendarPrivateCRKeys.h"
#include "calenweeklistboxview.h"
#include "calenweeklistbox.h"
#include "calenweeklistboxlayout.h"
#include "calenweekview.h"
#include "CalenUid.h"
#include "calendar.hrh"
// LOCAL CONSTANTS AND MACROS
const TInt KNonTimedNoteDefautDisplayTime(8);
const TInt KNullMinutes = -1;
const TInt KBeforeActiveTime(0);
const TInt KHoursInADay( 24 );
// METHOD DEFINITIONS
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::DrawBackground(CWindowGc& aGc) const
{
TRACE_ENTRY_POINT;
MAknsControlContext* cc =AknsDrawUtils::ControlContext( this );
if( cc )
{
TRect main_pane( Rect() );
AknsDrawUtils::Background( AknsUtils::SkinInstance(),
cc,
NULL,
aGc,
main_pane );
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// Draws horizontal and vertical grid lines
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::DrawGridLines(CWindowGc& aGc) const
{
TRACE_ENTRY_POINT;
TRect main_pane_Rect = ReducePreview( Rect() );
TAknLayoutRect main_cale_week_pane;
main_cale_week_pane.LayoutRect( main_pane_Rect, AknLayoutScalable_Apps::main_cale_week_pane().LayoutLine() );
// FIXME: use member variable?
TAknLayoutRect listscroll_cale_week_pane;
TWeekListBoxLayout lay( UseInfobar(), UseToolbar(), UsePreview(), main_pane_Rect );
TInt layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::EListScrollCaleWeekPane );
listscroll_cale_week_pane.LayoutRect( main_cale_week_pane.Rect(), AknLayoutScalable_Apps::listscroll_cale_week_pane(layoutVariant).LayoutLine() );
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::ECaleWeekScrollPaneG1);
const TRect parentRect = listscroll_cale_week_pane.Rect();
// Primary lines were drawn in different functions
TAknLayoutRect horizontalPrimaryLine;
horizontalPrimaryLine.LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g1( layoutVariant ).LayoutLine() );
TAknLayoutRect verticalPrimaryLine;
verticalPrimaryLine.LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g2( layoutVariant ).LayoutLine() );
TRgb lineColor( verticalPrimaryLine.Color() );
AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), lineColor,
KAknsIIDQsnLineColors,
EAknsCIQsnLineColorsCG1);
aGc.SetBrushColor( lineColor );
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
aGc.Clear( verticalPrimaryLine.Rect() );
aGc.Clear( horizontalPrimaryLine.Rect() );
// There are six secondary vertical lines
const TInt verticalLineCount = 6;
TAknLayoutRect verticalLines[ verticalLineCount ];
verticalLines[0].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g3( layoutVariant ).LayoutLine() );
verticalLines[1].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g4( layoutVariant ).LayoutLine() );
verticalLines[2].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g5( layoutVariant ).LayoutLine() );
verticalLines[3].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g6( layoutVariant ).LayoutLine() );
verticalLines[4].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g7( layoutVariant ).LayoutLine() );
verticalLines[5].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g8( layoutVariant ).LayoutLine() );
// and seven secondary horizontal lines
const TInt horizontalLineCount = 7;
TAknLayoutRect horizontalLines[ horizontalLineCount ];
horizontalLines[0].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g9( layoutVariant ).LayoutLine() );
horizontalLines[1].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g10( layoutVariant ).LayoutLine() );
horizontalLines[2].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g11( layoutVariant ).LayoutLine() );
horizontalLines[3].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g12( layoutVariant ).LayoutLine() );
horizontalLines[4].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g13( layoutVariant ).LayoutLine() );
horizontalLines[5].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g14( layoutVariant ).LayoutLine() );
horizontalLines[6].LayoutRect( parentRect, AknLayoutScalable_Apps::cale_week_scroll_pane_g15( layoutVariant ).LayoutLine() );
lineColor = verticalLines[0].Color();
AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), lineColor,
KAknsIIDQsnLineColors,
EAknsCIQsnLineColorsCG2);
aGc.SetBrushColor( lineColor );
aGc.SetBrushStyle( CGraphicsContext::ESolidBrush );
for (TInt i=0; i < verticalLineCount; ++i)
{
aGc.Clear( verticalLines[i].Rect() );
}
for (TInt i=0; i < horizontalLineCount; ++i)
{
aGc.Clear( horizontalLines[i].Rect() );
}
TRACE_EXIT_POINT;
}
// ================= MEMBER FUNCTIONS =======================
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CCalenWeekContainer
// C++ constructor can NOT contain any code, that might leave.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenWeekContainer::CCalenWeekContainer( CCalenNativeView* aView,
TTime& aTime,
TInt& aSelectedRowNumber,
TTimeIntervalMinutes& aFirstRowTime,
MCalenServices& aServices )
: CCalenContainer( aView, aServices ),
// iCurrentDay( TInt64(0) ),
iStartDay( TInt64(0) ),
iViewPopulationComplete( EFalse ),
iTime( aTime ),
iSelectedRowNumber( aSelectedRowNumber ),
iFirstRowTime( aFirstRowTime )
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::~CCalenWeekContainer
// Destructor
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalenWeekContainer::~CCalenWeekContainer()
{
TRACE_ENTRY_POINT;
delete iListBox;
delete iDesArray;
CleanupInstances();
ResetSlotTable();
delete iBackgroundSkinContext;
delete iGestureControl;
TRACE_EXIT_POINT;
}
// ---------------------------------------------------------
// CCalenWeekContainer::SetCursorToActiveDayL
// Sets cursor in Active day
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SetCursorToActiveDayL()
{
TRACE_ENTRY_POINT;
iTime = CCalenContainer::DateFromContextL( iServices.Context() );
TLocale locale;
TInt column( iTime.DayNoInWeek() - locale.StartOfWeek() );
if( column < 0 )
{
column += KCalenDaysInWeek;
}
iColumn = column;
TTime startDay( iTime - TTimeIntervalDays( column ) );
if (iStartDay != startDay)
{
iStartDay = startDay;
iView->BeginRepopulationL();
iListBox->View()->SetDisableRedraw(ETrue);
}
else if ( iViewPopulationComplete )
{
iListBox->View()->SetDisableRedraw(ETrue);
SelectHighlightedCellAndVisibleRangeL();
iListBox->View()->SetDisableRedraw(EFalse);
FocusChangeForPopupL();
UpdateStatusPaneAndExtensionsL();
DrawNow();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::RedrawLocaleChangeL
// Redrawing when locale change
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::RedrawLocaleChangeL(TLocaleChangeRedraw aFlag) // ERedrawAll | ERedrawWeek
{
TRACE_ENTRY_POINT;
if (aFlag == ERedrawAll)
{
iStartDay = Time::NullTTime();
SetCursorToActiveDayL();
}
FocusChangeForPopupL();
UpdateStatusPaneAndExtensionsL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TInt CCalenWeekContainer::HighlightRowFromActiveContextL(TInt aColumn)
{
TRACE_ENTRY_POINT;
TInt row = KErrNotFound;
MCalenContext& context = iServices.Context();
// row is selected while moving up/dowm left/right
if ( iSelectedRowNumber != KErrNotFound )
{
row = iSelectedRowNumber;
iFirstRowTime = context.FocusTime();
if(iFirstRowTime != TTimeIntervalMinutes(KNullMinutes))
{
iRow = EFalse;
}
else
{
iRow = ETrue;
row = FindItemFromColumnL( context.InstanceId(),aColumn );
}
if(iFirstRowTime == TTimeIntervalMinutes(0))
{
row = KErrNotFound;
iFirstRowTime = TTimeIntervalMinutes(KNullMinutes);
}
}
else if ( !(context.InstanceId() == TCalenInstanceId::NullInstanceId() ) )
{
// based on the instanceid
row = FindItemFromColumnL( context.InstanceId(),
aColumn );
}
else if ( context.FocusDateAndTimeL().TimeUtcL() != Time::NullTTime() )
{
// weekview is activated from other views/view switching
if( iSelectedRowNumber == KErrNotFound &&
iFirstRowTime == TTimeIntervalMinutes(KNullMinutes) )
{
row = KErrNotFound;
}
else
{
// based on the context time
row = FindRowForTime(
CalenDateUtils::RoundToPreviousHour(
CalenDateUtils::TimeOfDay(
context.FocusDateAndTimeL().TimeLocalL().DateTime() ) ) );
}
}
// if we still haven't found anything to highlight,
// highlight to first entry or 8:00 row.
if (row == KErrNotFound)
{
row = FindFirstItemOfColumn(aColumn);
if (row == KErrNotFound)
{
TInt eightOclock = KNonTimedNoteDefautDisplayTime * KCalenMinutesInHour;
row = FindRowForTime( eightOclock );
iTopRowDefault = ETrue;
}
}
ASSERT( row != KErrNotFound );
TRACE_EXIT_POINT;
return row;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SelectHighlightedCellAndVisibleRangeL()
// Sets highlight item in ListBox at active time
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SelectHighlightedCellAndVisibleRangeL()
{
TRACE_ENTRY_POINT;
TInt row = HighlightRowFromActiveContextL( iColumn );
TInt topRow = SearchTopIndexL( iColumn );
if (row == KErrNotFound)
{
// If not yet found, Then just take 8:00 row
TInt eightOclock = KNonTimedNoteDefautDisplayTime * KCalenMinutesInHour;
row = FindRowForTime(eightOclock);
}
SetHighlightAndVisibleRange( row, iColumn, topRow );
SetActiveContextFromHighlightL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SetActiveContextFromHighlightL
// Set Active date and time
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SetActiveContextFromHighlightL(TBool aInstAvailable)
{
TRACE_ENTRY_POINT;
MCalenContext& context = iServices.Context();
TCalTime currentDayCalTime;
TDateTime dt = iTime.DateTime();
currentDayCalTime.SetTimeLocalL( iTime );
context.SetFocusDateAndTimeL( currentDayCalTime,
TVwsViewId( KUidCalendar, KUidCalenWeekView ) );
TInt row = iListBox->View()->CurrentItemIndex();
// In under processing of DoStepL(), row is -1.
if (row >= 0)
{
CWeekSlotArrayPtr slotTable = iSlotTable[iColumn];
const CCalHourItem& itemInfo = *(*slotTable)[row];
// Focused item
// 1. Non-timed item, 1 for each cell, on same/ different day
// * Focus on instanceId and datetime
// 2. Timed item, 1-n for each cell, on same/ different day
// * Focus on datetime
if( itemInfo.HasInstance() && aInstAvailable && iViewPopulationComplete)
{
TCalenInstanceId instId = TCalenInstanceId::CreateL( *itemInfo.iInstance );
if( !itemInfo.IsTimed() ) // todo/anniv/memo
{
dt.SetHour( KNonTimedNoteDefautDisplayTime );
currentDayCalTime.SetTimeLocalL( TTime( dt ) );
context.SetFocusDateAndTimeAndInstanceL( currentDayCalTime, instId,
TVwsViewId( KUidCalendar, KUidCalenWeekView ) );
}
else // meeting
{
TTime focusTime = CalenDateUtils::BeginningOfDay( iTime ) + itemInfo.iStartTime;
currentDayCalTime.SetTimeLocalL( focusTime );
context.SetFocusDateAndTimeAndInstanceL( currentDayCalTime, instId,
TVwsViewId( KUidCalendar, KUidCalenWeekView ) );
}
}
else if( itemInfo.iStartTime.Int() == KErrNotFound ) // empty non-timed cell
{
dt.SetHour( KNonTimedNoteDefautDisplayTime );
currentDayCalTime.SetTimeLocalL( TTime( dt ) );
context.SetFocusDateAndTimeL( currentDayCalTime,
TVwsViewId( KUidCalendar, KUidCalenWeekView ) );
}
else // empty timed cell
{
TTime focusTime = CalenDateUtils::BeginningOfDay( iTime ) + itemInfo.iStartTime;
currentDayCalTime.SetTimeLocalL( focusTime );
context.SetFocusDateAndTimeL( currentDayCalTime,
TVwsViewId( KUidCalendar, KUidCalenWeekView ) );
}
FocusChangeForPopupL();
}
// Hide/unhide "today" toolbar item based on the focused day
UpdateTodayToolbarItemL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CalcDayFromColumn
// Calculates and Sets day from ListBox column
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::CalcDayFromColumn()
{
TRACE_ENTRY_POINT;
iTime = iStartDay + TTimeIntervalDays( iColumn );
TDateTime dt = iStartDay.DateTime();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::PopulatesDayListsL
// Populate whole week daylist from Agenda server
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::PopulatesDayListsL()
{
TRACE_ENTRY_POINT;
TTime indexDay( iStartDay );
TTimeIntervalDays oneDay( 1 );
RArray<TInt> colIdArray;
CCalenNativeView::GetActiveCollectionidsL( iServices, colIdArray );
if(colIdArray.Count() > 0)
{
for( TInt i(0); i < KCalenDaysInWeek; ++i, indexDay+=oneDay )
{
iIdList[i].ResetAndDestroy();
CalenAgendaUtils::CreateEntryIdListForDayL( iIdList[i],
iServices.InstanceViewL(colIdArray),
indexDay );
}
}
else
{
for( TInt i(0); i < KCalenDaysInWeek; ++i, indexDay+=oneDay )
{
iIdList[i].ResetAndDestroy();
CalenAgendaUtils::CreateEntryIdListForDayL( iIdList[i],
iServices.InstanceViewL(),
indexDay );
}
}
colIdArray.Reset();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::InsertTimedNotesToSlotTableL
//
// After this function, slotTable for each column (weekday)
// will contain:
// 1) for each hour row without meetings:
// SHourItem.iStartTime = hour as a minutes from beginning of day
// SHourItem.iInstanceId = NullInstanceId
// SHourItem.iTimedNote = EFalse
// SHourItem.iHourData = -- (nothing set)
// 2) for each hour row with at least one meeting:
// SHourItem.iStartTime = hour as a minutes from beginning of day
// SHourItem.iInstanceId = instance id of first entry falling to the hour
// (sorting order as in day view)
// SHourItem.iTimedNote = ETrue
// SHourItem.iHourData = hour data as a table of six color values.
//
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::InsertTimedNotesToSlotTableL()
{
TRACE_ENTRY_POINT;
//Parsing items for each day in week
TTime instStart;
TTime instEnd;
TDateTime daybegin;
TDateTime startDateTime;
TDateTime endDateTime;
TTimeIntervalMinutes durationInMinutes;
TTimeIntervalHours instStartHour;
TTimeIntervalHours instEndHour;
TTimeIntervalMinutes instStartMin;
TTimeIntervalMinutes instEndMin;
TInt markStart;
TInt markEnd;
TInt instEndHourInt;
TInt instStartMinInt;
TInt instEndMinInt;
TInt eventsInHour;
TInt hours;
TInt KEveryMinutes = KCalenMinutesInHour / KEventsInHour; //10min
// For each day in a week
for (TInt dayIx(0); dayIx < KCalenDaysInWeek; dayIx++)
{
TTime day((iStartDay + TTimeIntervalDays(dayIx)));
CWeekSlotArrayPtr slotTable = iSlotTable[dayIx];
RPointerArray<CCalInstance>& dayList = iIdList[dayIx]; //Event for day
//Get start time of day
TTime dayBegin = CalenDateUtils::BeginningOfDay( day );
//Initialize the ptr list with empty items but take account the non timed events
TInt beginMinutes(0);
// For each hour in a day initialisation for the slot table and other hour item required.
for(TInt i(0) ; i < KCalenHoursInDay; i++)
{
CCalHourItem* emptyInfo = CCalHourItem::NewL();
CleanupStack::PushL( emptyInfo );
emptyInfo->iInstance = NULL;
emptyInfo->iStartTime = TTimeIntervalMinutes( beginMinutes );
emptyInfo->iTimedNote = EFalse;
// For instances before non - timed notes
if(i < KNonTimedNoteDefautDisplayTime)
{
slotTable->InsertL(i, emptyInfo);
}
else // For instances after non - timed notes
{
emptyInfo->iTimedNote=ETrue;
slotTable->AppendL(emptyInfo);
}
CleanupStack::Pop();
beginMinutes = beginMinutes + KCalenMinutesInHour;
}
//Go through the whole instance list
for(TInt item(0); item < dayList.Count(); item++)
{
RPointerArray<CCalCalendarInfo> calendarInfoList;
iServices.GetAllCalendarInfoL(calendarInfoList);
CleanupClosePushL(calendarInfoList);
CCalInstance* inst = dayList[item];
CCalEntry& entry = inst->Entry();
TCalCollectionId colId = inst->InstanceIdL().iCollectionId;
HBufC* calendarFileName = iServices.GetCalFileNameForCollectionId(colId).AllocLC();
TInt index = calendarInfoList.Find( *calendarFileName,
CCalenWeekContainer::CalendarInfoIdentifierL);
CleanupStack::PopAndDestroy(calendarFileName);
//Handle only the timed node, ignore nontimed and non-allday
if( ( IsTimedNoteL( entry ) || CalenViewUtils::IsAlldayEventL(*inst) )
&& index != KErrNotFound && calendarInfoList[index]->Enabled() )
{
//Get the start and end time of instance
instStart = inst->Time().TimeLocalL();
entry.EndTimeL().TimeLocalL().MinutesFrom( entry.StartTimeL().TimeLocalL(), durationInMinutes );
instEnd = instStart + durationInMinutes;
// Get the day' begin time, instance start time and
// instance end time in TDateTime format.
daybegin = dayBegin.DateTime();
startDateTime = instStart.DateTime();
endDateTime = instEnd.DateTime();
// If the instance start time is before the day begin,
// then initialise it to day begin's time
if(startDateTime.Year() != daybegin.Year() ||
startDateTime.Month() != daybegin.Month() ||
startDateTime.Day() != daybegin.Day() )
{
startDateTime = daybegin;
}
// If the instance end day one or more days ahead than
// day begin, then initialise it to end of day begin
if(endDateTime.Year() != daybegin.Year() ||
endDateTime.Month() != daybegin.Month() ||
endDateTime.Day() != daybegin.Day() )
{
endDateTime = daybegin;
endDateTime.SetHour(23);
endDateTime.SetMinute(59);
}
//Get time interval between beginning of day and instance start and end time
// in minutes in TTimeIntervalMinutes format.
TTime(startDateTime).HoursFrom(dayBegin, instStartHour);
TTime(endDateTime).HoursFrom(dayBegin,instEndHour);
//Get time interval between beginning of day and instance start and end time
// in hours in TTimeIntervalHours format.
TTime(startDateTime).MinutesFrom(dayBegin,instStartMin);
TTime(endDateTime).MinutesFrom(dayBegin,instEndMin);
// The no. of hours from day begin to instance end time
instEndHourInt = instEndHour.Int(); //From Day Begin
// The no. of min from day begin to instance start time.
instStartMinInt = instStartMin.Int();
// The no. of min from day begin to instance end time
instEndMinInt = instEndMin.Int();
// The hour to start with.
hours = instStartHour.Int();
eventsInHour = startDateTime.Minute() / 10;
// The minute to start with.
markStart = instStartMin.Int();
// The minute to end with.
markEnd = markStart + KEveryMinutes;
// From instance start hour to end hour
for( ; hours <= instEndHourInt; hours++ )
{
TInt itemIndex(0);
// Before non - timed notes
if(hours < KNonTimedNoteDefautDisplayTime )
{
itemIndex = hours;
}
else // After non-time notes
{
itemIndex = hours + iNonTimedAreaRowCount;
}
//Get correct item
CCalHourItem& itemInfo = *(*slotTable)[itemIndex];
itemInfo.iInstance = inst;
TUint32 color;
// For all the events in this hour
for( ; eventsInHour < KEventsInHour; eventsInHour++ ) // 6 times
{
// If this instance is there between mark start and end
if( ( instStartMinInt >= markStart && instStartMinInt < markEnd) ||
( instStartMinInt <= markStart && instEndMinInt > markStart) )
{
if( itemInfo.iHourData.Event(eventsInHour) )
{
// conflicting meeting from same/different db
color = (TUint32)EManyEvents;
}
else
{
color = calendarInfoList[index]->Color().Value();
if(color == KRgbBlack.Value())
{
color = EBlackColoredEvent;
}
}
itemInfo.iHourData.SetEvent( eventsInHour, color );
}
markStart += KEveryMinutes;
markEnd += KEveryMinutes;
}
eventsInHour = 0;
}
}
CleanupStack::PopAndDestroy(&calendarInfoList);
}
ClearOneDayEntryCache();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::InsertNonTimedNotesToSlotTableL
//
// After this function, slotTable for each column (weekday)
// will contain:
// 1) for each empty non-timed note row (those days that have less
// non-timed notes than others, contain empty rows):
// SHourItem.iStartTime = KCalenActiveTimeNull
// SHourItem.iInstanceId = NullInstanceId
// SHourItem.iTimedNote = EFalse
// SHourItem.iHourData = -- (nothing set)
// 2) for each non-timed note row with note :
// SHourItem.iStartTime = KCalenActiveTimeNull
// SHourItem.iInstanceId = instance id of entry
// SHourItem.iTimedNote = EFalse
// SHourItem.iHourData = icon index representing non-timed note
//
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::InsertNonTimedNotesToSlotTableL()
{
TRACE_ENTRY_POINT;
TInt maxNotes( 0 );
TInt nonTimedNotes[ KCalenDaysInWeek ];
TInt dayIx( 0 );
for( dayIx = 0; dayIx < KCalenDaysInWeek; ++dayIx )
{
nonTimedNotes[dayIx] = 0;
// instances
RPointerArray<CCalInstance>& dayList = iIdList[dayIx];
for (TInt i(0); i < dayList.Count(); ++i)
{
CCalEntry& entry = dayList[i]->Entry();
CCalEntry::TType type = entry.EntryTypeL();
TCalCollectionId colId = dayList[i]->InstanceIdL().iCollectionId;
if ( type != CCalEntry::EAppt && !CalenViewUtils::IsAlldayEventL( *( dayList[i] ) ) )
{
nonTimedNotes[dayIx] += 1;
}
}
maxNotes = Max( maxNotes, nonTimedNotes[dayIx] );
}
iNonTimedAreaRowCount = maxNotes;
for( dayIx = 0; dayIx < KCalenDaysInWeek; ++dayIx )
{
CWeekSlotArrayPtr slotTable = iSlotTable[dayIx];
// Empty slots
TInt nonTimedAreaRow( 0 );
for ( ; nonTimedAreaRow < iNonTimedAreaRowCount - nonTimedNotes[dayIx]; ++nonTimedAreaRow )
{
// create new hour item
CCalHourItem* itemInfo = CCalHourItem::NewL();
CleanupStack::PushL( itemInfo );
itemInfo->iStartTime = TTimeIntervalMinutes( KNullMinutes );
itemInfo->iTimedNote = EFalse;
// Empty slots
itemInfo->iInstance = NULL;
slotTable->AppendL( itemInfo );
CleanupStack::Pop(); // iteminfo
// we just put non-timed notes to slot table
}
// Slots with notes
if (nonTimedAreaRow < iNonTimedAreaRowCount)
{
RPointerArray<CCalInstance>& dayList = iIdList[dayIx];
for( TInt item(0); item < dayList.Count(); ++item )
{
CCalEntry& entry = dayList[item]->Entry();
TCalCollectionId colId = dayList[item]->InstanceIdL().iCollectionId;
if( !IsTimedNoteL( entry ) && !CalenViewUtils::IsAlldayEventL( *( dayList[item] ) ) ) ///*&& index != KErrNotFound && infoArray[index]->GetCalendarStatus()*/)
{
++nonTimedAreaRow;
CCalHourItem* itemInfo = CCalHourItem::NewL();
CleanupStack::PushL( itemInfo );
itemInfo->iInstance = dayList[item];
// set icon index
TInt iconIndex = static_cast<TInt>( IconIndexFromEntryL( entry ,
CalenViewUtils::IsAlldayEventL( *( dayList[ item ] ) ) ) );
itemInfo->iHourData.SetIconIndex( iconIndex );
slotTable->AppendL( itemInfo );
CleanupStack::Pop(); // iteminfo
}
}
}
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SetListBoxDataL
// Sets Week data to ListBox
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SetListBoxDataL()
{
TRACE_ENTRY_POINT;
iListBox->View()->SetDisableRedraw(ETrue);
TLocale locale;
const TInt resID( locale.TimeFormat() == ETime24 ?
R_QTN_TIME_USUAL : R_CALEN_WEEKVIEW_TIMEFORMAT_12 );
HBufC* timeFormat = StringLoader::LoadLC( resID, iEikonEnv );
iDesArray->Reset();
CWeekSlotArrayPtr firstDaySlotTable = iSlotTable[0];
TInt count( firstDaySlotTable->Count() );
for (TInt row(0); row < count; ++row)
{
TTime time(TInt64(0));
const CCalHourItem& hourItemInfo = *(*firstDaySlotTable)[row];
SDisplayData dispData;
if( hourItemInfo.iStartTime.Int() >= 0 )
{
time += hourItemInfo.iStartTime;
time.FormatL(dispData.iHourDes, *timeFormat);
}
for (TInt day(0); day < KCalenDaysInWeek; ++day)
{
CWeekSlotArrayPtr daySlotTable = iSlotTable[day];
const CCalHourItem& itemInfo = *(*daySlotTable)[row];
dispData.iHourData[day] = itemInfo.iHourData;
}
TInt size((sizeof(dispData) / sizeof(TText)));
TPtr16 ptr((TUint16 *)&dispData, size, size);
iDesArray->AppendL(ptr);
}
CleanupStack::PopAndDestroy(timeFormat);
iListBox->SetStartDay(iStartDay);
iListBox->HandleItemAdditionL();
static_cast<CCalenWeekLBView*>(iListBox->View())->SetColumn(iColumn);
SelectHighlightedCellAndVisibleRangeL();
iListBox->View()->SetDisableRedraw(EFalse);
DrawDeferred();
//Changing RSK to back / exit
WeekView().UpdateCbaL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SearchMatchedNoteL
// The note contained in within a time is searched.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SearchMatchedNoteL(RPointerArray<CCalInstance>& aDayList,// InstanceId array
TTime aTime) // Search Timezone
{
TRACE_ENTRY_POINT;
TTime aTimeEnd( aTime );
aTimeEnd += TTimeIntervalHours( 1 );
for( TInt i(0); i < aDayList.Count(); ++i )
{
CCalInstance* instance = aDayList[i];
CCalEntry& entry = instance->Entry();
if( IsTimedNoteL( entry ) )
{
TTime start( instance->Time().TimeLocalL() );
TTimeIntervalMinutes duration;
entry.EndTimeL().TimeLocalL().MinutesFrom( entry.StartTimeL().TimeLocalL(), duration );
TTime end = start +duration;
if( (start >= aTime && start < aTimeEnd) ||
(start <= aTime && end > aTime) )
{
CleanupStack::PushL( instance );
iEntryCache.AppendL( instance );
CleanupStack::Pop(); // instance
}
}
}
if( !iEntryCache.Count() )
{
iEntryCache.Reset();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::IsTimedNote
// Check specified entry whether Timed Note.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TBool CCalenWeekContainer::IsTimedNoteL(CCalEntry& aEntry)
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
return( aEntry.EntryTypeL() == CCalEntry::EAppt );
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::ResetSlotTable
// Reset slot time table.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::ResetSlotTable()
{
TRACE_ENTRY_POINT;
// loop through days
for (TInt dayIx(0); dayIx < KCalenDaysInWeek; ++dayIx)
{
// current day
CWeekSlotArrayPtr daySlotTable = iSlotTable[dayIx];
// go thorugh items in a day
if (daySlotTable)
{
for (TInt i=0; i<daySlotTable->Count(); ++i)
{
// free instances on a day
CCalHourItem* itemInfo = (*daySlotTable)[i];
delete itemInfo;
(*daySlotTable)[i]=NULL;
}
// delete day
delete daySlotTable;
}
iSlotTable[dayIx] = NULL;
}
TRACE_EXIT_POINT;
}
void CCalenWeekContainer::InitSlotTableL()
{
TRACE_ENTRY_POINT;
ResetSlotTable();
for (TInt dayIx(0); dayIx < KCalenDaysInWeek; ++dayIx)
{
iSlotTable[dayIx] = new(ELeave) CArrayFixFlat<CCalHourItem*>(10);
}
TRACE_EXIT_POINT;
}
TInt CCalenWeekContainer::FindFirstItemOfColumn(TInt aColumn)
{
TRACE_ENTRY_POINT;
CWeekSlotArrayPtr slotTable = iSlotTable[aColumn];
TInt count = slotTable->Count();
for(TInt index = 0; index < count; ++index)
{
const CCalHourItem& itemInfo = *(*slotTable)[index];
if (!(itemInfo.iInstance==NULL))
{
TRACE_EXIT_POINT;
return index;
}
}
TRACE_EXIT_POINT;
return KErrNotFound;
}
TInt CCalenWeekContainer::FindItemFromColumnL( const TCalenInstanceId& aId,
TInt aColumn)
{
TRACE_ENTRY_POINT;
CWeekSlotArrayPtr slotTable = iSlotTable[aColumn];
TInt count = slotTable->Count();
CCalEntry::TType type = aId.iType;
if( type == CCalEntry::ETodo ||
type == CCalEntry::EEvent ||
type == CCalEntry::EReminder ||
type == CCalEntry::EAnniv )
{ // non-timed entry, each entry should occupy 1 cell in the weekview
for(TInt index = 0; index < count; ++index)
{
const CCalHourItem& itemInfo = *(*slotTable)[index];
CCalInstance * itemInstance = itemInfo.iInstance;
if (itemInstance && (itemInstance->Entry().LocalUidL() == aId.iEntryLocalUid))
{
TRACE_EXIT_POINT;
return index;
}
}
}
else if( aId.iType == CCalEntry::EAppt )
{ // timed entry, e.g Meeting, should search for it's timed cell
TInt hr = aId.iInstanceTime.DateTime().Hour();
if( hr < KNonTimedNoteDefautDisplayTime )
{
hr = hr;
}
else
{
hr = hr + count - KHoursInADay;
}
TRACE_EXIT_POINT;
return hr;
}
// unknown entry type
TRACE_EXIT_POINT;
return KErrNotFound;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::FindRowForTime
// Searches specified time
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TInt CCalenWeekContainer::FindRowForTime(TTimeIntervalMinutes aTime)
{
TRACE_ENTRY_POINT;
// We can use first column, as all columns have same amount of non-timed
// rows.
CWeekSlotArrayPtr slotTable = iSlotTable[0];
for(TInt row = 0; row < slotTable->Count(); ++row)
{
const CCalHourItem& item = *(*slotTable)[row];
if (item.iStartTime == aTime)
{
return row;
}
}
TRACE_EXIT_POINT;
return KErrNotFound;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SetHighlightAndVisibleRange
// Sets highlight item in ListBox
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SetHighlightAndVisibleRange(
TInt aRow, // Selected item index in ListBox
TInt aColumn, // Day of the week
TInt aTopRow) // Top item index in ListBox
{
TRACE_ENTRY_POINT;
__ASSERT_ALWAYS(aRow != KErrNotFound, User::Invariant());
__ASSERT_ALWAYS(aColumn >= 0, User::Invariant());
__ASSERT_ALWAYS(aColumn < KCalenDaysInWeek, User::Invariant());
// Purpose of the function is to set position of focus and
// set and select topmost visible row.
// Set highlight
iListBox->SetCurrentItemIndex(aRow);
CCalenWeekLBView* view =
static_cast<CCalenWeekLBView*>( iListBox->View() );
if (aColumn != view->Column())
{
view->SetColumn(aColumn, ETrue);
}
// Select topmost visible row
if (KErrNotFound == aTopRow)
{
aTopRow = aRow;
}
// FIXME: Take middle SetTopItemIndex calls away
TInt top(aTopRow < 0 ? aRow - KBeforeActiveTime : aTopRow);
TInt items(view->NumberOfItemsThatFitInRect(view->ViewRect()));
CWeekSlotArrayPtr slotTable = iSlotTable[aColumn];
top = Min(top, slotTable->Count() - items);
top = Max(top, 0);
iListBox->SetTopItemIndex(top);
if (top > aRow)
{
iListBox->SetTopItemIndex(aRow);
}
else if (iListBox->BottomItemIndex() <= aRow)
{
iListBox->SetTopItemIndex(aRow - items + 1);
CWeekSlotArrayPtr firstDaySlotTable = iSlotTable[0];
const CCalHourItem& itemInfo = *(*firstDaySlotTable)[aRow];
if ( (! itemInfo.IsTimed()) && aRow == iListBox->BottomItemIndex())
{
TTimeIntervalMinutes bottomTime =
KNonTimedNoteDefautDisplayTime * KCalenMinutesInHour;
TInt bottomIndex = FindRowForTime(bottomTime) - (items - 1);
if (bottomIndex > aRow)
{
iListBox->SetCurrentItemIndex(bottomIndex);
}
}
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::ClearOneDayEntryCache
// Clear entry of array for cash
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::ClearOneDayEntryCache()
{
TRACE_ENTRY_POINT;
iOneDayEntryCache.ResetAndDestroy();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::TopTime
// Gets time of top item in ListBox
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TTimeIntervalMinutes CCalenWeekContainer::TopTime() const
{
TRACE_ENTRY_POINT;
CWeekSlotArrayPtr slotTable = iSlotTable[0];
TInt index(iListBox->TopItemIndex());
const CCalHourItem& item = *(*slotTable)[index];
TRACE_EXIT_POINT;
return item.iStartTime;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::UpdateSize
// Do layout changes after calendar settings are
// changed. No necessary actions for this view.
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::UpdateSize()
{
TRACE_ENTRY_POINT;
SizeChanged();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::ConstructImplL
// Third phase constructor.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::ConstructImplL()
{
TRACE_ENTRY_POINT;
TLocale locale;
// Create preview pane
TRect aRect = PreviewRectL();
iPreview = iServices.CustomPreviewPaneL(aRect);
// ownership of builder transferred
// 3) Listbox
iListBox = new (ELeave) CCalenWeekListbox( *this );
// compile error argument is (CCoeControl*, TInt aFlag)
iListBox->ConstructL(this);
iListBox->SetBorder(TGulBorder::ENone);
iListBox->DisableScrolling(ETrue);
// Single click integration
iListBox->DisableSingleClick( ETrue );
// 4) Listbox model
iDesArray = new(ELeave) CDesCArrayFlat(5);
CTextListBoxModel* model = iListBox->Model();
model->SetItemTextArray(iDesArray);
model->SetOwnershipType(ELbmDoesNotOwnItemArray);
iListBox->HandleItemAdditionL();
// 5) Icons
CArrayPtr<CGulIcon>* iconArray = iListBox->ItemDrawer()->FormattedCellData()->IconArray();
if(iconArray)
{
iconArray->ResetAndDestroy();
delete iconArray; // owned by CFormattedCellListBoxData
iconArray = NULL; // to suppress codescanner error
iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(NULL);
}
CArrayPtr<CGulIcon>* icons = CreateIconsL( iIconIndices );
iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(icons);
iListBox->SetCursorObserver(this);
// 6) Scroll bar
iListBox->CreateScrollBarFrameL(ETrue);
iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
// 7) Background skin contexts
PIM_TRAPD_HANDLE( CCalenWeekContainer::ConstructBackgroundContextL() );
iRow = EFalse;
iTopRowDefault = EFalse;
iGestureControl = GestureHelper::CGestureHelper::NewL( *this );
iGestureControl->SetDoubleTapEnabled( EFalse );
iGestureControl->SetHoldingEnabled( EFalse );
TRACE_EXIT_POINT;
}
void CCalenWeekContainer::ConstructBackgroundContextL()
{
TRACE_ENTRY_POINT;
TRect dummy(0,0,0,0);
if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() )
{
iBackgroundSkinContext = CAknsFrameBackgroundControlContext::NewL(
KAknsIIDQsnFrCale, dummy, dummy, EFalse );
iHeadingBgContext = CAknsFrameBackgroundControlContext::NewL(
KAknsIIDQsnFrCaleHeading, dummy, dummy, EFalse );
iSideBgContext = CAknsFrameBackgroundControlContext::NewL(
KAknsIIDQsnFrCaleSide, dummy, dummy, EFalse );
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::NotifyChangeDateL
// Date change operation notification handler.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::NotifyChangeDateL()
{
TRACE_ENTRY_POINT;
SetCursorToActiveDayL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SizeChanged
// Resizes child controls
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SizeChanged()
{
TRACE_ENTRY_POINT;
/* LAF doesn't specify week view listbox directly.
* Calculation of listbox rect is done inside listbox.
*/
CCalenContainer::SizeChanged( Rect() );
TRAP_IGNORE(iLayoutManager->GetLayoutAndExtensionL());
TRect main_pane = ReducePreview( Rect() );
TAknLayoutRect main_cale_week_pane;
main_cale_week_pane.LayoutRect( main_pane, AknLayoutScalable_Apps::main_cale_week_pane().LayoutLine() );
TWeekListBoxLayout layToolBar( UseInfobar(), UseToolbar(), UsePreview(), main_pane );
TInt layoutToolBarVariant = layToolBar.LayoutVariantIndex(TWeekListBoxLayout::EListScrollCaleWeekPane);
// Cached layout value:
i_listscroll_cale_week_pane.LayoutRect( main_cale_week_pane.Rect(),
AknLayoutScalable_Apps::listscroll_cale_week_pane(layoutToolBarVariant).LayoutLine() );
TWeekListBoxLayout lay( UseInfobar(), UseToolbar(), UsePreview(), main_pane );
iListBox->SetRect( iListBox->LayoutRect() );
TInt layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::EScrollPaneCp08);
AknLayoutUtils::LayoutVerticalScrollBar( iListBox->ScrollBarFrame(),
i_listscroll_cale_week_pane.Rect(),
AknLayoutScalable_Apps::scroll_pane_cp08( layoutVariant ).LayoutLine() );
if( iBgContext && iHeadingBgContext && iSideBgContext )
{
TAknLayoutRect bg_cale_pane_cp01;
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::EBgCalePaneCp01);
bg_cale_pane_cp01.LayoutRect( i_listscroll_cale_week_pane.Rect(), AknLayoutScalable_Apps::bg_cale_pane_cp01( layoutVariant ).LayoutLine() );
TAknLayoutRect cale_bg_pane_center;
cale_bg_pane_center.LayoutRect( bg_cale_pane_cp01.Rect(), AknLayoutScalable_Apps::cale_bg_pane_g1().LayoutLine() );
iBackgroundSkinContext->SetFrameRects( bg_cale_pane_cp01.Rect(), cale_bg_pane_center.Rect() );
// Heading pane layout
TAknLayoutRect bg_cale_heading_pane;
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::EBgCaleHeadingPane);
bg_cale_heading_pane.LayoutRect( i_listscroll_cale_week_pane.Rect(), AknLayoutScalable_Apps::bg_cale_heading_pane( layoutVariant ).LayoutLine() );
// center
TAknLayoutRect bg_cale_heading_pane_g1;
bg_cale_heading_pane_g1.LayoutRect( bg_cale_heading_pane.Rect(), AknLayoutScalable_Apps::bg_cale_heading_pane_g1().LayoutLine() );
iHeadingBgContext->SetFrameRects( bg_cale_heading_pane.Rect(), bg_cale_heading_pane_g1.Rect() );
// Side pane layout
TAknLayoutRect cale_week_time_pane;
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::ECaleWeekTimePane);
cale_week_time_pane.LayoutRect( i_listscroll_cale_week_pane.Rect(), AknLayoutScalable_Apps::cale_week_time_pane( layoutVariant ).LayoutLine() );
TAknLayoutRect bg_cale_side_pane;
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::EBgCaleSidePane);
bg_cale_side_pane.LayoutRect( cale_week_time_pane.Rect(), AknLayoutScalable_Apps::bg_cale_side_pane(layoutVariant).LayoutLine() );
// center
TAknLayoutRect bg_cale_side_pane_g1;
bg_cale_side_pane_g1.LayoutRect( bg_cale_side_pane.Rect(), AknLayoutScalable_Apps::bg_cale_side_pane_g1().LayoutLine() );
iSideBgContext->SetFrameRects( bg_cale_side_pane.Rect(), bg_cale_side_pane_g1.Rect() );
iBackgroundSkinContext->SetParentContext( iBgContext );
iHeadingBgContext->SetParentContext( iBackgroundSkinContext );
iSideBgContext->SetParentContext( iHeadingBgContext );
}
PIM_TRAPD_HANDLE( UpdateStatusPaneAndExtensionsL() );
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::FocusChanged
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::FocusChanged( TDrawNow aDrawNow )
{
TRACE_ENTRY_POINT;
CCalenContainer::FocusChanged( aDrawNow );
if( iListBox )
{
iListBox->SetFocus( IsFocused() );
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::HandleResourceChange(TInt aType)
// Called when layout or skin change occurs
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HandleResourceChange(TInt aType)
{
TRACE_ENTRY_POINT;
CCalenContainer::HandleResourceChange( aType );
if ( aType == KAknsMessageSkinChange || aType == KEikDynamicLayoutVariantSwitch )
{
CArrayPtr<CGulIcon>* iconArray = iListBox->ItemDrawer()->FormattedCellData()->IconArray();
if(iconArray)
{
iconArray->ResetAndDestroy();
delete iconArray; // owned by CFormattedCellListBoxData
iconArray = NULL; // to suppress codescanner error
iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(NULL);
}
TRAPD(leave, iconArray = CreateIconsL( iIconIndices ) );
if(!leave && iconArray)
{
iListBox->ItemDrawer()->FormattedCellData()->SetIconArray(iconArray);
}
SizeChanged();
// if layout change and res.change is allowed do the refresh
if ( aType == KEikDynamicLayoutVariantSwitch )
{
iLayoutManager->HandleResourceChange( aType );
TRAP_IGNORE(iView->BeginRepopulationL());
}
}
CCoeControl::HandleResourceChange( aType );
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CountComponentControls
// Return components count
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TInt CCalenWeekContainer::CountComponentControls() const
{
TRACE_ENTRY_POINT;
TInt controlCount;
if ( iLayoutManager->ControlOrNull() )
{
controlCount = 2;
}
else
{
controlCount = 1;
}
TRACE_EXIT_POINT;
return controlCount;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::ComponentControl
// Retrun the component specified by aIndex
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCoeControl* CCalenWeekContainer::ComponentControl
(TInt aIndex) const
{
TRACE_ENTRY_POINT;
CCoeControl* control( NULL );
switch (aIndex)
{
case 0:
control = iListBox;
break;
case 1:
control = iLayoutManager->ControlOrNull();
break;
default:
__ASSERT_DEBUG( 0, User::Invariant() );
break;
}
TRACE_EXIT_POINT;
return control;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::OfferKeyEventL
// processing of a key event
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TKeyResponse CCalenWeekContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
TEventCode aType )
{
TRACE_ENTRY_POINT;
// always hide popup on key events
if (iPreview && aType == EEventKeyDown)
{
iPreview->Hide();
}
// common view key handling.
// NOTE! Common key handling has to be performed before custom handling
// otherwise view-cycling state handling breaks.
if (CCalenContainer::OfferKeyEventL(aKeyEvent, aType) == EKeyWasConsumed)
{
return EKeyWasConsumed;
}
// month view specific key handling
TKeyResponse exitCode(EKeyWasNotConsumed);
if (aType == EEventKey)
{
switch (aKeyEvent.iCode)
{
case EKeyOK:
iServices.IssueCommandL( ECalenForwardsToDayView );
exitCode = EKeyWasConsumed;
break;
case EKeyEnter:
iView->HandleCommandL(EAknSoftkeyOpen);
exitCode = EKeyWasConsumed;
break;
default:
break;
}
}
// listbox key handling
if ( exitCode == EKeyWasConsumed || !iListBox || !iViewPopulationComplete )
{ // if DoDeactivate() is done, iListBox will be NULL.
// do nothing
}
else
{
TInt oldRow(iListBox->View()->CurrentItemIndex());
TInt oldColumn(iColumn);
exitCode = iListBox->OfferKeyEventL(aKeyEvent, aType);
if (exitCode == EKeyWasConsumed)
{
TInt newRow(iListBox->View()->CurrentItemIndex());
TInt newColumn(iColumn);
if (newRow != oldRow || newColumn != oldColumn)
{
iFirstRowTime = TopTime();
CalcDayFromColumn();
SetActiveContextFromHighlightL();
if (newColumn != oldColumn)
{
UpdateStatusPaneAndExtensionsL();
}
}
}
}
TRACE_EXIT_POINT;
return exitCode;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::GetHelpContext
// Gets help context
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::GetHelpContext( TCoeHelpContext& aContext ) const
{
TRACE_ENTRY_POINT;
aContext.iMajor = KUidCalendar;
// This is specified in HRH file.
aContext.iContext = KCALE_HLP_WEEK_VIEW;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TKeyResponse CCalenWeekContainer::CursorMovedL(MCalenWeekCursorObserver::TCursorMove aDir)
{
TRACE_ENTRY_POINT;
TKeyResponse consumed(EKeyWasNotConsumed);
if (aDir == MCalenWeekCursorObserver::ECalenLeft)
{
consumed = HorizontalMoveL(-1);
}
else if (aDir == MCalenWeekCursorObserver::ECalenRight)
{
consumed = HorizontalMoveL(+1);
}
else
{
// up or down
iSelectedRowNumber = iListBox->View()->CurrentItemIndex();
}
TRACE_EXIT_POINT;
return consumed;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
TKeyResponse CCalenWeekContainer::HorizontalMoveL(TInt aDir)
{
TRACE_ENTRY_POINT;
CCalenWeekLBView* view =
static_cast<CCalenWeekLBView*>( iListBox->View() );
TTime newDay = iTime + TTimeIntervalDays( aDir );
if (CalenDateUtils::IsValidDay(newDay))
{
TInt newColumn = iColumn + aDir;
if (newColumn < 0 || KCalenDaysInWeek <= newColumn) // went over left or right border
{
if( newColumn < 0 )
{
iColumn = KCalenDaysInWeek - 1;
}
else
{
iColumn = 0;
}
view->SetColumn(iColumn);
iTime = newDay;
iStartDay = iTime - TTimeIntervalDays( iColumn );
iSelectedRowNumber = KErrNotFound; // Recalculate when repopulation occurs
// Refresh listbox
iView->BeginRepopulationL();
iListBox->View()->SetDisableRedraw(ETrue);
TRACE_EXIT_POINT;
return EKeyWasConsumed;
}
else if ( iViewPopulationComplete )
{
// Actual processing is performed by the List box side.
iColumn += aDir;
TRACE_EXIT_POINT;
return EKeyWasNotConsumed;
}
else
{
TRACE_EXIT_POINT;
return EKeyWasNotConsumed;
}
}
else
{
view->SetColumn(iColumn);
CalenViewUtils::ShowDateOutOfRangeErrorNoteL();
TRACE_EXIT_POINT;
return EKeyWasConsumed;
}
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::MopSupplyObject()
// Pass skin information if needed.
// ----------------------------------------------------------------------------
//
TTypeUid::Ptr CCalenWeekContainer::MopSupplyObject(TTypeUid aId)
{
TRACE_ENTRY_POINT;
if( aId.iUid == MAknsControlContext::ETypeId )
{
MAknsControlContext* cc = iSideBgContext;
if( !cc )
{
cc = iBgContext;
}
if ( cc )
{
TRACE_EXIT_POINT;
return MAknsControlContext::SupplyMopObject( aId, cc );
}
}
TRACE_EXIT_POINT;
return CCoeControl::MopSupplyObject( aId );
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::FocusChangeForPopupL()
{
TRACE_ENTRY_POINT;
if( iViewPopulationComplete )
{
CalcDayFromColumn();
CWeekSlotArrayPtr slotTable = iSlotTable[iColumn];
CCalHourItem& itemInfo = *(*slotTable)[iListBox->CurrentItemIndex()];
// dont focus the preview popup/previewpane if any dialog or faster app is active
if(iPreview && !iView->IsEditorActiveOrFasterAppExit())
{
if( !itemInfo.IsTimed() )
{
// Non-timed cell
iPreview->FocusChangedL(itemInfo.iInstance);
}
else
{
TDateTime dt = iTime.DateTime(); // TACOTEMP
iPreview->FocusChangedL( iServices.Context().FocusDateAndTimeL().TimeLocalL() );
}
}
}
else
{
HidePopup();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::Draw
// Draws most of the main pane dependend parts of week view
// - skinned or normal background
// - Day names
// - grid lines
// - line between day names and grid
// - line between hours and grid (which is drawn also inside
// list, to make scrolling work)
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::Draw(const TRect& /*aRect*/) const
{
TRACE_ENTRY_POINT;
CWindowGc& gc = SystemGc();
DrawBackground(gc);
TRAPD(error,DrawDayNamesL(gc));
if(error!=KErrNone)
{
// to avoid warning
}
DrawGridLines(gc);
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekListbox::DrawDayNames
// Draw day names
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::DrawDayNamesL(CWindowGc& aGc) const // Window graphic context
{
TRACE_ENTRY_POINT;
// No need to clear background in this function, because this is
// called only from Draw.
// If popup needs to call this from DrawDayNamesNow, clearing
// should be done there.
TRect mainPane = ReducePreview( Rect() );
TWeekListBoxLayout lay( UseInfobar(), UseToolbar(), UsePreview(), mainPane );
TInt layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::ECaleWeekDayHeadingPane);
TAknLayoutRect cale_week_day_heading_pane;
cale_week_day_heading_pane.LayoutRect( i_listscroll_cale_week_pane.Rect(),
AknLayoutScalable_Apps::cale_week_day_heading_pane( layoutVariant ).LayoutLine() );
TRect dayHeadingRect = cale_week_day_heading_pane.Rect();
TAknLayoutText dayHeadingLayouts[ KCalenDaysInWeek ];
layoutVariant = lay.LayoutVariantIndex(TWeekListBoxLayout::ECaleWeekDayHeadingPaneT1);
dayHeadingLayouts[0].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t1(layoutVariant).LayoutLine() );
dayHeadingLayouts[1].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t2(layoutVariant).LayoutLine() );
dayHeadingLayouts[2].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t3(layoutVariant).LayoutLine() );
dayHeadingLayouts[3].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t4(layoutVariant).LayoutLine() );
dayHeadingLayouts[4].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t5(layoutVariant).LayoutLine() );
dayHeadingLayouts[5].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t6(layoutVariant).LayoutLine() );
dayHeadingLayouts[6].LayoutText( dayHeadingRect, AknLayoutScalable_Apps::cale_week_day_heading_pane_t7(layoutVariant).LayoutLine() );
// Get drawing color
TRgb textColor = dayHeadingLayouts[0].Color();
AknsUtils::GetCachedColor(AknsUtils::SkinInstance(), textColor,
KAknsIIDQsnTextColors,
EAknsCIQsnTextColorsCG23);
TTime date( iStartDay );
TLocale locale;
for (TInt i=0; i < KCalenDaysInWeek; ++i)
{
TBool isToday = CalenDateUtils::OnSameDay( CalenDateUtils::Today(), date );
aGc.SetUnderlineStyle( isToday ? EUnderlineOn : EUnderlineOff );
TInt dayNoInWeek( i + locale.StartOfWeek() );
if( dayNoInWeek >= KCalenDaysInWeek )
{
dayNoInWeek -= KCalenDaysInWeek;
}
dayHeadingLayouts[ i ].DrawText( aGc,
WeekView().AbbreviatedDayArrayL()[dayNoInWeek],
ETrue,
textColor);
date += TTimeIntervalDays( 1 );
}
TRACE_EXIT_POINT;
}
CCalenWeekView& CCalenWeekContainer::WeekView() const
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
return *(static_cast<CCalenWeekView*>(iView));
}
// ---------------- class CCHourItem ------------------------ //
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalHourItem::CCalHourItem()
{
TRACE_ENTRY_POINT;
iStartTime = TTimeIntervalMinutes( KNullMinutes );
iInstance = NULL;
iTimedNote = EFalse;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalHourItem::~CCalHourItem()
{
TRACE_ENTRY_POINT;
// not owned
// delete iInstance;
iInstance = NULL;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalHourItem::ConstructL()
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalHourItem::ConstructL(CCalInstance& aInstance)
{
TRACE_ENTRY_POINT;
iInstance = &aInstance;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalHourItem* CCalHourItem::NewL()
{
TRACE_ENTRY_POINT;
CCalHourItem* self=new (ELeave) CCalHourItem();
CleanupStack::PushL(self);
self->ConstructL();
CleanupStack::Pop( self );
TRACE_EXIT_POINT;
return self;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
CCalHourItem* CCalHourItem::NewL(CCalInstance& aInstance)
{
TRACE_ENTRY_POINT;
CCalHourItem* self=new (ELeave) CCalHourItem();
CleanupStack::PushL(self);
self->ConstructL(aInstance);
CleanupStack::Pop(self);
TRACE_EXIT_POINT;
return self;
}
// ----------------------------------------------------------------------------
// ?classname::?member_function
// ?implementation_description
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalHourItem::SetDataL( CCalInstance& aInstance,
TTimeIntervalMinutes aStartTime,
TBool aTimedNote,
TCalenWeekHour aHourData )
{
TRACE_ENTRY_POINT;
ConstructL( aInstance );
iStartTime = aStartTime;
iTimedNote = aTimedNote;
iHourData = aHourData;
TRACE_EXIT_POINT;
}
TBool CCalHourItem::HasInstance() const
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
return iInstance != NULL;
}
TBool CCalHourItem::IsTimed() const
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
return iTimedNote;
}
// ----------------------------------------------------------------------------
// CCalenMonthContainer::HandleGestureL
//
// ----------------------------------------------------------------------------
void CCalenWeekContainer::HandleGestureL( const GestureHelper::MGestureEvent& aEvent )
{
GestureHelper::TGestureCode code = aEvent.Code( GestureHelper::MGestureEvent::EAxisBoth );
switch ( code )
{
case GestureHelper::EGestureStart:
{
iGestureHandled = EFalse;
break;
}
case GestureHelper::EGestureSwipeRight:
{
HandleNaviDecoratorEventL( EAknNaviDecoratorEventLeftTabArrow );
}
iGestureHandled = ETrue;
break;
case GestureHelper::EGestureSwipeLeft:
{
HandleNaviDecoratorEventL( EAknNaviDecoratorEventRightTabArrow );
}
iGestureHandled = ETrue;
break;
default:
// Other gestures are not handled here
break;
}
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::HorizontalWeekMoveL
// processing of a week move (from touch ui navi decoration)
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HorizontalWeekMoveL(TInt aDir)
{
TRACE_ENTRY_POINT;
if(AknLayoutUtils::PenEnabled())
{
__ASSERT_ALWAYS( (aDir == 1 || aDir == -1), User::Invariant());
CCalenWeekLBView* view =
static_cast<CCalenWeekLBView*>( iListBox->View() );
TTime newDay = iTime + TTimeIntervalDays( aDir*KCalenDaysInWeek );
if ( CalenDateUtils::IsValidDay( newDay ) )
{
iTime = newDay;
iStartDay = iTime - TTimeIntervalDays(iColumn);
// Refresh listbox
iListBox->View()->SetDisableRedraw(ETrue);
}
else
{
view->SetColumn(iColumn);
CalenViewUtils::ShowDateOutOfRangeErrorNoteL();
}
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::HandleNaviDecorationPointerEventL
// processing of a navi decoration event
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HandleNaviDecoratorEventL(TInt aEventID)
{
TRACE_ENTRY_POINT;
if(AknLayoutUtils::PenEnabled())
{
TInt direction(0);
if(aEventID == EAknNaviDecoratorEventLeftTabArrow)
{
if(AknLayoutUtils::LayoutMirrored())
{
direction = 1;
}
else
{
direction = -1;
}
}
else if(aEventID == EAknNaviDecoratorEventRightTabArrow)
{
if(AknLayoutUtils::LayoutMirrored())
{
direction = -1;
}
else
{
direction = 1;
}
}
else
return;
HorizontalWeekMoveL(direction);
SetActiveContextFromHighlightL(EFalse);
WeekView().SetStatusPaneFromActiveContextL();
iView->BeginRepopulationL();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::PointerMovedL
// processing of a move to new column (from touch ui)
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::PointerMovedL(TInt aNewColumn)
{
TRACE_ENTRY_POINT;
if(AknLayoutUtils::PenEnabled())
{
CCalenWeekLBView* view =
static_cast<CCalenWeekLBView*>( iListBox->View() );
TInt indexDiff = aNewColumn-iColumn;
TTime newDay = iTime + TTimeIntervalDays(indexDiff);
if (!CalenDateUtils::IsValidDay(newDay))
{
iValidDay=ETrue;
view->SetColumn(iColumn);
CalenViewUtils::ShowDateOutOfRangeErrorNoteL();
return ;
}
else
{
iValidDay=EFalse;
view->PointerMoveToItemL(aNewColumn);
iColumn = aNewColumn;
}
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenMonthContainer::HandleLongTapEventL
// processing of a long tap event
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HandleLongTapEventL( const TPoint& /*aPenEventLocation*/,
const TPoint& /*aPenEventScreenLocation*/ )
{
TRACE_ENTRY_POINT;
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::HandlePointerEventL
// processing of a navi decoration event
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HandlePointerEventL(const TPointerEvent& aPointerEvent)
{
TRACE_ENTRY_POINT;
if(AknLayoutUtils::PenEnabled())
{
TInt pointerIndex(-1);
TInt oldRow(0);
TInt oldColumn(0);
TInt newRow(0);
TInt newColumn(0);
TBool isItem (iListBox->View()->XYPosToItemIndex(aPointerEvent.iPosition,
pointerIndex));
if( !iListBox->IsValidPointer(aPointerEvent.iPosition) &&
aPointerEvent.iType == TPointerEvent::EButton1Down )
{
IgnoreEventsUntilNextPointerUp();
CCoeControl* control(NULL);
if (aPointerEvent.iType == TPointerEvent::EButton1Down)
{
control = iLayoutManager->ControlOrNull();
if (control)
{
if (control->Rect().Contains(aPointerEvent.iPosition))
{
control->HandlePointerEventL(aPointerEvent);
}
}
}
return;
}
if ( iGestureControl )
{
iGestureControl->HandlePointerEventL( aPointerEvent );
if ( iGestureHandled )
{
TRACE_EXIT_POINT;
return;
}
}
switch(aPointerEvent.iType)
{
case TPointerEvent::EButton1Down:
{
this->GenerateTactileFeedback(); //Tactile feedback.
if(isItem)
{
oldRow = iListBox->View()->CurrentItemIndex();
oldColumn = iColumn;
iListBox->HandlePointerEventL(aPointerEvent);
newRow = iListBox->View()->CurrentItemIndex();
newColumn = iColumn;
if (newRow != oldRow || newColumn != oldColumn)
{
CalcDayFromColumn();
SetActiveContextFromHighlightL();
if (newColumn != oldColumn)
{
UpdateStatusPaneAndExtensionsL();
}
}
}
else
{
IgnoreEventsUntilNextPointerUp();
}
break;
}
case TPointerEvent::EButtonRepeat:
{
if(isItem)
break;
} // else this is drag event
case TPointerEvent::EDrag:
{
// for themable support - clear Pressed Down State when dragging
oldRow = iListBox->View()->CurrentItemIndex();
oldColumn = iColumn;
newColumn = iListBox->PointerEventColumn(aPointerEvent.iPosition);
newRow = pointerIndex;
if (newRow != oldRow || newColumn != oldColumn)
{
iHourChange = ETrue;
}
break;
}
case TPointerEvent::EButton1Up:
if(isItem &&
iView->MenuBar()->IsDisplayed() == EFalse && !iHourChange)
{
iServices.IssueCommandL( ECalenForwardsToDayView );
}
iHourChange = EFalse;
break;
default:
break;
}
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::HidePopup
// Hides the popup window
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::HidePopup()
{
TRACE_ENTRY_POINT;
if (iPreview)
{
iPreview->Hide();
}
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::BeginPopulationWithInstanceViewL
// Beings populating the view. First stage of view population.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::BeginPopulationWithInstanceViewL()
{
TRACE_ENTRY_POINT;
SizeChanged();
iViewPopulationComplete = EFalse;
if (iPreview)
{
iPreview->Hide();
}
iListBox->View()->SetDisableRedraw( ETrue );
PopulatesDayListsL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::FirstPopulateOfSlotTableL
// Prepares and puts non timed notes into the slot table.
// Second stage of view population.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::FirstPopulateOfSlotTableL()
{
TRACE_ENTRY_POINT;
InitSlotTableL();
InsertNonTimedNotesToSlotTableL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SecondPopulateOfSlotTableL
// Puts timed notes into the slot table. Third stage of view population.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::SecondPopulateOfSlotTableL()
{
TRACE_ENTRY_POINT;
InsertTimedNotesToSlotTableL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CompletePopulationL
// Completes population. Fourth and final stage of view population.
// (other items were commented in a header).
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::CompletePopulationL()
{
TRACE_ENTRY_POINT;
iListBox->View()->SetDisableRedraw( EFalse );
SetCursorToActiveDayL();
SetListBoxDataL();
AddToStackAndMakeVisibleL();
iViewPopulationComplete = ETrue;
iView->SetEditorActive( EFalse );
// Popup needs to check if iViewPopulationComplete is set
FocusChangeForPopupL();
UpdateStatusPaneAndExtensionsL();
DrawDeferred();
// Hide/unhide "today" toolbar item based on the focused day
UpdateTodayToolbarItemL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CreateIconIndicesL
// Create icon index for day view
// ----------------------------------------------------------------------------
//
void CCalenWeekContainer::CreateIconIndicesL( RArray<MCalenServices::TCalenIcons>& aIndexArray )
{
TRACE_ENTRY_POINT;
// Icons needed for the week view
aIndexArray.Reset();
aIndexArray.AppendL( MCalenServices::ECalenBirthdayIcon );
aIndexArray.AppendL( MCalenServices::ECalenMeetingIcon );
aIndexArray.AppendL( MCalenServices::ECalenDaynoteIcon );
aIndexArray.AppendL( MCalenServices::ECalenToDoIcon );
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::InfoBarRectL
// Returns the available info bar rect for this container
// ----------------------------------------------------------------------------
TRect CCalenWeekContainer::InfoBarRectL( TBool aToolbarAvailable )
{
TRACE_ENTRY_POINT;
// Get the main pane
TAknLayoutRect main_cale_week_pane;
main_cale_week_pane.LayoutRect( Rect(),
AknLayoutScalable_Apps::main_cale_week_pane().LayoutLine() );
TAknLayoutRect listscroll_cale_week_pane;
listscroll_cale_week_pane.LayoutRect( main_cale_week_pane.Rect(),
AknLayoutScalable_Apps::listscroll_cale_week_pane(1).LayoutLine() );
// Create a dummy label to find the layout rect
CEikLabel* dummyLabel = new( ELeave ) CEikLabel;
CleanupStack::PushL( dummyLabel );
// Get the layout variant for the week view infobar.
// We assume that we have one for this check, as we need to
// find the size that would be available if we do have one.
TInt layoutVariant = 0;
if( aToolbarAvailable )
{
layoutVariant = 1;
}
else
{
layoutVariant = 0;
}
AknLayoutUtils::LayoutLabel( dummyLabel, listscroll_cale_week_pane.Rect(),
AknLayoutScalable_Apps::listscroll_cale_week_pane_t1( layoutVariant ).LayoutLine() );
TRect infoRect = dummyLabel->Rect();
TRect rect;
// Discard the label
CleanupStack::PopAndDestroy( dummyLabel );
TRACE_EXIT_POINT;
return infoRect;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::CheckLayoutAndExtensionsL
// check with layoutmanager for any layout changes
// ----------------------------------------------------------------------------
void CCalenWeekContainer::CheckLayoutAndExtensionL()
{
TRACE_ENTRY_POINT;
iLayoutManager->GetLayoutAndExtensionL();
TRACE_EXIT_POINT;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::SearchTopIndexL
// Searches for the top index
// ----------------------------------------------------------------------------
TInt CCalenWeekContainer::SearchTopIndexL(TInt /*aColumn*/)
{
TRACE_ENTRY_POINT;
TInt row = KErrNotFound;
MCalenContext& context = iServices.Context();
if( iSelectedRowNumber == KErrNotFound && iRow)
{
row = KErrNotFound;
}
else
{
if(iListBox->TopItemIndex()!=0 && !iTopRowDefault)
{
// row is top item index..
row = iListBox->TopItemIndex();
}
else
{
// row for the time
row = FindRowForTime(iFirstRowTime);
iTopRowDefault = EFalse;
}
}
TRACE_EXIT_POINT;
return row;
}
// -----------------------------------------------------------------------------
// CCalenWeekContainer::PreviewPane
// Return preview pane pointer
// -----------------------------------------------------------------------------
//
const MCalenPreview* CCalenWeekContainer::PreviewPane()
{
TRACE_ENTRY_POINT
TRACE_EXIT_POINT
return iPreview;
}
// ----------------------------------------------------------------------------
// CCalenWeekContainer::UpdatePreviewPaneL
// Updates preview pane whenever application comes to foreground
// ----------------------------------------------------------------------------
void CCalenWeekContainer::UpdatePreviewPaneL()
{
TRACE_ENTRY_POINT;
if( iViewPopulationComplete )
{
CalcDayFromColumn();
CWeekSlotArrayPtr slotTable = iSlotTable[iColumn];
CCalHourItem& itemInfo = *(*slotTable)[iListBox->CurrentItemIndex()];
// dont focus the preview popup/previewpane if any dialog or faster app is active
if( iPreview && !iView->IsEditorActiveOrFasterAppExit())
{
if( !itemInfo.IsTimed() )
{
// Non-timed cell
iPreview->FocusChangedL(itemInfo.iInstance);
}
else
{
TDateTime dt = iTime.DateTime(); // TACOTEMP
iPreview->FocusChangedL( iServices.Context().FocusDateAndTimeL().TimeLocalL() );
}
}
}
else
{
HidePopup();
}
TRACE_EXIT_POINT;
}
// -----------------------------------------------------------------------------
// CCalenWeekContainer::CalendarInfoIdentifierL
// Searches for the index in calendar info list based on calendar file name
// -----------------------------------------------------------------------------
//
TBool CCalenWeekContainer::CalendarInfoIdentifierL( const HBufC* aName,
const CCalCalendarInfo& aCalendarInfo)
{
TRACE_ENTRY_POINT;
TBool retVal = EFalse;
HBufC* calendarFileName = aCalendarInfo.FileNameL().AllocLC();
retVal = calendarFileName->CompareF(*aName);
CleanupStack::PopAndDestroy(calendarFileName);
TRACE_EXIT_POINT;
return (!retVal);
}
// --------------------------------------------------------------------------
// CCalenWeekContainer::CleanupInstancesL
// (other items were commented in a header).
// --------------------------------------------------------------------------
//
void CCalenWeekContainer::CleanupInstances()
{
TRACE_ENTRY_POINT
for (TInt loop(0); loop < KCalenDaysInWeek; ++loop)
{
iIdList[loop].ResetAndDestroy();
}
TRACE_EXIT_POINT
}
// End of File