phonebookui/Phonebook/App/src/CPbkRemoveFromGroupCmd.cpp
changeset 0 e686773b3f54
child 21 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkRemoveFromGroupCmd.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,182 @@
+/*
+* 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: 
+*          Provides phonebook multiple contacts removal from group command methods.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkRemoveFromGroupCmd.h"
+#include <eikprogi.h>
+#include <StringLoader.h>
+#include <CPbkContactEngine.h>
+#include <Phonebook.rsg>
+#include <CPbkRemoveFromGroup.h>
+#include <CPbkProgressNoteWrapper.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, "CPbkRemoveFromGroupCmd");
+    User::Panic(KPanicText,aReason);
+    }
+#endif
+
+} // namespace
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+inline CPbkRemoveFromGroupCmd::CPbkRemoveFromGroupCmd
+        (CPbkContactEngine& aEngine,
+        CPbkContactViewListControl& aUiControl) :    
+    iEngine(aEngine),
+    iUiControl(aUiControl)    
+	{
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkRemoveFromGroupCmd::CPbkRemoveFromGroupCmd(0x%x)"), 
+        this);
+    }
+
+inline void CPbkRemoveFromGroupCmd::ConstructL
+        (const CContactIdArray& aContacts,
+        TContactItemId aGroupId)
+    {
+    iRemoveFromGroupProcess = CPbkRemoveFromGroup::NewLC(iEngine, aContacts, aGroupId);
+    CleanupStack::Pop(iRemoveFromGroupProcess);    
+    iWaitNoteWrapper = CPbkProgressNoteWrapper::NewL();    
+    }
+
+CPbkRemoveFromGroupCmd* CPbkRemoveFromGroupCmd::NewL
+        (CPbkContactEngine& aEngine,
+        const CContactIdArray& aContacts,
+        CPbkContactViewListControl& aUiControl,
+        TContactItemId aGroupId)
+    {
+    CPbkRemoveFromGroupCmd* self = new(ELeave) CPbkRemoveFromGroupCmd(aEngine, aUiControl);
+    CleanupStack::PushL(self);
+    self->ConstructL(aContacts, aGroupId);
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+void CPbkRemoveFromGroupCmd::ResetWhenDestroyed
+        (CPbkRemoveFromGroupCmd** aSelfPtr)
+    {
+    __ASSERT_DEBUG(!aSelfPtr || *aSelfPtr==this, 
+        Panic(EPanicPreCond_ResetWhenDestroyed));
+
+    iSelfPtr = aSelfPtr;
+    }
+
+CPbkRemoveFromGroupCmd::~CPbkRemoveFromGroupCmd()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkRemoveFromGroupCmd::~CPbkRemoveFromGroupCmd(0x%x)"), 
+        this);
+
+    iUiControl.SetBlank(EFalse);
+    delete iWaitNoteWrapper;
+    delete iRemoveFromGroupProcess;
+
+    if (iSelfPtr)
+        {
+        *iSelfPtr = NULL;
+        }
+    iDestroyed = ETrue;
+    }
+
+void CPbkRemoveFromGroupCmd::ExecuteLD()
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkRemoveFromGroupCmd::ExecuteLD(0x%x)"), 
+        this);
+    CleanupStack::PushL(this);
+    
+    // Save focus 
+	iFocusIndex = iUiControl.CurrentItemIndex();
+    iFocusedContact = iUiControl.ContactIdAtL(iFocusIndex);
+
+    // Blank UI control to avoid flicker
+    iUiControl.SetBlank(ETrue);
+    
+    CPbkWaitNoteWrapperBase::TNoteParams noteParams;
+        noteParams.iObserver = this;
+    // ProcessFinished will be called when execution is finished.
+    iWaitNoteWrapper->ExecuteL
+            (*iRemoveFromGroupProcess, R_QTN_PHOB_WNOTE_REM_FROM_GROUP, noteParams);
+    
+    CleanupStack::Pop(this);
+    }
+
+void CPbkRemoveFromGroupCmd::AddObserver
+        (MPbkCommandObserver& aObserver) 
+    {
+    iCommandObserver = &aObserver;
+    }
+
+void CPbkRemoveFromGroupCmd::ProcessFinished
+        (MPbkBackgroundProcess& /*aProcess*/)
+    {
+    PBK_DEBUG_PRINT
+        (PBK_DEBUG_STRING("CPbkRemoveFromGroupCmd::ProcessFinished(0x%x)"), 
+        this);
+
+    // Clear listbox selections
+    iUiControl.HandleMarkableListUpdateAfterCommandExecution();
+
+    // Restore focus
+    TInt focusedIndex(0);
+    // If focused contact still exists, then restore the focus to it
+    TRAPD(err, focusedIndex = iUiControl.FindContactIdL(iFocusedContact));
+    if ((err == KErrNone) && (focusedIndex != KErrNotFound))
+        {
+        // The focused contact was not deleted (special case)
+        iUiControl.SetCurrentItemIndex(focusedIndex);
+        }
+    else
+        {
+        // Safe to continue even if err != KErrNone
+        TInt items = iUiControl.NumberOfItems();
+	    if (iFocusIndex < items)
+		    {
+		    iUiControl.SetCurrentItemIndex(iFocusIndex);
+		    }
+	    else if (iFocusIndex >= iUiControl.NumberOfItems())
+		    {
+		    // Subtract one because index is zero-based
+		    iUiControl.SetCurrentItemIndex(items-1);
+		    }
+        }
+
+    // Unblank and redraw UI control
+    iUiControl.SetBlank(EFalse);
+    iUiControl.DrawDeferred();
+    }
+    
+//  End of File