phonebookui/Phonebook/App/src/CPbkContactListAppView.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkContactListAppView.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,490 @@
+/*
+* 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 Contact List app views class methods.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkContactListAppView.h"
+
+#include "CPbkAppUi.h"
+#include "CPbkAppGlobals.h"
+
+#include <PbkUID.h>
+#include <CPbkContactEngine.h>
+#include <CPbkContactItem.h>
+#include <PbkCommandHandler.h>
+#include <MPbkCommand.h>
+#include <MPbkCommandObserver.h>
+#include <MPbkCommandFactory.h>
+#include <CPbkContactViewListControl.h>
+#include <CPbkPhoneNumberSelect.h>
+#include <CPbkGroupBelongings.h>
+#include <CPbkConstants.h>
+#include <Phonebook.rsg>            // Phonebook resources
+#include <MenuFilteringFlags.h>
+#include <CPbkAiwInterestArray.h>
+
+#include <eikmenup.h>
+#include <sendui.h>                 // Send UI API
+#include <SenduiMtmUids.h>          // Send UI MTM uids
+#include <CMessageData.h>
+#include <MsgBioUids.h>             // Bio message uids
+#include <AiwServiceHandler.h>      // AIW
+#include <AiwCommon.hrh>            // AIW
+#include <SendUiConsts.h>           // Postcard Uid
+#include <FeatMgr.h>                // Feature manager
+
+// Debugging headers
+#include <pbkdebug.h>
+#include "PbkProfiling.h"
+
+// Local declarations
+/*
+* Local helper class to clear marked list if command is succesfull
+* Can only be used if command is not using the default command observer
+*/
+class TClearMarks : public MPbkCommandObserver
+    {
+    public:
+        TClearMarks( CPbkContactViewListControl& aControl );
+
+    public: // MPbkCommandObserver
+        void CommandFinished(const MPbkCommand& aCommand);
+
+    private:
+        CPbkContactViewListControl& iControl;
+    };
+
+TClearMarks::TClearMarks( CPbkContactViewListControl& aControl ) :
+iControl( aControl )
+    {
+
+    }
+
+void TClearMarks::CommandFinished(const MPbkCommand& /*aCommand*/)
+    {
+    iControl.HandleMarkableListUpdateAfterCommandExecution();
+    }
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkContactListAppView::CPbkContactListAppView()
+	{
+	}
+
+CPbkContactListAppView::~CPbkContactListAppView()
+	{
+	}
+
+void CPbkContactListAppView::BaseConstructL(TInt aResId)
+    {
+    __PBK_PROFILE_START(PbkProfiling::EViewBaseConstruct);
+    CPbkAppView::BaseConstructL(aResId);
+    __PBK_PROFILE_END(PbkProfiling::EViewBaseConstruct);
+
+    // Create AIW interest array for call
+    CreateInterestItemAndAttachL(KAiwCmdCall,
+        R_PHONEBOOK_CALL_MENU, R_PHONEBOOK_CALLUI_AIW_INTEREST, ETrue);
+
+    // Create AIW interest array for PoC
+    CreateInterestItemAndAttachL(KAiwCmdPoC,
+        R_PHONEBOOK_POC_MENU, R_PHONEBOOK_POCUI_AIW_INTEREST, ETrue);
+    // The last parameter is false, since KAiwCmdPoC is already attached
+    // to base services above
+    CreateInterestItemAndAttachL(KAiwCmdPoC,
+        R_PHONEBOOK_POC_CONTEXT_MENU, R_PHONEBOOK_POCUI_AIW_INTEREST, EFalse);
+
+    // Create AIW interest array for synchronization
+    CreateInterestItemAndAttachL(KAiwCmdSynchronize,
+        R_PHONEBOOK_SYNCML_MENU, R_PHONEBOOK_SYNCML_AIW_INTEREST, ETrue);
+    }
+
+void CPbkContactListAppView::CmdOpenMeViewsL()
+	{
+    if (!Control().ItemsMarked())
+        {
+        CPbkViewState* state = Control().GetStateLC();
+        PbkAppUi()->ActivatePhonebookViewL(CPbkAppUi::KPbkContactInfoViewUid, state);
+        CleanupStack::PopAndDestroy();  // state
+        Control().HandleMarkableListUpdateAfterCommandExecution();
+        }
+	}
+
+void CPbkContactListAppView::CmdWriteToContactsL(
+         TPbkSendingParams aParams )
+    {
+    const CContactIdArray& array = Control().MarkedItemsL();
+    if ( array.Count() > 0 )
+        {
+		// Create the write message command object
+		MPbkCommand* cmd = CPbkAppGlobalsBase::InstanceL()->
+			CommandFactory().CreateSendMultipleMessageCmdL(
+			*Engine(),
+			aParams,
+			array,
+			NULL,
+			ETrue);
+	    TClearMarks clearMarks( Control() );
+	    cmd->AddObserver( clearMarks );
+		// Execute the command
+		cmd->ExecuteLD();
+
+        Control().ResetFindL();
+        TInt idx = Control().FindContactIdL(array[0]);
+        if (idx >= 0)
+            {
+            Control().SetCurrentItemIndexAndDraw(idx);
+            }
+        }
+    }
+
+void CPbkContactListAppView::CmdSendContactsL(
+         TPbkSendingParams aParams )
+    {
+    CPbkContactViewListControl& control = Control();
+
+    const TContactItemId focusedContactId = control.FocusedContactIdL();
+    TInt focusedContactIndex( control.FindContactIdL(focusedContactId) );
+
+    if (control.ItemsMarked())
+        {
+		// Get the contact ids in an array
+		const CContactIdArray& array = control.MarkedItemsL();
+		// Create the send contacts command object
+		MPbkCommand* cmd = CPbkAppGlobalsBase::InstanceL()->
+			CommandFactory().CreateSendContactsCmdL(
+			aParams, *Engine(),
+			CPbkAppGlobals::InstanceL()->BCardEngL(*Engine()), array);
+	    TClearMarks clearMarks( control );
+	    cmd->AddObserver( clearMarks );
+		// Execute the command
+		cmd->ExecuteLD();
+        }
+    else
+        {
+        if (focusedContactId != KNullContactId)
+            {
+			// Create the send contact command object
+			MPbkCommand* cmd = CPbkAppGlobalsBase::InstanceL()->
+				CommandFactory().CreateSendContactCmdL(
+				aParams, *Engine(),
+				CPbkAppGlobals::InstanceL()->BCardEngL(*Engine()),
+				focusedContactId, NULL);
+			// Execute the command
+			cmd->ExecuteLD();
+            }
+        }
+
+    // reset find filter and focus to (first) sent contact
+
+    if ( control.FindTextL() != KNullDesC )
+        {
+        control.ResetFindL();
+        focusedContactIndex = control.FindContactIdL(focusedContactId);
+        }
+
+    if (focusedContactIndex >= 0)
+        {
+        control.SetCurrentItemIndexAndDraw(focusedContactIndex);
+        }
+    }
+
+void CPbkContactListAppView::CmdBelongsToGroupsL()
+    {
+    if (!Control().ItemsMarked())
+        {
+        const TContactItemId contactId = Control().FocusedContactIdL();
+        CPbkGroupBelongings* dlg = CPbkGroupBelongings::NewL();
+        dlg->ExecuteLD(*Engine(), contactId);
+        Control().HandleMarkableListUpdateAfterCommandExecution();
+        }
+    }
+
+void CPbkContactListAppView::HandleCommandL
+        (TInt aCommandId)
+    {
+    // MarkedItemsL() might leave on low-mem situation
+    const CContactIdArray* items = NULL;
+    TRAPD(err, items = &Control().MarkedItemsL());
+    if (!err && items)
+        {
+        // Offer the command first to AIW
+        TInt serviceCmdId = KNullHandle;
+        if (!Control().ItemsMarked())
+            {
+            if (aCommandId == EPbkCmdCall)
+                {
+                serviceCmdId = KAiwCmdCall;
+                }
+            else if ( aCommandId == EPbkCmdPoc )
+                {
+                serviceCmdId = KAiwCmdPoC;
+                }
+            }
+
+        if(iAiwInterestArray->HandleCommandL(
+            aCommandId,
+            *items,
+            NULL, // no field level focus
+            serviceCmdId,
+            this))
+            {
+            return;
+            }
+        }
+
+    // Try as normal command
+    switch (aCommandId)
+        {
+        case EPbkCmdOpenMeViews:
+            {
+            CmdOpenMeViewsL();
+            break;
+            }
+
+        case EPbkCmdBelongsToGroups:
+            {
+            CmdBelongsToGroupsL();
+            break;
+            }
+        case EPbkCmdWrite:
+            {
+            TPbkSendingParams params = CreateWriteParamsLC();
+
+            PbkAppUi()->FFSClCheckL(PbkCommandHandler(this,
+                &CPbkContactListAppView::CmdWriteToContactsL,
+                params ));
+
+            CleanupStack::PopAndDestroy(); //mtmFilter
+            break;
+            }
+        default:
+            {
+            Control().HandleMarkableListProcessCommandL(aCommandId);
+            CPbkAppView::HandleCommandL(aCommandId);
+            break;
+            }
+
+        }
+    }
+
+/**
+ * Returns ETrue if shift is depressed in aKeyEvent.
+ */
+inline TBool ShiftDown
+        (const TKeyEvent& aKeyEvent)
+    {
+    return (aKeyEvent.iModifiers & (EModifierShift|EModifierLeftShift|EModifierRightShift)) != 0;
+    }
+
+/**
+ * Returns ETrue if shift is depressed in aKeyEvent.
+ */
+inline TBool CtrlDown
+        (const TKeyEvent& aKeyEvent)
+    {
+    return (aKeyEvent.iModifiers & (EModifierCtrl|EModifierLeftCtrl|EModifierRightCtrl)) != 0;
+    }
+
+TBool CPbkContactListAppView::HandleCommandKeyL
+        (const TKeyEvent& aKeyEvent,
+        TEventCode aType)
+    {
+    TBool result = EFalse;
+
+    if (aType == EEventKey && Control().IsReady())
+        {
+        switch (aKeyEvent.iCode)
+            {
+            case EKeyPhoneSend:
+                {
+                // Use the EPbkCmdCall id to identify that
+                // call is being launched with send key
+                if ( Control().NumberOfItems() > 0 )
+                    {
+                    HandleCommandL(EPbkCmdCall);
+                    result = ETrue;
+                    }
+                break;
+                }
+            case EKeyPoC:
+                {
+                HandleCommandL(EPbkCmdPoc);
+                break;
+                }
+            case EKeyBackspace:
+                {
+                if (aKeyEvent.iCode == EKeyBackspace)
+                    {
+                    if ((Control().NumberOfItems() > 0) &&
+                        (Control().FindTextL() == KNullDesC))
+                        {
+                        // check that there are names and that find window is empty
+                        DeleteFocusedEntryL();
+                        result = ETrue;
+                        }
+                    }
+                break;
+                }
+
+            case EKeyOK:
+                {
+                if (!ShiftDown(aKeyEvent) && !CtrlDown( aKeyEvent ))  // pure OK key
+                    {
+                    CPbkContactViewListControl& control = Control();
+                    if (control.NumberOfItems() > 0 && !control.ItemsMarked())
+                        {
+                        // Select key is mapped to "Open Contact" command
+                        HandleCommandL(EPbkCmdOpenMeViews);
+                        }
+                    else
+                        {
+                        // select key mapped to context sensitive menu if list is empty
+                        HandleCommandL(EPbkCmdContextMenu);
+                        }
+                    result = ETrue;
+                    }
+                break;
+                }
+
+            default:
+                {
+                break;
+                }
+            }
+        }
+
+
+    return result;
+    }
+
+
+void CPbkContactListAppView::DynInitMenuPaneL
+        (TInt aResourceId,
+        CEikMenuPane* aMenuPane)
+    {
+    Control().HandleMarkableListDynInitMenuPane(aResourceId, aMenuPane);
+    CPbkAppView::DynInitMenuPaneL(aResourceId,aMenuPane);
+    }
+
+void CPbkContactListAppView::HandleSendContactsL( TUint aFlags )
+    {
+    TPbkSendingParams params = CreateSendParamsLC(aFlags);
+    PbkAppUi()->FFSClCheckL(PbkCommandHandler(this,
+		&CPbkContactListAppView::CmdSendContactsL,
+        params));
+    CleanupStack::PopAndDestroy(); //mtmFilter
+    }
+
+TPbkSendingParams CPbkContactListAppView::CreateWriteParamsLC()
+    {
+    // Construct the MTM filter
+	CArrayFixFlat<TUid>* mtmFilter =
+		new(ELeave) CArrayFixFlat<TUid>(4);
+	CleanupStack::PushL(mtmFilter);
+
+    const CContactIdArray& array = Control().MarkedItemsL();
+    if( array.Count() > 1 )
+        {
+    	const TUid KPostcardMtmUid = { KSenduiMtmPostcardUidValue };
+        mtmFilter->AppendL(KPostcardMtmUid);	// hide postcard
+        }
+
+	TSendingCapabilities capabilities = TSendingCapabilities();
+    capabilities.iFlags = TSendingCapabilities::ESupportsEditor;
+	return TPbkSendingParams( mtmFilter, capabilities );
+    }
+
+TPbkSendingParams CPbkContactListAppView::CreateSendParamsLC(TUint aFlags)
+    {
+    // Construct the MTM filter
+	CArrayFixFlat<TUid>* mtmFilter =
+		new(ELeave) CArrayFixFlat<TUid>(4);
+    CleanupStack::PushL(mtmFilter);
+
+	const TUid KPostcardMtmUid = { KSenduiMtmPostcardUidValue };
+
+    mtmFilter->AppendL(KPostcardMtmUid);	// hide postcard
+    mtmFilter->AppendL(KSenduiMtmAudioMessageUid); // hide audio message
+
+    // Check must we disable SMS menuitem
+	if (!CPbkAppGlobals::InstanceL()->SendUiL()
+        ->CanSendBioMessage(KMsgBioUidVCard))
+        {
+        mtmFilter->AppendL(KSenduiMtmSmsUid);	// hide SMS
+        }
+
+	// If there are items marked, hide items
+    if (aFlags & KPbkItemsMarked)
+        {
+
+        mtmFilter->AppendL(KSenduiMtmSmsUid);	// hide SMS
+
+        // If multiple vCard over BT/IR is not supported hide also BT and IR
+        if (!Engine()->Constants()->LocallyVariatedFeatureEnabled
+            (EPbkLVMultipleVCardOverBTAndIR))
+            {
+            mtmFilter->AppendL(KSenduiMtmBtUid);	// hide Bluetooth
+		    mtmFilter->AppendL(KSenduiMtmIrUid);	// hide Infrared
+            }
+        }
+
+    // Hide MMS if not supported
+    if (!FeatureManager::FeatureSupported(KFeatureIdMMS))
+        {
+        mtmFilter->AppendL(KSenduiMtmMmsUid);
+        }
+
+    // Hide Email if not supported
+    if (!FeatureManager::FeatureSupported(KFeatureIdEmailUi))
+        {
+        mtmFilter->AppendL(KSenduiMtmSmtpUid);
+        mtmFilter->AppendL(KSenduiMtmImap4Uid);
+        mtmFilter->AppendL(KSenduiMtmPop3Uid);
+        mtmFilter->AppendL(KSenduiMtmSyncMLEmailUid);
+        }
+
+    TSendingCapabilities capabilities = TSendingCapabilities();
+    capabilities.iFlags = TSendingCapabilities::ESupportsBioSending;
+    capabilities.iFlags |= TSendingCapabilities::ESupportsAttachments;
+	return TPbkSendingParams( mtmFilter, capabilities );
+    }
+
+void CPbkContactListAppView::AiwCommandHandledL(TInt /*aMenuCommandId*/,
+        TInt aServiceCommandId,
+        TInt /*aErrorCode*/)
+    {
+    if (aServiceCommandId == KAiwCmdCall ||
+        aServiceCommandId == KAiwCmdPoC)
+        {
+        // Reset find and focus the selected contact
+        const TInt selIndex = Control().CurrentItemIndex();
+        if (selIndex >= 0)
+            {
+            TContactItemId cid = Control().ContactIdAtL(selIndex);
+            Control().ResetFindL();
+            TInt idx = Control().FindContactIdL(cid);
+            if (idx >= 0)
+                {
+                Control().SetCurrentItemIndexAndDraw(idx);
+                }
+            }
+        Control().HandleMarkableListUpdateAfterCommandExecution();
+        }
+    }
+
+//  End of File