diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook2/CommandsExtension/src/CPbk2EditContactCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook2/CommandsExtension/src/CPbk2EditContactCmd.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2002-2007 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 command for editing a contact +* +*/ + + + +// INCLUDE FILES +#include "CPbk2EditContactCmd.h" + +// Phonebook 2 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Virtual Phonebook +#include +#include +#include +#include +#include +#include +#include + +// System includes +#include + + +#ifdef _DEBUG +namespace +{ +enum TPanicCode + { + EExecuteLD_PreCond, + EVPbkSingleContactOperationComplete_PreCond, + EPanicPreCond_Null_Pointer + }; + +void Panic(TInt aReason) + { + _LIT(KPanicText, "k2EditContactCmd"); + User::Panic(KPanicText, aReason); + } +} +#endif // _DEBUG + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::CPbk2EditContactCmd +// C++ default constructor can NOT contain any code, that +// might leave. +// -------------------------------------------------------------------------- +// +CPbk2EditContactCmd::CPbk2EditContactCmd( + MPbk2ContactUiControl& aUiControl) : + iUiControl( &aUiControl ), + iIsEditingAborted( EFalse ) + { + iUiControl->RegisterCommand( this ); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::~CPbk2EditContactCmd +// -------------------------------------------------------------------------- +// +CPbk2EditContactCmd::~CPbk2EditContactCmd() + { + delete iContactLink; + delete iContact; + delete iContactRetriever; + if ( iUiControl ) + { + iUiControl->RegisterCommand( NULL ); + } + Release( iAppServices ); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::NewL +// Two-phased constructor. +// -------------------------------------------------------------------------- +// +CPbk2EditContactCmd* CPbk2EditContactCmd::NewL( + MPbk2ContactUiControl& aUiControl) + { + CPbk2EditContactCmd* self = new( ELeave ) CPbk2EditContactCmd(aUiControl); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ConstructL +// Symbian 2nd phase constructor can leave. +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ConstructL() + { + iAppServices = CPbk2ApplicationServices::InstanceL(); + const MVPbkBaseContact* contact = iUiControl->FocusedContactL(); + __ASSERT_DEBUG(contact, Panic(EPanicPreCond_Null_Pointer)); + + User::LeaveIfNull( contact ); + + iContactLink = contact->CreateLinkLC(); + CleanupStack::Pop(); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ExecuteLD +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ExecuteLD() + { + CleanupStack::PushL(this); + iContactRetriever = iAppServices->ContactManager().RetrieveContactL( + *iContactLink, *this); + CleanupStack::Pop(this); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::AddObserver +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::AddObserver(MPbk2CommandObserver& aObserver) + { + iCommandObserver = &aObserver; + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ResetUiControl +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ResetUiControl( + MPbk2ContactUiControl& aUiControl) + { + if (iUiControl == &aUiControl) + { + iUiControl = NULL; + } + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::VPbkSingleContactOperationComplete +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::VPbkSingleContactOperationComplete( + MVPbkContactOperationBase& /*aOperation*/, + MVPbkStoreContact* aContact) + { + __ASSERT_DEBUG(aContact, + Panic(EVPbkSingleContactOperationComplete_PreCond)); + + __ASSERT_DEBUG(iCommandObserver, Panic(EPanicPreCond_Null_Pointer)); + + if (aContact) + { + iContact = aContact; + TRAPD( error, iContact->LockL(*this) ); + if ( error != KErrNone ) + { + iCommandObserver->CommandFinished(*this); + CCoeEnv::Static()->HandleError(error); + } + } + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::VPbkSingleContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::VPbkSingleContactOperationFailed + (MVPbkContactOperationBase& /*aOperation*/, TInt aError) + { + __ASSERT_DEBUG(iCommandObserver, Panic(EPanicPreCond_Null_Pointer)); + + iCommandObserver->CommandFinished(*this); + CCoeEnv::Static()->HandleError(aError); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ContactOperationCompleted +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ContactOperationCompleted + (TContactOpResult /*aResult*/) + { + // open editing dialog + TRAPD(result, ExecuteEditorL()); + iCommandObserver->CommandFinished(*this); + if (result != KErrNone) + { + CCoeEnv::Static()->HandleError(result); + } + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ContactOperationFailed +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ContactOperationFailed + (TContactOp /*aOpCode*/, TInt aErrorCode, TBool /*aErrorNotified*/) + { + __ASSERT_DEBUG(iCommandObserver, Panic(EPanicPreCond_Null_Pointer)); + + iCommandObserver->CommandFinished(*this); + CCoeEnv::Static()->HandleError(aErrorCode); + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ContactEditingComplete +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ContactEditingComplete + (MVPbkStoreContact* aEditedContact) + { + iContact = aEditedContact; + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ContactEditingDeletedContact +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ContactEditingDeletedContact + (MVPbkStoreContact* aEditedContact) + { + iContact = aEditedContact; + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ContactEditingAborted +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ContactEditingAborted() + { + iIsEditingAborted = ETrue; + } + +// -------------------------------------------------------------------------- +// CPbk2EditContactCmd::ExecuteEditorL +// -------------------------------------------------------------------------- +// +void CPbk2EditContactCmd::ExecuteEditorL() + { + // verify syncronization field existance and content + VPbkUtils::VerifySyncronizationFieldL( + CCoeEnv::Static()->FsSession(), + iContact->ParentStore().StoreProperties().SupportedFields(), + *iContact ); + + // adjust focus + TInt focusedFieldIndex = KErrNotFound; + if (iUiControl) + { + focusedFieldIndex = iUiControl->FocusedFieldIndex(); + } + + TPbk2ContactEditorParams params; + if ( focusedFieldIndex != KErrNotFound ) + { + params.iFocusedContactField = + FocusedFieldLC( *iContact ); + } + + // create and execute editing dialog + CPbk2ContactEditorDlg* dlg = + CPbk2ContactEditorDlg::NewL( params, iContact, *this ); + iContact = NULL; // ownership went to editor + dlg->ExecuteLD(); + + // clean after dialog execution + if ( focusedFieldIndex != KErrNotFound ) + { + CleanupStack::PopAndDestroy(); //params.iFocusedContactField + } + + if (iUiControl) + { + iUiControl->ResetFindL(); + + // If editing has been aborted we don't set focused contact. + if ( iContact && !iIsEditingAborted) + { + // It is possible that the contact got changed while in edit + iUiControl->SetFocusedFieldIndex( params.iFocusedIndex ); + iUiControl->SetFocusedContactL( *iContact ); + } + + // If contact got deleted in the editor, this call ensures + // that the contact info view is switched to the names list + iUiControl->UpdateAfterCommandExecution(); + } + } + +MVPbkStoreContactField* CPbk2EditContactCmd::FocusedFieldLC + ( MVPbkStoreContact& aStoreContact ) + { + CPbk2PresentationContact* presentationContact = + CPbk2PresentationContact::NewL( aStoreContact, + iAppServices->FieldProperties() ); + CleanupStack::PushL( presentationContact ); + + TInt index = KErrNotFound; + if (iUiControl) + { + index = presentationContact->PresentationFields().StoreIndexOfField( + iUiControl->FocusedFieldIndex() ); + } + + CleanupStack::PopAndDestroy( presentationContact ); + + if ( index != KErrNotFound ) + { + // Use FieldAtLC to avoid the unvalidity of the field after new + // FieldAt call. + return aStoreContact.Fields().FieldAtLC( index ); + } + return NULL; + } + +// End of File