diff -r 12af337248b1 -r bd7edf625bdd calendarui/editors/src/calendbfield.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/editors/src/calendbfield.cpp Wed Sep 01 12:32:31 2010 +0100 @@ -0,0 +1,466 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: To handle Calendar Db filed +* +*/ + +// system includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include // TCalenInstanceId +#include +#include + +// user includes +#include "calendbfield.h" +#include "CalenDefaultEditors.hrh" +#include "calenunifiededitor.h" +#include "CalendarPrivateCRKeys.h" +#include "CleanupResetAndDestroy.h" +#include "calendarui_debug.h" + + +// ----------------------------------------------------------------------------- +// CCalenDbField::NewL +// First Phase constuctor +// ----------------------------------------------------------------------------- +// +CCalenDbField* CCalenDbField::NewL( CCalenUnifiedEditor& aUnifiedEditor,MCalenServices& aServices ) + { + TRACE_ENTRY_POINT; + + CCalenDbField* self = + new( ELeave ) CCalenDbField( aUnifiedEditor, aServices ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + TRACE_EXIT_POINT; + return self; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::CCalenDbField +// C++ constructor +// ----------------------------------------------------------------------------- +// +CCalenDbField::CCalenDbField( CCalenUnifiedEditor& aUnifiedEditor,MCalenServices& aServices ) + : iUnifiedEditor( aUnifiedEditor ), + iServices(&aServices) + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::ConstructL +// second phase constructor +// ----------------------------------------------------------------------------- +// +void CCalenDbField::ConstructL() + { + TRACE_ENTRY_POINT; + + //Get MultipleDbInfo array + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL( calendarInfoList ); + + iDbNamesArrayText = new ( ELeave ) CDesCArrayFlat( calendarInfoList.Count()+1 ); + + for(TInt i=0 ; i < calendarInfoList.Count();i++ ) + { + HBufC* calendarName=( *calendarInfoList[i] ).NameL().AllocLC(); + iDbNamesArrayText->AppendL( *calendarName ); + CleanupStack::PopAndDestroy( calendarName ); + } + CleanupStack::PopAndDestroy( &calendarInfoList ); + + // create textarray + iDbNamesArray = CAknQueryValueTextArray::NewL(); + iDbNamesArray->SetArray( *iDbNamesArrayText ); + + iDbNamesTextValues = CAknQueryValueText::NewL(); + iDbNamesTextValues->SetArrayL( iDbNamesArray ); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::~CCalenDbField +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CCalenDbField::~CCalenDbField() + { + TRACE_ENTRY_POINT; + + if( iAsyncDBquery ) + { + iAsyncDBquery->Cancel(); + delete iAsyncDBquery; + iAsyncDBquery = NULL; + } + + delete iDbNamesArrayText; + delete iDbNamesArray; + delete iDbNamesTextValues; + delete iCalendarFileName; + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::InitDbFieldLayoutL +// Updates fields just before the form is shown. +// ----------------------------------------------------------------------------- +// +void CCalenDbField::InitDbFieldLayoutL() + { + TRACE_ENTRY_POINT; + + CAknPopupField* pops = + static_cast( iUnifiedEditor.Control( ECalenEditorDBName ) ); + pops->SetQueryValueL( iDbNamesTextValues ); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::SetDataToEditorL +// update data in form +// ----------------------------------------------------------------------------- +// +void CCalenDbField::SetDataToEditorL() + { + TRACE_ENTRY_POINT; + //Get MultipleDbInfo array + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL(calendarInfoList); + + TInt index = KErrNotFound; + if (iUnifiedEditor.IsCreatingNewEntry()) + { + TBuf lastUsedCalendar; + CRepository* cenRep = CRepository::NewLC(KCRUidCalendar); + User::LeaveIfError(cenRep->Get(KCalendarLastUsedCalendar, + lastUsedCalendar)); + + HBufC* name = lastUsedCalendar.AllocLC(); + index = calendarInfoList.Find(*name, + CCalenDbField::CalendarInfoNameIdentifierL); + + if (KErrNotFound == index) + { + User::LeaveIfError(cenRep->Set(KCalendarLastUsedCalendar, + name->Des())); + } + + CleanupStack::PopAndDestroy(name); + CleanupStack::PopAndDestroy(cenRep); + } + else + { + TCalCollectionId colId = iServices->Context().InstanceId().iColId; + HBufC* calendarFileName= iServices->GetCalFileNameForCollectionId(colId).AllocLC(); + index = calendarInfoList.Find(*calendarFileName, + CCalenDbField::CalendarInfoNameIdentifierL); + CleanupStack::PopAndDestroy(calendarFileName); + } + + if (index != KErrNotFound) + { + iDbNamesTextValues->SetCurrentValueIndex(index); + } + + if (KErrNotFound == index) + { + iDbNamesTextValues->SetCurrentValueIndex(0); + } + + TInt pos = iDbNamesTextValues->CurrentValueIndex(); + HBufC* calendarFileName = calendarInfoList[pos]->FileNameL().AllocLC(); + iPreviousColId = iCurrentColId + = iServices->SessionL(*calendarFileName).CollectionIdL(); + CleanupStack::PopAndDestroy(calendarFileName); + + iUnifiedEditor.EditorDataHandler().SetCalendarFieldEditedL( + IsCalendarEdited(), iPreviousColId, iCurrentColId); + + CleanupStack::PopAndDestroy(&calendarInfoList); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::SetDataToEditorL +// update data in form +// ----------------------------------------------------------------------------- +// +void CCalenDbField::SetDataToEditorL(const TCalCollectionId& aColId) + { + TRACE_ENTRY_POINT; + //Get MultipleDbInfo array + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL(calendarInfoList); + + TInt index = KErrNotFound; + + HBufC* calendarFileName= iServices->GetCalFileNameForCollectionId(aColId).AllocLC(); + index = calendarInfoList.Find(*calendarFileName, CCalenDbField::CalendarInfoNameIdentifierL); + CleanupStack::PopAndDestroy(calendarFileName); + + if (KErrNotFound == index) + { + iDbNamesTextValues->SetCurrentValueIndex(0); + } + else + { + iDbNamesTextValues->SetCurrentValueIndex(index); + } + iUnifiedEditor.EditorDataHandler().SetCalendarFieldEditedL( + IsCalendarEdited(), iPreviousColId, iCurrentColId); + + CleanupStack::PopAndDestroy(&calendarInfoList); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::HandleControlStateChangeL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenDbField::HandleControlStateChangeL( TInt aControlId ) + { + TRACE_ENTRY_POINT; + + switch(aControlId) + { + case ECalenEditorDBName: + { + TBool continueOnError = EFalse; + ReadDataFromFormL( continueOnError ); + iUnifiedEditor.EditorDataHandler().SetCalendarFieldEditedL(IsCalendarEdited() + ,iPreviousColId,iCurrentColId); + + TCallBack callback(DoAsyncShowChangeDBQueryL,this); + iAsyncDBquery = new(ELeave) CAsyncCallBack(callback,CActive::EPriorityStandard); + iAsyncDBquery->CallBack(); + break; + } + default: + break; + } + + TRACE_EXIT_POINT; + } + +// ---------------------------------------------------------------------------- +// CallBackForShowinginfonote +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +TInt CCalenDbField::DoAsyncShowChangeDBQueryL(TAny* aThisPtr) + { + TRACE_ENTRY_POINT + CCalenDbField* self = static_cast(aThisPtr); + if(self) + { + self->ShowChangeDBQueryL(); + } + TRACE_EXIT_POINT + return 0; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::ReadDataFromFormL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenDbField::ReadDataFromFormL( TBool /*aContinueOnError*/ ) + { + TRACE_ENTRY_POINT; + + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL( calendarInfoList ); + TInt pos; + if( calendarInfoList.Count() == 1 ) + { + pos = 0; + } + else + { + pos = iDbNamesTextValues->CurrentValueIndex(); + } + + HBufC* calendarFileName = calendarInfoList[pos]->FileNameL().AllocLC(); + iCurrentColId = iServices->SessionL(*calendarFileName).CollectionIdL(); + CleanupStack::PopAndDestroy(calendarFileName); + CleanupStack::PopAndDestroy( &calendarInfoList ); + + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::PrepareForFocusTransitionL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenDbField::PrepareForFocusTransitionL( TInt aFocusedId ) + { + TRACE_ENTRY_POINT; + + switch(aFocusedId) + { + case ECalenEditorDBName: + { + TBool continueOnError = EFalse; + ReadDataFromFormL( continueOnError ); + break; + } + default: + break; + } + TRACE_EXIT_POINT; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::GetCalendarIndexForEntryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TInt CCalenDbField::GetCalendarIndexForEntryL() + { + TRACE_ENTRY_POINT; + TRACE_EXIT_POINT; + return iDbNamesTextValues->CurrentValueIndex();; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::GetCalendarNameForEntryL +// get calendar name for the entry +// ----------------------------------------------------------------------------- +// +const TDesC& CCalenDbField::GetCalendarNameForEntryL() + { + TRACE_ENTRY_POINT + + if(iCalendarFileName) + { + delete iCalendarFileName; + iCalendarFileName = NULL; + } + + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL( calendarInfoList ); + TInt pos = iDbNamesTextValues->CurrentValueIndex(); + iCalendarFileName = calendarInfoList[pos]->FileNameL().AllocL(); + CleanupStack::PopAndDestroy( &calendarInfoList ); + + TRACE_EXIT_POINT + return *iCalendarFileName; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::GetCalendarNameForEntryL +// get calendar index for the entry +// ----------------------------------------------------------------------------- +// +TInt CCalenDbField::GetCalendarNameForEntryL(const TDesC& aCalendarFileName) + { + TRACE_ENTRY_POINT + __impl_prints(_L("CCalenDbField::GetCalendarNameForEntryL 2-- start")); + HBufC* calendarFilename = aCalendarFileName.AllocLC(); + RPointerArray calendarInfoList; + iServices->GetAllCalendarInfoL(calendarInfoList); + CleanupClosePushL( calendarInfoList ); + __impl_prints(_L("CCalenDbField::GetCalendarNameForEntryL -- GetAllCalendarInfoL")); + TInt index = calendarInfoList.Find(*calendarFilename, + CCalenDbField::CalendarInfoNameIdentifierL); + __impl_print(_L("CCalenDbField::GetCalendarNameForEntryL 2 -- index = %d"),index); + CleanupStack::PopAndDestroy(calendarFilename); + CleanupStack::PopAndDestroy( &calendarInfoList ); + + TRACE_EXIT_POINT + return index; + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::IsCalendarEdited +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCalenDbField::IsCalendarEdited() + { + TRACE_ENTRY_POINT + TRACE_EXIT_POINT + return (iPreviousColId != iCurrentColId); + } + +// ----------------------------------------------------------------------------- +// CCalenDbField::CalendarInfoNameIdentifierL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CCalenDbField::CalendarInfoNameIdentifierL( const HBufC* aName, + const CCalCalendarInfo& aInfoItem ) + { + TRACE_ENTRY_POINT; + TPtrC calendarFileName = aInfoItem.FileNameL(); + TRACE_EXIT_POINT; + return (!calendarFileName.CompareF(*aName)); + } +// ----------------------------------------------------------------------------- +// CCalenDbField::ShowChangeDBQueryL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CCalenDbField::ShowChangeDBQueryL() + { + + //Check the child entries for the repeated entry + //The entry which is changing the calendar having any childs + //show this information note to the user. + CCalEntry& originalEntry = iUnifiedEditor.EditorDataHandler().Entry(); + RPointerArray childEntries; + CleanupResetAndDestroyPushL(childEntries); + iServices->EntryViewL(iPreviousColId)->FetchL(originalEntry.UidL(), childEntries); + if(IsCalendarEdited() && (childEntries.Count() > 1)) + { + TCalCollectionId currentId = iCurrentColId; + SetDataToEditorL(); + iUnifiedEditor.UpdateFormL(); + CAknQueryDialog* dlg = CAknQueryDialog::NewL(); + if( dlg->ExecuteLD( R_CALEN_DB_CHANGE_QUERY ) ) + { + iCurrentColId = currentId; + SetDataToEditorL(iCurrentColId); + iUnifiedEditor.UpdateFormL(); + } + } + CleanupStack::PopAndDestroy( &childEntries ); + } +// End of File