--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/landmarksui/uicontrols/src/CLmkDlgCombiSelectorImpl.cpp Tue Feb 02 00:16:03 2010 +0200
@@ -0,0 +1,806 @@
+/*
+* Copyright (c) 2002-2005 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 - This contains methods implementing a combined dialog for Landmarks
+* by name view and categories view
+*
+*/
+
+
+
+
+
+
+
+// INCLUDE FILES
+
+#include <eikapp.h>
+#include <eikenv.h>
+#include <StringLoader.h>
+#include <AknsUtils.h>
+#include <akntabgrp.h>
+#include <eikspane.h>
+#include <aknnavide.h>
+#include <aknnavi.h>
+#include <barsread.h>
+#include <lmkui.rsg>
+#include <EPos_CPosLmCategoryCriteria.h>
+#include "LmkConsts.h"
+#include "landmarks.hrh"
+#include "CLmkDbUtils.h"
+#include "CLmkLmItemListProvider.h"
+#include "CLmkUiUtils.h"
+#include "CLmkSelectorDialog.h"
+#include "CLmkEmptyDialog.h"
+#include "CLmkDlgLmSelectorImpl.h"
+#include "CLmkDlgCategorySelectorImpl.h"
+#include "CLmkDlgCombiSelectorImpl.h"
+#include "CLmkLmItemListMemento.h"
+#include <lmkerrors.h>
+
+
+// CONSTANTS
+/// Unnamed namespace for local definitions
+namespace {
+
+const TInt KLmkNumberOfSelectors = 3;
+
+#if defined(_DEBUG)
+_LIT( KPanicMsg, "CLmkDlgCombiSelectorImpl" );
+void Panic( TPanicCode aReason )
+ {
+ User::Panic( KPanicMsg, aReason );
+ }
+#endif
+} // namespace
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::CLmkDlgCombiSelectorImpl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::CLmkDlgCombiSelectorImpl( CPosLandmarkDatabase& aDb )
+ : CLmkDlgSelectorImplBase( aDb ),
+ iSelectorState( ELmkInitialState ),
+ iSelectors( KLmkNumberOfSelectors ),
+ iMementos( KLmkNumberOfSelectors ),
+ iNavigating( EFalse ),
+ iAlwaysModify( EFalse ),
+ iCustomLandmarksTitle(0)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::ConstructL()
+ {
+ BaseConstructL();
+
+ // Default status pane:
+ CEikStatusPane* sp = iEnv->AppUiFactory()->StatusPane();
+
+ // Fetch pointer to the default navi pane control:
+ iNaviPane = static_cast<CAknNavigationControlContainer*>(
+ sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+ __ASSERT_DEBUG( iNaviPane, Panic( KLmkPanicNullMember ) );
+ iNaviDeco = iNaviPane->CreateTabGroupL();
+ iNaviDeco->SetControlType( CAknNavigationDecorator::ETabGroup );
+ iTabGroup = static_cast<CAknTabGroup*>( iNaviDeco->DecoratedControl() );
+ __ASSERT_DEBUG( iTabGroup, Panic( KLmkPanicNullMember ) );
+
+ // Add Tab Icons
+ AddTabsL( *iTabGroup );
+
+ // Set observer for CAknTabGroup
+ iTabGroup->SetObserver( this );
+
+ // Create mementos and initialize selector array with NULL pointers:
+ MLmkListMemento* memento = NULL;
+ for ( TInt i( 0 ); i < KLmkNumberOfSelectors; ++i )
+ {
+ memento = MementoL();
+ User::LeaveIfError( iMementos.Append( memento ) );
+ User::LeaveIfError( iSelectors.Append( NULL ) );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CLmkDlgCombiSelectorImpl* CLmkDlgCombiSelectorImpl::NewL(
+ CPosLandmarkDatabase& aDb )
+ {
+ CLmkDlgCombiSelectorImpl* self =
+ new( ELeave ) CLmkDlgCombiSelectorImpl( aDb );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::~CLmkDlgCombiSelectorImpl
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::~CLmkDlgCombiSelectorImpl()
+ {
+ iSelectors.ResetAndDestroy();
+ iMementos.ResetAndDestroy();
+ delete iNaviDeco;
+ if( iCustomLandmarksTitle )
+ delete iCustomLandmarksTitle;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::StopExecutionL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::StopExecutionL()
+ {
+ __ASSERT_DEBUG( iSelectors.Count() == KLmkNumberOfSelectors,
+ Panic( KLmkPanicSelectorArrayIndex ) );
+
+ for ( TInt i( 0 ); i < KLmkNumberOfSelectors; ++i )
+ {
+ if ( iSelectors[i] )
+ {
+ iSelectors[i]->StopExecutionL();
+ }
+ }
+ iNaviPane->Pop( iNaviDeco );
+ // Dialog ExecuteL returns and we must consider it in final state
+ iSelectorState = ELmkFinalState;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::ExecuteL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLmkDlgCombiSelectorImpl::ExecuteL(
+ TPosLmItemId& aOpenedItem,
+ TBool aAlwaysModifyOpened )
+ {
+ // Ensure that ExecuteL is not already running:
+ __ASSERT_DEBUG( iSelectorState == ELmkFinalState ||
+ iSelectorState == ELmkInitialState,
+ Panic( KLmkPanicIllegalMethodCall ) );
+
+ iSelectorState = ELmkInitialState;
+ iOpenedItem = &aOpenedItem;
+ iAlwaysModify = aAlwaysModifyOpened;
+ CLmkEmptyDialog * lDlg = new(ELeave)CLmkEmptyDialog();
+ lDlg->SetMopParent(iMopParent);
+ lDlg->ExecuteLD(R_EMPTY_DIALOG);
+
+ TLmkSelectorStateEvent nextEvent( ELmkSelectorStart );
+ do
+ {
+ nextEvent = HandleAnyStateEventL( nextEvent );
+
+ } while ( nextEvent != ELmkSelectorNoEvent );
+
+ lDlg->EmptyDialogExitL();
+ return iDlgRetVal;
+ }
+
+// -----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::ExecuteL
+//
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CLmkDlgCombiSelectorImpl::ExecuteL(
+ RArray<TPosLmItemId>& aSelectedItems,
+ TBool aAlwaysModifySelected )
+ {
+ // Ensure that ExecuteL is not already running:
+ __ASSERT_DEBUG( iSelectorState == ELmkFinalState ||
+ iSelectorState == ELmkInitialState,
+ Panic( KLmkPanicIllegalMethodCall ) );
+
+ iSelectorState = ELmkInitialState;
+ iSelectedItems = &aSelectedItems;
+ iAlwaysModify = aAlwaysModifySelected;
+
+
+ TLmkSelectorStateEvent nextEvent( ELmkSelectorStart );
+ do
+ {
+ nextEvent = HandleAnyStateEventL( nextEvent );
+
+ } while ( nextEvent != ELmkSelectorNoEvent );
+
+ return iDlgRetVal;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleAnyStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleAnyStateEventL(
+ TLmkSelectorStateEvent aEvent )
+ {
+ TLmkSelectorStateEvent nextEvent( ELmkSelectorNoEvent );
+
+ switch ( iSelectorState )
+ {
+ case ELmkInitialState:
+ {
+ nextEvent = HandleInitialStateEventL( aEvent );
+ break;
+ }
+ case ELmkLandmarkSelector:
+ {
+ nextEvent = HandleLandmarkSelectorStateEventL( aEvent );
+ break;
+ }
+ case ELmkCategorySelector:
+ {
+ nextEvent = HandleCategorySelectorStateEventL( aEvent );
+ break;
+ }
+ case ELmkFilteredLmSelector:
+ {
+ nextEvent = HandleFilteredLmSelectorStateEventL( aEvent );
+ break;
+ }
+ default: // ELmkFinalState
+ {
+ nextEvent = HandleDefaultStateStateEventL( aEvent );
+ }
+ }
+ if ( iNavigating )
+ { // navigation variable overrides dialog return value
+ iNavigating = EFalse;
+ nextEvent = ELmkSelectorNavigating;
+ }
+
+ return nextEvent;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleInitialStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleInitialStateEventL(
+ TLmkSelectorStateEvent /*aEvent*/ )
+ {
+
+ iTabGroup->SetActiveTabById( ETabLandmarkList );
+ iNaviPane->PushL( *iNaviDeco );
+ iSelectorState = ELmkLandmarkSelector;
+ CLmkDlgSelectorImplBase& selector = CurrentStateSelectorL();
+
+ if ( iSelectedItems )
+ { // multi selector mode
+ iDlgRetVal = selector.ExecuteL( *iSelectedItems, iAlwaysModify );
+ }
+ else
+ { // single selector mode
+ iDlgRetVal = selector.ExecuteL( *iOpenedItem, iAlwaysModify );
+ }
+ return ELmkSelectorStop;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleAnyStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleLandmarkSelectorStateEventL(
+ TLmkSelectorStateEvent aEvent )
+ {
+ __ASSERT_DEBUG( aEvent == ELmkSelectorNavigating ||
+ aEvent == ELmkSelectorStop,
+ Panic( KLmkPanicUnexpectedEvent ) );
+
+ if ( aEvent == ELmkSelectorNavigating )
+ {
+ iSelectorState = ELmkCategorySelector;
+ CLmkDlgSelectorImplBase& selector = CurrentStateSelectorL();
+ iDlgRetVal = selector.ExecuteL( iCategoryIndex );
+ return ELmkSelectorStop;
+ }
+ else
+ { // aEvent == ELmkSelectorStop
+ iSelectorState = ELmkFinalState;
+ return ELmkSelectorNoEvent;
+ }
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleCategorySelectorStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleCategorySelectorStateEventL(
+ TLmkSelectorStateEvent aEvent )
+ {
+ __ASSERT_DEBUG( aEvent == ELmkSelectorNavigating ||
+ aEvent == ELmkSelectorStop,
+ Panic( KLmkPanicUnexpectedEvent ) );
+
+ if ( aEvent == ELmkSelectorNavigating )
+ {
+ iSelectorState = ELmkLandmarkSelector;
+ CLmkDlgSelectorImplBase& selector = CurrentStateSelectorL();
+
+ if ( iSelectedItems )
+ { // multi selector mode
+ iDlgRetVal = selector.ExecuteL( *iSelectedItems, iAlwaysModify );
+ }
+ else
+ { // single selector mode
+ iDlgRetVal = selector.ExecuteL( *iOpenedItem, iAlwaysModify );
+ }
+ return ELmkSelectorStop;
+ }
+ else if ( aEvent == ELmkSelectorStop && iDlgRetVal != 0 )
+ { // -> open category contents
+ TPosLmItemId categoryId( KPosLmNullItemId );
+ static_cast<const CLmkLmItemListProvider&>( ListProvider() ).
+ GetSelectedItemId( categoryId, iCategoryIndex );
+
+ HBufC* catName = NULL;
+
+ if (categoryId == KPosLmNullItemId) // 'uncategorised' category
+ {
+ // 'uncategorised' category
+ // set criteria for searchnig 'Uncategorised' landmarks
+ catName = StringLoader::LoadL(
+ R_LMK_LM_LIST_UNCATEGORISED,
+ const_cast<CEikonEnv *>( iEnv ));
+ }
+ else
+ {
+ //HBufC* catName = CLmkDbUtils::CategoryNameL( iDb, categoryId );
+ catName = CLmkDbUtils::CategoryNameL( iDb, categoryId );
+ }
+
+ CleanupStack::PushL( catName );
+ //Store old and create new navi pane
+ iLmkUiUtils->StoreNaviPaneL();
+ iLmkUiUtils->CreateNaviLabelL( *catName );
+ CleanupStack::PopAndDestroy(); //catName
+
+ iSelectorState = ELmkFilteredLmSelector;
+ CLmkDlgSelectorImplBase& selector = CurrentStateSelectorL( categoryId );
+ if(iMementos[iSelectorState])
+ {
+ CLmkLmItemListMemento* memento =
+ static_cast<CLmkLmItemListMemento*>(iMementos[iSelectorState]);
+ memento->UpdateModelAvailability(EFalse);
+ }
+ if ( iSelectedItems )
+ { // Return value is stored even if "Back" was pressed:
+ iDlgRetVal = selector.ExecuteL( *iSelectedItems, ETrue );
+ }
+ else
+ { // Return value is not stored if "Back" was pressed:
+ iDlgRetVal = selector.ExecuteL( *iOpenedItem, EFalse );
+ }
+ return ELmkSelectorStop;
+ }
+ else // aEvent == ELmkSelectorStop && dialog canceled
+ {
+ iSelectorState = ELmkFinalState;
+ return ELmkSelectorNoEvent;
+ }
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleFilteredLmSelectorStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleFilteredLmSelectorStateEventL(
+ TLmkSelectorStateEvent aEvent )
+ {
+ __ASSERT_DEBUG( aEvent == ELmkSelectorStop,
+ Panic( KLmkPanicUnexpectedEvent ) );
+
+ // filtered lm selector shouldn't be removed earlier
+ CLmkDlgSelectorImplBase*& selector = iSelectors[ELmkFilteredLmSelector];
+ delete selector;
+ selector = NULL; // iSelector's pointer points to NULL now!
+
+ //Restore navi panel
+ iLmkUiUtils->RestoreOldNaviPaneL();
+
+ if ( aEvent == ELmkSelectorStop && iDlgRetVal != 0 )
+ {
+ iSelectorState = ELmkFinalState;
+ return ELmkSelectorNoEvent;
+ }
+ else // aEvent == ELmkSelectorStop & dialog canceled
+ {
+ iSelectorState = ELmkCategorySelector;
+ CLmkDlgSelectorImplBase& dlgselector = CurrentStateSelectorL();
+ TInt categoryIndex( -1 );
+ iDlgRetVal = dlgselector.ExecuteL( categoryIndex );
+ iCategoryIndex = categoryIndex;
+ return ELmkSelectorStop;
+ }
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleDefaultStateStateEventL
+// ----------------------------------------------------
+//
+CLmkDlgCombiSelectorImpl::TLmkSelectorStateEvent
+CLmkDlgCombiSelectorImpl::HandleDefaultStateStateEventL(
+ TLmkSelectorStateEvent /*aEvent*/ )
+ {
+ return ELmkSelectorNoEvent;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::SetupListProviderL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::SetupListProviderL()
+ {
+ // This class does not create own provider
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::ListProvider
+// ----------------------------------------------------
+//
+const CLmkListProviderBase& CLmkDlgCombiSelectorImpl::ListProvider() const
+ {
+ if ( iSelectorState == ELmkCategorySelector )
+ {
+ return iSelectors[ELmkCategorySelector]->ListProvider();
+ }
+ else if ( iSelectorState == ELmkFilteredLmSelector )
+ {
+ return iSelectors[ELmkFilteredLmSelector]->ListProvider();
+ }
+ else // ELmkLandmarkSelector
+ {
+ return iSelectors[ELmkLandmarkSelector]->ListProvider();
+ }
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::GetDlgResources
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::GetDlgResources(
+ TBool /*aIsSingleSelector*/,
+ TInt& aTitlePaneResource,
+ TInt& aMenuBarResource,
+ TInt& aDialogResource ) const
+ {
+ // This class does not define resources
+ aTitlePaneResource = NULL;
+ aMenuBarResource = NULL;
+ aDialogResource = NULL;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::StoreMemento
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::StoreMemento()
+ {
+ // This class does not store
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::RestoreMemento
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::RestoreMemento()
+ {
+ // This class does not restore
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::ProcessCommandL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::ProcessCommandL( TInt /*aCommandId*/ )
+ {
+ // This class does not process cmds
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleNavigationEventL
+// ----------------------------------------------------
+//
+TKeyResponse CLmkDlgCombiSelectorImpl::HandleNavigationEventL(
+ const TKeyEvent& aKeyEvent )
+ {
+ __ASSERT_DEBUG( iTabGroup, Panic( KLmkPanicNullMember ) );
+ // tab scroll key event handling is not needed 'Landmark Contents' view
+ if ( iSelectorState == ELmkFilteredLmSelector)
+ {
+ return EKeyWasNotConsumed;
+ }
+
+ TInt active = iTabGroup->ActiveTabId();
+ TBool shift = EFalse;
+
+ if ( active == ETabCategoryList )
+ {
+ if(AknLayoutUtils::LayoutMirrored())
+ {
+ if(aKeyEvent.iCode == EKeyRightArrow)
+ {
+ shift = ETrue;
+ }
+ else
+ {//aKeyEvent.iCode == EKeyLeftArrow
+ shift = EFalse;
+ }
+ }
+ else
+ {
+ if(aKeyEvent.iCode == EKeyLeftArrow)
+ {
+ shift = ETrue;
+ }
+ else
+ {//aKeyEvent.iCode == EKeyRightArrow
+ shift = EFalse;
+ }
+ }
+
+ if(shift)
+ {
+ iTabGroup->SetActiveTabById( ETabLandmarkList );
+ iNaviPane->PushL(*iNaviDeco);
+ iNavigating = ETrue;
+ }
+ else
+ {// no need to set the tab id
+ return EKeyWasNotConsumed;
+ }
+ }
+ else if ( active == ETabLandmarkList )
+ {
+ TBool shift = EFalse;
+ if(AknLayoutUtils::LayoutMirrored())
+ {
+ if(aKeyEvent.iCode == EKeyLeftArrow)
+ {
+ shift = ETrue;
+ }
+ else //aKeyEvent.iCode == EKeyRightArrow
+ {
+ shift = EFalse;
+ }
+ }
+ else
+ {
+ if(aKeyEvent.iCode == EKeyRightArrow)
+ {
+ shift = ETrue;
+ }
+ else //aKeyEvent.iCode == EKeyLeftArrow
+ {
+ shift = EFalse;
+ }
+ }
+
+ if(shift)
+ {
+ iTabGroup->SetActiveTabById( ETabCategoryList );
+ iNaviPane->PushL(*iNaviDeco);
+ iNavigating = ETrue;
+ }
+ else // no need to set the tab id
+ {
+ return EKeyWasNotConsumed;
+ }
+ }
+ else
+ {
+ return EKeyWasNotConsumed;
+ }
+ return EKeyWasConsumed;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleLaunchingEventL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::HandleLaunchingEventL()
+ {
+ // This class does not do anything with this event
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::HandleClosingEventL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::HandleClosingEventL()
+ {
+ // This class does not do anything with this event
+ }
+
+CLmkDlgSelectorImplBase& CLmkDlgCombiSelectorImpl::CurrentStateSelectorL(
+ TPosLmItemId aCategoryId )
+ {
+ __ASSERT_DEBUG( iSelectors.Count() == KLmkNumberOfSelectors,
+ Panic( KLmkPanicSelectorArrayIndex ) );
+
+ CLmkDlgSelectorImplBase*& selector = iSelectors[iSelectorState];
+ if ( selector == NULL )
+ { // iSelector's pointer will be modified!
+ if ( iSelectorState == ELmkLandmarkSelector )
+ {
+ selector = CLmkDlgLmSelectorImpl::NewL( iDb );
+ if (iCustomLandmarksTitle)
+ {
+ selector->CLmkDlgSelectorImplBase::SetDialogTitleL(*iCustomLandmarksTitle);
+ }
+ }
+ else if ( iSelectorState == ELmkCategorySelector )
+ {
+ // Don't show empty categories -> 2nd parameter EFalse
+ selector = CLmkDlgCategorySelectorImpl::NewL( iDb, EFalse );
+ }
+ else //ELmkFilteredLmSelector
+ {
+ __ASSERT_DEBUG( iSelectorState == ELmkFilteredLmSelector,
+ Panic( KLmkPanicWrongSelector ) );
+ CPosLmCategoryCriteria* criteria = CPosLmCategoryCriteria::NewLC();
+ criteria->SetCategoryItemId( aCategoryId );
+ selector = CLmkDlgLmSelectorImpl::NewL( iDb, criteria );
+ if (iCustomLandmarksTitle)
+ {
+ selector->CLmkDlgSelectorImplBase::SetDialogTitleL(*iCustomLandmarksTitle);
+ }
+ CleanupStack::Pop(); // criteria, ownership was transferred
+ }
+
+ selector->SetMopParent(iMopParent);
+ selector->SetSelectorImplParent( this );
+ selector->SetMemento( *( iMementos[iSelectorState] ) );
+ selector->SetEmptyDlgLabel(iCurrentLabelPrimResource , iCurrentLabelSecResource);
+ }
+
+ return *selector;
+ }
+
+// ----------------------------------------------------
+// CLmkDlgCombiSelectorImpl::AddTabsL
+// ----------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::AddTabsL(CAknTabGroup& aTabGroup)
+ {
+ aTabGroup.SetTabFixedWidthL(EAknTabWidthWithTwoTabs);
+
+ MAknsSkinInstance* skin = AknsUtils::SkinInstance();
+
+ TFileName filename( KLmkSystemMbmPath );
+ filename.Append(KLandmarksIconFileName);
+ CLmkUiUtils::GetFileWithCorrectDriveL( filename );
+
+ //Add tab icon 1
+ CFbsBitmap* lmkListBitmap = NULL;
+ CFbsBitmap* lmkBitmapMask = NULL;
+
+ AknsUtils::CreateIconLC( skin,
+ KAknsIIDQgnPropLmNamesTab2,
+ lmkListBitmap,
+ lmkBitmapMask,
+ /**filename*/filename,
+ EMbmLandmarksQgn_prop_lm_names_tab2,
+ EMbmLandmarksQgn_prop_lm_names_tab2_mask );
+
+ CleanupStack::Pop(2); //lmkListBitmap, lmkBitmapMask
+
+ //Add tab icon 2
+ CFbsBitmap* lmkCatBitmap = NULL;
+ CFbsBitmap* lmkCatBitmapMask = NULL;
+
+ AknsUtils::CreateIconLC( skin,
+ KAknsIIDQgnPropLmCategoriesTab2,
+ lmkCatBitmap,
+ lmkCatBitmapMask,
+ /* *filename */filename,
+ EMbmLandmarksQgn_prop_lm_categories_tab2,
+ EMbmLandmarksQgn_prop_lm_categories_tab2_mask );
+
+ CleanupStack::Pop(2); //lmkCatBitmap, lmkCatBitmapMask
+
+ if(AknLayoutUtils::LayoutMirrored())
+ {
+ aTabGroup.AddTabL(ETabCategoryList, lmkCatBitmap, lmkCatBitmapMask); // ELmkByCategoryView
+ aTabGroup.AddTabL( ETabLandmarkList, lmkListBitmap, lmkBitmapMask ); //ELmkByLmView
+ }
+ else
+ {
+ aTabGroup.AddTabL( ETabLandmarkList, lmkListBitmap, lmkBitmapMask ); //ELmkByLmView
+ aTabGroup.AddTabL(ETabCategoryList, lmkCatBitmap, lmkCatBitmapMask); // ELmkByCategoryView
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::GetBitmapFilenameL
+// ----------------------------------------------------------------------------
+//
+HBufC* CLmkDlgCombiSelectorImpl::GetBitmapFilenameLC()
+ {
+ // Path and file name:
+ HBufC* filename = HBufC::NewLC( KMaxFileName);
+ TPtr fileNamePtr = filename->Des();
+ fileNamePtr.Append(KLmkSystemMbmPath);
+ fileNamePtr.Append(KLandmarksIconFileName);
+
+ TBuf<20> aApp; // Holds drive name where the file is stored
+ CEikAppUi *appUi = (CEikAppUi *)(iEnv->AppUi());
+ HBufC* fullPath = HBufC::NewLC( KMaxFileName);
+ *fullPath = appUi->Application()->AppFullName();
+ TPtr fullPathPtr = fullPath->Des();
+ TParsePtr ptr(fullPathPtr);
+ aApp.Copy(ptr.Drive());
+
+ // Add drive to path & file name:
+ TParse parse;
+ User::LeaveIfError( parse.Set( fileNamePtr, &aApp, NULL ) );
+ CleanupStack::PopAndDestroy(2); // fullPath, filename
+ return parse.FullName().AllocLC();
+ }
+
+// ----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::TabChangedL
+// ----------------------------------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::TabChangedL( TInt /*aIndex*/ )
+ {
+ iNaviPane->PushL(*iNaviDeco);
+ iNavigating = ETrue;
+
+ TInt active = iTabGroup->ActiveTabId();
+
+ if ( active == ETabCategoryList ) // After tab change, ETabCategoryList tab is active
+ {
+ iSelectors[ETabLandmarkList]->StopExecutionL();
+ iSelectorState = ELmkLandmarkSelector;
+ }
+ else if( active == ETabLandmarkList ) // After tab change, ETabLandmarkList tab is active
+ {
+ iSelectors[ETabCategoryList]->StopExecutionL();
+ iSelectorState = ELmkCategorySelector;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CLmkDlgCombiSelectorImpl::SetDialogTitleL
+// ----------------------------------------------------------------------------
+//
+void CLmkDlgCombiSelectorImpl::SetDialogTitleL(const TDesC& aTitle)
+ {
+ delete iCustomLandmarksTitle;
+ iCustomLandmarksTitle = NULL;
+ iCustomLandmarksTitle = aTitle.AllocL();
+ }
+
+
+// End of File