--- /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