landmarksui/app/src/CLmkBaseContainer.cpp
branchRCL_3
changeset 18 870918037e16
parent 0 522cd55cc3d7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/app/src/CLmkBaseContainer.cpp	Wed Sep 01 12:31:27 2010 +0100
@@ -0,0 +1,406 @@
+/*
+* 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:    LandmarksUi Content File -    Provides LM request container class methods.
+*
+*/
+
+
+
+
+
+
+
+// INCLUDE FILES
+#include "CLmkBaseContainer.h"
+#include "MLmkKeyProcessor.h"
+#include "LmkUID.h"
+#include "LmkConsts.h"
+#include <aknViewAppUi.h>
+#include <aknnavide.h>
+#include <barsread.h>
+#include <akntabgrp.h>
+#include <eikmenub.h>
+#include "landmarks.hrh"
+#include <AknsUtils.h>
+#include <akntabgrp.h>
+#include <eikapp.h>
+#include <AknsSkinInstance.h>
+#include <f32file.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <eikenv.h>
+#include <aknViewAppUi.h>
+#include <apparc.h>
+#include "CLmkAppSelectorImplBase.h"
+#include <lmkerrors.h>
+#include "Debug.h"
+
+#if defined(_DEBUG)
+// CONSTANTS
+namespace {
+_LIT( KPanicText, "CLmkBaseContainer" );
+
+void Panic( TPanicCode aReason )
+    {
+    User::Panic( KPanicText, aReason );
+    }
+}  // namespace
+#endif
+
+// ================= MEMBER FUNCTIONS =======================
+// ----------------------------------------------------
+// CLmkBaseContainer::CLmkBaseContainer
+// ----------------------------------------------------
+//
+CLmkBaseContainer::CLmkBaseContainer(
+    MLmkKeyProcessor& aKeyProcessor,
+    const TDesC& aHelpContext )
+    :iKeyProcessor( aKeyProcessor ),
+     iContextName( aHelpContext )
+    {
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::BaseConstructL
+// ----------------------------------------------------
+//
+void CLmkBaseContainer::BaseConstructL()
+    {
+    CEikStatusPane* sp = StatusPane();
+    // Fetch pointer to the default navi pane control
+    iNaviPane = static_cast<CAknNavigationControlContainer*>
+        ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+    }
+// ----------------------------------------------------
+// CLmkBaseContainer::~CLmkBaseContainer
+// ----------------------------------------------------
+//
+CLmkBaseContainer::~CLmkBaseContainer()
+    {
+    delete iSelector;
+    }
+
+// ----------------------------------------------------------------------------
+// CLmkBaseContainer::SelectorImpl()
+// ----------------------------------------------------------------------------
+//
+CLmkAppSelectorImplBase& CLmkBaseContainer::SelectorImpl()
+    {
+    __ASSERT_DEBUG( iSelector, Panic( KLmkPanicNullMember ) );
+    return *iSelector;
+    }
+// ----------------------------------------------------
+// CLmkBaseContainer::ActivateTabL
+// ----------------------------------------------------
+//
+void CLmkBaseContainer::ActivateTabL(
+    CAknNavigationDecorator& aNaviDecorator,
+    TInt aTabId )
+    {
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    CAknNavigationControlContainer* naviPane =
+        static_cast<CAknNavigationControlContainer*>(
+        sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));
+    CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>(
+        aNaviDecorator.DecoratedControl() );
+    tabGroup->SetActiveTabById( aTabId );
+    naviPane->PushL( aNaviDecorator );
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::GetHelpContext
+// ----------------------------------------------------
+//
+void CLmkBaseContainer::GetHelpContext( TCoeHelpContext& aContext ) const
+    {
+    aContext.iContext = iContextName;
+    aContext.iMajor = TUid::Uid( KLmkAppUID3 );
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::OfferKeyEventL
+// ----------------------------------------------------
+//
+TKeyResponse CLmkBaseContainer::OfferKeyEventL(
+    const TKeyEvent& aKeyEvent,
+    TEventCode aType )
+    {
+	DEBUG( CLmkBaseContainer::OfferKeyEventL entered );    	
+    	
+    CAknNavigationDecorator* naviDecorator = NaviPane().Top();
+
+    // Check if navigation pane controls exists, because decorator does
+    // not exist in every cases.
+    if ( naviDecorator && naviDecorator->ControlType() ==
+         CAknNavigationDecorator::ETabGroup )
+        {
+        if(aKeyEvent.iRepeats == 0)
+			{
+			if ( naviDecorator->DecoratedControl()->OfferKeyEventL(
+			 aKeyEvent, aType ) == EKeyWasConsumed )
+				{
+				return EKeyWasConsumed;
+				}
+			}
+        }
+
+    if ( iKeyProcessor.ProcessKeyEventL( aKeyEvent, aType ) ==
+         EKeyWasConsumed )
+        {
+        return EKeyWasConsumed;
+        }
+
+    if ( aType == EEventKey )
+        {
+	    TBool shiftKeyPressed = (aKeyEvent.iModifiers & EModifierShift) ||
+    	                        (aKeyEvent.iModifiers & EModifierLeftShift) ||
+        	                    (aKeyEvent.iModifiers & EModifierRightShift);
+        
+        if ( aKeyEvent.iCode == EKeyOK && !shiftKeyPressed && ContextSpecificMenuBar() )	        
+            {
+	        DEBUG( CLmkBaseContainer::OfferKeyEventL aKeyEvent.iCode == EKeyOK entered ); 	
+            CEikMenuBar* menubar = MenuBar();
+            if ( menubar )
+                {
+                menubar->SetMenuTitleResourceId( ContextSpecificMenuBar() );
+                menubar->StopDisplayingMenuBar();
+                TRAPD( err, menubar->TryDisplayMenuBarL() );
+                // set ordinary menubar back even in case of error
+                menubar->SetMenuTitleResourceId( OptionsMenuBar() );
+                User::LeaveIfError( err );
+                }
+            return EKeyWasConsumed;
+            }
+		if ( aKeyEvent.iCode == EKeyEnter || aKeyEvent.iScanCode == EStdKeyEnter )
+			{
+			TKeyEvent enterKeyEvent( aKeyEvent );
+			enterKeyEvent.iCode = EKeyOK;
+			CEikButtonGroupContainer* cba = CEikButtonGroupContainer::Current();
+			return cba->OfferKeyEventL( enterKeyEvent, aType );
+			}
+        }
+
+    for ( TInt i( 0 ); i < CountComponentControls(); ++i )
+        {
+        if ( ComponentControl(i)->OfferKeyEventL( aKeyEvent, aType ) ==
+             EKeyWasConsumed )
+            {
+            return EKeyWasConsumed;
+            }
+        }
+	DEBUG( CLmkBaseContainer::OfferKeyEventL end );    	    
+    return EKeyWasNotConsumed;    
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::LmkAppUi
+// ----------------------------------------------------
+//
+CAknViewAppUi* CLmkBaseContainer::ViewAppUi()
+    {
+    return static_cast<CAknViewAppUi*>( iAvkonAppUi );
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::NaviPane
+// ----------------------------------------------------
+//
+CAknNavigationControlContainer& CLmkBaseContainer::NaviPane()
+    {
+    // default navi pane should always exist:
+    __ASSERT_DEBUG( iNaviPane, Panic( KLmkPanicNullNaviPane ) );
+    return *iNaviPane;
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::CreateNaviPaneL
+// ----------------------------------------------------
+//
+CAknNavigationDecorator* CLmkBaseContainer::CreateNaviPaneL(
+    TInt aResource )
+    {
+    CEikStatusPane* sp = iEikonEnv->AppUiFactory()->StatusPane();
+    // Fetch pointer to the default navi pane control
+    CAknNavigationControlContainer* naviPane =
+        static_cast<CAknNavigationControlContainer*>(sp->ControlL(
+        TUid::Uid(EEikStatusPaneUidNavi)));
+
+    CAknNavigationDecorator* decorator = NULL;
+    if ( aResource == KZeroResourceId ) // dummy tab
+        {
+        naviPane->PushDefaultL( EFalse );
+        }
+    else
+        {
+        decorator = naviPane->CreateTabGroupL(iKeyProcessor.TabObserver());
+        decorator->SetControlType( CAknNavigationDecorator::ETabGroup );
+        CAknTabGroup* tabGroup =
+        static_cast< CAknTabGroup* > ( decorator->DecoratedControl() );
+        AddTabsL( *tabGroup );
+        }
+    return decorator;
+    }
+
+// ----------------------------------------------------
+// CLmkBaseContainer::StatusPane
+// ----------------------------------------------------
+//
+CEikStatusPane* CLmkBaseContainer::StatusPane()
+    {
+    return iEikonEnv->AppUiFactory()->StatusPane();
+    }
+
+// ---------------------------------------------------------
+// CLmkBaseContainer::MenuBar
+// ---------------------------------------------------------
+//
+CEikMenuBar* CLmkBaseContainer::MenuBar()
+    {
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CLmkBaseContainer::ContextSpecificMenuBar
+// ---------------------------------------------------------
+//
+TInt CLmkBaseContainer::ContextSpecificMenuBar()
+    {
+    return 0;
+    }
+
+// ---------------------------------------------------------
+// CLmkBaseContainer::OptionsMenuBar
+// ---------------------------------------------------------
+//
+TInt CLmkBaseContainer::OptionsMenuBar()
+    {
+    return 0;
+    }
+
+// Code added by gaurav fro Tab Icons -start-
+// ----------------------------------------------------
+// CLmkBaseContainer::AddTabsL
+// ----------------------------------------------------
+//
+void CLmkBaseContainer::AddTabsL(CAknTabGroup& aTabGroup)
+    {
+    aTabGroup.SetTabFixedWidthL(EAknTabWidthWithTwoTabs);
+
+    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+    HBufC* filename = GetBitmapFilenameLC();
+    CFbsBitmap* bitmap = NULL;
+    CFbsBitmap* bitmapMask = NULL;
+
+    //Add tab icon 1
+    AknsUtils::CreateIconLC( skin,
+                            KAknsIIDQgnPropLmNamesTab2,
+                            bitmap,
+                            bitmapMask,
+                            *filename,
+                            EMbmLandmarksQgn_prop_lm_names_tab2,
+                            EMbmLandmarksQgn_prop_lm_names_tab2_mask );
+    aTabGroup.AddTabL( ELmkByLmView, bitmap, bitmapMask ); //ELmkByLmView
+    CleanupStack::Pop(2); //bitmap, bitmapmask
+
+
+    //Add tab icon 2
+    AknsUtils::CreateIconLC( skin,
+                            KAknsIIDQgnPropLmCategoriesTab2,
+                            bitmap,
+                            bitmapMask,
+                            *filename,
+                            EMbmLandmarksQgn_prop_lm_categories_tab2,
+                            EMbmLandmarksQgn_prop_lm_categories_tab2_mask );
+    aTabGroup.AddTabL(ELmkByCategoryView, bitmap, bitmapMask ); // ELmkByCategoryView
+    CleanupStack::Pop(2); //bitmap, bitmapmask
+
+    CleanupStack::PopAndDestroy(); //filename
+    }
+
+// ----------------------------------------------------------------------------
+// CLmkBaseContainer::GetBitmapFilenameL
+// ----------------------------------------------------------------------------
+//
+HBufC* CLmkBaseContainer::GetBitmapFilenameLC()
+    {
+
+    TBuf<2> aApp;
+    CEikAppUi *appUi = (CEikAppUi *)(iCoeEnv->AppUi());
+    TFileName* full = new( ELeave ) TFileName;
+    CleanupStack::PushL( full );
+    *full = appUi->Application()->AppFullName();
+    TParsePtr ptr(*full);
+    aApp.Copy(ptr.Drive());
+
+	// Path and file name:
+    TFileName* file = new( ELeave ) TFileName;
+    CleanupStack::PushL( file );
+    file->Append( KLmkSystemMbmPath ); // always safe
+    file->Append( KLandmarksIconFileName ); // always safe
+
+    // Add drive to path & file name:
+    TParse* parse = new(ELeave) TParse;
+    CleanupStack::PushL( parse );
+    User::LeaveIfError( parse->Set( *file, &aApp, NULL ) );
+	HBufC* retFileName = parse->FullName().AllocLC();
+	CleanupStack::Pop();//retFileName
+	CleanupStack::PopAndDestroy(3);
+	CleanupStack::PushL( retFileName );
+    return retFileName;
+    }
+
+// ---------------------------------------------------------
+// CLmkBaseContainer::ResolveMskDisplayItem()
+// ---------------------------------------------------------
+//
+TLmkMskDispItem CLmkBaseContainer::ResolveMskDisplayItem()
+	{
+	TLmkMskDispItem dispItem  = ELabel;
+	if (iSearchInitiated && (!SelectorImpl().ListVisibleItemCount()))
+		{
+		dispItem = ENoMsk;
+		}
+	else
+		{
+		const CArrayFix<TInt>* markedIndexes = NULL;
+		markedIndexes = SelectorImpl().MarkedIndexes();
+        if(markedIndexes->Count() > 0 ||
+        !SelectorImpl().ListVisibleItemCount())
+            {
+            dispItem = EContextMenu;
+            }
+		}
+
+	return dispItem;
+	}
+
+#ifdef RD_SCALABLE_UI_V2
+// ---------------------------------------------------------
+// CLmkBaseContainer::SetListBoxObserver()
+// ---------------------------------------------------------
+//
+void CLmkBaseContainer::SetListBoxObserver(MEikListBoxObserver* /*aObserver*/)
+	{
+	//Since CLmkCategorySettingsContainer is directly derived from
+	// CLmkBaseContainer, is the reason this function is made virtual
+	//in this class. Most of the other container classes are derived
+	//from CLmkLbWithFilterContainer, which is derived from CLmkBaseContainer,
+	//hence there will be two overriding of this function,
+	//1. In 	CLmkCategorySettingsContainer
+	//2. In     CLmkLbWithFilterContainer
+	//since both the above classes holds the CEikListBox member, where the
+	//observer needs to be set.
+	}
+#endif//RD_SCALABLE_UI_V2
+// End of File