diff -r 000000000000 -r e686773b3f54 phonebookui/Phonebook/App/src/CPbkMemoryEntryAppView.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Phonebook/App/src/CPbkMemoryEntryAppView.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,351 @@ +/* +* 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 memory entry app view methods. +* +*/ + + +// INCLUDE FILES +#include "CPbkMemoryEntryAppView.h" +#include "CPbkAppUi.h" +#include "CPbkCommandFactory.h" +#include "CPbkAppGlobals.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +/// Unnamed namespace for local defintions +namespace { + +// LOCAL CONSTANTS + +// Sufficient amount of memory for contact database modification +const TInt KFreeSpaceForDbCompress = 128*1024; // 128kb + +/// Values for TDeletedContactData::iFlags +enum TDeletedContactFlags + { + EFlagContactDeleted = 0x01, + EFlagContactRemoved = 0x02, + EFlagContactDeletedAndRemoved = EFlagContactDeleted|EFlagContactRemoved + }; + +} // namespace + + +// ================= MEMBER FUNCTIONS ======================= + +// CPbkMemoryEntryAppView::TDeletedContactData +inline void CPbkMemoryEntryAppView::TDeletedContactData::SetDeleted() + { + iFlags |= EFlagContactDeleted; + } + +inline void CPbkMemoryEntryAppView::TDeletedContactData::SetRemoved() + { + iFlags |= EFlagContactRemoved; + } + +inline TBool CPbkMemoryEntryAppView::TDeletedContactData::IsDeletedAndRemoved() const + { + return ((iFlags & EFlagContactDeletedAndRemoved)==EFlagContactDeletedAndRemoved); + } + +inline void CPbkMemoryEntryAppView::TDeletedContactData::SetIndex(TInt aIndex) + { + iIndex = aIndex; + } + +inline TInt CPbkMemoryEntryAppView::TDeletedContactData::Index() const + { + return iIndex; + } + +void CPbkMemoryEntryAppView::TDeletedContactData::Reset() + { + iFlags = 0; + iIndex = -1; + } + + +// CPbkMemoryEntryAppView +CPbkMemoryEntryAppView::~CPbkMemoryEntryAppView() + { + if (iAllContactsView) + { + iAllContactsView->Close(*this); + } + delete iContactChangeNotifier; + delete iPbkFFSCheck; + if (iSharedDataClient) + { + iSharedDataClient->Close(); + delete iSharedDataClient; + } + } + +void CPbkMemoryEntryAppView::CmdBackL() + { + CPbkViewState* state = GetViewStateLC(); + PbkAppUi()->ActivatePreviousViewL(state); + CleanupStack::PopAndDestroy(state); + } + +void CPbkMemoryEntryAppView::CmdDeleteMeL() + { + CPbkContactItem* ci = ContactItemL(); + if (DoAskDeleteL(*ci)) + { + // Compress contact database in low disk space situation. + // This compress guarantees that contact db size decreases + // when phone user deletes single contact manually several times. + // Compression is done before delete because compression may release + // disk space. This extra space may be needed for successful delete + // operation. + TRAPD(err,FFSCheckL()); + if (KErrDiskFull == err) + { + //Db comppression does not cancel delete operation. + TRAP_IGNORE(DbCompactL()); + err = KErrNone; + } + User::LeaveIfError(err); + TRAP(err, Engine()->DeleteContactL(ci->Id(), ETrue)) + if ( KErrNotFound == err ) + { + // Ignore KErrNotFound which means that somebody got + // the contact first + err = KErrNone; + } + User::LeaveIfError(err); + } + // Previous view is activated from DB event handlers + } + +TBool CPbkMemoryEntryAppView::DoAskDeleteL(CPbkContactItem& aContact) + { + CPbkDeleteContactQuery* dlg = CPbkDeleteContactQuery::NewLC(); + return (dlg->RunLD(aContact) != 0); + } + +void CPbkMemoryEntryAppView::ContactChangedL() + { + } + +void CPbkMemoryEntryAppView::HandleCommandL + (TInt aCommandId) + { + switch (aCommandId) + { + case EAknSoftkeyBack: + { + CmdBackL(); + break; + } + + case EPbkCmdDeleteMe: + { + CmdDeleteMeL(); + break; + } + + default: + { + // Forward unknown commands to base class + CPbkAppView::HandleCommandL(aCommandId); + break; + } + } + } + +void CPbkMemoryEntryAppView::DoActivateL + (const TVwsViewId& /*aPrevViewId*/, + TUid /*aCustomMessageId*/, + const TDesC8& /*aCustomMessage*/) + { + if (!iContactChangeNotifier) + { + iContactChangeNotifier = CPbkContactChangeNotifier::NewL(*Engine(),this); + } + if (!iAllContactsView) + { + CContactViewBase* allContactsView = &Engine()->AllContactsView(); + allContactsView->OpenL(*this); + iAllContactsView = allContactsView; + } + } + +void CPbkMemoryEntryAppView::DoDeactivate() + { + if (iAllContactsView) + { + iAllContactsView->Close(*this); + iAllContactsView = NULL; + } + delete iContactChangeNotifier; + iContactChangeNotifier = NULL; + } + +TBool CPbkMemoryEntryAppView::HandleCommandKeyL + (const TKeyEvent& aKeyEvent, TEventCode aType) + { + if (aType == EEventKey) + { + switch (aKeyEvent.iCode) + { + case EKeyBackspace: // Clear key + { + HandleCommandL(EPbkCmdDeleteMe); + return ETrue; + } + case EKeyOK: + { + HandleCommandL(EPbkCmdContextMenu); + return ETrue; + } + default: + { + break; + } + } + } + + // Key was not handled here + return EFalse; + } + +void CPbkMemoryEntryAppView::HandleDatabaseEventL(TContactDbObserverEvent aEvent) + { + if (aEvent.iContactId==ContactItemId()) + { + switch (aEvent.iType) + { + case EContactDbObserverEventContactChanged: + { + ContactChangedL(); + break; + } + + case EContactDbObserverEventContactDeleted: + { + iDeletedContactData.SetDeleted(); + HandleContactDeletedL(); + break; + } + + default: + { + break; + } + } + } + } + +void CPbkMemoryEntryAppView::HandleContactViewEvent + (const CContactViewBase& aView,const TContactViewEvent& aEvent) + { + if (&aView==iAllContactsView && aEvent.iContactId==ContactItemId()) + { + switch (aEvent.iEventType) + { + case TContactViewEvent::EItemRemoved: + { + iDeletedContactData.SetRemoved(); + iDeletedContactData.SetIndex(aEvent.iInt); + TRAP_IGNORE(HandleContactDeletedL()); + break; + } + + default: + { + break; + } + } + } + } + +void CPbkMemoryEntryAppView::HandleContactDeletedL() + { + // Ensure that delete event has been received by both HandleDatabaseEventL + // and HandleContactViewEvent. HandleContactViewEvent receives a + // EItemRemoved and EItemAdded events when a contact is merely renamed. + if (iDeletedContactData.IsDeletedAndRemoved()) + { + // Calculate the contact to focus + TContactItemId focusId = KNullContactId; + TInt index = iDeletedContactData.Index(); + iDeletedContactData.Reset(); + if (index >= 0) + { + const TInt lastIndex = iAllContactsView->CountL() - 1; + if (index > lastIndex) + { + index = lastIndex; + } + if (index >= 0) + { + focusId = iAllContactsView->AtL(index); + } + } + + // Activate previous view + if (focusId != KNullContactId) + { + CPbkViewState* viewState = CPbkViewState::NewLC(); + viewState->SetFocusedContactId(focusId); + PbkAppUi()->ActivatePreviousViewL(viewState); + CleanupStack::PopAndDestroy(viewState); + } + else + { + PbkAppUi()->ActivatePreviousViewL(); + } + } + } + +inline void CPbkMemoryEntryAppView::FFSCheckL() + { + if (!iPbkFFSCheck) + { + iPbkFFSCheck = CPbkFFSCheck::NewL(); + } + // Leaves with KErrDiskFull if free disk space is below critical level. + iPbkFFSCheck->FFSClCheckL(); + } + +inline void CPbkMemoryEntryAppView::RequestFreeDiskSpaceLC() + { + if (!iSharedDataClient) + { + iSharedDataClient = new (ELeave) RSharedDataClient(); + User::LeaveIfError(iSharedDataClient->Connect()); + } + iSharedDataClient->RequestFreeDiskSpaceLC(KFreeSpaceForDbCompress); + } + +inline void CPbkMemoryEntryAppView::DbCompactL() + { + RequestFreeDiskSpaceLC(); + Engine()->Database().CompactL(); + CleanupStack::PopAndDestroy();// RequestFreeDiskSpaceLC + } + +// End of File