phonebookui/Phonebook/App/src/CPbkContactInfoBaseNavigationStrategy.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkContactInfoBaseNavigationStrategy.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,254 @@
+/*
+* 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: 
+*       Contact Info View common base navigation stategy.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPbkContactInfoBaseNavigationStrategy.h"  // This class' declaration
+
+#include <barsread.h> // TResourceReader
+#include <aknnavide.h>
+#include <StringLoader.h>
+#include <akntabgrp.h>
+#include <gulicon.h>
+#include <eikspane.h>
+
+// Phonebook.app include files
+#include <Phonebook.rsg>
+#include <PbkView.rsg>
+#include <pbkdebug.h>
+
+// PbkEng.dll include files
+#include <PbkIconInfo.h>
+#include <CPbkContactItem.h>
+#include "MPbkContactInfoNavigationCallback.h"
+#include <Phonebook.hrh>
+
+
+/// Unnamed namespace for local definitions
+namespace {
+
+// LOCAL CONSTANTS AND MACROS
+//
+
+#ifdef _DEBUG
+enum TPanicCode
+    {
+    EPanicIcon_StatusPaneUpdateL
+    };
+#endif
+
+
+// ==================== LOCAL FUNCTIONS ====================
+
+#ifdef _DEBUG
+void Panic(TPanicCode aReason)
+    {
+    _LIT(KPanicText, "CPbkContactInfoBaseNavigationStrategy");
+    User::Panic(KPanicText, aReason);
+    }
+#endif
+
+}  // namespace
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkContactInfoBaseNavigationStrategy::CPbkContactInfoBaseNavigationStrategy
+        (CPbkContactEngine& aEngine,
+        MPbkContactInfoNavigationCallback& aCallback) :
+    iEngine(aEngine),
+    iNavigationCallback(aCallback),
+    iViewReady(EFalse)
+    {
+    }
+
+CPbkContactInfoBaseNavigationStrategy::~CPbkContactInfoBaseNavigationStrategy()
+    {
+    delete iNaviDeco;
+    }
+
+TBool CPbkContactInfoBaseNavigationStrategy::HandleCommandKeyL
+        (const TKeyEvent& aKeyEvent, 
+        TEventCode /*aType*/)
+    {
+    if (iViewReady)
+        {
+        switch (aKeyEvent.iCode)
+            {
+            case EKeyLeftArrow: // FALLTHROUGH
+            case EKeyRightArrow:
+                {
+                TInt dir = 0;
+                switch (aKeyEvent.iCode)
+                    {
+                    case EKeyLeftArrow:
+                        {
+                        dir = -1;
+                        break;
+                        }
+                    case EKeyRightArrow:
+                        {
+                        dir = 1;
+                        break;
+                        }
+                    }
+                // Handle mirrored layout by negating the directionality
+                if (AknLayoutUtils::LayoutMirrored())
+                    {
+                    dir = -1 * dir;
+                    }
+                NavigateContactL(dir);
+                return ETrue;
+                }
+            }
+        }
+    return EFalse;
+    }
+
+void CPbkContactInfoBaseNavigationStrategy::StatusPaneUpdateL()
+    {
+    // update the navi decorator
+    if (iViewReady)
+        {
+        // check the index and count of the groups to navi pane
+        const TInt index = iScrollView->FindL(iNavigationCallback.GetContactItemId()) + 1;
+        
+        // create navi pane text
+        CArrayFixFlat<TInt>* values = new (ELeave) CArrayFixFlat<TInt>(2);
+        CleanupStack::PushL(values);
+        values->AppendL(index);
+        values->AppendL(iScrollView->CountL());      
+        HBufC* buf  = StringLoader::LoadLC(R_QTN_PHOB_NAVI_POS_INDICATOR,
+			*values);
+
+        CPbkIconInfoContainer* iconInfoContainer =
+			CPbkIconInfoContainer::NewL(R_PBK_ICON_INFO_ARRAY, CCoeEnv::Static());
+        CleanupStack::PushL(iconInfoContainer);
+                
+        CGulIcon* icon = iconInfoContainer->LoadBitmapL(
+                            EPbkqgn_prop_pb_contacts_tab1 );
+        __ASSERT_DEBUG(icon, Panic(EPanicIcon_StatusPaneUpdateL));
+        CleanupStack::PopAndDestroy(); // iconInfoContainer
+        CleanupStack::PushL(icon);
+
+        static_cast<CAknTabGroup*>(iNaviDeco->DecoratedControl())
+            ->ReplaceTabL(EPbkContactInfoViewId, *buf, icon->Bitmap(),
+			icon->Mask());
+        // tab group takes ownership of bitmap and mask
+        icon->SetBitmapsOwnedExternally(ETrue);
+        CleanupStack::PopAndDestroy(3); // icon, buf, values
+        }
+    }
+
+void CPbkContactInfoBaseNavigationStrategy::ConstructNaviIndicatorsL()
+    {
+    // navi indicators
+    CEikStatusPane* statusPane = iNavigationCallback.GetStatusPane();
+    if (statusPane && statusPane->PaneCapabilities
+		(TUid::Uid(EEikStatusPaneUidNavi)).IsPresent())
+        {
+        CAknNavigationControlContainer* naviPane =
+			static_cast<CAknNavigationControlContainer*>
+			(statusPane->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+        if (!iNaviDeco)
+            {
+            TResourceReader resReader;
+            CCoeEnv::Static()->CreateResourceReaderLC(resReader,
+				R_PBK_CONTACT_INFO_TAB_GROUP);
+            iNaviDeco = naviPane->CreateTabGroupL(resReader);
+            CleanupStack::PopAndDestroy(); // resReader
+            }
+
+        iNaviDeco->MakeScrollButtonVisible(ETrue);
+        if (iScrollView->CountL() > 1)
+            {
+            iNaviDeco->SetScrollButtonDimmed
+				(CAknNavigationDecorator::ERightButton, EFalse);
+            iNaviDeco->SetScrollButtonDimmed
+				(CAknNavigationDecorator::ELeftButton, EFalse);
+            }
+        else
+            {
+            iNaviDeco->SetScrollButtonDimmed
+				(CAknNavigationDecorator::ERightButton, ETrue);
+            iNaviDeco->SetScrollButtonDimmed
+				(CAknNavigationDecorator::ELeftButton, ETrue);
+            }
+        naviPane->PushL(*iNaviDeco);
+        }
+    StatusPaneUpdateL();
+    }
+
+void CPbkContactInfoBaseNavigationStrategy::NavigateContactL
+        (TInt aDir)
+    {
+    if (aDir == 0) 
+        {
+        // no change
+        return;
+        }
+
+    TInt contactIndex = iScrollView->FindL(iNavigationCallback.GetContactItemId()) + aDir;
+    const TInt contactCount = iScrollView->CountL();
+    if (contactCount > 1)
+        {
+        if (contactIndex < 0)
+            {
+            contactIndex = contactCount + contactIndex;
+            }
+        else if (contactIndex >= contactCount)
+            {
+            contactIndex = contactIndex - contactCount;
+            }
+        const TContactItemId contactId = iScrollView->AtL(contactIndex);
+        iNavigationCallback.ChangeContactL(contactId);
+
+        StatusPaneUpdateL();
+        }
+    }
+
+
+void CPbkContactInfoBaseNavigationStrategy::HandleContactViewEvent
+        (const CContactViewBase& aView,
+        const TContactViewEvent& aEvent)
+    {
+    if (&aView == iScrollView &&
+        aEvent.iEventType == TContactViewEvent::EReady)
+        {
+        iViewReady = ETrue;
+        // navi pane construction
+        TRAPD(err, ConstructNaviIndicatorsL());
+        if (err != KErrNone)
+            {
+            CCoeEnv::Static()->HandleError(err);
+            }
+        }
+    }
+
+void CPbkContactInfoBaseNavigationStrategy::HandleContactViewListControlEventL
+        (CPbkContactViewListControl& /*aControl*/,
+        const TPbkContactViewListControlEvent& aEvent)
+    {
+    if (aEvent.iEventType == TPbkContactViewListControlEvent::EReady)
+        {
+        // navi pane update
+        StatusPaneUpdateL();
+        }
+    }
+
+//  End of File