phonebookui/Phonebook/App/src/CPbkAssignToGroupCmd.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /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 <eikprogi.h>
+#include <StringLoader.h>
+#include <Phonebook.rsg>
+#include <CPbkAssignToGroup.h>
+#include <CPbkContactViewListControl.h>
+#include <MPbkCommandObserver.h>
+#include <pbkdebug.h>
+
+/// 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<CEikDialog**>(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