diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/UIControls/src/cpbk2contacteditornewowncontact.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/UIControls/src/cpbk2contacteditornewowncontact.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,305 @@ +/* +* 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: A contact editor strategy for the new own contact creation +* +*/ + +// INCLUDE FILES +#include "cpbk2contacteditornewowncontact.h" + +// Phonebook 2 +#include +#include +#include "CPbk2InputAbsorber.h" +#include +#include +#include + +// Virtual Phonebook +#include + +// System includes +#include + + +#ifdef _DEBUG + +/// Unnamed namespace +namespace { +enum TPanicCode + { + EContactOperationCompleted_PreCond, + EContactOperationFailed_PreCond, + EDeleteContactL_PreCond + }; + +void Panic(TInt aReason) + { + _LIT(KPanicText, "EditorNewOwnContact"); + User::Panic(KPanicText, aReason); + } +} /// namespace + +#endif // _DEBUG + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::CPbk2ContactEditorNewOwnContact +// -------------------------------------------------------------------------- +// +inline CPbk2ContactEditorNewOwnContact::CPbk2ContactEditorNewOwnContact( + CPbk2PresentationContact* aContact ) : + CActive( CActive::EPriorityStandard ), + iContact( aContact ) + { + CActiveScheduler::Add(this); + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::~CPbk2ContactEditorNewOwnContact +// -------------------------------------------------------------------------- +// +CPbk2ContactEditorNewOwnContact::~CPbk2ContactEditorNewOwnContact() + { + Cancel(); + delete iIdleDelete; + delete iInputAbsorber; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::NewL +// -------------------------------------------------------------------------- +// +CPbk2ContactEditorNewOwnContact* CPbk2ContactEditorNewOwnContact::NewL( + TPbk2ContactEditorParams& /*aParams*/, + CPbk2PresentationContact* aContact ) + { + CPbk2ContactEditorNewOwnContact* self = + new(ELeave) CPbk2ContactEditorNewOwnContact(aContact); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::ConstructL +// -------------------------------------------------------------------------- +// +inline void CPbk2ContactEditorNewOwnContact::ConstructL() + { + iContact->AddSupportedTemplateFieldsL(); + iInputAbsorber = CPbk2InputAbsorber::NewL(R_AVKON_SOFTKEYS_OPTIONS_DONE); + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::RunL +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::RunL() + { + MPbk2ContactEditorEventObserver* observer = iObserver; + iObserver = NULL; + observer->ContactEditorOperationCompleted(iLatestResult, iEditorParams); + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::DoCancel +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::DoCancel() + { + // Do nothing + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::SaveContactL +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::SaveContactL( + MPbk2ContactEditorEventObserver& aObserver, + MPbk2ContactEditorEventObserver::TParams& aParams) + { + // If observer is set there is process ongoing. + // Might happen when user is quicker than should be. + if ( !iObserver ) + { + iObserver = &aObserver; + iEditorParams = aParams; + iContact->CommitL(*this); + iInputAbsorber->Wait(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::DeleteContactL +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::DeleteContactL( + MPbk2ContactEditorEventObserver& aObserver, + MPbk2ContactEditorEventObserver::TParams& aParams) + { + __ASSERT_DEBUG(!iObserver, Panic(EDeleteContactL_PreCond)); + + if (!iIdleDelete) + { + iIdleDelete = CIdle::NewL(CActive::EPriorityStandard); + } + else + { + iIdleDelete->Cancel(); + } + + iObserver = &aObserver; + iEditorParams = aParams; + iIdleDelete->Start(TCallBack(&IdleDeleteCallBack, this)); + iInputAbsorber->Wait(); + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::DefaultTitle +// -------------------------------------------------------------------------- +// +const TDesC& CPbk2ContactEditorNewOwnContact::DefaultTitle() const + { + // not used + return KNullDesC; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::SwitchContactL +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::SwitchContactL( + CPbk2PresentationContact* aContact) + { + iContact = aContact; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::GetHelpContext +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::GetHelpContext( + TCoeHelpContext &aContext) const + { + aContext.iMajor.iUid = KPbk2UID3; + aContext.iContext = KHLP_CCA_EDITOR; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::StopQuery +// -------------------------------------------------------------------------- +// +TBool CPbk2ContactEditorNewOwnContact::StopQuery() + { + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::IdleDeleteCallBack +// -------------------------------------------------------------------------- +// +TInt CPbk2ContactEditorNewOwnContact::IdleDeleteCallBack( TAny* aSelf ) + { + static_cast(aSelf)->HandleIdleDelete(); + return EFalse; + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::HandleIdleDelete +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::HandleIdleDelete() + { + PBK2_DEBUG_PRINT( PBK2_DEBUG_STRING + ( "CPbk2ContactEditorNewOwnContact::HandleIdleDelete(0x%x)" ), this ); + + iInputAbsorber->StopWait(); + MPbk2ContactEditorEventObserver* observer = iObserver; + iObserver = NULL; + MVPbkContactObserver::TContactOpResult result; + // Disable warnings by nulling the data members + result.iStoreContact = NULL; + result.iExtension = NULL; + result.iOpCode = MVPbkContactObserver::EContactDelete; + observer->ContactEditorOperationCompleted( result, iEditorParams ); + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::ContactOperationCompleted +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::ContactOperationCompleted( + MVPbkContactObserver::TContactOpResult aResult ) + { + __ASSERT_DEBUG(iObserver && + ( aResult.iOpCode == MVPbkContactObserver::EContactCommit || + aResult.iOpCode == MVPbkContactObserver::EContactSetOwn ), + Panic(EContactOperationCompleted_PreCond)); + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPbk2ContactEditorNewOwnContact::ContactOperationCompleted(0x%x)"), + this); + if( aResult.iOpCode == MVPbkContactObserver::EContactCommit ) + { + // Set contact as own contact + TRAPD( err, iContact->SetAsOwnL( *this ) ); + if( err ) + { + ContactOperationFailed( aResult.iOpCode, err, EFalse ); + } + // store commit result + iLatestResult = aResult; + } + else // MVPbkContactObserver::EContactSetOwn + { + iInputAbsorber->StopWait(); + + // Notify client asynchronously to give some time for the all + // contacts view to get ready. This might not be needed anymore + // here in new contact strategy... In edit contact strategy + // this however is a mandatory move. + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + } + +// -------------------------------------------------------------------------- +// CPbk2ContactEditorNewOwnContact::ContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2ContactEditorNewOwnContact::ContactOperationFailed( + MVPbkContactObserver::TContactOp aOpCode, + TInt aErrorCode, TBool aErrorNotified ) + { + __ASSERT_DEBUG(iObserver, Panic(EContactOperationFailed_PreCond)); + + PBK2_DEBUG_PRINT(PBK2_DEBUG_STRING + ("CPbk2ContactEditorNewOwnContact::ContactOperationFailed(0x%x) aErrorCode(%d)"), + this, aErrorCode); + iInputAbsorber->StopWait(); + MPbk2ContactEditorEventObserver* observer = iObserver; + iObserver = NULL; + + MPbk2ContactEditorEventObserver::TFailParams failParams; + failParams.iCloseEditor = EFalse; + failParams.iErrorNotified = aErrorNotified; + failParams.iErrorCode = KErrNone; + + observer->ContactEditorOperationFailed(aOpCode, aErrorCode, iEditorParams, + failParams ); + } + +// End of File