diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/App/src/CPbkAssignToGroupCmd.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/App/src/CPbkAssignToGroupCmd.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,277 @@ +/* +* 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: +* +*/ + + + +// INCLUDE FILES +#include "CPbkAssignToGroupCmd.h" +#include +#include +#include +#include +#include +#include +#include + +/// Unnamed namespace for local definitions +namespace { + +// LOCAL DEBUG CODE +#ifdef _DEBUG +enum TPanicCode + { + EPanicPreCond_ResetWhenDestroyed = 1 + }; + +void Panic(TPanicCode aReason) + { + _LIT(KPanicText, "CPbkAssignToGroupCmd"); + User::Panic(KPanicText,aReason); + } +#endif + +} + + +// ================= MEMBER FUNCTIONS ======================= + +inline CPbkAssignToGroupCmd::CPbkAssignToGroupCmd + (CPbkContactEngine& aEngine, + CPbkContactViewListControl& aUiControl) : + CActive(EPriorityIdle), + iEngine(aEngine), + iUiControl(aUiControl), + iFocusId(KNullContactId), + iDialogDismissed(ETrue) // there is no dialog at this point + { + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::CPbkAssignToGroupCmd(0x%x)"), + this); + + CActiveScheduler::Add(this); + } + +inline void CPbkAssignToGroupCmd::ConstructL + (const CContactIdArray& aContacts, + TContactItemId aGroupId) + { + iAssignToGroupProcess = CPbkAssignToGroup::NewLC(iEngine, aContacts, aGroupId); + CleanupStack::Pop(iAssignToGroupProcess); + } + +CPbkAssignToGroupCmd* CPbkAssignToGroupCmd::NewL + (CPbkContactEngine& aEngine, + const CContactIdArray& aContacts, + CPbkContactViewListControl& aUiControl, + TContactItemId aGroupId) + { + CPbkAssignToGroupCmd* self = new(ELeave) CPbkAssignToGroupCmd(aEngine, aUiControl); + CleanupStack::PushL(self); + self->ConstructL(aContacts, aGroupId); + CleanupStack::Pop(self); + return self; + } + +void CPbkAssignToGroupCmd::ResetWhenDestroyed + (CPbkAssignToGroupCmd** aSelfPtr) + { + __ASSERT_DEBUG(!aSelfPtr || *aSelfPtr==this, + Panic(EPanicPreCond_ResetWhenDestroyed)); + + iSelfPtr = aSelfPtr; + } + +CPbkAssignToGroupCmd::~CPbkAssignToGroupCmd() + { + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::~CPbkAssignToGroupCmd(0x%x)"), + this); + + Cancel(); + + if ( !iRedButtonPressed ) + { + // Unblank and redraw UI control + iUiControl.SetBlank(EFalse); + } + + DeleteProgressNote(); + delete iAssignToGroupProcess; + + if (iSelfPtr) + { + *iSelfPtr = NULL; + } + iDestroyed = ETrue; + } + +void CPbkAssignToGroupCmd::ExecuteLD() + { + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::ExecuteLD(0x%x)"), + this); + CleanupStack::PushL(this); + + // save focus + iFocusId = iUiControl.FocusedContactIdL(); + + // Blank UI control to avoid flicker + iUiControl.SetBlank(ETrue); + + // delete previous note + DeleteProgressNote(); + + // Start assignation process. ProcessFinished() will be called when execution + // is finished. + CAknProgressDialog* progressDialog = new(ELeave) CAknProgressDialog( + reinterpret_cast(NULL), ETrue); + progressDialog->PrepareLC(R_QTN_PHOB_WNOTE_ADD_TO_GROUP); + iProgressDlgInfo = progressDialog->GetProgressInfoL(); + iProgressDlgInfo->SetFinalValue(iAssignToGroupProcess->TotalNumberOfSteps()); + progressDialog->SetCallback(this); + iDialogDismissed = EFalse; + progressDialog->RunLD(); + + iProgressDialog = progressDialog; + + // issue request for entry assignation + IssueRequest(); + + CleanupStack::Pop(this); + } + +void CPbkAssignToGroupCmd::AddObserver + (MPbkCommandObserver& aObserver) + { + iCommandObserver = &aObserver; + } + +void CPbkAssignToGroupCmd::DoCancel() + { + } + +void CPbkAssignToGroupCmd::RunL() + { + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::StepL()"), + this); + + if (!iAssignToGroupProcess->IsProcessDone() && !iDialogDismissed) + { + // process one step + iAssignToGroupProcess->StepL(); + ++iAssignedCount; + + // Incrementing progress of the process + iProgressDlgInfo->SetAndDraw(iAssignedCount); + + // issue request to delete next item + IssueRequest(); + } + else + { + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkAssignToGroupCmd::RunL process completed start")); + + // process is completed, all entries have been assigned + ProcessFinished(*iAssignToGroupProcess); + + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkAssignToGroupCmd::RunL process completed end")); + } + + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::RunL end")); + } + +TInt CPbkAssignToGroupCmd::RunError + (TInt aError) + { + TInt result = iAssignToGroupProcess->HandleStepError(aError); + Cancel(); + ProcessFinished(*iAssignToGroupProcess); + return result; + } + +void CPbkAssignToGroupCmd::ProcessFinished + (MPbkBackgroundProcess& /*aProcess*/) + { + PBK_DEBUG_PRINT + (PBK_DEBUG_STRING("CPbkAssignToGroupCmd::ProcessFinished(0x%x)"), + this); + + if ( !iRedButtonPressed ) + { + // Clear listbox selections + iUiControl.HandleMarkableListUpdateAfterCommandExecution(); + + // restore focus + if (iFocusId != KNullContactId) + { + TInt index = -1; + TRAP_IGNORE(index = iUiControl.FindContactIdL(iFocusId)); + if (index >= 0) + { + iUiControl.SetCurrentItemIndex(index); + } + } + + // Unblank and redraw UI control + iUiControl.SetBlank(EFalse); + iUiControl.DrawNow(); + } + + DeleteProgressNote(); + } + +void CPbkAssignToGroupCmd::DeleteProgressNote() + { + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkAssignToGroupCmd::DeleteProgressNote start")); + + if (iProgressDialog && !iDialogDismissed) + { + // deletes the dialog + TRAPD(err, iProgressDialog->ProcessFinishedL()); + if (err != KErrNone) + { + delete iProgressDialog; + } + iProgressDialog = NULL; + } + + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkAssignToGroupCmd::DeleteProgressNote end")); + } + +void CPbkAssignToGroupCmd::IssueRequest() + { + TRequestStatus* status = &iStatus; + User::RequestComplete(status, KErrNone); + SetActive(); + } + +void CPbkAssignToGroupCmd::DialogDismissedL( TInt aButtonId ) + { + PBK_DEBUG_PRINT(PBK_DEBUG_STRING("CPbkAssignToGroupCmd::DialogDismissedL")); + iDialogDismissed = ETrue; + if ( aButtonId == KErrNotFound ) + { + iRedButtonPressed = ETrue; + } + + // notify command owner that the command has finished + iCommandObserver->CommandFinished(*this); + } + +// End of File