--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookui/Phonebook/App/src/CPbkViewNavigator.cpp Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,171 @@
+/*
+* 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:
+* Phonebook view navigation implementation base class.
+*
+*/
+
+
+// INCLUDES
+#include "CPbkViewNavigator.h"
+#include <barsread.h>
+#include <aknnavi.h>
+#include <aknnavide.h>
+#include <akntabgrp.h>
+#include <AknsUtils.h>
+
+#include <CPbkAppUiBase.h>
+#include <DigViewGraph.h>
+
+#include <PbkIcons.hrh>
+
+#include <CPbkExtGlobals.h>
+#include <MPbkExtensionFactory.h>
+#include <PbkIconInfo.h>
+#include <Phonebook.rsg>
+
+// ================= MEMBER FUNCTIONS =======================
+
+CPbkViewNavigator::~CPbkViewNavigator()
+ {
+ iViewTabGroups.ResetAndDestroy();
+ Release(iExtGlobals);
+ }
+
+CAknNavigationDecorator* CPbkViewNavigator::TabGroupFromId(TInt aTabId) const
+ {
+ const TInt tabGroupCount = iViewTabGroups.Count();
+ for (TInt i=0; i < tabGroupCount; ++i)
+ {
+ CAknNavigationDecorator* decorator =
+ CONST_CAST(CAknNavigationDecorator*, iViewTabGroups[i]);
+ CAknTabGroup* tabGroup =
+ static_cast<CAknTabGroup*>(decorator->DecoratedControl());
+ if (tabGroup->TabIndexFromId(aTabId) >= 0)
+ {
+ return decorator;
+ }
+ }
+ return NULL;
+ }
+
+void CPbkViewNavigator::BaseConstructL()
+ {
+ iExtGlobals = CPbkExtGlobals::InstanceL();
+
+ iNaviPane = static_cast<CAknNavigationControlContainer*>
+ (iAppUi.StatusPane()->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+
+ RArray<TInt> tabGroupIds;
+ CleanupClosePushL(tabGroupIds);
+ const TInt nodeCount = iViewGraph.Count();
+ for (TInt i=0; i < nodeCount; ++i)
+ {
+ const CDigViewNode& viewNode = iViewGraph[i];
+ const TInt resId = viewNode.AdditionalResId();
+ if (resId != 0 && tabGroupIds.Find(resId) == KErrNotFound)
+ {
+ User::LeaveIfError(tabGroupIds.Append(resId));
+ TResourceReader resReader;
+ iAppUi.ControlEnv()->CreateResourceReaderLC(resReader, resId);
+ CAknNavigationDecorator* tabGroup = CreateTabGroupL(resReader);
+ CleanupStack::PushL(tabGroup);
+ User::LeaveIfError(iViewTabGroups.Append(tabGroup));
+ CleanupStack::Pop(tabGroup);
+ CleanupStack::PopAndDestroy(); // resReader
+ }
+ }
+
+ // Call this to skin the tab bitmaps
+ HandleResourceChange(KAknsMessageSkinChange);
+
+ CleanupStack::PopAndDestroy(&tabGroupIds);
+ }
+
+void CPbkViewNavigator::HandleResourceChange(TInt aType)
+ {
+ const TInt tabGroupCount = iViewTabGroups.Count();
+ for (TInt i=0; i<tabGroupCount; ++i)
+ {
+ CAknTabGroup* tabGroup = TabGroupFromIndex(i);
+ tabGroup->HandleResourceChange(aType);
+ }
+
+ if (aType == KAknsMessageSkinChange)
+ {
+ SkinTabBitmaps();
+ }
+ }
+
+CAknTabGroup* CPbkViewNavigator::TabGroupFromIndex (TInt aIndex) const
+ {
+ CAknNavigationDecorator* decorator =
+ CONST_CAST(CAknNavigationDecorator*, iViewTabGroups[aIndex]);
+ CAknTabGroup* tabGroup =
+ static_cast<CAknTabGroup*>(decorator->DecoratedControl());
+
+ return tabGroup;
+ }
+
+void CPbkViewNavigator::SkinTabBitmaps()
+ {
+ TRAP_IGNORE(DoSkinTabBitmapsL());
+ }
+
+void CPbkViewNavigator::DoSkinTabBitmapsL()
+ {
+ CPbkIconInfoContainer* iconInfoContainer =
+ CPbkIconInfoContainer::NewL(R_PBK_TAB_ICON_INFO_ARRAY);
+ CleanupStack::PushL(iconInfoContainer);
+
+ // let extensions add their own tab icons
+ iExtGlobals->FactoryL().AddPbkTabIconsL(iconInfoContainer);
+
+ const TInt tabGroupCount = iViewTabGroups.Count();
+ for (TInt i=0; i<tabGroupCount; ++i)
+ {
+ CAknTabGroup* tabGroup = TabGroupFromIndex(i);
+ SkinTabGroupL(*tabGroup, *iconInfoContainer);
+ }
+
+ CleanupStack::PopAndDestroy(iconInfoContainer);
+ }
+
+void CPbkViewNavigator::SkinTabGroupL
+ (CAknTabGroup& aTabGroup, CPbkIconInfoContainer& aIconInfoContainer)
+ {
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ const TInt count = aTabGroup.TabCount();
+ for (TInt i = 0; i < count; ++i)
+ {
+ TInt tabId = aTabGroup.TabIdFromIndex(i);
+ // tabId is used as icon id
+ const TPbkIconInfo* iconInfo =
+ aIconInfoContainer.Find(TPbkIconId(tabId));
+ if (iconInfo)
+ {
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+ PbkIconUtils::CreateIconLC(
+ skin, bitmap, mask, *iconInfo);
+
+ aTabGroup.ReplaceTabL(tabId, bitmap, mask);
+
+ CleanupStack::Pop(2); // mask, bitmap
+ }
+ }
+ }
+
+// End of File